summaryrefslogtreecommitdiff
path: root/editor/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'editor/plugins')
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp4
-rw-r--r--editor/plugins/asset_library_editor_plugin.cpp110
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp144
-rw-r--r--editor/plugins/canvas_item_editor_plugin.h2
-rw-r--r--editor/plugins/collision_polygon_2d_editor_plugin.cpp1
-rw-r--r--editor/plugins/cube_grid_theme_editor_plugin.cpp2
-rw-r--r--editor/plugins/curve_editor_plugin.cpp96
-rw-r--r--editor/plugins/curve_editor_plugin.h23
-rw-r--r--editor/plugins/editor_preview_plugins.cpp108
-rw-r--r--editor/plugins/editor_preview_plugins.h23
-rw-r--r--editor/plugins/gradient_editor_plugin.cpp99
-rw-r--r--editor/plugins/gradient_editor_plugin.h35
-rw-r--r--editor/plugins/item_list_editor_plugin.cpp2
-rw-r--r--editor/plugins/line_2d_editor_plugin.cpp1
-rw-r--r--editor/plugins/navigation_mesh_editor_plugin.cpp166
-rw-r--r--editor/plugins/navigation_mesh_editor_plugin.h87
-rw-r--r--editor/plugins/navigation_mesh_generator.cpp308
-rw-r--r--editor/plugins/navigation_mesh_generator.h66
-rw-r--r--editor/plugins/navigation_polygon_editor_plugin.cpp1
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp1
-rw-r--r--editor/plugins/script_editor_plugin.cpp56
-rw-r--r--editor/plugins/script_editor_plugin.h5
-rw-r--r--editor/plugins/skeleton_2d_editor_plugin.cpp30
-rw-r--r--editor/plugins/skeleton_2d_editor_plugin.h30
-rw-r--r--editor/plugins/sprite_editor_plugin.cpp30
-rw-r--r--editor/plugins/sprite_editor_plugin.h30
-rw-r--r--editor/plugins/style_box_editor_plugin.cpp87
-rw-r--r--editor/plugins/style_box_editor_plugin.h26
-rw-r--r--editor/plugins/texture_region_editor_plugin.cpp46
-rw-r--r--editor/plugins/texture_region_editor_plugin.h4
-rw-r--r--editor/plugins/tile_set_editor_plugin.cpp10
31 files changed, 675 insertions, 958 deletions
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index b387972558..23c5e36a92 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -85,7 +85,7 @@ void AnimationPlayerEditor::_notification(int p_what) {
}
frame->set_value(player->get_current_animation_position());
key_editor->set_anim_pos(player->get_current_animation_position());
- EditorNode::get_singleton()->get_property_editor()->refresh();
+ EditorNode::get_singleton()->get_inspector()->refresh();
} else if (last_active) {
//need the last frame after it stopped
@@ -1073,7 +1073,7 @@ void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag)
updating = false;
_seek_value_changed(p_pos, !p_drag);
- EditorNode::get_singleton()->get_property_editor()->refresh();
+ EditorNode::get_singleton()->get_inspector()->refresh();
//seekit
}
diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp
index 05833704d1..d595d4dd98 100644
--- a/editor/plugins/asset_library_editor_plugin.cpp
+++ b/editor/plugins/asset_library_editor_plugin.cpp
@@ -65,7 +65,7 @@ void EditorAssetLibraryItem::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {
- icon->set_normal_texture(get_icon("GodotAssetDefault", "EditorIcons"));
+ icon->set_normal_texture(get_icon("DefaultProjectIcon", "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));
}
@@ -110,6 +110,7 @@ EditorAssetLibraryItem::EditorAssetLibraryItem() {
add_child(hb);
icon = memnew(TextureButton);
+ icon->set_custom_minimum_size(Size2(64, 64));
icon->set_default_cursor_shape(CURSOR_POINTING_HAND);
icon->connect("pressed", this, "_asset_clicked");
@@ -170,7 +171,23 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const
for (int i = 0; i < preview_images.size(); i++) {
if (preview_images[i].id == p_index) {
- preview_images[i].button->set_icon(p_image);
+ if (preview_images[i].is_video) {
+ Ref<Image> overlay = get_icon("PlayOverlay", "EditorIcons")->get_data();
+ Ref<Image> thumbnail = p_image->get_data();
+ Point2 overlay_pos = Point2((thumbnail->get_width() - overlay->get_width()) / 2, (thumbnail->get_height() - overlay->get_height()) / 2);
+
+ thumbnail->lock();
+ thumbnail->blend_rect(overlay, overlay->get_used_rect(), overlay_pos);
+ thumbnail->unlock();
+
+ Ref<ImageTexture> tex;
+ tex.instance();
+ tex->create_from_image(thumbnail);
+
+ preview_images[i].button->set_icon(tex);
+ } else {
+ preview_images[i].button->set_icon(p_image);
+ }
break;
}
}
@@ -383,7 +400,7 @@ void EditorAssetLibraryItemDownload::configure(const String &p_title, int p_asse
icon->set_texture(p_preview);
asset_id = p_asset_id;
if (!p_preview.is_valid())
- icon->set_texture(get_icon("GodotAssetDefault", "EditorIcons"));
+ icon->set_texture(get_icon("DefaultProjectIcon", "EditorIcons"));
host = p_download_url;
sha256 = p_sha256_hash;
asset_installer->connect("confirmed", this, "_close");
@@ -688,13 +705,24 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt
int len = image_data.size();
PoolByteArray::Read r = image_data.read();
- Ref<Image> image = Ref<Image>(memnew(Image(r.ptr(), len)));
+ Ref<Image> image = Ref<Image>(memnew(Image));
+
+ uint8_t png_signature[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
+ uint8_t jpg_signature[3] = { 255, 216, 255 };
+
+ if (r.ptr()) {
+ if (memcmp(&r[0], &png_signature[0], 8) == 0) {
+ image->copy_internals_from(Image::_png_mem_loader_func(r.ptr(), len));
+ } else if (memcmp(&r[0], &jpg_signature[0], 3) == 0) {
+ image->copy_internals_from(Image::_jpg_mem_loader_func(r.ptr(), len));
+ }
+ }
if (!image->empty()) {
switch (image_queue[p_queue_id].image_type) {
case IMAGE_QUEUE_ICON:
- image->resize(80 * EDSCALE, 80 * EDSCALE, Image::INTERPOLATE_CUBIC);
+ image->resize(64 * EDSCALE, 64 * EDSCALE, Image::INTERPOLATE_CUBIC);
break;
case IMAGE_QUEUE_THUMBNAIL: {
@@ -724,7 +752,7 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt
}
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"));
+ obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_icon("DefaultProjectIcon", "EditorIcons"));
}
}
}
@@ -733,7 +761,7 @@ void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, cons
ERR_FAIL_COND(!image_queue.has(p_queue_id));
- if (p_status == HTTPRequest::RESULT_SUCCESS) {
+ if (p_status == HTTPRequest::RESULT_SUCCESS && p_code < HTTPClient::RESPONSE_BAD_REQUEST) {
if (p_code != HTTPClient::RESPONSE_NOT_MODIFIED) {
for (int i = 0; i < headers.size(); i++) {
@@ -764,10 +792,10 @@ void EditorAssetLibrary::_image_request_completed(int p_status, int p_code, cons
_image_update(p_code == HTTPClient::RESPONSE_NOT_MODIFIED, true, p_data, p_queue_id);
} else {
- WARN_PRINTS("Error getting PNG file from URL: " + image_queue[p_queue_id].image_url);
+ // WARN_PRINTS("Error getting image file from URL: " + image_queue[p_queue_id].image_url);
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"));
+ obj->call("set_image", image_queue[p_queue_id].image_type, image_queue[p_queue_id].image_index, get_icon("DefaultProjectIcon", "EditorIcons"));
}
}
@@ -919,41 +947,43 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int
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);
+ hbc->add_constant_override("separation", 5);
+ Button *first = memnew(Button);
+ first->set_text(TTR("First"));
if (p_page != 0) {
- LinkButton *first = memnew(LinkButton);
- first->set_text(TTR("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);
+ } else {
+ first->set_disabled(true);
+ first->set_focus_mode(Control::FOCUS_NONE);
}
+ hbc->add_child(first);
+ Button *prev = memnew(Button);
+ prev->set_text(TTR("Previous"));
if (p_page > 0) {
- LinkButton *prev = memnew(LinkButton);
- prev->set_text(TTR("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);
+ } else {
+ prev->set_disabled(true);
+ prev->set_focus_mode(Control::FOCUS_NONE);
}
+ hbc->add_child(prev);
+ hbc->add_child(memnew(VSeparator));
for (int i = from; i < to; i++) {
if (i == p_page) {
- Label *current = memnew(Label);
+ Button *current = memnew(Button);
current->set_text(itos(i + 1));
+ current->set_disabled(true);
+ current->set_focus_mode(Control::FOCUS_NONE);
+
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);
+ Button *current = memnew(Button);
current->set_text(itos(i + 1));
current->connect("pressed", this, "_search", varray(i));
@@ -961,28 +991,26 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int
}
}
+ Button *next = memnew(Button);
+ next->set_text(TTR("Next"));
if (p_page < p_page_count - 1) {
- LinkButton *next = memnew(LinkButton);
- next->set_text(TTR("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);
+ } else {
+ next->set_disabled(true);
+ next->set_focus_mode(Control::FOCUS_NONE);
}
+ hbc->add_child(memnew(VSeparator));
+ hbc->add_child(next);
+ Button *last = memnew(Button);
+ last->set_text(TTR("Last"));
if (p_page != p_page_count - 1) {
- LinkButton *last = memnew(LinkButton);
- last->set_text(TTR("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));
+ } else {
+ last->set_disabled(true);
+ last->set_focus_mode(Control::FOCUS_NONE);
}
-
- 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_child(last);
hbc->add_spacer();
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index 93aeca6632..ad49ab86c9 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -520,8 +520,17 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel
node = node->get_parent();
}
+ // Check if the canvas item is already in the list (for groups or scenes)
+ bool duplicate = false;
+ for (int j = 0; j < i; j++) {
+ if (r_items[j].item == canvas_item) {
+ duplicate = true;
+ break;
+ }
+ }
+
//Remove the item if invalid
- if (!canvas_item || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner())) || (canvas_item->has_meta("_edit_lock_") && canvas_item->get_meta("_edit_lock_"))) {
+ if (!canvas_item || duplicate || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner())) || (canvas_item->has_meta("_edit_lock_") && canvas_item->get_meta("_edit_lock_"))) {
r_items.remove(i);
i--;
} else {
@@ -530,6 +539,88 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel
}
}
+void CanvasItemEditor::_get_bones_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items) {
+ Point2 screen_pos = transform.xform(p_pos);
+
+ for (Map<BoneKey, BoneList>::Element *E = bone_list.front(); E; E = E->next()) {
+ Node2D *from_node = Object::cast_to<Node2D>(ObjectDB::get_instance(E->key().from));
+ Node2D *to_node = Object::cast_to<Node2D>(ObjectDB::get_instance(E->key().to));
+
+ Vector<Vector2> bone_shape;
+ if (!_get_bone_shape(&bone_shape, NULL, E))
+ continue;
+
+ // Check if the point is inside the Polygon2D
+ if (Geometry::is_point_in_polygon(screen_pos, bone_shape)) {
+ // Check if the item is already in the list
+ bool duplicate = false;
+ for (int i = 0; i < r_items.size(); i++) {
+ if (r_items[i].item == from_node) {
+ duplicate = true;
+ break;
+ }
+ }
+ if (duplicate)
+ continue;
+
+ // Else, add it
+ _SelectResult res;
+ res.item = from_node;
+ res.z_index = from_node ? from_node->get_z_index() : 0;
+ res.has_z = from_node;
+ r_items.push_back(res);
+ }
+ }
+}
+
+bool CanvasItemEditor::_get_bone_shape(Vector<Vector2> *shape, Vector<Vector2> *outline_shape, Map<BoneKey, BoneList>::Element *bone) {
+ int bone_width = EditorSettings::get_singleton()->get("editors/2d/bone_width");
+ int bone_outline_width = EditorSettings::get_singleton()->get("editors/2d/bone_outline_size");
+
+ Node2D *from_node = Object::cast_to<Node2D>(ObjectDB::get_instance(bone->key().from));
+ Node2D *to_node = Object::cast_to<Node2D>(ObjectDB::get_instance(bone->key().to));
+
+ if (!from_node->is_inside_tree())
+ return false; //may have been removed
+ if (!from_node)
+ return false;
+
+ if (!to_node && bone->get().length == 0)
+ return false;
+
+ Vector2 from = transform.xform(from_node->get_global_position());
+ Vector2 to;
+
+ if (to_node)
+ to = transform.xform(to_node->get_global_position());
+ else
+ to = transform.xform(from_node->get_global_transform().xform(Vector2(bone->get().length, 0)));
+
+ Vector2 rel = to - from;
+ Vector2 relt = rel.tangent().normalized() * bone_width;
+ Vector2 reln = rel.normalized();
+ Vector2 reltn = relt.normalized();
+
+ if (shape) {
+ shape->clear();
+ shape->push_back(from);
+ shape->push_back(from + rel * 0.2 + relt);
+ shape->push_back(to);
+ shape->push_back(from + rel * 0.2 - relt);
+ }
+
+ if (outline_shape) {
+ outline_shape->clear();
+ outline_shape->push_back(from + (-reln - reltn) * bone_outline_width);
+ outline_shape->push_back(from + (-reln + reltn) * bone_outline_width);
+ outline_shape->push_back(from + rel * 0.2 + relt + reltn * bone_outline_width);
+ outline_shape->push_back(to + (reln + reltn) * bone_outline_width);
+ outline_shape->push_back(to + (reln - reltn) * bone_outline_width);
+ outline_shape->push_back(from + rel * 0.2 - relt - reltn * bone_outline_width);
+ }
+ return true;
+}
+
void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_node, List<CanvasItem *> *r_items, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform) {
if (!p_node)
return;
@@ -1787,8 +1878,13 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
// Find the item to select
CanvasItem *canvas_item = NULL;
Vector<_SelectResult> selection;
+
+ // Retrieve the items
_get_canvas_items_at_pos(click, selection, editor_selection->get_selection().empty() ? 1 : 0);
+ // Retrieve the bones
+ _get_bones_at_pos(click, selection);
+
for (int i = 0; i < selection.size(); i++) {
if (editor_selection->is_selected(selection[i].item)) {
// Drag the node(s) if requested
@@ -2579,57 +2675,25 @@ void CanvasItemEditor::_draw_bones() {
RID ci = viewport->get_canvas_item();
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_outline_color = EditorSettings::get_singleton()->get("editors/2d/bone_outline_color");
Color bone_selected_color = EditorSettings::get_singleton()->get("editors/2d/bone_selected_color");
- int bone_outline_size = EditorSettings::get_singleton()->get("editors/2d/bone_outline_size");
for (Map<BoneKey, BoneList>::Element *E = bone_list.front(); E; E = E->next()) {
- Node2D *from_node = Object::cast_to<Node2D>(ObjectDB::get_instance(E->key().from));
- Node2D *to_node = Object::cast_to<Node2D>(ObjectDB::get_instance(E->key().to));
-
- if (!from_node->is_inside_tree())
- continue; //may have been removed
- if (!from_node)
+ Vector<Vector2> bone_shape;
+ Vector<Vector2> bone_shape_outline;
+ if (!_get_bone_shape(&bone_shape, &bone_shape_outline, E))
continue;
- if (!to_node && E->get().length == 0)
+ Node2D *from_node = Object::cast_to<Node2D>(ObjectDB::get_instance(E->key().from));
+ if (!from_node->is_visible_in_tree())
continue;
- Vector2 from = transform.xform(from_node->get_global_position());
- Vector2 to;
-
- if (to_node)
- to = transform.xform(to_node->get_global_position());
- else
- to = transform.xform(from_node->get_global_transform().xform(Vector2(E->get().length, 0)));
-
- Vector2 rel = to - from;
- Vector2 relt = rel.tangent().normalized() * bone_width;
- Vector2 reln = rel.normalized();
- Vector2 reltn = relt.normalized();
-
- 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<Vector2> bone_shape_outline;
- bone_shape_outline.push_back(from + (-reln - reltn) * bone_outline_size);
- bone_shape_outline.push_back(from + (-reln + reltn) * bone_outline_size);
- bone_shape_outline.push_back(from + rel * 0.2 + relt + reltn * bone_outline_size);
- bone_shape_outline.push_back(to + (reln + reltn) * bone_outline_size);
- bone_shape_outline.push_back(to + (reln - reltn) * bone_outline_size);
- bone_shape_outline.push_back(from + rel * 0.2 - relt - reltn * bone_outline_size);
-
Vector<Color> colors;
if (from_node->has_meta("_edit_ik_")) {
-
colors.push_back(bone_ik_color);
colors.push_back(bone_ik_color);
colors.push_back(bone_ik_color);
@@ -4275,13 +4339,13 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
hb->add_child(snap_button);
snap_button->set_toggle_mode(true);
snap_button->connect("toggled", this, "_button_toggle_snap");
- snap_button->set_tooltip(TTR("Toggles snapping"));
+ snap_button->set_tooltip(TTR("Toggle snapping."));
snap_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/use_snap", TTR("Use Snap"), KEY_S));
snap_config_menu = memnew(MenuButton);
hb->add_child(snap_config_menu);
snap_config_menu->set_h_size_flags(SIZE_SHRINK_END);
- snap_config_menu->set_tooltip(TTR("Snapping options"));
+ snap_config_menu->set_tooltip(TTR("Snapping Options"));
PopupMenu *p = snap_config_menu->get_popup();
p->connect("id_pressed", this, "_popup_callback");
diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h
index a1957b892e..4d2af11303 100644
--- a/editor/plugins/canvas_item_editor_plugin.h
+++ b/editor/plugins/canvas_item_editor_plugin.h
@@ -351,6 +351,7 @@ class CanvasItemEditor : public VBoxContainer {
void _find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, Vector<_SelectResult> &r_items, int p_limit = 0, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
void _get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items, int p_limit = 0);
+ void _get_bones_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items);
void _find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_node, List<CanvasItem *> *r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
bool _select_click_on_item(CanvasItem *item, Point2 p_click_pos, bool p_append);
@@ -379,6 +380,7 @@ class CanvasItemEditor : public VBoxContainer {
UndoRedo *undo_redo;
bool _build_bones_list(Node *p_node);
+ bool _get_bone_shape(Vector<Vector2> *shape, Vector<Vector2> *outline_shape, Map<BoneKey, BoneList>::Element *bone);
List<CanvasItem *> _get_edited_canvas_items(bool retreive_locked = false, bool remove_canvas_item_if_parent_in_selection = true);
Rect2 _get_encompassing_rect_from_list(List<CanvasItem *> p_list);
diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.cpp b/editor/plugins/collision_polygon_2d_editor_plugin.cpp
index b624d69810..672337ba2f 100644
--- a/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/collision_polygon_2d_editor_plugin.cpp
@@ -42,6 +42,7 @@ void CollisionPolygon2DEditor::_set_node(Node *p_polygon) {
CollisionPolygon2DEditor::CollisionPolygon2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
+ node = NULL;
}
CollisionPolygon2DEditorPlugin::CollisionPolygon2DEditorPlugin(EditorNode *p_node) :
diff --git a/editor/plugins/cube_grid_theme_editor_plugin.cpp b/editor/plugins/cube_grid_theme_editor_plugin.cpp
index 81f45b9f55..68d5ea5247 100644
--- a/editor/plugins/cube_grid_theme_editor_plugin.cpp
+++ b/editor/plugins/cube_grid_theme_editor_plugin.cpp
@@ -198,7 +198,7 @@ void MeshLibraryEditor::_menu_cbk(int p_option) {
} break;
case MENU_OPTION_REMOVE_ITEM: {
- String p = editor->get_property_editor()->get_selected_path();
+ String p = editor->get_inspector()->get_selected_path();
if (p.begins_with("/MeshLibrary/item") && p.get_slice_count("/") >= 3) {
to_erase = p.get_slice("/", 3).to_int();
diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp
index 7c49408c35..49c54ad67d 100644
--- a/editor/plugins/curve_editor_plugin.cpp
+++ b/editor/plugins/curve_editor_plugin.cpp
@@ -91,7 +91,7 @@ void CurveEditor::set_curve(Ref<Curve> curve) {
}
Size2 CurveEditor::get_minimum_size() const {
- return Vector2(64, 64);
+ return Vector2(64, 150) * EDSCALE;
}
void CurveEditor::_notification(int p_what) {
@@ -639,7 +639,7 @@ void CurveEditor::_draw() {
Ref<Font> font = get_font("font", "Label");
float font_height = font->get_height();
- const Color text_color = get_color("font_color", "Editor");
+ Color text_color = get_color("font_color", "Editor");
{
// X axis
@@ -720,6 +720,7 @@ void CurveEditor::_draw() {
// Help text
if (_selected_point > 0 && _selected_point + 1 < curve.get_point_count()) {
+ text_color.a *= 0.4;
draw_string(font, Vector2(50, font_height), TTR("Hold Shift to edit tangents individually"), text_color);
}
}
@@ -750,87 +751,28 @@ void CurveEditor::_bind_methods() {
//---------------
-CurveEditorPlugin::CurveEditorPlugin(EditorNode *p_node) {
- _editor_node = p_node;
-
- _view = memnew(CurveEditor);
- _view->set_custom_minimum_size(Size2(100, 128 * EDSCALE));
- _view->hide();
-
- _toggle_button = _editor_node->add_bottom_panel_item(get_name(), _view);
- _toggle_button->hide();
-
- get_editor_interface()->get_resource_previewer()->add_preview_generator(memnew(CurvePreviewGenerator));
-}
-
-CurveEditorPlugin::~CurveEditorPlugin() {
-}
-
-void CurveEditorPlugin::edit(Object *p_object) {
-
- Ref<Curve> curve_ref;
-
- if (_current_ref.is_valid()) {
- CurveTexture *ct = Object::cast_to<CurveTexture>(*_current_ref);
- if (ct)
- ct->disconnect(CoreStringNames::get_singleton()->changed, this, "_curve_texture_changed");
- }
-
- if (p_object) {
- Resource *res = Object::cast_to<Resource>(p_object);
- ERR_FAIL_COND(res == NULL);
- ERR_FAIL_COND(!handles(p_object));
-
- _current_ref = Ref<Resource>(Object::cast_to<Resource>(p_object));
-
- if (_current_ref.is_valid()) {
- Curve *curve = Object::cast_to<Curve>(*_current_ref);
- if (curve)
- curve_ref = Ref<Curve>(curve);
- else {
- CurveTexture *ct = Object::cast_to<CurveTexture>(*_current_ref);
- if (ct) {
- ct->connect(CoreStringNames::get_singleton()->changed, this, "_curve_texture_changed");
- curve_ref = ct->get_curve();
- }
- }
- }
+bool EditorInspectorPluginCurve::can_handle(Object *p_object) {
- } else {
- _current_ref = Ref<Resource>();
- }
-
- _view->set_curve(curve_ref);
+ return Object::cast_to<Curve>(p_object) != NULL;
}
-bool CurveEditorPlugin::handles(Object *p_object) const {
- // Both handled so that we can keep the curve editor open
- return Object::cast_to<Curve>(p_object) || Object::cast_to<CurveTexture>(p_object);
-}
+void EditorInspectorPluginCurve::parse_begin(Object *p_object) {
-void CurveEditorPlugin::make_visible(bool p_visible) {
- if (p_visible) {
- _toggle_button->show();
- _editor_node->make_bottom_panel_item_visible(_view);
- } else {
- _toggle_button->hide();
- if (_view->is_visible_in_tree())
- _editor_node->hide_bottom_panel();
- }
-}
+ Curve *curve = Object::cast_to<Curve>(p_object);
+ ERR_FAIL_COND(!curve);
+ Ref<Curve> c(curve);
-void CurveEditorPlugin::_curve_texture_changed() {
- // If the curve is shown indirectly as a CurveTexture is edited,
- // we need to monitor when the curve property gets assigned
- CurveTexture *ct = Object::cast_to<CurveTexture>(*_current_ref);
- if (ct) {
- _view->set_curve(ct->get_curve());
- }
+ CurveEditor *editor = memnew(CurveEditor);
+ editor->set_curve(curve);
+ add_custom_control(editor);
}
-void CurveEditorPlugin::_bind_methods() {
+CurveEditorPlugin::CurveEditorPlugin(EditorNode *p_node) {
+ Ref<EditorInspectorPluginCurve> curve_plugin;
+ curve_plugin.instance();
+ EditorInspector::add_inspector_plugin(curve_plugin);
- ClassDB::bind_method(D_METHOD("_curve_texture_changed"), &CurveEditorPlugin::_curve_texture_changed);
+ get_editor_interface()->get_resource_previewer()->add_preview_generator(memnew(CurvePreviewGenerator));
}
//-----------------------------------
@@ -852,13 +794,13 @@ Ref<Texture> CurvePreviewGenerator::generate(const Ref<Resource> &p_from) {
img_ref.instance();
Image &im = **img_ref;
- im.create(thumbnail_size, thumbnail_size, 0, Image::FORMAT_RGBA8);
+ im.create(thumbnail_size, thumbnail_size / 2, 0, Image::FORMAT_RGBA8);
im.lock();
Color bg_color(0.1, 0.1, 0.1, 1.0);
for (int i = 0; i < thumbnail_size; i++) {
- for (int j = 0; j < thumbnail_size; j++) {
+ for (int j = 0; j < thumbnail_size / 2; j++) {
im.set_pixel(i, j, bg_color);
}
}
diff --git a/editor/plugins/curve_editor_plugin.h b/editor/plugins/curve_editor_plugin.h
index 97f1ba2fa1..255f359ed2 100644
--- a/editor/plugins/curve_editor_plugin.h
+++ b/editor/plugins/curve_editor_plugin.h
@@ -119,28 +119,19 @@ private:
float _tangents_length;
};
+class EditorInspectorPluginCurve : public EditorInspectorPlugin {
+ GDCLASS(EditorInspectorPluginCurve, EditorInspectorPlugin)
+public:
+ virtual bool can_handle(Object *p_object);
+ virtual void parse_begin(Object *p_object);
+};
+
class CurveEditorPlugin : public EditorPlugin {
GDCLASS(CurveEditorPlugin, EditorPlugin)
public:
CurveEditorPlugin(EditorNode *p_node);
- ~CurveEditorPlugin();
String get_name() const { return "Curve"; }
- bool has_main_screen() const { return false; }
- void edit(Object *p_object);
- bool handles(Object *p_object) const;
- void make_visible(bool p_visible);
-
-private:
- static void _bind_methods();
-
- void _curve_texture_changed();
-
-private:
- CurveEditor *_view;
- Ref<Resource> _current_ref;
- EditorNode *_editor_node;
- ToolButton *_toggle_button;
};
class CurvePreviewGenerator : public EditorResourcePreviewGenerator {
diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp
index 8542296bde..d065a756b4 100644
--- a/editor/plugins/editor_preview_plugins.cpp
+++ b/editor/plugins/editor_preview_plugins.cpp
@@ -37,6 +37,7 @@
#include "io/resource_loader.h"
#include "os/os.h"
#include "scene/resources/bit_mask.h"
+#include "scene/resources/dynamic_font.h"
#include "scene/resources/material.h"
#include "scene/resources/mesh.h"
@@ -96,6 +97,7 @@ Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from) {
if (img.is_null() || img->empty())
return Ref<Texture>();
+ img = img->duplicate();
img->clear_mipmaps();
int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
@@ -467,15 +469,6 @@ Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from) {
Color text_color = EditorSettings::get_singleton()->get("text_editor/highlighting/text_color");
Color symbol_color = EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color");
- if (EditorSettings::get_singleton()->get("text_editor/theme/color_theme") == "Adaptive") {
- Ref<Theme> tm = EditorNode::get_singleton()->get_theme_base()->get_theme();
-
- bg_color = tm->get_color("text_editor/highlighting/background_color", "Editor");
- keyword_color = tm->get_color("text_editor/highlighting/keyword_color", "Editor");
- text_color = tm->get_color("text_editor/highlighting/text_color", "Editor");
- symbol_color = tm->get_color("text_editor/highlighting/symbol_color", "Editor");
- }
-
img->lock();
if (bg_color.a == 0)
@@ -942,3 +935,100 @@ EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() {
VS::get_singleton()->free(camera);
VS::get_singleton()->free(scenario);
}
+
+///////////////////////////////////////////////////////////////////////////
+
+void EditorFontPreviewPlugin::_preview_done(const Variant &p_udata) {
+
+ preview_done = true;
+}
+
+void EditorFontPreviewPlugin::_bind_methods() {
+
+ ClassDB::bind_method("_preview_done", &EditorFontPreviewPlugin::_preview_done);
+}
+
+bool EditorFontPreviewPlugin::handles(const String &p_type) const {
+
+ return ClassDB::is_parent_class(p_type, "DynamicFontData");
+}
+
+Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path) {
+ if (canvas.is_valid()) {
+ VS::get_singleton()->viewport_remove_canvas(viewport, canvas);
+ }
+
+ canvas = VS::get_singleton()->canvas_create();
+ canvas_item = VS::get_singleton()->canvas_item_create();
+
+ VS::get_singleton()->viewport_attach_canvas(viewport, canvas);
+ VS::get_singleton()->canvas_item_set_parent(canvas_item, canvas);
+
+ Ref<DynamicFontData> SampledFont;
+ SampledFont.instance();
+ SampledFont->set_font_path(p_path);
+
+ int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
+ thumbnail_size *= EDSCALE;
+
+ Ref<DynamicFont> sampled_font;
+ sampled_font.instance();
+ sampled_font->set_size(50);
+ sampled_font->set_font_data(SampledFont);
+
+ String sampled_text = "Abg";
+ Vector2 size = sampled_font->get_string_size(sampled_text);
+
+ Vector2 pos;
+
+ pos.x = 64 - size.x / 2;
+ pos.y = 80;
+
+ Ref<Font> font = sampled_font;
+
+ font->draw(canvas_item, pos, sampled_text);
+
+ VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ONCE); //once used for capture
+
+ preview_done = false;
+ VS::get_singleton()->request_frame_drawn_callback(this, "_preview_done", Variant());
+
+ while (!preview_done) {
+ OS::get_singleton()->delay_usec(10);
+ }
+
+ Ref<Image> img = VS::get_singleton()->VS::get_singleton()->texture_get_data(viewport_texture);
+ ERR_FAIL_COND_V(img.is_null(), Ref<ImageTexture>());
+
+ img->convert(Image::FORMAT_RGBA8);
+ img->resize(thumbnail_size, thumbnail_size);
+
+ post_process_preview(img);
+
+ Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));
+ ptex->create_from_image(img, 0);
+
+ return ptex;
+}
+
+Ref<Texture> EditorFontPreviewPlugin::generate(const RES &p_from) {
+
+ return generate_from_path(p_from->get_path());
+}
+
+EditorFontPreviewPlugin::EditorFontPreviewPlugin() {
+
+ viewport = VS::get_singleton()->viewport_create();
+ VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED);
+ VS::get_singleton()->viewport_set_vflip(viewport, true);
+ VS::get_singleton()->viewport_set_size(viewport, 128, 128);
+ VS::get_singleton()->viewport_set_active(viewport, true);
+ viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
+}
+
+EditorFontPreviewPlugin::~EditorFontPreviewPlugin() {
+
+ VS::get_singleton()->free(canvas_item);
+ VS::get_singleton()->free(canvas);
+ VS::get_singleton()->free(viewport);
+}
diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h
index 35b5c3a5f0..332f991b49 100644
--- a/editor/plugins/editor_preview_plugins.h
+++ b/editor/plugins/editor_preview_plugins.h
@@ -140,4 +140,27 @@ public:
~EditorMeshPreviewPlugin();
};
+class EditorFontPreviewPlugin : public EditorResourcePreviewGenerator {
+
+ GDCLASS(EditorFontPreviewPlugin, EditorResourcePreviewGenerator)
+
+ RID viewport;
+ RID viewport_texture;
+ RID canvas;
+ RID canvas_item;
+ volatile bool preview_done;
+
+ void _preview_done(const Variant &p_udata);
+
+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);
+
+ EditorFontPreviewPlugin();
+ ~EditorFontPreviewPlugin();
+};
#endif // EDITORPREVIEWPLUGINS_H
diff --git a/editor/plugins/gradient_editor_plugin.cpp b/editor/plugins/gradient_editor_plugin.cpp
index e89cb68935..442bd52ea7 100644
--- a/editor/plugins/gradient_editor_plugin.cpp
+++ b/editor/plugins/gradient_editor_plugin.cpp
@@ -33,77 +33,70 @@
#include "canvas_item_editor_plugin.h"
#include "spatial_editor_plugin.h"
-GradientEditorPlugin::GradientEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- ramp_editor = memnew(GradientEdit);
-
- 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");
+Size2 GradientEditor::get_minimum_size() const {
+ return Size2(0, 60) * EDSCALE;
}
+void GradientEditor::_gradient_changed() {
-void GradientEditorPlugin::edit(Object *p_object) {
-
- Gradient *gradient = Object::cast_to<Gradient>(p_object);
- if (!gradient)
+ if (editing)
return;
- gradient_ref = Ref<Gradient>(gradient);
- ramp_editor->set_points(gradient_ref->get_points());
-}
-bool GradientEditorPlugin::handles(Object *p_object) const {
+ editing = true;
+ Vector<Gradient::Point> points = gradient->get_points();
+ set_points(points);
+ editing = false;
+}
- return p_object->is_class("Gradient");
+void GradientEditor::_ramp_changed() {
+
+ editing = true;
+ UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
+ undo_redo->create_action("Gradient Edited");
+ undo_redo->add_do_method(gradient.ptr(), "set_offsets", get_offsets());
+ undo_redo->add_do_method(gradient.ptr(), "set_colors", get_colors());
+ undo_redo->add_undo_method(gradient.ptr(), "set_offsets", gradient->get_offsets());
+ undo_redo->add_undo_method(gradient.ptr(), "set_colors", gradient->get_colors());
+ undo_redo->commit_action();
+ editing = false;
}
-void GradientEditorPlugin::make_visible(bool p_visible) {
+void GradientEditor::_bind_methods() {
- if (p_visible) {
- ramp_editor->show();
- } else {
- ramp_editor->hide();
- }
+ ClassDB::bind_method("_gradient_changed", &GradientEditor::_gradient_changed);
+ ClassDB::bind_method("_ramp_changed", &GradientEditor::_ramp_changed);
}
-void GradientEditorPlugin::_ramp_changed() {
-
- if (gradient_ref.is_valid()) {
+void GradientEditor::set_gradient(const Ref<Gradient> &p_gradient) {
+ gradient = p_gradient;
+ connect("ramp_changed", this, "_ramp_changed");
+ gradient->connect("changed", this, "_gradient_changed");
+ set_points(gradient->get_points());
+}
- UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
+GradientEditor::GradientEditor() {
+ editing = false;
+}
- //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 = gradient_ref->get_offsets();
- Vector<Color> old_colors = gradient_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_gradient", new_offsets, new_colors);
- ur->add_undo_method(this, "undo_redo_gradient", old_offsets, old_colors);
- ur->commit_action();
+bool EditorInspectorPluginGradient::can_handle(Object *p_object) {
- //color_ramp_ref->set_points(ramp_editor->get_points());
- }
+ return Object::cast_to<Gradient>(p_object) != NULL;
}
-void GradientEditorPlugin::_undo_redo_gradient(const Vector<float> &offsets, const Vector<Color> &colors) {
+void EditorInspectorPluginGradient::parse_begin(Object *p_object) {
- gradient_ref->set_offsets(offsets);
- gradient_ref->set_colors(colors);
- ramp_editor->set_points(gradient_ref->get_points());
- ramp_editor->update();
-}
+ Gradient *gradient = Object::cast_to<Gradient>(p_object);
+ Ref<Gradient> g(gradient);
-GradientEditorPlugin::~GradientEditorPlugin() {
+ GradientEditor *editor = memnew(GradientEditor);
+ editor->set_gradient(g);
+ add_custom_control(editor);
}
-void GradientEditorPlugin::_bind_methods() {
- ClassDB::bind_method(D_METHOD("ramp_changed"), &GradientEditorPlugin::_ramp_changed);
- ClassDB::bind_method(D_METHOD("undo_redo_gradient", "offsets", "colors"), &GradientEditorPlugin::_undo_redo_gradient);
+GradientEditorPlugin::GradientEditorPlugin(EditorNode *p_node) {
+
+ Ref<EditorInspectorPluginGradient> plugin;
+ plugin.instance();
+ add_inspector_plugin(plugin);
}
diff --git a/editor/plugins/gradient_editor_plugin.h b/editor/plugins/gradient_editor_plugin.h
index 52f4c59575..0c878b168f 100644
--- a/editor/plugins/gradient_editor_plugin.h
+++ b/editor/plugins/gradient_editor_plugin.h
@@ -35,28 +35,39 @@
#include "editor/editor_plugin.h"
#include "scene/gui/gradient_edit.h"
-class GradientEditorPlugin : public EditorPlugin {
+class GradientEditor : public GradientEdit {
+ GDCLASS(GradientEditor, GradientEdit)
- GDCLASS(GradientEditorPlugin, EditorPlugin);
+ bool editing;
+ Ref<Gradient> gradient;
- Ref<Gradient> gradient_ref;
- GradientEdit *ramp_editor;
- EditorNode *editor;
+ void _gradient_changed();
+ void _ramp_changed();
protected:
static void _bind_methods();
- void _ramp_changed();
- void _undo_redo_gradient(const Vector<float> &offsets, const Vector<Color> &colors);
+
+public:
+ virtual Size2 get_minimum_size() const;
+ void set_gradient(const Ref<Gradient> &p_gradient);
+ GradientEditor();
+};
+
+class EditorInspectorPluginGradient : public EditorInspectorPlugin {
+ GDCLASS(EditorInspectorPluginGradient, EditorInspectorPlugin)
+public:
+ virtual bool can_handle(Object *p_object);
+ virtual void parse_begin(Object *p_object);
+};
+
+class GradientEditorPlugin : public EditorPlugin {
+
+ GDCLASS(GradientEditorPlugin, EditorPlugin);
public:
virtual String get_name() const { return "ColorRamp"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
GradientEditorPlugin(EditorNode *p_node);
- ~GradientEditorPlugin();
};
#endif /* TOOLS_EDITOR_PLUGINS_COLOR_RAMP_EDITOR_PLUGIN_H_ */
diff --git a/editor/plugins/item_list_editor_plugin.cpp b/editor/plugins/item_list_editor_plugin.cpp
index 8b44f672b0..f75fb0d109 100644
--- a/editor/plugins/item_list_editor_plugin.cpp
+++ b/editor/plugins/item_list_editor_plugin.cpp
@@ -388,7 +388,7 @@ ItemListEditor::ItemListEditor() {
vbc->add_child(property_editor);
property_editor->set_v_size_flags(SIZE_EXPAND_FILL);
- tree = property_editor->get_scene_tree();
+ tree = property_editor->get_property_tree();
}
ItemListEditor::~ItemListEditor() {
diff --git a/editor/plugins/line_2d_editor_plugin.cpp b/editor/plugins/line_2d_editor_plugin.cpp
index 47d5a73078..ba6452c1d1 100644
--- a/editor/plugins/line_2d_editor_plugin.cpp
+++ b/editor/plugins/line_2d_editor_plugin.cpp
@@ -64,6 +64,7 @@ void Line2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, con
Line2DEditor::Line2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
+ node = NULL;
}
Line2DEditorPlugin::Line2DEditorPlugin(EditorNode *p_node) :
diff --git a/editor/plugins/navigation_mesh_editor_plugin.cpp b/editor/plugins/navigation_mesh_editor_plugin.cpp
deleted file mode 100644
index da3c744324..0000000000
--- a/editor/plugins/navigation_mesh_editor_plugin.cpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/*************************************************************************/
-/* navigation_mesh_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* 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_mesh_editor_plugin.h"
-#include "io/marshalls.h"
-#include "io/resource_saver.h"
-#include "scene/3d/mesh_instance.h"
-#include "scene/gui/box_container.h"
-
-#ifdef RECAST_ENABLED
-
-void NavigationMeshEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
-
- hide();
- }
-}
-
-void NavigationMeshEditor::_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"));
- }
-}
-
-void NavigationMeshEditor::_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;
- }
-
- NavigationMeshGenerator::clear(node->get_navigation_mesh());
- NavigationMeshGenerator::bake(node->get_navigation_mesh(), node);
-
- if (node) {
- node->update_gizmo();
- }
-}
-
-void NavigationMeshEditor::_clear_pressed() {
-
- if (node)
- NavigationMeshGenerator::clear(node->get_navigation_mesh());
-
- button_bake->set_pressed(false);
- bake_info->set_text("");
-
- if (node) {
- node->update_gizmo();
- }
-}
-
-void NavigationMeshEditor::edit(NavigationMeshInstance *p_nav_mesh_instance) {
-
- if (p_nav_mesh_instance == NULL || node == p_nav_mesh_instance) {
- return;
- }
-
- node = p_nav_mesh_instance;
-}
-
-void NavigationMeshEditor::_bind_methods() {
-
- ClassDB::bind_method("_bake_pressed", &NavigationMeshEditor::_bake_pressed);
- ClassDB::bind_method("_clear_pressed", &NavigationMeshEditor::_clear_pressed);
-}
-
-NavigationMeshEditor::NavigationMeshEditor() {
-
- 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_bake->set_tooltip(TTR("Bake the navigation mesh.") + "\n");
-
- 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;
-
- button_bake->connect("pressed", this, "_bake_pressed");
- button_reset->connect("pressed", this, "_clear_pressed");
- button_reset->set_tooltip(TTR("Clear the navigation mesh."));
-}
-
-NavigationMeshEditor::~NavigationMeshEditor() {
-}
-
-void NavigationMeshEditorPlugin::edit(Object *p_object) {
-
- navigation_mesh_editor->edit(Object::cast_to<NavigationMeshInstance>(p_object));
-}
-
-bool NavigationMeshEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("NavigationMeshInstance");
-}
-
-void NavigationMeshEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- navigation_mesh_editor->show();
- navigation_mesh_editor->bake_hbox->show();
- } else {
-
- navigation_mesh_editor->hide();
- navigation_mesh_editor->bake_hbox->hide();
- navigation_mesh_editor->edit(NULL);
- }
-}
-
-NavigationMeshEditorPlugin::NavigationMeshEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- navigation_mesh_editor = memnew(NavigationMeshEditor);
- editor->get_viewport()->add_child(navigation_mesh_editor);
- add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, navigation_mesh_editor->bake_hbox);
- navigation_mesh_editor->hide();
- navigation_mesh_editor->bake_hbox->hide();
-}
-
-NavigationMeshEditorPlugin::~NavigationMeshEditorPlugin() {
-}
-
-#endif // RECAST_ENABLED
diff --git a/editor/plugins/navigation_mesh_editor_plugin.h b/editor/plugins/navigation_mesh_editor_plugin.h
deleted file mode 100644
index 9382467d85..0000000000
--- a/editor/plugins/navigation_mesh_editor_plugin.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*************************************************************************/
-/* navigation_mesh_editor_plugin.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* 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 NAVIGATION_MESH_GENERATOR_PLUGIN_H
-#define NAVIGATION_MESH_GENERATOR_PLUGIN_H
-
-#ifdef RECAST_ENABLED
-
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
-#include "navigation_mesh_generator.h"
-
-class NavigationMeshEditor : public Control {
- friend class NavigationMeshEditorPlugin;
-
- GDCLASS(NavigationMeshEditor, Control);
-
- AcceptDialog *err_dialog;
-
- HBoxContainer *bake_hbox;
- Button *button_bake;
- Button *button_reset;
- Label *bake_info;
-
- NavigationMeshInstance *node;
-
- void _bake_pressed();
- void _clear_pressed();
-
-protected:
- void _node_removed(Node *p_node);
- static void _bind_methods();
- void _notification(int p_option);
-
-public:
- void edit(NavigationMeshInstance *p_nav_mesh_instance);
- NavigationMeshEditor();
- ~NavigationMeshEditor();
-};
-
-class NavigationMeshEditorPlugin : public EditorPlugin {
-
- GDCLASS(NavigationMeshEditorPlugin, EditorPlugin);
-
- NavigationMeshEditor *navigation_mesh_editor;
- EditorNode *editor;
-
-public:
- virtual String get_name() const { return "NavigationMesh"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
- NavigationMeshEditorPlugin(EditorNode *p_node);
- ~NavigationMeshEditorPlugin();
-};
-
-#endif // RECAST_ENABLED
-#endif // NAVIGATION_MESH_GENERATOR_PLUGIN_H
diff --git a/editor/plugins/navigation_mesh_generator.cpp b/editor/plugins/navigation_mesh_generator.cpp
deleted file mode 100644
index 0537c5c31f..0000000000
--- a/editor/plugins/navigation_mesh_generator.cpp
+++ /dev/null
@@ -1,308 +0,0 @@
-/*************************************************************************/
-/* navigation_mesh_generator.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* 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_mesh_generator.h"
-
-#ifdef RECAST_ENABLED
-
-void NavigationMeshGenerator::_add_vertex(const Vector3 &p_vec3, Vector<float> &p_verticies) {
- p_verticies.push_back(p_vec3.x);
- p_verticies.push_back(p_vec3.y);
- p_verticies.push_back(p_vec3.z);
-}
-
-void NavigationMeshGenerator::_add_mesh(const Ref<Mesh> &p_mesh, const Transform &p_xform, Vector<float> &p_verticies, Vector<int> &p_indices) {
- int current_vertex_count = 0;
-
- for (int i = 0; i < p_mesh->get_surface_count(); i++) {
- current_vertex_count = p_verticies.size() / 3;
-
- if (p_mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES)
- continue;
-
- int index_count = 0;
- if (p_mesh->surface_get_format(i) & Mesh::ARRAY_FORMAT_INDEX) {
- index_count = p_mesh->surface_get_array_index_len(i);
- } else {
- index_count = p_mesh->surface_get_array_len(i);
- }
-
- ERR_CONTINUE((index_count == 0 || (index_count % 3) != 0));
-
- int face_count = index_count / 3;
-
- Array a = p_mesh->surface_get_arrays(i);
-
- PoolVector<Vector3> mesh_vertices = a[Mesh::ARRAY_VERTEX];
- PoolVector<Vector3>::Read vr = mesh_vertices.read();
-
- if (p_mesh->surface_get_format(i) & Mesh::ARRAY_FORMAT_INDEX) {
-
- PoolVector<int> mesh_indices = a[Mesh::ARRAY_INDEX];
- PoolVector<int>::Read ir = mesh_indices.read();
-
- for (int i = 0; i < mesh_vertices.size(); i++) {
- _add_vertex(p_xform.xform(vr[i]), p_verticies);
- }
-
- for (int i = 0; i < face_count; i++) {
- // CCW
- p_indices.push_back(current_vertex_count + (ir[i * 3 + 0]));
- p_indices.push_back(current_vertex_count + (ir[i * 3 + 2]));
- p_indices.push_back(current_vertex_count + (ir[i * 3 + 1]));
- }
- } else {
- face_count = mesh_vertices.size() / 3;
- for (int i = 0; i < face_count; i++) {
- _add_vertex(p_xform.xform(vr[i * 3 + 0]), p_verticies);
- _add_vertex(p_xform.xform(vr[i * 3 + 2]), p_verticies);
- _add_vertex(p_xform.xform(vr[i * 3 + 1]), p_verticies);
-
- p_indices.push_back(current_vertex_count + (i * 3 + 0));
- p_indices.push_back(current_vertex_count + (i * 3 + 1));
- p_indices.push_back(current_vertex_count + (i * 3 + 2));
- }
- }
- }
-}
-
-void NavigationMeshGenerator::_parse_geometry(const Transform &p_base_inverse, Node *p_node, Vector<float> &p_verticies, Vector<int> &p_indices) {
-
- if (Object::cast_to<MeshInstance>(p_node)) {
-
- MeshInstance *mesh_instance = Object::cast_to<MeshInstance>(p_node);
- Ref<Mesh> mesh = mesh_instance->get_mesh();
- if (mesh.is_valid()) {
- _add_mesh(mesh, p_base_inverse * mesh_instance->get_global_transform(), p_verticies, p_indices);
- }
- }
-
- for (int i = 0; i < p_node->get_child_count(); i++) {
- _parse_geometry(p_base_inverse, p_node->get_child(i), p_verticies, p_indices);
- }
-}
-
-void NavigationMeshGenerator::_convert_detail_mesh_to_native_navigation_mesh(const rcPolyMeshDetail *p_detail_mesh, Ref<NavigationMesh> p_nav_mesh) {
-
- PoolVector<Vector3> nav_vertices;
-
- for (int i = 0; i < p_detail_mesh->nverts; i++) {
- const float *v = &p_detail_mesh->verts[i * 3];
- nav_vertices.append(Vector3(v[0], v[1], v[2]));
- }
- p_nav_mesh->set_vertices(nav_vertices);
-
- for (int i = 0; i < p_detail_mesh->nmeshes; i++) {
- const unsigned int *m = &p_detail_mesh->meshes[i * 4];
- const unsigned int bverts = m[0];
- const unsigned int btris = m[2];
- const unsigned int ntris = m[3];
- const unsigned char *tris = &p_detail_mesh->tris[btris * 4];
- for (unsigned int j = 0; j < ntris; j++) {
- Vector<int> nav_indices;
- nav_indices.resize(3);
- nav_indices[0] = ((int)(bverts + tris[j * 4 + 0]));
- nav_indices[1] = ((int)(bverts + tris[j * 4 + 1]));
- nav_indices[2] = ((int)(bverts + tris[j * 4 + 2]));
- p_nav_mesh->add_polygon(nav_indices);
- }
- }
-}
-
-void NavigationMeshGenerator::_build_recast_navigation_mesh(Ref<NavigationMesh> p_nav_mesh, EditorProgress *ep,
- rcHeightfield *hf, rcCompactHeightfield *chf, rcContourSet *cset, rcPolyMesh *poly_mesh, rcPolyMeshDetail *detail_mesh,
- Vector<float> &vertices, Vector<int> &indices) {
- rcContext ctx;
- ep->step(TTR("Setting up Configuration..."), 1);
-
- const float *verts = vertices.ptr();
- const int nverts = vertices.size() / 3;
- const int *tris = indices.ptr();
- const int ntris = indices.size() / 3;
-
- float bmin[3], bmax[3];
- rcCalcBounds(verts, nverts, bmin, bmax);
-
- rcConfig cfg;
- memset(&cfg, 0, sizeof(cfg));
-
- cfg.cs = p_nav_mesh->get_cell_size();
- cfg.ch = p_nav_mesh->get_cell_height();
- cfg.walkableSlopeAngle = p_nav_mesh->get_agent_max_slope();
- cfg.walkableHeight = (int)Math::ceil(p_nav_mesh->get_agent_height() / cfg.ch);
- cfg.walkableClimb = (int)Math::floor(p_nav_mesh->get_agent_max_climb() / cfg.ch);
- cfg.walkableRadius = (int)Math::ceil(p_nav_mesh->get_agent_radius() / cfg.cs);
- cfg.maxEdgeLen = (int)(p_nav_mesh->get_edge_max_length() / p_nav_mesh->get_cell_size());
- cfg.maxSimplificationError = p_nav_mesh->get_edge_max_error();
- cfg.minRegionArea = (int)(p_nav_mesh->get_region_min_size() * p_nav_mesh->get_region_min_size());
- cfg.mergeRegionArea = (int)(p_nav_mesh->get_region_merge_size() * p_nav_mesh->get_region_merge_size());
- cfg.maxVertsPerPoly = (int)p_nav_mesh->get_verts_per_poly();
- cfg.detailSampleDist = p_nav_mesh->get_detail_sample_distance() < 0.9f ? 0 : p_nav_mesh->get_cell_size() * p_nav_mesh->get_detail_sample_distance();
- cfg.detailSampleMaxError = p_nav_mesh->get_cell_height() * p_nav_mesh->get_detail_sample_max_error();
-
- cfg.bmin[0] = bmin[0];
- cfg.bmin[1] = bmin[1];
- cfg.bmin[2] = bmin[2];
- cfg.bmax[0] = bmax[0];
- cfg.bmax[1] = bmax[1];
- cfg.bmax[2] = bmax[2];
-
- ep->step(TTR("Calculating grid size..."), 2);
- rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height);
-
- ep->step(TTR("Creating heightfield..."), 3);
- hf = rcAllocHeightfield();
-
- ERR_FAIL_COND(!hf);
- ERR_FAIL_COND(!rcCreateHeightfield(&ctx, *hf, cfg.width, cfg.height, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch));
-
- ep->step(TTR("Marking walkable triangles..."), 4);
- {
- Vector<unsigned char> tri_areas;
- tri_areas.resize(ntris);
-
- ERR_FAIL_COND(tri_areas.size() == 0);
-
- memset(tri_areas.ptrw(), 0, ntris * sizeof(unsigned char));
- rcMarkWalkableTriangles(&ctx, cfg.walkableSlopeAngle, verts, nverts, tris, ntris, tri_areas.ptrw());
-
- ERR_FAIL_COND(!rcRasterizeTriangles(&ctx, verts, nverts, tris, tri_areas.ptr(), ntris, *hf, cfg.walkableClimb));
- }
-
- if (p_nav_mesh->get_filter_low_hanging_obstacles())
- rcFilterLowHangingWalkableObstacles(&ctx, cfg.walkableClimb, *hf);
- if (p_nav_mesh->get_filter_ledge_spans())
- rcFilterLedgeSpans(&ctx, cfg.walkableHeight, cfg.walkableClimb, *hf);
- if (p_nav_mesh->get_filter_walkable_low_height_spans())
- rcFilterWalkableLowHeightSpans(&ctx, cfg.walkableHeight, *hf);
-
- ep->step(TTR("Constructing compact heightfield..."), 5);
-
- chf = rcAllocCompactHeightfield();
-
- ERR_FAIL_COND(!chf);
- ERR_FAIL_COND(!rcBuildCompactHeightfield(&ctx, cfg.walkableHeight, cfg.walkableClimb, *hf, *chf));
-
- rcFreeHeightField(hf);
- hf = 0;
-
- ep->step(TTR("Eroding walkable area..."), 6);
- ERR_FAIL_COND(!rcErodeWalkableArea(&ctx, cfg.walkableRadius, *chf));
-
- ep->step(TTR("Partitioning..."), 7);
- if (p_nav_mesh->get_sample_partition_type() == NavigationMesh::SAMPLE_PARTITION_WATERSHED) {
- ERR_FAIL_COND(!rcBuildDistanceField(&ctx, *chf));
- ERR_FAIL_COND(!rcBuildRegions(&ctx, *chf, 0, cfg.minRegionArea, cfg.mergeRegionArea));
- } else if (p_nav_mesh->get_sample_partition_type() == NavigationMesh::SAMPLE_PARTITION_MONOTONE) {
- ERR_FAIL_COND(!rcBuildRegionsMonotone(&ctx, *chf, 0, cfg.minRegionArea, cfg.mergeRegionArea));
- } else {
- ERR_FAIL_COND(!rcBuildLayerRegions(&ctx, *chf, 0, cfg.minRegionArea));
- }
-
- ep->step(TTR("Creating contours..."), 8);
-
- cset = rcAllocContourSet();
-
- ERR_FAIL_COND(!cset);
- ERR_FAIL_COND(!rcBuildContours(&ctx, *chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset));
-
- ep->step(TTR("Creating polymesh..."), 9);
-
- poly_mesh = rcAllocPolyMesh();
- ERR_FAIL_COND(!poly_mesh);
- ERR_FAIL_COND(!rcBuildPolyMesh(&ctx, *cset, cfg.maxVertsPerPoly, *poly_mesh));
-
- detail_mesh = rcAllocPolyMeshDetail();
- ERR_FAIL_COND(!detail_mesh);
- ERR_FAIL_COND(!rcBuildPolyMeshDetail(&ctx, *poly_mesh, *chf, cfg.detailSampleDist, cfg.detailSampleMaxError, *detail_mesh));
-
- rcFreeCompactHeightfield(chf);
- chf = 0;
- rcFreeContourSet(cset);
- cset = 0;
-
- ep->step(TTR("Converting to native navigation mesh..."), 10);
-
- _convert_detail_mesh_to_native_navigation_mesh(detail_mesh, p_nav_mesh);
-
- rcFreePolyMesh(poly_mesh);
- poly_mesh = 0;
- rcFreePolyMeshDetail(detail_mesh);
- detail_mesh = 0;
-}
-
-void NavigationMeshGenerator::bake(Ref<NavigationMesh> p_nav_mesh, Node *p_node) {
-
- ERR_FAIL_COND(!p_nav_mesh.is_valid());
-
- EditorProgress ep("bake", TTR("Navigation Mesh Generator Setup:"), 11);
- ep.step(TTR("Parsing Geometry..."), 0);
-
- Vector<float> vertices;
- Vector<int> indices;
-
- _parse_geometry(Object::cast_to<Spatial>(p_node)->get_global_transform().affine_inverse(), p_node, vertices, indices);
-
- if (vertices.size() > 0 && indices.size() > 0) {
-
- rcHeightfield *hf = NULL;
- rcCompactHeightfield *chf = NULL;
- rcContourSet *cset = NULL;
- rcPolyMesh *poly_mesh = NULL;
- rcPolyMeshDetail *detail_mesh = NULL;
-
- _build_recast_navigation_mesh(p_nav_mesh, &ep, hf, chf, cset, poly_mesh, detail_mesh, vertices, indices);
-
- rcFreeHeightField(hf);
- hf = 0;
-
- rcFreeCompactHeightfield(chf);
- chf = 0;
-
- rcFreeContourSet(cset);
- cset = 0;
-
- rcFreePolyMesh(poly_mesh);
- poly_mesh = 0;
-
- rcFreePolyMeshDetail(detail_mesh);
- detail_mesh = 0;
- }
- ep.step(TTR("Done!"), 11);
-}
-
-void NavigationMeshGenerator::clear(Ref<NavigationMesh> p_nav_mesh) {
- if (p_nav_mesh.is_valid()) {
- p_nav_mesh->clear_polygons();
- p_nav_mesh->set_vertices(PoolVector<Vector3>());
- }
-}
-
-#endif //RECAST_ENABLED
diff --git a/editor/plugins/navigation_mesh_generator.h b/editor/plugins/navigation_mesh_generator.h
deleted file mode 100644
index d26f541b8d..0000000000
--- a/editor/plugins/navigation_mesh_generator.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*************************************************************************/
-/* navigation_mesh_generator.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* 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 NAVIGATION_MESH_GENERATOR_H
-#define NAVIGATION_MESH_GENERATOR_H
-
-#ifdef RECAST_ENABLED
-
-#include "editor/editor_node.h"
-#include "editor/editor_settings.h"
-
-#include "scene/3d/mesh_instance.h"
-
-#include "scene/3d/navigation_mesh.h"
-
-#include "os/thread.h"
-#include "scene/resources/shape.h"
-
-#include <Recast.h>
-
-class NavigationMeshGenerator {
-protected:
- static void _add_vertex(const Vector3 &p_vec3, Vector<float> &p_verticies);
- static void _add_mesh(const Ref<Mesh> &p_mesh, const Transform &p_xform, Vector<float> &p_verticies, Vector<int> &p_indices);
- static void _parse_geometry(const Transform &p_base_inverse, Node *p_node, Vector<float> &p_verticies, Vector<int> &p_indices);
-
- static void _convert_detail_mesh_to_native_navigation_mesh(const rcPolyMeshDetail *p_detail_mesh, Ref<NavigationMesh> p_nav_mesh);
- static void _build_recast_navigation_mesh(Ref<NavigationMesh> p_nav_mesh, EditorProgress *ep,
- rcHeightfield *hf, rcCompactHeightfield *chf, rcContourSet *cset, rcPolyMesh *poly_mesh,
- rcPolyMeshDetail *detail_mesh, Vector<float> &vertices, Vector<int> &indices);
-
-public:
- static void bake(Ref<NavigationMesh> p_nav_mesh, Node *p_node);
- static void clear(Ref<NavigationMesh> p_nav_mesh);
-};
-
-#endif // RECAST_ENABLED
-
-#endif // NAVIGATION_MESH_GENERATOR_H
diff --git a/editor/plugins/navigation_polygon_editor_plugin.cpp b/editor/plugins/navigation_polygon_editor_plugin.cpp
index d1edf1ae10..0332e15b0e 100644
--- a/editor/plugins/navigation_polygon_editor_plugin.cpp
+++ b/editor/plugins/navigation_polygon_editor_plugin.cpp
@@ -123,6 +123,7 @@ void NavigationPolygonEditor::_create_resource() {
NavigationPolygonEditor::NavigationPolygonEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
+ node = NULL;
}
NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin(EditorNode *p_node) :
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index f04e0a801c..ed41e1931e 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -1035,6 +1035,7 @@ Vector2 Polygon2DEditor::snap_point(Vector2 p_target) const {
Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
+ node = NULL;
snap_step = Vector2(10, 10);
use_snap = false;
snap_show_grid = false;
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index fa674e1e34..3c0cc589dc 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -1182,12 +1182,13 @@ void ScriptEditor::_notification(int p_what) {
script_forward->set_icon(get_icon("Forward", "EditorIcons"));
script_back->set_icon(get_icon("Back", "EditorIcons"));
+ members_overview_alphabeta_sort_button->set_icon(get_icon("Sort", "EditorIcons"));
} break;
case NOTIFICATION_READY: {
get_tree()->connect("tree_changed", this, "_tree_changed");
- editor->connect("request_help", this, "_request_help");
+ editor->get_inspector_dock()->connect("request_help", this, "_request_help");
editor->connect("request_help_search", this, "_help_search");
editor->connect("request_help_index", this, "_help_index");
} break;
@@ -1403,17 +1404,25 @@ void ScriptEditor::_update_members_overview_visibility() {
ScriptEditorBase *se = _get_current_editor();
if (!se) {
+ members_overview_alphabeta_sort_button->set_visible(false);
members_overview->set_visible(false);
return;
}
if (members_overview_enabled && se->show_members_overview()) {
+ members_overview_alphabeta_sort_button->set_visible(true);
members_overview->set_visible(true);
} else {
+ members_overview_alphabeta_sort_button->set_visible(false);
members_overview->set_visible(false);
}
}
+void ScriptEditor::_toggle_members_overview_alpha_sort(bool p_alphabetic_sort) {
+ EditorSettings::get_singleton()->set("text_editor/tools/sort_members_outline_alphabetically", p_alphabetic_sort);
+ _update_members_overview();
+}
+
void ScriptEditor::_update_members_overview() {
members_overview->clear();
@@ -1423,10 +1432,19 @@ void ScriptEditor::_update_members_overview() {
}
Vector<String> functions = se->get_functions();
+ if (EditorSettings::get_singleton()->get("text_editor/tools/sort_members_outline_alphabetically")) {
+ functions.sort();
+ }
+
for (int i = 0; i < functions.size(); i++) {
members_overview->add_item(functions[i].get_slice(":", 0));
members_overview->set_item_metadata(i, functions[i].get_slice(":", 1).to_int() - 1);
}
+
+ String path = se->get_edited_script()->get_path();
+ bool built_in = !path.is_resource_file();
+ String name = built_in ? path.get_file() : se->get_name();
+ filename->set_text(name);
}
void ScriptEditor::_update_help_overview_visibility() {
@@ -1445,7 +1463,9 @@ void ScriptEditor::_update_help_overview_visibility() {
}
if (help_overview_enabled) {
+ members_overview_alphabeta_sort_button->set_visible(false);
help_overview->set_visible(true);
+ filename->set_text(se->get_name());
} else {
help_overview->set_visible(false);
}
@@ -1536,9 +1556,10 @@ void ScriptEditor::_update_script_names() {
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
if (se) {
- String name = se->get_name();
Ref<Texture> icon = se->get_icon();
String path = se->get_edited_script()->get_path();
+ bool built_in = !path.is_resource_file();
+ String name = built_in ? path.get_file() : se->get_name();
_ScriptEditorItemData sd;
sd.icon = icon;
@@ -2596,6 +2617,8 @@ void ScriptEditor::_bind_methods() {
ClassDB::bind_method("_live_auto_reload_running_scripts", &ScriptEditor::_live_auto_reload_running_scripts);
ClassDB::bind_method("_unhandled_input", &ScriptEditor::_unhandled_input);
ClassDB::bind_method("_script_list_gui_input", &ScriptEditor::_script_list_gui_input);
+ ClassDB::bind_method("_toggle_members_overview_alpha_sort", &ScriptEditor::_toggle_members_overview_alpha_sort);
+ ClassDB::bind_method("_update_members_overview", &ScriptEditor::_update_members_overview);
ClassDB::bind_method("_script_changed", &ScriptEditor::_script_changed);
ClassDB::bind_method("_update_recent_scripts", &ScriptEditor::_update_recent_scripts);
ClassDB::bind_method("_on_find_in_files_requested", &ScriptEditor::_on_find_in_files_requested);
@@ -2656,14 +2679,39 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
add_child(context_menu);
context_menu->connect("id_pressed", this, "_menu_option");
+ members_overview_vbox = memnew(VBoxContainer);
+ members_overview_vbox->set_custom_minimum_size(Size2(0, 90));
+ members_overview_vbox->set_v_size_flags(SIZE_EXPAND_FILL);
+
+ list_split->add_child(members_overview_vbox);
+ members_overview_buttons_hbox = memnew(HBoxContainer);
+ members_overview_vbox->add_child(members_overview_buttons_hbox);
+
+ filename = memnew(Label);
+ filename->set_clip_text(true);
+ filename->set_h_size_flags(SIZE_EXPAND_FILL);
+ filename->add_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_stylebox("normal", "LineEdit"));
+ members_overview_buttons_hbox->add_child(filename);
+
+ members_overview_alphabeta_sort_button = memnew(ToolButton);
+ members_overview_alphabeta_sort_button->set_tooltip(TTR("Toggle alphabetical sorting of the method list."));
+ members_overview_alphabeta_sort_button->set_toggle_mode(true);
+ members_overview_alphabeta_sort_button->set_pressed(EditorSettings::get_singleton()->get("text_editor/tools/sort_members_outline_alphabetically"));
+ members_overview_alphabeta_sort_button->connect("toggled", this, "_toggle_members_overview_alpha_sort");
+
+ members_overview_buttons_hbox->add_child(members_overview_alphabeta_sort_button);
+
members_overview = memnew(ItemList);
- list_split->add_child(members_overview);
+ members_overview_vbox->add_child(members_overview);
+
members_overview->set_allow_reselect(true);
members_overview->set_custom_minimum_size(Size2(0, 90)); //need to give a bit of limit to avoid it from disappearing
members_overview->set_v_size_flags(SIZE_EXPAND_FILL);
+ members_overview->set_allow_rmb_select(true);
+ members_overview->set_drag_forwarding(this);
help_overview = memnew(ItemList);
- list_split->add_child(help_overview);
+ members_overview_vbox->add_child(help_overview);
help_overview->set_allow_reselect(true);
help_overview->set_custom_minimum_size(Size2(0, 90)); //need to give a bit of limit to avoid it from disappearing
help_overview->set_v_size_flags(SIZE_EXPAND_FILL);
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
index 9f37b18d7d..3707f39d11 100644
--- a/editor/plugins/script_editor_plugin.h
+++ b/editor/plugins/script_editor_plugin.h
@@ -199,6 +199,10 @@ class ScriptEditor : public PanelContainer {
ItemList *script_list;
HSplitContainer *script_split;
ItemList *members_overview;
+ VBoxContainer *members_overview_vbox;
+ HBoxContainer *members_overview_buttons_hbox;
+ Label *filename;
+ ToolButton *members_overview_alphabeta_sort_button;
bool members_overview_enabled;
ItemList *help_overview;
bool help_overview_enabled;
@@ -318,6 +322,7 @@ class ScriptEditor : public PanelContainer {
void _update_members_overview_visibility();
void _update_members_overview();
+ void _toggle_members_overview_alpha_sort(bool p_alphabetic_sort);
void _update_script_names();
bool _sort_list_on_update;
diff --git a/editor/plugins/skeleton_2d_editor_plugin.cpp b/editor/plugins/skeleton_2d_editor_plugin.cpp
index e372f792d6..08bfebefbd 100644
--- a/editor/plugins/skeleton_2d_editor_plugin.cpp
+++ b/editor/plugins/skeleton_2d_editor_plugin.cpp
@@ -1,3 +1,33 @@
+/*************************************************************************/
+/* skeleton_2d_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* 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 "skeleton_2d_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
diff --git a/editor/plugins/skeleton_2d_editor_plugin.h b/editor/plugins/skeleton_2d_editor_plugin.h
index bbe2a3a6f2..26ab4328b0 100644
--- a/editor/plugins/skeleton_2d_editor_plugin.h
+++ b/editor/plugins/skeleton_2d_editor_plugin.h
@@ -1,3 +1,33 @@
+/*************************************************************************/
+/* skeleton_2d_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* 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 SKELETON_2D_EDITOR_PLUGIN_H
#define SKELETON_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/sprite_editor_plugin.cpp b/editor/plugins/sprite_editor_plugin.cpp
index 49816fe2ae..66673cca00 100644
--- a/editor/plugins/sprite_editor_plugin.cpp
+++ b/editor/plugins/sprite_editor_plugin.cpp
@@ -1,3 +1,33 @@
+/*************************************************************************/
+/* sprite_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* 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_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
diff --git a/editor/plugins/sprite_editor_plugin.h b/editor/plugins/sprite_editor_plugin.h
index 17aa3eb1f9..238227e4a0 100644
--- a/editor/plugins/sprite_editor_plugin.h
+++ b/editor/plugins/sprite_editor_plugin.h
@@ -1,3 +1,33 @@
+/*************************************************************************/
+/* sprite_editor_plugin.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* 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_EDITOR_PLUGIN_H
#define SPRITE_EDITOR_PLUGIN_H
diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp
index f4faab69ed..f6d98cb4c7 100644
--- a/editor/plugins/style_box_editor_plugin.cpp
+++ b/editor/plugins/style_box_editor_plugin.cpp
@@ -30,7 +30,26 @@
#include "style_box_editor_plugin.h"
-void StyleBoxEditor::edit(const Ref<StyleBox> &p_stylebox) {
+bool EditorInspectorPluginStyleBox::can_handle(Object *p_object) {
+
+ return Object::cast_to<StyleBox>(p_object) != NULL;
+}
+
+void EditorInspectorPluginStyleBox::parse_begin(Object *p_object) {
+
+ Ref<StyleBox> sb = Ref<StyleBox>(Object::cast_to<StyleBox>(p_object));
+
+ StyleBoxPreview *preview = memnew(StyleBoxPreview);
+ preview->edit(sb);
+ add_custom_control(preview);
+}
+bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
+ return false; //do not want
+}
+void EditorInspectorPluginStyleBox::parse_end() {
+}
+
+void StyleBoxPreview::edit(const Ref<StyleBox> &p_stylebox) {
if (stylebox.is_valid())
stylebox->disconnect("changed", this, "_sb_changed");
@@ -39,71 +58,33 @@ void StyleBoxEditor::edit(const Ref<StyleBox> &p_stylebox) {
preview->add_style_override("panel", stylebox);
stylebox->connect("changed", this, "_sb_changed");
}
+ _sb_changed();
}
-void StyleBoxEditor::_sb_changed() {
+void StyleBoxPreview::_sb_changed() {
preview->update();
+ if (stylebox.is_valid()) {
+ Size2 ms = stylebox->get_minimum_size() * 4 / 3;
+ ms.height = MAX(ms.height, 150 * EDSCALE);
+ preview->set_custom_minimum_size(ms);
+ }
}
-void StyleBoxEditor::_bind_methods() {
+void StyleBoxPreview::_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);
+ ClassDB::bind_method("_sb_changed", &StyleBoxPreview::_sb_changed);
}
-StyleBoxEditor::StyleBoxEditor() {
-
- panel = memnew(Panel);
- add_child(panel);
- panel->set_anchors_and_margins_preset(Control::PRESET_WIDE);
-
- Label *l = memnew(Label);
- l->set_text(TTR("StyleBox Preview:"));
- l->set_position(Point2(5, 5));
- panel->add_child(l);
+StyleBoxPreview::StyleBoxPreview() {
preview = memnew(Panel);
- panel->add_child(preview);
- preview->set_position(Point2(50, 50));
- preview->set_size(Size2(200, 100));
-}
-
-void StyleBoxEditorPlugin::edit(Object *p_node) {
-
- if (Object::cast_to<StyleBox>(p_node)) {
- stylebox_editor->edit(Object::cast_to<StyleBox>(p_node));
- 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();
- }
+ add_margin_child(TTR("Preview:"), preview);
}
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(TTR("StyleBox"), stylebox_editor);
- button->hide();
+ Ref<EditorInspectorPluginStyleBox> inspector_plugin;
+ inspector_plugin.instance();
+ add_inspector_plugin(inspector_plugin);
}
diff --git a/editor/plugins/style_box_editor_plugin.h b/editor/plugins/style_box_editor_plugin.h
index 34d8caaeb6..6b0d7e57a8 100644
--- a/editor/plugins/style_box_editor_plugin.h
+++ b/editor/plugins/style_box_editor_plugin.h
@@ -31,18 +31,17 @@
#ifndef STYLE_BOX_EDITOR_PLUGIN_H
#define STYLE_BOX_EDITOR_PLUGIN_H
+#include "editor/editor_inspector.h"
#include "editor/editor_node.h"
#include "scene/gui/option_button.h"
#include "scene/gui/texture_rect.h"
#include "scene/resources/style_box.h"
-class StyleBoxEditor : public Control {
+class StyleBoxPreview : public VBoxContainer {
- GDCLASS(StyleBoxEditor, Control);
+ GDCLASS(StyleBoxPreview, VBoxContainer);
- Panel *panel;
Panel *preview;
-
Ref<StyleBox> stylebox;
void _sb_changed();
@@ -53,23 +52,24 @@ protected:
public:
void edit(const Ref<StyleBox> &p_stylebox);
- StyleBoxEditor();
+ StyleBoxPreview();
+};
+
+class EditorInspectorPluginStyleBox : public EditorInspectorPlugin {
+ GDCLASS(EditorInspectorPluginStyleBox, EditorInspectorPlugin)
+public:
+ virtual bool can_handle(Object *p_object);
+ virtual void parse_begin(Object *p_object);
+ virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage);
+ virtual void parse_end();
};
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);
};
diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp
index 5ba3931689..e4fdd1f251 100644
--- a/editor/plugins/texture_region_editor_plugin.cpp
+++ b/editor/plugins/texture_region_editor_plugin.cpp
@@ -601,6 +601,17 @@ void TextureRegionEditor::apply_rect(const Rect2 &rect) {
void TextureRegionEditor::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_PROCESS: {
+ if (node_sprite) {
+ if (node_sprite->is_region()) {
+
+ set_process(false);
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
+ }
+ } else {
+ set_process(false);
+ }
+ } break;
case NOTIFICATION_THEME_CHANGED:
case NOTIFICATION_READY: {
zoom_out->set_icon(get_icon("ZoomLess", "EditorIcons"));
@@ -640,6 +651,23 @@ void TextureRegionEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_zoom_out"), &TextureRegionEditor::_zoom_out);
}
+bool TextureRegionEditor::is_stylebox() {
+ return obj_styleBox.is_valid();
+}
+
+bool TextureRegionEditor::is_atlas_texture() {
+
+ return atlas_tex.is_valid();
+}
+
+bool TextureRegionEditor::is_ninepatch() {
+ return node_ninepatch != NULL;
+}
+
+Sprite *TextureRegionEditor::get_sprite() {
+ return node_sprite;
+}
+
void TextureRegionEditor::edit(Object *p_obj) {
if (node_sprite)
node_sprite->remove_change_receptor(this);
@@ -670,6 +698,12 @@ void TextureRegionEditor::edit(Object *p_obj) {
tile_set = Ref<TileSet>(NULL);
}
edit_draw->update();
+ if (node_sprite && !node_sprite->is_region()) {
+ set_process(true);
+ }
+ if (!p_obj) {
+ set_process(false);
+ }
}
void TextureRegionEditor::_changed_callback(Object *p_changed, const char *p_prop) {
@@ -932,8 +966,12 @@ bool TextureRegionEditorPlugin::handles(Object *p_object) const {
void TextureRegionEditorPlugin::make_visible(bool p_visible) {
if (p_visible) {
texture_region_button->show();
- if (texture_region_button->is_pressed())
- region_editor->show();
+ if (region_editor->is_stylebox() || region_editor->is_atlas_texture() || region_editor->is_ninepatch() || (region_editor->get_sprite() && region_editor->get_sprite()->is_region())) {
+ editor->make_bottom_panel_item_visible(region_editor);
+ } else {
+ if (texture_region_button->is_pressed())
+ region_editor->show();
+ }
} else {
texture_region_button->hide();
region_editor->edit(NULL);
@@ -989,10 +1027,10 @@ TextureRegionEditorPlugin::TextureRegionEditorPlugin(EditorNode *p_node) {
editor = p_node;
region_editor = memnew(TextureRegionEditor(p_node));
- texture_region_button = p_node->add_bottom_panel_item(TTR("Texture Region"), region_editor);
+ texture_region_button = p_node->add_bottom_panel_item(TTR("TextureRegion"), region_editor);
texture_region_button->set_tooltip(TTR("Texture Region Editor"));
- region_editor->set_custom_minimum_size(Size2(0, 200));
+ region_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE);
region_editor->hide();
texture_region_button->hide();
}
diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h
index 1244953a3f..eeba1987a6 100644
--- a/editor/plugins/texture_region_editor_plugin.h
+++ b/editor/plugins/texture_region_editor_plugin.h
@@ -131,6 +131,10 @@ public:
void _region_draw();
void _region_input(const Ref<InputEvent> &p_input);
void _scroll_changed(float);
+ bool is_stylebox();
+ bool is_atlas_texture();
+ bool is_ninepatch();
+ Sprite *get_sprite();
void edit(Object *p_obj);
TextureRegionEditor(EditorNode *p_editor);
diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp
index 385fa24ad8..c79cf02062 100644
--- a/editor/plugins/tile_set_editor_plugin.cpp
+++ b/editor/plugins/tile_set_editor_plugin.cpp
@@ -126,7 +126,7 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) {
Transform2D shape_transform = sb->shape_owner_get_transform(E->get());
bool one_way = sb->is_shape_owner_one_way_collision_enabled(E->get());
- shape_transform.set_origin(shape_transform.get_origin() - phys_offset);
+ shape_transform[2] -= phys_offset - sb->get_transform().xform(shape_transform[2]);
for (int k = 0; k < sb->shape_owner_get_shape_count(E->get()); k++) {
@@ -667,7 +667,7 @@ void TileSetEditor::_on_workspace_draw() {
if (mask & TileSet::BIND_BOTTOMRIGHT) {
workspace->draw_rect(Rect2(anchor + size / 2, size / 2), c);
}
- } else if (tileset->autotile_get_bitmask_mode(get_current_tile()) == TileSet::BITMASK_3X3) {
+ } else {
if (mask & TileSet::BIND_TOPLEFT) {
workspace->draw_rect(Rect2(anchor, size / 3), c);
}
@@ -821,7 +821,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
bit = TileSet::BIND_BOTTOMRIGHT;
}
}
- } else if (tileset->autotile_get_bitmask_mode(get_current_tile()) == TileSet::BITMASK_3X3) {
+ } else {
if (pos.x < size.x / 3) {
if (pos.y < size.y / 3) {
bit = TileSet::BIND_TOPLEFT;
@@ -884,7 +884,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
bit = TileSet::BIND_BOTTOMRIGHT;
}
}
- } else if (tileset->autotile_get_bitmask_mode(get_current_tile()) == TileSet::BITMASK_3X3) {
+ } else {
if (pos.x < size.x / 3) {
if (pos.y < size.y / 3) {
bit = TileSet::BIND_TOPLEFT;
@@ -1849,7 +1849,7 @@ void TileSetEditorHelper::_get_property_list(List<PropertyInfo> *p_list) const {
if (selected_tile < 0 || tileset.is_null())
return;
- p_list->push_back(PropertyInfo(Variant::INT, "bitmask_mode", PROPERTY_HINT_ENUM, "2x2,3x3"));
+ p_list->push_back(PropertyInfo(Variant::INT, "bitmask_mode", PROPERTY_HINT_ENUM, "2x2,3x3 (minimal),3x3"));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "layout/tile_size"));
p_list->push_back(PropertyInfo(Variant::INT, "layout/spacing", PROPERTY_HINT_RANGE, "0,256,1"));
}