Path: blob/master/editor/scene/2d/tiles/tile_data_editors.h
9906 views
/**************************************************************************/1/* tile_data_editors.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "tile_atlas_view.h"3334#include "editor/inspector/editor_properties.h"35#include "scene/gui/box_container.h"3637class Label;38class MenuButton;39class SpinBox;40class EditorUndoRedoManager;4142class TileDataEditor : public VBoxContainer {43GDCLASS(TileDataEditor, VBoxContainer);4445private:46bool _tile_set_changed_update_needed = false;47void _tile_set_changed_plan_update();48void _tile_set_changed_deferred_update();4950protected:51Ref<TileSet> tile_set;52TileData *_get_tile_data(TileMapCell p_cell);53virtual void _tile_set_changed() {}5455static void _bind_methods();5657public:58void set_tile_set(Ref<TileSet> p_tile_set);5960// Input to handle painting.61virtual Control *get_toolbar() { return nullptr; }62virtual void forward_draw_over_atlas(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, CanvasItem *p_canvas_item, Transform2D p_transform) {}63virtual void forward_draw_over_alternatives(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, CanvasItem *p_canvas_item, Transform2D p_transform) {}64virtual void forward_painting_atlas_gui_input(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, const Ref<InputEvent> &p_event) {}65virtual void forward_painting_alternatives_gui_input(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, const Ref<InputEvent> &p_event) {}6667// Used to draw the tile data property value over a tile.68virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) {}69};7071class DummyObject : public Object {72GDCLASS(DummyObject, Object)73private:74HashMap<String, Variant> properties;7576protected:77bool _set(const StringName &p_name, const Variant &p_value);78bool _get(const StringName &p_name, Variant &r_ret) const;7980public:81bool has_dummy_property(const StringName &p_name);82void add_dummy_property(const StringName &p_name);83void remove_dummy_property(const StringName &p_name);84void clear_dummy_properties();85};8687class GenericTilePolygonEditor : public VBoxContainer {88GDCLASS(GenericTilePolygonEditor, VBoxContainer);8990private:91Ref<TileSet> tile_set;92LocalVector<Vector<Point2>> polygons;93bool multiple_polygon_mode = false;9495bool use_undo_redo = true;9697// UI98int hovered_polygon_index = -1;99int hovered_point_index = -1;100int hovered_segment_index = -1;101Vector2 hovered_segment_point;102103enum DragType {104DRAG_TYPE_NONE,105DRAG_TYPE_DRAG_POINT,106DRAG_TYPE_CREATE_POINT,107DRAG_TYPE_PAN,108};109DragType drag_type = DRAG_TYPE_NONE;110int drag_polygon_index = 0;111int drag_point_index = 0;112Vector2 drag_last_pos;113PackedVector2Array drag_old_polygon;114115HBoxContainer *toolbar = nullptr;116Ref<ButtonGroup> tools_button_group;117Button *button_expand = nullptr;118Button *button_create = nullptr;119Button *button_edit = nullptr;120Button *button_delete = nullptr;121MenuButton *button_advanced_menu = nullptr;122123enum Snap {124SNAP_NONE,125SNAP_HALF_PIXEL,126SNAP_GRID,127};128int current_snap_option = SNAP_HALF_PIXEL;129MenuButton *button_pixel_snap = nullptr;130SpinBox *snap_subdivision = nullptr;131132Vector<Point2> in_creation_polygon;133134Panel *panel = nullptr;135Control *base_control = nullptr;136EditorZoomWidget *editor_zoom_widget = nullptr;137Button *button_center_view = nullptr;138Vector2 panning;139bool initializing = true;140141Ref<TileSetAtlasSource> background_atlas_source;142Vector2i background_atlas_coords;143int background_alternative_id;144145Color polygon_color = Color(1.0, 0.0, 0.0);146147enum AdvancedMenuOption {148RESET_TO_DEFAULT_TILE,149CLEAR_TILE,150ROTATE_RIGHT,151ROTATE_LEFT,152FLIP_HORIZONTALLY,153FLIP_VERTICALLY,154};155156void _base_control_draw();157void _zoom_changed();158void _advanced_menu_item_pressed(int p_item_pressed);159void _center_view();160void _base_control_gui_input(Ref<InputEvent> p_event);161void _set_snap_option(int p_index);162void _store_snap_options();163void _toggle_expand(bool p_expand);164165void _snap_to_tile_shape(Point2 &r_point, float &r_current_snapped_dist, float p_snap_dist);166void _snap_point(Point2 &r_point);167void _grab_polygon_point(Vector2 p_pos, const Transform2D &p_polygon_xform, int &r_polygon_index, int &r_point_index);168void _grab_polygon_segment_point(Vector2 p_pos, const Transform2D &p_polygon_xform, int &r_polygon_index, int &r_segment_index, Vector2 &r_point);169170protected:171void _notification(int p_what);172static void _bind_methods();173174public:175void set_use_undo_redo(bool p_use_undo_redo);176177void set_tile_set(Ref<TileSet> p_tile_set);178void set_background_tile(const TileSetAtlasSource *p_atlas_source, const Vector2 &p_atlas_coords, int p_alternative_id);179180int get_polygon_count();181int add_polygon(const Vector<Point2> &p_polygon, int p_index = -1);182void remove_polygon(int p_index);183void clear_polygons();184void set_polygon(int p_polygon_index, const Vector<Point2> &p_polygon);185Vector<Point2> get_polygon(int p_polygon_index);186187void set_polygons_color(Color p_color);188void set_multiple_polygon_mode(bool p_multiple_polygon_mode);189190GenericTilePolygonEditor();191};192193class TileDataDefaultEditor : public TileDataEditor {194GDCLASS(TileDataDefaultEditor, TileDataEditor);195196private:197// Toolbar198HBoxContainer *toolbar = memnew(HBoxContainer);199Button *picker_button = nullptr;200201// UI202Ref<Texture2D> tile_bool_checked;203Ref<Texture2D> tile_bool_unchecked;204Label *label = nullptr;205206EditorProperty *property_editor = nullptr;207208// Painting state.209enum DragType {210DRAG_TYPE_NONE = 0,211DRAG_TYPE_PAINT,212DRAG_TYPE_PAINT_RECT,213};214DragType drag_type = DRAG_TYPE_NONE;215Vector2 drag_start_pos;216Vector2 drag_last_pos;217HashMap<TileMapCell, Variant, TileMapCell> drag_modified;218Variant drag_painted_value;219220void _property_value_changed(const StringName &p_property, const Variant &p_value, const StringName &p_field);221222protected:223DummyObject *dummy_object = memnew(DummyObject);224225StringName type;226String property;227Variant::Type property_type;228void _notification(int p_what);229230virtual Variant _get_painted_value();231virtual void _set_painted_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile);232virtual void _set_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile, const Variant &p_value);233virtual Variant _get_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile);234virtual void _setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, const HashMap<TileMapCell, Variant, TileMapCell> &p_previous_values, const Variant &p_new_value);235236public:237virtual Control *get_toolbar() override { return toolbar; }238virtual void forward_draw_over_atlas(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, CanvasItem *p_canvas_item, Transform2D p_transform) override;239virtual void forward_draw_over_alternatives(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, CanvasItem *p_canvas_item, Transform2D p_transform) override;240virtual void forward_painting_atlas_gui_input(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, const Ref<InputEvent> &p_event) override;241virtual void forward_painting_alternatives_gui_input(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, const Ref<InputEvent> &p_event) override;242virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;243244void setup_property_editor(Variant::Type p_type, const String &p_property, const String &p_label = "", const Variant &p_default_value = Variant());245Variant::Type get_property_type();246247TileDataDefaultEditor();248~TileDataDefaultEditor();249};250251class TileDataTextureOriginEditor : public TileDataDefaultEditor {252GDCLASS(TileDataTextureOriginEditor, TileDataDefaultEditor);253254public:255virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;256};257258class TileDataPositionEditor : public TileDataDefaultEditor {259GDCLASS(TileDataPositionEditor, TileDataDefaultEditor);260261public:262virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;263};264265class TileDataYSortEditor : public TileDataDefaultEditor {266GDCLASS(TileDataYSortEditor, TileDataDefaultEditor);267268public:269virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;270};271272class TileDataOcclusionShapeEditor : public TileDataDefaultEditor {273GDCLASS(TileDataOcclusionShapeEditor, TileDataDefaultEditor);274275private:276int occlusion_layer = -1;277278// UI279GenericTilePolygonEditor *polygon_editor = nullptr;280281void _polygon_changed(const PackedVector2Array &p_polygon);282283virtual Variant _get_painted_value() override;284virtual void _set_painted_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) override;285virtual void _set_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile, const Variant &p_value) override;286virtual Variant _get_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) override;287virtual void _setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, const HashMap<TileMapCell, Variant, TileMapCell> &p_previous_values, const Variant &p_new_value) override;288289protected:290virtual void _tile_set_changed() override;291292void _notification(int p_what);293294public:295virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;296297void set_occlusion_layer(int p_occlusion_layer) { occlusion_layer = p_occlusion_layer; }298299TileDataOcclusionShapeEditor();300};301302class TileDataCollisionEditor : public TileDataDefaultEditor {303GDCLASS(TileDataCollisionEditor, TileDataDefaultEditor);304305int physics_layer = -1;306307// UI308GenericTilePolygonEditor *polygon_editor = nullptr;309DummyObject *dummy_object = memnew(DummyObject);310HashMap<StringName, EditorProperty *> property_editors;311312void _property_value_changed(const StringName &p_property, const Variant &p_value, const StringName &p_field);313void _property_selected(const StringName &p_path, int p_focusable);314void _polygons_changed();315316virtual Variant _get_painted_value() override;317virtual void _set_painted_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) override;318virtual void _set_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile, const Variant &p_value) override;319virtual Variant _get_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) override;320virtual void _setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, const HashMap<TileMapCell, Variant, TileMapCell> &p_previous_values, const Variant &p_new_value) override;321322protected:323virtual void _tile_set_changed() override;324325void _notification(int p_what);326327public:328virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;329330void set_physics_layer(int p_physics_layer) { physics_layer = p_physics_layer; }331332TileDataCollisionEditor();333~TileDataCollisionEditor();334};335336class TileDataTerrainsEditor : public TileDataEditor {337GDCLASS(TileDataTerrainsEditor, TileDataEditor);338339private:340// Toolbar341HBoxContainer *toolbar = memnew(HBoxContainer);342Button *picker_button = nullptr;343344// Painting state.345enum DragType {346DRAG_TYPE_NONE = 0,347DRAG_TYPE_PAINT_TERRAIN_SET,348DRAG_TYPE_PAINT_TERRAIN_SET_RECT,349DRAG_TYPE_PAINT_TERRAIN_BITS,350DRAG_TYPE_PAINT_TERRAIN_BITS_RECT,351};352DragType drag_type = DRAG_TYPE_NONE;353Vector2 drag_start_pos;354Vector2 drag_last_pos;355HashMap<TileMapCell, Variant, TileMapCell> drag_modified;356Variant drag_painted_value;357358// UI359Label *label = nullptr;360DummyObject *dummy_object = memnew(DummyObject);361EditorPropertyEnum *terrain_set_property_editor = nullptr;362EditorPropertyEnum *terrain_property_editor = nullptr;363364void _property_value_changed(const StringName &p_property, const Variant &p_value, const StringName &p_field);365366void _update_terrain_selector();367368protected:369virtual void _tile_set_changed() override;370371void _notification(int p_what);372373public:374virtual Control *get_toolbar() override { return toolbar; }375virtual void forward_draw_over_atlas(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, CanvasItem *p_canvas_item, Transform2D p_transform) override;376virtual void forward_draw_over_alternatives(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, CanvasItem *p_canvas_item, Transform2D p_transform) override;377virtual void forward_painting_atlas_gui_input(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, const Ref<InputEvent> &p_event) override;378virtual void forward_painting_alternatives_gui_input(TileAtlasView *p_tile_atlas_view, TileSetAtlasSource *p_tile_atlas_source, const Ref<InputEvent> &p_event) override;379virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;380381TileDataTerrainsEditor();382~TileDataTerrainsEditor();383};384385class TileDataNavigationEditor : public TileDataDefaultEditor {386GDCLASS(TileDataNavigationEditor, TileDataDefaultEditor);387388private:389int navigation_layer = -1;390PackedVector2Array navigation_polygon;391392// UI393GenericTilePolygonEditor *polygon_editor = nullptr;394395void _polygon_changed(const PackedVector2Array &p_polygon);396397virtual Variant _get_painted_value() override;398virtual void _set_painted_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) override;399virtual void _set_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile, const Variant &p_value) override;400virtual Variant _get_value(TileSetAtlasSource *p_tile_set_atlas_source, Vector2 p_coords, int p_alternative_tile) override;401virtual void _setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, const HashMap<TileMapCell, Variant, TileMapCell> &p_previous_values, const Variant &p_new_value) override;402403protected:404virtual void _tile_set_changed() override;405406void _notification(int p_what);407408public:409virtual void draw_over_tile(CanvasItem *p_canvas_item, Transform2D p_transform, TileMapCell p_cell, bool p_selected = false) override;410411void set_navigation_layer(int p_navigation_layer) { navigation_layer = p_navigation_layer; }412413TileDataNavigationEditor();414};415416417