diff options
Diffstat (limited to 'tools')
49 files changed, 1383 insertions, 706 deletions
diff --git a/tools/doc/doc_data.cpp b/tools/doc/doc_data.cpp index 3836fa710b..2d0d7617c2 100644 --- a/tools/doc/doc_data.cpp +++ b/tools/doc/doc_data.cpp @@ -190,7 +190,11 @@ void DocData::generate(bool p_basic_types) { #ifdef DEBUG_METHODS_ENABLED if (m && m->get_return_type()!=StringName()) method.return_type=m->get_return_type(); - else if (arginfo.type!=Variant::NIL) // { + else if (method.name.find(":")!=-1) { + method.return_type=method.name.get_slice(":",1); + method.name=method.name.get_slice(":",0); + + } else if (arginfo.type!=Variant::NIL) // { #endif method.return_type=(arginfo.hint==PROPERTY_HINT_RESOURCE_TYPE)?arginfo.hint_string:Variant::get_type_name(arginfo.type); // } @@ -210,7 +214,7 @@ void DocData::generate(bool p_basic_types) { } else if (arginfo.hint==PROPERTY_HINT_RESOURCE_TYPE) { type_name=arginfo.hint_string; } else if (arginfo.type==Variant::NIL) - type_name="var"; + type_name="Variant"; else type_name=Variant::get_type_name(arginfo.type); diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile new file mode 100644 index 0000000000..428de9d1a7 --- /dev/null +++ b/tools/docker/Dockerfile @@ -0,0 +1,13 @@ +FROM ubuntu:14.04 +MAINTAINER Mohammad Rezai, https://github.com/mrezai +WORKDIR /godot-dev +COPY scripts/install-android-tools /godot-dev/ +ENV DEBIAN_FRONTEND noninteractive +RUN dpkg --add-architecture i386 && \ + apt-get update && \ + apt-get upgrade -y && \ + apt-get install --no-install-recommends -y -q \ + build-essential gcc-multilib g++-multilib mingw32 mingw-w64 scons pkg-config libx11-dev libxcursor-dev \ + libasound2-dev libfreetype6-dev libgl1-mesa-dev libglu-dev libssl-dev libxinerama-dev libudev-dev \ + git wget openjdk-7-jdk libbcprov-java libc6:i386 libncurses5:i386 libstdc++6:i386 zlib1g:i386 lib32z1 + diff --git a/tools/docker/README.md b/tools/docker/README.md new file mode 100644 index 0000000000..7f10b46ad8 --- /dev/null +++ b/tools/docker/README.md @@ -0,0 +1,40 @@ +## A Docker image to build Linux, Windows and Android godot binaries.
+
+The main reason to write this, is to provide a simple way in all platforms to integrate external godot modules and build a custom version of godot.
+
+## usage
+1. Install docker on Linux or docker toolbox on Windows or Mac.
+2. Open a terminal on linux or "Docker Quickstart Terminal" on Windows or Mac.
+3. Run command:
+ - Linux: `cd`
+ - Windows: `cd /c/Users/YOUR_USERNAME`
+ - Mac: `cd /Users/YOUR_USERNAME`
+4. Get godot source code: `git clone https://github.com/godotengine/godot.git`
+5. Run command: `cd godot/tools/docker`
+6. Run command: `docker build -t godot .`(In Linux run Docker commands with `sudo` or add your user to docker group before run the Docker commands). The godot docker image will be build after a while.
+7. Run command:
+ - Linux: `docker run -it --name=godot-dev -v /home/YOUR_USERNAME/godot:/godot-dev/godot godot`
+ - Windows: `docker run -it --name=godot-dev -v /c/Users/YOUR_USERNAME/godot:/godot-dev/godot godot`
+ - Mac: `docker run -it --name=godot-dev -v /Users/YOUR_USERNAME/godot:/godot-dev/godot godot`
+ You are in the godot-dev container and /godot-dev directory now.
+8. Run `./install-android-tools` to download and install all android development tools.
+9. Run command: `source ~/.bashrc`
+10. Run command: `cd godot`
+11. Run command: `scons p=android target=release` to test everything is ok. You can set platform to x11, windows, android, haiku and server.
+
+After use and exit, you can use this environment again by open terminal and type commands: `docker start godot-dev && docker attach godot-dev`.
+
+### Windows and Mac stuffs:
+
+- Speed up compilation:
+ - Exit from container.
+ - Run command: `docker-machine stop`
+ - Open "Oracle VM VirtualBox".
+ - In settings of default VM increase CPU cores and RAM to suitable values.
+ - Run command: `docker-machine start`
+ - Run command: `docker start godot-dev && docker attach godot-dev`
+
+- ssh to VM(can be useful sometimes):
+ - `docker-machine ssh`
+
+Check docker and boot2docker projects for more details.
diff --git a/tools/docker/scripts/install-android-tools b/tools/docker/scripts/install-android-tools new file mode 100644 index 0000000000..8a617d9942 --- /dev/null +++ b/tools/docker/scripts/install-android-tools @@ -0,0 +1,90 @@ +#!/bin/bash + +BASH_RC=~/.bashrc +GODOT_BUILD_TOOLS_PATH=/godot-dev/build-tools +mkdir -p $GODOT_BUILD_TOOLS_PATH +cd $GODOT_BUILD_TOOLS_PATH + +ANDROID_BASE_URL=http://dl.google.com/android + +ANDROID_SDK_RELEASE=android-sdk_r24.4.1 +ANDROID_SDK_DIR=android-sdk-linux +ANDROID_SDK_FILENAME=$ANDROID_SDK_RELEASE-linux.tgz +ANDROID_SDK_URL=$ANDROID_BASE_URL/$ANDROID_SDK_FILENAME +ANDROID_SDK_PATH=$GODOT_BUILD_TOOLS_PATH/$ANDROID_SDK_DIR +ANDROID_SDK_SHA1=725bb360f0f7d04eaccff5a2d57abdd49061326d + +ANDROID_NDK_RELEASE=android-ndk-r10e +ANDROID_NDK_DIR=$ANDROID_NDK_RELEASE +ANDROID_NDK_FILENAME=$ANDROID_NDK_RELEASE-linux-x86_64.bin +ANDROID_NDK_URL=$ANDROID_BASE_URL/ndk/$ANDROID_NDK_FILENAME +ANDROID_NDK_PATH=$GODOT_BUILD_TOOLS_PATH/$ANDROID_NDK_DIR +ANDROID_NDK_MD5=19af543b068bdb7f27787c2bc69aba7f + +echo +echo "Download and install Android development tools ..." +echo + +if [ ! -e $ANDROID_SDK_FILENAME ]; then + echo "Downloading: Android SDK ..." + wget $ANDROID_SDK_URL +else + echo $ANDROID_SDK_SHA1 $ANDROID_SDK_FILENAME > $ANDROID_SDK_FILENAME.sha1 + sha1sum --check --strict $ANDROID_SDK_FILENAME.sha1 + if [ ! $? -eq 0 ]; then + echo "Downloading: Android SDK ..." + wget $ANDROID_SDK_URL + fi +fi + +if [ ! -d $ANDROID_SDK_DIR ]; then + tar -xvzf $ANDROID_SDK_FILENAME +fi + +if [ ! -e $ANDROID_NDK_FILENAME ]; then + echo "Downloading: Android NDK ..." + wget $ANDROID_NDK_URL +else + echo $ANDROID_NDK_MD5 $ANDROID_NDK_FILENAME > $ANDROID_NDK_FILENAME.md5 + md5sum --check --strict $ANDROID_NDK_FILENAME.md5 + if [ ! $? -eq 0 ]; then + echo "Downloading: Android NDK ..." + wget $ANDROID_NDK_URL + fi +fi + +if [ ! -d $ANDROID_NDK_DIR ]; then + chmod a+x $ANDROID_NDK_FILENAME + ./$ANDROID_NDK_FILENAME + echo +fi + +cd $ANDROID_SDK_DIR/tools +chmod a+x android + +if ! ./android list target | grep -q 'android-19'; then + echo "Installing: Android Tools ..." + echo y | ./android update sdk --no-ui --all --filter "platform-tools,android-19,build-tools-19.1.0,\ + extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository,\ + extra-google-play_apk_expansion,extra-google-play_billing,extra-google-play_licensing" +fi + +EXPORT_VAL="export ANDROID_HOME=$ANDROID_SDK_PATH" +if ! grep -q "^$EXPORT_VAL" $BASH_RC; then + echo $EXPORT_VAL >> ~/.bashrc +fi + + +EXPORT_VAL="export ANDROID_NDK_ROOT=$ANDROID_NDK_PATH" +if ! grep -q "^$EXPORT_VAL" $BASH_RC; then + echo $EXPORT_VAL >> ~/.bashrc +fi + +EXPORT_VAL="export PATH=$PATH:$ANDROID_SDK_PATH/tools" +if ! grep -q "^export PATH=.*$ANDROID_SDK_PATH/tools.*" $BASH_RC; then + echo $EXPORT_VAL >> ~/.bashrc +fi + +echo +echo "Done!" +echo
\ No newline at end of file diff --git a/tools/editor/create_dialog.cpp b/tools/editor/create_dialog.cpp index 0f39d72308..23b8cad9ce 100644 --- a/tools/editor/create_dialog.cpp +++ b/tools/editor/create_dialog.cpp @@ -171,6 +171,7 @@ void CreateDialog::_update_search() { if (EditorNode::get_editor_data().get_custom_types().has(type)) { //there are custom types based on this... cool. + //print_line("there are custom types"); const Vector<EditorData::CustomType> &ct = EditorNode::get_editor_data().get_custom_types()[type]; @@ -259,7 +260,33 @@ Object *CreateDialog::instance_selected() { TreeItem *selected = search_options->get_selected(); if (selected) { - return ObjectTypeDB::instance(selected->get_text(0)); + String custom = selected->get_metadata(0); + if (custom!=String()) { + if (EditorNode::get_editor_data().get_custom_types().has(custom)) { + + for(int i=0;i<EditorNode::get_editor_data().get_custom_types()[custom].size();i++) { + if (EditorNode::get_editor_data().get_custom_types()[custom][i].name==selected->get_text(0)) { + Ref<Texture> icon = EditorNode::get_editor_data().get_custom_types()[custom][i].icon; + Ref<Script> script = EditorNode::get_editor_data().get_custom_types()[custom][i].script; + String name = selected->get_text(0); + + Object *ob = ObjectTypeDB::instance(custom); + ERR_FAIL_COND_V(!ob,NULL); + if (ob->is_type("Node")) { + ob->call("set_name",name); + } + ob->set_script(script.get_ref_ptr()); + if (icon.is_valid()) + ob->set_meta("_editor_icon",icon); + return ob; + + } + } + + } + } else { + return ObjectTypeDB::instance(selected->get_text(0)); + } } return NULL; diff --git a/tools/editor/editor_data.cpp b/tools/editor/editor_data.cpp index c872b1c3ca..6c1fc2ef05 100644 --- a/tools/editor/editor_data.cpp +++ b/tools/editor/editor_data.cpp @@ -422,6 +422,14 @@ void EditorData::add_editor_plugin(EditorPlugin *p_plugin) { editor_plugins.push_back(p_plugin); } +int EditorData::get_editor_plugin_count() const { + return editor_plugins.size(); +} +EditorPlugin *EditorData::get_editor_plugin(int p_idx) { + + ERR_FAIL_INDEX_V(p_idx,editor_plugins.size(),NULL); + return editor_plugins[p_idx]; +} void EditorData::add_custom_type(const String& p_type, const String& p_inherits,const Ref<Script>& p_script,const Ref<Texture>& p_icon ) { @@ -791,6 +799,8 @@ void EditorSelection::_node_removed(Node *p_node) { void EditorSelection::add_node(Node *p_node) { + ERR_FAIL_NULL(p_node); + if (selection.has(p_node)) return; @@ -814,6 +824,8 @@ void EditorSelection::add_node(Node *p_node) { void EditorSelection::remove_node(Node *p_node) { + ERR_FAIL_NULL(p_node); + if (!selection.has(p_node)) return; @@ -832,12 +844,25 @@ bool EditorSelection::is_selected(Node * p_node) const { } +Array EditorSelection::_get_selected_nodes() { + + Array ret; + + for (List<Node*>::Element *E=selected_node_list.front();E;E=E->next()) { + + ret.push_back(E->get()); + } + + return ret; +} void EditorSelection::_bind_methods() { ObjectTypeDB::bind_method(_MD("_node_removed"),&EditorSelection::_node_removed); ObjectTypeDB::bind_method(_MD("clear"),&EditorSelection::clear); - ObjectTypeDB::bind_method(_MD("add_node"),&EditorSelection::add_node); + ObjectTypeDB::bind_method(_MD("add_node","node:Node"),&EditorSelection::add_node); + ObjectTypeDB::bind_method(_MD("remove_node","node:Node"),&EditorSelection::remove_node); + ObjectTypeDB::bind_method(_MD("get_selected_nodes"),&EditorSelection::_get_selected_nodes); ADD_SIGNAL( MethodInfo("selection_changed") ); } diff --git a/tools/editor/editor_data.h b/tools/editor/editor_data.h index fcc8ccef06..5814ae8f5c 100644 --- a/tools/editor/editor_data.h +++ b/tools/editor/editor_data.h @@ -165,6 +165,9 @@ public: void add_editor_plugin(EditorPlugin *p_plugin); void remove_editor_plugin(EditorPlugin *p_plugin); + int get_editor_plugin_count() const; + EditorPlugin *get_editor_plugin(int p_idx); + UndoRedo &get_undo_redo(); void save_editor_global_states(); @@ -228,6 +231,7 @@ public: List<Node*> selected_node_list; void _update_nl(); + Array _get_selected_nodes(); protected: static void _bind_methods(); diff --git a/tools/editor/editor_help.cpp b/tools/editor/editor_help.cpp index 2ece518f8d..110e06f25b 100644 --- a/tools/editor/editor_help.cpp +++ b/tools/editor/editor_help.cpp @@ -1123,35 +1123,87 @@ void EditorHelp::_add_text(const String& p_bbcode) { class_desc->push_indent(1);*/ int pos = 0; + String bbcode=p_bbcode.replace("\t"," ").replace("\r"," ").strip_edges(); + + //find double newlines, keep them + for(int i=0;i<bbcode.length();i++) { + + //find valid newlines (double) + if (bbcode[i]=='\n') { + bool dnl=false; + int j=i+1; + for(;j<p_bbcode.length();j++) { + if (bbcode[j]==' ') + continue; + if (bbcode[j]=='\n') { + dnl=true; + break; + } + break; + } + + if (dnl) { + bbcode[i]=0xFFFF; + i=j; + } else { + bbcode[i]=' '; + i=j-1; + } + } + } + + //remove double spaces or spaces after newlines + for(int i=0;i<bbcode.length();i++) { + + if (bbcode[i]==' ' || bbcode[i]==0xFFFF) { + + for(int j=i+1;j<p_bbcode.length();j++) { + if (bbcode[j]==' ') { + bbcode.remove(j); + j--; + continue; + } else { + break; + } + } + } + } + + //change newlines to double newlines + + CharType dnls[2]={0xFFFF,0}; + bbcode=bbcode.replace(dnls,"\n"); + + List<String> tag_stack; - while(pos < p_bbcode.length()) { + while(pos < bbcode.length()) { - int brk_pos = p_bbcode.find("[",pos); + int brk_pos = bbcode.find("[",pos); if (brk_pos<0) - brk_pos=p_bbcode.length(); + brk_pos=bbcode.length(); if (brk_pos > pos) { - class_desc->add_text(p_bbcode.substr(pos,brk_pos-pos)); + class_desc->add_text(bbcode.substr(pos,brk_pos-pos)); } - if (brk_pos==p_bbcode.length()) + if (brk_pos==bbcode.length()) break; //nothing else o add - int brk_end = p_bbcode.find("]",brk_pos+1); + int brk_end = bbcode.find("]",brk_pos+1); if (brk_end==-1) { //no close, add the rest - class_desc->add_text(p_bbcode.substr(brk_pos,p_bbcode.length()-brk_pos)); + class_desc->add_text(bbcode.substr(brk_pos,bbcode.length()-brk_pos)); break; } - String tag = p_bbcode.substr(brk_pos+1,brk_end-brk_pos-1); + String tag = bbcode.substr(brk_pos+1,brk_end-brk_pos-1); if (tag.begins_with("/")) { @@ -1201,7 +1253,7 @@ void EditorHelp::_add_text(const String& p_bbcode) { class_desc->push_font(get_font("italic","Fonts")); pos=brk_end+1; tag_stack.push_front(tag); - } else if (tag=="code") { + } else if (tag=="code" || tag=="codeblock") { //use monospace font class_desc->push_font(get_font("source","EditorFonts")); @@ -1234,10 +1286,10 @@ void EditorHelp::_add_text(const String& p_bbcode) { } else if (tag=="url") { //use strikethrough (not supported underline instead) - int end=p_bbcode.find("[",brk_end); + int end=bbcode.find("[",brk_end); if (end==-1) - end=p_bbcode.length(); - String url = p_bbcode.substr(brk_end+1,end-brk_end-1); + end=bbcode.length(); + String url = bbcode.substr(brk_end+1,end-brk_end-1); class_desc->push_meta(url); pos=brk_end+1; @@ -1251,10 +1303,10 @@ void EditorHelp::_add_text(const String& p_bbcode) { } else if (tag=="img") { //use strikethrough (not supported underline instead) - int end=p_bbcode.find("[",brk_end); + int end=bbcode.find("[",brk_end); if (end==-1) - end=p_bbcode.length(); - String image = p_bbcode.substr(brk_end+1,end-brk_end-1); + end=bbcode.length(); + String image = bbcode.substr(brk_end+1,end-brk_end-1); Ref<Texture> texture = ResourceLoader::load(base_path+"/"+image,"Texture"); if (texture.is_valid()) diff --git a/tools/editor/editor_import_export.cpp b/tools/editor/editor_import_export.cpp index b845eba66b..39182bfd69 100644 --- a/tools/editor/editor_import_export.cpp +++ b/tools/editor/editor_import_export.cpp @@ -63,13 +63,30 @@ String EditorImportPlugin::expand_source_path(const String& p_path) { } } + +String EditorImportPlugin::_validate_source_path(const String& p_path) { + + return validate_source_path(p_path); +} + +String EditorImportPlugin::_expand_source_path(const String& p_path) { + + return expand_source_path(p_path); +} + void EditorImportPlugin::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("validate_source_path","path"),&EditorImportPlugin::_validate_source_path); + ObjectTypeDB::bind_method(_MD("expand_source_path","path"),&EditorImportPlugin::_expand_source_path); + ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::STRING,"get_name")); ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::STRING,"get_visible_name")); ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo("import_dialog",PropertyInfo(Variant::STRING,"from"))); - ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::INT,"import",PropertyInfo(Variant::STRING,"path"),PropertyInfo(Variant::OBJECT,"from",PROPERTY_HINT_RESOURCE_TYPE,"ResourceImportMetaData"))); - ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::RAW_ARRAY,"custom_export",PropertyInfo(Variant::STRING,"path"))); + ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::INT,"import",PropertyInfo(Variant::STRING,"path"),PropertyInfo(Variant::OBJECT,"from",PROPERTY_HINT_RESOURCE_TYPE,"ResourceImportMetadata"))); + ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::RAW_ARRAY,"custom_export",PropertyInfo(Variant::STRING,"path"),PropertyInfo(Variant::OBJECT,"platform",PROPERTY_HINT_RESOURCE_TYPE,"EditorExportPlatform"))); + +// BIND_VMETHOD( mi ); } String EditorImportPlugin::get_name() const { @@ -113,8 +130,8 @@ Error EditorImportPlugin::import(const String& p_path, const Ref<ResourceImportM Vector<uint8_t> EditorImportPlugin::custom_export(const String& p_path, const Ref<EditorExportPlatform> &p_platform) { - if (get_script_instance() && get_script_instance()->has_method("custom_export")) { - get_script_instance()->call("custom_export",p_path); + if (get_script_instance() && get_script_instance()->has_method("_custom_export")) { + get_script_instance()->call("_custom_export",p_path,p_platform); } return Vector<uint8_t>(); @@ -130,7 +147,10 @@ EditorImportPlugin::EditorImportPlugin() { void EditorExportPlugin::_bind_methods() { - BIND_VMETHOD( MethodInfo("custom_export:Dictionary",PropertyInfo(Variant::STRING,"name",PROPERTY_HINT_RESOURCE_TYPE,"EditorExportPlatformPC")) ); + MethodInfo mi = MethodInfo("custom_export:Variant",PropertyInfo(Variant::STRING,"name"),PropertyInfo(Variant::OBJECT,"platform",PROPERTY_HINT_RESOURCE_TYPE,"EditorExportPlatform")); + mi.return_val.type=Variant::RAW_ARRAY; + + BIND_VMETHOD( mi ); } @@ -141,6 +161,9 @@ Vector<uint8_t> EditorExportPlugin::custom_export(String& p_path,const Ref<Edito Variant d = get_script_instance()->call("custom_export",p_path,p_platform); if (d.get_type()==Variant::NIL) return Vector<uint8_t>(); + if (d.get_type()==Variant::RAW_ARRAY) + return d; + ERR_FAIL_COND_V(d.get_type()!=Variant::DICTIONARY,Vector<uint8_t>()); Dictionary dict=d; ERR_FAIL_COND_V(!dict.has("name"),Vector<uint8_t>()); @@ -1455,9 +1478,17 @@ Ref<EditorImportPlugin> EditorImportExport::get_import_plugin_by_name(const Stri void EditorImportExport::add_export_plugin(const Ref<EditorExportPlugin>& p_plugin) { + ERR_FAIL_COND( p_plugin.is_null() ); + export_plugins.push_back(p_plugin); } +void EditorImportExport::remove_export_plugin(const Ref<EditorExportPlugin>& p_plugin) { + + ERR_FAIL_COND( p_plugin.is_null() ); + export_plugins.erase(p_plugin); +} + int EditorImportExport::get_export_plugin_count() const{ return export_plugins.size(); @@ -2068,9 +2099,61 @@ bool EditorImportExport::sample_get_trim() const{ return sample_action_trim; } +DVector<String> EditorImportExport::_get_export_file_list() { + + DVector<String> fl; + for (Map<StringName,FileAction>::Element *E=files.front();E;E=E->next()) { + + fl.push_back(E->key()); + } + + return fl; +} + +DVector<String> EditorImportExport::_get_export_platforms() { + + DVector<String> ep; + for (Map<StringName,Ref<EditorExportPlatform> >::Element *E=exporters.front();E;E=E->next()) { + + ep.push_back(E->key()); + } + + return ep; + +} void EditorImportExport::_bind_methods() { + ObjectTypeDB::bind_method(_MD("add_import_plugin","plugin:EditorImportPlugin"),&EditorImportExport::add_import_plugin); + ObjectTypeDB::bind_method(_MD("remove_import_plugin","plugin:EditorImportPlugin"),&EditorImportExport::remove_import_plugin); + ObjectTypeDB::bind_method(_MD("get_import_plugin_count"),&EditorImportExport::get_import_plugin_count); + ObjectTypeDB::bind_method(_MD("get_import_plugin:EditorImportPlugin","idx"),&EditorImportExport::get_import_plugin); + ObjectTypeDB::bind_method(_MD("get_import_plugin_by_name:EditorImportPlugin","name"),&EditorImportExport::get_import_plugin_by_name); + + ObjectTypeDB::bind_method(_MD("add_export_plugin","plugin:EditorExportPlugin"),&EditorImportExport::add_export_plugin); + ObjectTypeDB::bind_method(_MD("remove_export_plugin","plugin:EditorExportPlugin"),&EditorImportExport::remove_export_plugin); + ObjectTypeDB::bind_method(_MD("get_export_plugin_count"),&EditorImportExport::get_export_plugin_count); + ObjectTypeDB::bind_method(_MD("get_export_plugin:EditorExportPlugin","idx"),&EditorImportExport::get_export_plugin); + + ObjectTypeDB::bind_method(_MD("set_export_file_action","file","action"),&EditorImportExport::set_export_file_action); + ObjectTypeDB::bind_method(_MD("get_export_file_action","file"),&EditorImportExport::get_export_file_action); + ObjectTypeDB::bind_method(_MD("get_export_file_list"),&EditorImportExport::_get_export_file_list); + + ObjectTypeDB::bind_method(_MD("add_export_platform","platform:EditorExportplatform"),&EditorImportExport::add_export_platform); + //ObjectTypeDB::bind_method(_MD("remove_export_platform","platform:EditorExportplatform"),&EditorImportExport::add_export_platform); + ObjectTypeDB::bind_method(_MD("get_export_platform:EditorExportPlatform","name"),&EditorImportExport::get_export_platform); + ObjectTypeDB::bind_method(_MD("get_export_platforms"),&EditorImportExport::_get_export_platforms); + + ObjectTypeDB::bind_method(_MD("set_export_filter","filter"),&EditorImportExport::set_export_filter); + ObjectTypeDB::bind_method(_MD("get_export_filter"),&EditorImportExport::get_export_filter); + + ObjectTypeDB::bind_method(_MD("set_export_custom_filter","filter"),&EditorImportExport::set_export_custom_filter); + ObjectTypeDB::bind_method(_MD("get_export_custom_filter"),&EditorImportExport::get_export_custom_filter); + + ObjectTypeDB::bind_method(_MD("set_export_custom_filter_exclude","filter_exclude"),&EditorImportExport::set_export_custom_filter_exclude); + ObjectTypeDB::bind_method(_MD("get_export_custom_filter_exclude"),&EditorImportExport::get_export_custom_filter_exclude); + + ObjectTypeDB::bind_method(_MD("image_export_group_create"),&EditorImportExport::image_export_group_create); ObjectTypeDB::bind_method(_MD("image_export_group_remove"),&EditorImportExport::image_export_group_remove); ObjectTypeDB::bind_method(_MD("image_export_group_set_image_action"),&EditorImportExport::image_export_group_set_image_action); @@ -2085,7 +2168,27 @@ void EditorImportExport::_bind_methods() { ObjectTypeDB::bind_method(_MD("script_get_action"),&EditorImportExport::script_get_action); ObjectTypeDB::bind_method(_MD("script_get_encryption_key"),&EditorImportExport::script_get_encryption_key); -} + + + BIND_CONSTANT( ACTION_NONE ); + BIND_CONSTANT( ACTION_COPY ); + BIND_CONSTANT( ACTION_BUNDLE ); + + BIND_CONSTANT( EXPORT_SELECTED ); + BIND_CONSTANT( EXPORT_RESOURCES ); + BIND_CONSTANT( EXPORT_ALL ); + + BIND_CONSTANT( IMAGE_ACTION_NONE ); + BIND_CONSTANT( IMAGE_ACTION_COMPRESS_DISK ); + BIND_CONSTANT( IMAGE_ACTION_COMPRESS_RAM ); + BIND_CONSTANT( IMAGE_ACTION_KEEP ); + + BIND_CONSTANT( SCRIPT_ACTION_NONE ); + BIND_CONSTANT( SCRIPT_ACTION_COMPILE ); + BIND_CONSTANT( SCRIPT_ACTION_ENCRYPT ); +}; + + EditorImportExport::EditorImportExport() { diff --git a/tools/editor/editor_import_export.h b/tools/editor/editor_import_export.h index 60b7f919d8..fc8ad58bd9 100644 --- a/tools/editor/editor_import_export.h +++ b/tools/editor/editor_import_export.h @@ -46,6 +46,10 @@ protected: static void _bind_methods(); + String _validate_source_path(const String& p_path); + String _expand_source_path(const String& p_path); + + public: @@ -303,6 +307,9 @@ protected: static EditorImportExport* singleton; + DVector<String> _get_export_file_list(); + DVector<String> _get_export_platforms(); + static void _bind_methods(); public: @@ -315,6 +322,7 @@ public: Ref<EditorImportPlugin> get_import_plugin_by_name(const String& p_string) const; void add_export_plugin(const Ref<EditorExportPlugin>& p_plugin); + void remove_export_plugin(const Ref<EditorExportPlugin>& p_plugin); int get_export_plugin_count() const; Ref<EditorExportPlugin> get_export_plugin(int p_idx) const; @@ -391,7 +399,10 @@ public: ~EditorImportExport(); }; +VARIANT_ENUM_CAST(EditorImportExport::FileAction); +VARIANT_ENUM_CAST(EditorImportExport::ExportFilter); VARIANT_ENUM_CAST(EditorImportExport::ImageAction); VARIANT_ENUM_CAST(EditorImportExport::ScriptAction); +VARIANT_ENUM_CAST(EditorImportExport::SampleAction); #endif // EDITOR_IMPORT_EXPORT_H diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp index b39a1b5350..4666a49655 100644 --- a/tools/editor/editor_node.cpp +++ b/tools/editor/editor_node.cpp @@ -380,6 +380,10 @@ void EditorNode::_notification(int p_what) { _menu_option_confirm(FILE_QUIT, false); }; + if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { + scene_tabs->set_tab_close_display_policy( (bool(EDITOR_DEF("global/always_show_close_button_in_scene_tabs", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY) ); + } + } void EditorNode::_fs_changed() { @@ -1795,6 +1799,8 @@ void EditorNode::_run(bool p_current,const String& p_custom) { //pause_button->set_pressed(false); play_scene_button->set_pressed(false); play_scene_button->set_icon(gui_base->get_icon("PlayScene","EditorIcons")); + play_custom_scene_button->set_pressed(false); + play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom","EditorIcons")); String current_filename; String run_filename; @@ -1804,7 +1810,6 @@ void EditorNode::_run(bool p_current,const String& p_custom) { if (p_current || (editor_data.get_edited_scene_root() && p_custom==editor_data.get_edited_scene_root()->get_filename())) { - Node *scene = editor_data.get_edited_scene_root(); if (!scene) { @@ -1913,6 +1918,10 @@ void EditorNode::_run(bool p_current,const String& p_custom) { if (p_current) { play_scene_button->set_pressed(true); play_scene_button->set_icon(gui_base->get_icon("Reload","EditorIcons")); + } else if (p_custom!="") { + run_custom_filename=run_filename; + play_custom_scene_button->set_pressed(true); + play_custom_scene_button->set_icon(gui_base->get_icon("Reload","EditorIcons")); } else { play_button->set_pressed(true); play_button->set_icon(gui_base->get_icon("Reload","EditorIcons")); @@ -2595,9 +2604,16 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) { } break; case RUN_PLAY_CUSTOM_SCENE: { - _menu_option_confirm(RUN_STOP,true); - quick_run->popup("PackedScene",true); - quick_run->set_title("Quick Run Scene.."); + if (run_custom_filename.empty() || editor_run.get_status()==EditorRun::STATUS_STOP) { + _menu_option_confirm(RUN_STOP,true); + quick_run->popup("PackedScene",true); + quick_run->set_title("Quick Run Scene.."); + play_custom_scene_button->set_pressed(false); + } else { + String last_custom_scene=run_custom_filename; + _menu_option_confirm(RUN_STOP,true); + _run(false,last_custom_scene); + } } break; case RUN_PAUSE: { @@ -2611,10 +2627,13 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) { break; editor_run.stop(); + run_custom_filename.clear(); play_button->set_pressed(false); play_button->set_icon(gui_base->get_icon("MainPlay","EditorIcons")); play_scene_button->set_pressed(false); play_scene_button->set_icon(gui_base->get_icon("PlayScene","EditorIcons")); + play_custom_scene_button->set_pressed(false); + play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom","EditorIcons")); //pause_button->set_pressed(false); emit_signal("stop_pressed"); @@ -2652,8 +2671,9 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) { String exec = OS::get_singleton()->get_executable_path(); List<String> args; - args.push_back ( "-path" ); - args.push_back (exec.get_base_dir() ); + //args.push_back ( "-path" ); + //args.push_back (exec.get_base_dir() ); + args.push_back("-pm"); OS::ProcessID pid=0; Error err = OS::get_singleton()->execute(exec,args,false,&pid); @@ -2932,16 +2952,109 @@ void EditorNode::remove_editor_plugin(EditorPlugin *p_editor) { void EditorNode::add_editor_import_plugin(const Ref<EditorImportPlugin>& p_editor_import) { + ERR_FAIL_COND( p_editor_import.is_null() ); editor_import_export->add_import_plugin(p_editor_import); _rebuild_import_menu(); } void EditorNode::remove_editor_import_plugin(const Ref<EditorImportPlugin>& p_editor_import) { + ERR_FAIL_COND( p_editor_import.is_null() ); editor_import_export->remove_import_plugin(p_editor_import); _rebuild_import_menu(); } + +void EditorNode::_update_addon_config() { + + if (_initializing_addons) + return; + + Vector<String> enabled_addons; + + for(Map<String,EditorPlugin*>::Element *E=plugin_addons.front();E;E=E->next()) { + enabled_addons.push_back(E->key()); + } + + if (enabled_addons.size()==0) { + Globals::get_singleton()->set("editor_plugins/enabled",Variant()); + Globals::get_singleton()->set_persisting("editor_plugins/enabled",false); + } else { + Globals::get_singleton()->set("editor_plugins/enabled",enabled_addons); + Globals::get_singleton()->set_persisting("editor_plugins/enabled",true); + } + + project_settings->queue_save(); + +} + +void EditorNode::set_addon_plugin_enabled(const String& p_addon,bool p_enabled) { + + ERR_FAIL_COND(p_enabled && plugin_addons.has(p_addon)); + ERR_FAIL_COND(!p_enabled && !plugin_addons.has(p_addon)); + + if (!p_enabled) { + + EditorPlugin *addon = plugin_addons[p_addon]; + memdelete(addon); //bye + plugin_addons.erase(p_addon); + _update_addon_config(); + return; + } + + + Ref<ConfigFile> cf; + cf.instance(); + String addon_path = "res://addons/"+p_addon+"/plugin.cfg"; + Error err = cf->load(addon_path); + if (err!=OK) { + show_warning("Unable to enable addon plugin at: '"+addon_path+"' parsing of config failed."); + return; + } + + if (!cf->has_section_key("plugin","script")) { + show_warning("Unable to find script field for addon plugin at: 'res://addons/"+p_addon+"''."); + return; + } + + String path = cf->get_value("plugin","script"); + path="res://addons/"+p_addon+"/"+path; + + Ref<Script> script = ResourceLoader::load(path); + + + if (script.is_null()) { + show_warning("Unable to load addon script from path: '"+path+"'."); + return; + } + + //could check inheritance.. + if (String(script->get_instance_base_type())!="EditorPlugin") { + show_warning("Unable to load addon script from path: '"+path+"' Base type is not EditorPlugin."); + return; + } + + if (!script->is_tool()) { + show_warning("Unable to load addon script from path: '"+path+"' Script is does not support tool mode."); + return; + } + + EditorPlugin *ep = memnew( EditorPlugin ); + ep->set_script(script.get_ref_ptr()); + plugin_addons[p_addon]=ep; + add_editor_plugin(ep); + + _update_addon_config(); + + +} + +bool EditorNode::is_addon_plugin_enabled(const String& p_addon) const { + + return plugin_addons.has(p_addon); +} + + void EditorNode::_remove_edited_scene() { int new_index = editor_data.get_edited_scene(); int old_index=new_index; @@ -3843,9 +3956,9 @@ void EditorNode::_quick_opened() { } } -void EditorNode::_quick_run(const String& p_resource) { +void EditorNode::_quick_run() { - _run(false,p_resource); + _run(false,quick_run->get_selected()); } @@ -3930,10 +4043,14 @@ void EditorNode::register_editor_types() { ObjectTypeDB::register_type<EditorPlugin>(); ObjectTypeDB::register_type<EditorImportPlugin>(); + ObjectTypeDB::register_type<EditorExportPlugin>(); ObjectTypeDB::register_type<EditorScenePostImport>(); ObjectTypeDB::register_type<EditorScript>(); + ObjectTypeDB::register_type<EditorSelection>(); ObjectTypeDB::register_type<EditorFileDialog>(); - ObjectTypeDB::register_type<UndoRedo>(); + //ObjectTypeDB::register_type<EditorImportExport>(); + ObjectTypeDB::register_type<EditorSettings>(); + ObjectTypeDB::register_type<EditorSpatialGizmo>(); //ObjectTypeDB::register_type<EditorImporter>(); @@ -4336,6 +4453,51 @@ void EditorNode::_load_docks() { } + +void EditorNode::_update_dock_slots_visibility() { + + VSplitContainer*splits[DOCK_SLOT_MAX/2]={ + left_l_vsplit, + left_r_vsplit, + right_l_vsplit, + right_r_vsplit, + }; + + + HSplitContainer*h_splits[4]={ + left_l_hsplit, + left_r_hsplit, + main_hsplit, + right_hsplit, + }; + + for(int i=0;i<DOCK_SLOT_MAX;i++) { + + if (dock_slot[i]->get_tab_count()) + dock_slot[i]->show(); + else + dock_slot[i]->hide(); + + } + + + for(int i=0;i<DOCK_SLOT_MAX/2;i++) { + bool in_use = dock_slot[i*2+0]->get_tab_count() || dock_slot[i*2+1]->get_tab_count(); + if (in_use) + splits[i]->show(); + else + splits[i]->hide(); + } + + for(int i=0;i<DOCK_SLOT_MAX;i++) { + + if (!dock_slot[i]->is_hidden() && dock_slot[i]->get_tab_count()) { + dock_slot[i]->set_current_tab(0); + } + } +} + + void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String& p_section) { for(int i=0;i<DOCK_SLOT_MAX;i++) { @@ -4520,7 +4682,7 @@ void EditorNode::_scene_tab_closed(int p_tab) { } else { _remove_scene(p_tab); - //_update_scene_tabs(); + _update_scene_tabs(); } } @@ -4673,6 +4835,31 @@ void EditorNode::_bottom_panel_switch(bool p_enable,int p_idx) { } } + +void EditorNode::add_control_to_dock(DockSlot p_slot,Control* p_control) { + ERR_FAIL_INDEX(p_slot,DOCK_SLOT_MAX); + dock_slot[p_slot]->add_child(p_control); + _update_dock_slots_visibility(); + +} + +void EditorNode::remove_control_from_dock(Control* p_control) { + + Control *dock=NULL; + for(int i=0;i<DOCK_SLOT_MAX;i++) { + if (p_control->get_parent()==dock_slot[i]) { + dock=dock_slot[i]; + break; + } + } + + ERR_EXPLAIN("Control was not in dock"); + ERR_FAIL_COND(!dock); + + dock->remove_child(p_control); + _update_dock_slots_visibility(); +} + void EditorNode::_bind_methods() { @@ -4763,6 +4950,7 @@ EditorNode::EditorNode() { EditorHelp::generate_doc(); //before any editor classes are crated SceneState::set_disable_placeholders(true); + InputDefault *id = Input::get_singleton()->cast_to<InputDefault>(); if (id) { @@ -4778,6 +4966,7 @@ EditorNode::EditorNode() { singleton=this; last_checked_version=0; changing_scene=false; + _initializing_addons=false; FileAccess::set_backup_save(true); @@ -5044,7 +5233,7 @@ EditorNode::EditorNode() { scene_tabs=memnew( Tabs ); scene_tabs->add_tab("unsaved"); scene_tabs->set_tab_align(Tabs::ALIGN_CENTER); - scene_tabs->set_tab_close_display_policy(Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY); + scene_tabs->set_tab_close_display_policy( (bool(EDITOR_DEF("global/always_show_close_button_in_scene_tabs", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY) ); scene_tabs->connect("tab_changed",this,"_scene_tab_changed"); scene_tabs->connect("right_button_pressed",this,"_scene_tab_script_edited"); scene_tabs->connect("tab_close", this, "_scene_tab_closed"); @@ -5866,7 +6055,8 @@ EditorNode::EditorNode() { // Ref<EditorSceneImporterFBXConv> _fbxconv_import = memnew( EditorSceneImporterFBXConv); // _scene_import->add_importer(_fbxconv_import); editor_import_export->add_import_plugin( _scene_import); - editor_import_export->add_import_plugin( Ref<EditorSceneAnimationImportPlugin>( memnew(EditorSceneAnimationImportPlugin(this)))); + // TODO: This plugin has no code, it should be either implemented or dropped (GH-3667) + // editor_import_export->add_import_plugin( Ref<EditorSceneAnimationImportPlugin>( memnew(EditorSceneAnimationImportPlugin(this)))); editor_import_export->add_import_plugin( Ref<EditorMeshImportPlugin>( memnew(EditorMeshImportPlugin(this)))); editor_import_export->add_import_plugin( Ref<EditorFontImportPlugin>( memnew(EditorFontImportPlugin(this)))); editor_import_export->add_import_plugin( Ref<EditorSampleImportPlugin>( memnew(EditorSampleImportPlugin(this)))); @@ -6036,7 +6226,7 @@ EditorNode::EditorNode() { } - EditorSettings::get_singleton()->enable_plugins(); + Node::set_human_readable_collision_renaming(true); @@ -6052,6 +6242,19 @@ EditorNode::EditorNode() { editor_data.set_edited_scene(0); _update_scene_tabs(); + { + + _initializing_addons=true; + Vector<String> addons = Globals::get_singleton()->get("editor_plugins/enabled"); + + for(int i=0;i<addons.size();i++) { + set_addon_plugin_enabled(addons[i],true); + } + _initializing_addons=false; + } + + + _load_docks(); diff --git a/tools/editor/editor_node.h b/tools/editor/editor_node.h index a8aa6ac1f4..b5d3e536db 100644 --- a/tools/editor/editor_node.h +++ b/tools/editor/editor_node.h @@ -101,6 +101,19 @@ class EditorNode : public Node { OBJ_TYPE( EditorNode, Node ); +public: + enum DockSlot { + DOCK_SLOT_LEFT_UL, + DOCK_SLOT_LEFT_BL, + DOCK_SLOT_LEFT_UR, + DOCK_SLOT_LEFT_BR, + DOCK_SLOT_RIGHT_UL, + DOCK_SLOT_RIGHT_BL, + DOCK_SLOT_RIGHT_UR, + DOCK_SLOT_RIGHT_BR, + DOCK_SLOT_MAX + }; +private: enum { HISTORY_SIZE=64 }; @@ -182,17 +195,6 @@ class EditorNode : public Node { OBJECT_METHOD_BASE=500 }; - enum DockSlot { - DOCK_SLOT_LEFT_UL, - DOCK_SLOT_LEFT_BL, - DOCK_SLOT_LEFT_UR, - DOCK_SLOT_LEFT_BR, - DOCK_SLOT_RIGHT_UL, - DOCK_SLOT_RIGHT_BL, - DOCK_SLOT_RIGHT_UR, - DOCK_SLOT_RIGHT_BR, - DOCK_SLOT_MAX - }; //Node *edited_scene; //scene being edited @@ -355,6 +357,7 @@ class EditorNode : public Node { Object *current; bool _playing_edited; + String run_custom_filename; bool reference_resource_mem; bool save_external_resources_mem; uint64_t saved_version; @@ -447,7 +450,7 @@ class EditorNode : public Node { void _hide_top_editors(); void _quick_opened(); - void _quick_run(const String& p_resource); + void _quick_run(); void _run(bool p_current=false, const String &p_custom=""); @@ -478,6 +481,10 @@ class EditorNode : public Node { Map<String,Ref<Texture> > icon_type_cache; + bool _initializing_addons; + Map<String,EditorPlugin*> plugin_addons; + + static Ref<Texture> _file_dialog_get_icon(const String& p_path); static void _file_dialog_register(FileDialog *p_dialog); static void _file_dialog_unregister(FileDialog *p_dialog); @@ -540,6 +547,8 @@ class EditorNode : public Node { void _load_docks(); void _save_docks_to_config(Ref<ConfigFile> p_layout, const String& p_section); void _load_docks_from_config(Ref<ConfigFile> p_layout, const String& p_section); + void _update_dock_slots_visibility(); + void _update_layouts_menu(); void _layout_menu_option(int p_idx); @@ -548,6 +557,9 @@ class EditorNode : public Node { void _clear_search_box(); void _clear_undo_history(); + void _update_addon_config(); + + protected: void _notification(int p_what); static void _bind_methods(); @@ -569,9 +581,14 @@ public: static void add_editor_plugin(EditorPlugin *p_editor); static void remove_editor_plugin(EditorPlugin *p_editor); + void add_control_to_dock(DockSlot p_slot,Control* p_control); + void remove_control_from_dock(Control* p_control); + void add_editor_import_plugin(const Ref<EditorImportPlugin>& p_editor_import); void remove_editor_import_plugin(const Ref<EditorImportPlugin>& p_editor_import); + void set_addon_plugin_enabled(const String& p_addon,bool p_enabled); + bool is_addon_plugin_enabled(const String &p_addon) const; void edit_node(Node *p_node); void edit_resource(const Ref<Resource>& p_resource); diff --git a/tools/editor/editor_plugin.cpp b/tools/editor/editor_plugin.cpp index b7ccb452e9..89b9c59287 100644 --- a/tools/editor/editor_plugin.cpp +++ b/tools/editor/editor_plugin.cpp @@ -29,6 +29,8 @@ #include "editor_plugin.h" #include "plugins/canvas_item_editor_plugin.h" #include "plugins/spatial_editor_plugin.h" +#include "tools/editor/editor_node.h" +#include "tools/editor/editor_settings.h" void EditorPlugin::add_custom_type(const String& p_type, const String& p_base,const Ref<Script>& p_script, const Ref<Texture>& p_icon) { @@ -41,8 +43,26 @@ void EditorPlugin::remove_custom_type(const String& p_type){ } +void EditorPlugin::add_control_to_bottom_dock(Control *p_control, const String &p_title) { -void EditorPlugin::add_custom_control(CustomControlContainer p_location,Control *p_control) { + EditorNode::get_singleton()->add_bottom_panel_item(p_title,p_control); +} + +void EditorPlugin::add_control_to_dock(DockSlot p_slot,Control *p_control) { + + ERR_FAIL_NULL(p_control); + EditorNode::get_singleton()->add_control_to_dock(EditorNode::DockSlot(p_slot),p_control); + +} + +void EditorPlugin::remove_control_from_docks(Control *p_control) { + + ERR_FAIL_NULL(p_control); + EditorNode::get_singleton()->remove_control_from_dock(p_control); + +} + +void EditorPlugin::add_control_to_container(CustomControlContainer p_location,Control *p_control) { switch(p_location) { @@ -50,6 +70,7 @@ void EditorPlugin::add_custom_control(CustomControlContainer p_location,Control EditorNode::get_menu_hb()->add_child(p_control); } break; + case CONTAINER_SPATIAL_EDITOR_MENU: { SpatialEditor::get_singleton()->add_control_to_menu_panel(p_control); @@ -86,9 +107,13 @@ void EditorPlugin::add_custom_control(CustomControlContainer p_location,Control } } -bool EditorPlugin::create_spatial_gizmo(Spatial* p_spatial) { +Ref<SpatialEditorGizmo> EditorPlugin::create_spatial_gizmo(Spatial* p_spatial) { //?? - return false; + if (get_script_instance() && get_script_instance()->has_method("create_spatial_gizmo")) { + return get_script_instance()->call("create_spatial_gizmo",p_spatial); + } + + return Ref<SpatialEditorGizmo>(); } bool EditorPlugin::forward_input_event(const InputEvent& p_event) { @@ -206,15 +231,69 @@ void EditorPlugin::get_window_layout(Ref<ConfigFile> p_layout){ } +EditorSelection* EditorPlugin::get_selection() { + return EditorNode::get_singleton()->get_editor_selection(); +} + + +EditorSettings *EditorPlugin::get_editor_settings() { + return EditorSettings::get_singleton(); +} + +void EditorPlugin::add_import_plugin(const Ref<EditorImportPlugin>& p_editor_import) { + + EditorNode::get_singleton()->add_editor_import_plugin(p_editor_import); +} + +void EditorPlugin::remove_import_plugin(const Ref<EditorImportPlugin>& p_editor_import){ + + EditorNode::get_singleton()->remove_editor_import_plugin(p_editor_import); + +} + +void EditorPlugin::add_export_plugin(const Ref<EditorExportPlugin>& p_editor_export){ + + EditorImportExport::get_singleton()->add_export_plugin(p_editor_export); +} +void EditorPlugin::remove_export_plugin(const Ref<EditorExportPlugin>& p_editor_export){ + + EditorImportExport::get_singleton()->remove_export_plugin(p_editor_export); + +} + +Control *EditorPlugin::get_base_control() { + + return EditorNode::get_singleton()->get_gui_base(); +} + + void EditorPlugin::_bind_methods() { - ObjectTypeDB::bind_method(_MD("get_undo_redo"),&EditorPlugin::_get_undo_redo); - ObjectTypeDB::bind_method(_MD("add_custom_control","container","control"),&EditorPlugin::add_custom_control); + ObjectTypeDB::bind_method(_MD("add_control_to_container","container","control:Control"),&EditorPlugin::add_control_to_container); + ObjectTypeDB::bind_method(_MD("add_control_to_bottom_dock","control:Control","title"),&EditorPlugin::add_control_to_bottom_dock); + ObjectTypeDB::bind_method(_MD("add_control_to_dock","slot","control:Control"),&EditorPlugin::add_control_to_dock); + ObjectTypeDB::bind_method(_MD("remove_control_from_docks","control:Control"),&EditorPlugin::remove_control_from_docks); ObjectTypeDB::bind_method(_MD("add_custom_type","type","base","script:Script","icon:Texture"),&EditorPlugin::add_custom_type); ObjectTypeDB::bind_method(_MD("remove_custom_type","type"),&EditorPlugin::remove_custom_type); + ObjectTypeDB::bind_method(_MD("add_import_plugin","plugin:EditorImportPlugin"),&EditorPlugin::add_import_plugin); + ObjectTypeDB::bind_method(_MD("remove_import_plugin","plugin:EditorImportPlugin"),&EditorPlugin::remove_import_plugin); + + ObjectTypeDB::bind_method(_MD("add_export_plugin","plugin:EditorExportPlugin"),&EditorPlugin::add_export_plugin); + ObjectTypeDB::bind_method(_MD("remove_export_plugin","plugin:EditorExportPlugin"),&EditorPlugin::remove_export_plugin); + + + ObjectTypeDB::bind_method(_MD("get_base_control:Control"),&EditorPlugin::get_base_control); + ObjectTypeDB::bind_method(_MD("get_undo_redo:UndoRedo"),&EditorPlugin::_get_undo_redo); + ObjectTypeDB::bind_method(_MD("get_selection:EditorSelection"),&EditorPlugin::get_selection); + ObjectTypeDB::bind_method(_MD("get_editor_settings:EditorSettings"),&EditorPlugin::get_editor_settings); + ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::BOOL,"forward_input_event",PropertyInfo(Variant::INPUT_EVENT,"event"))); ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::BOOL,"forward_spatial_input_event",PropertyInfo(Variant::OBJECT,"camera",PROPERTY_HINT_RESOURCE_TYPE,"Camera"),PropertyInfo(Variant::INPUT_EVENT,"event"))); + MethodInfo gizmo = MethodInfo(Variant::OBJECT,"create_spatial_gizmo",PropertyInfo(Variant::OBJECT,"for_spatial:Spatial")); + gizmo.return_val.hint=PROPERTY_HINT_RESOURCE_TYPE; + gizmo.return_val.hint_string="EditorSpatialGizmo"; + ObjectTypeDB::add_virtual_method(get_type_static(),gizmo); ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::STRING,"get_name")); ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo(Variant::BOOL,"has_main_screen")); ObjectTypeDB::add_virtual_method(get_type_static(),MethodInfo("make_visible",PropertyInfo(Variant::BOOL,"visible"))); @@ -233,6 +312,16 @@ void EditorPlugin::_bind_methods() { BIND_CONSTANT( CONTAINER_CANVAS_EDITOR_MENU ); BIND_CONSTANT( CONTAINER_CANVAS_EDITOR_SIDE ); + BIND_CONSTANT( DOCK_SLOT_LEFT_UL ); + BIND_CONSTANT( DOCK_SLOT_LEFT_BL ); + BIND_CONSTANT( DOCK_SLOT_LEFT_UR ); + BIND_CONSTANT( DOCK_SLOT_LEFT_BR ); + BIND_CONSTANT( DOCK_SLOT_RIGHT_UL ); + BIND_CONSTANT( DOCK_SLOT_RIGHT_BL ); + BIND_CONSTANT( DOCK_SLOT_RIGHT_UR ); + BIND_CONSTANT( DOCK_SLOT_RIGHT_BR ); + BIND_CONSTANT( DOCK_SLOT_MAX ); + } EditorPlugin::EditorPlugin() diff --git a/tools/editor/editor_plugin.h b/tools/editor/editor_plugin.h index bf1e185a37..75a3b3b26f 100644 --- a/tools/editor/editor_plugin.h +++ b/tools/editor/editor_plugin.h @@ -40,6 +40,12 @@ class EditorNode; class Spatial; class Camera; +class EditorSelection; +class EditorImportExport; +class EditorSettings; +class SpatialEditorGizmo; +class EditorImportPlugin; +class EditorExportPlugin; class EditorPlugin : public Node { @@ -70,11 +76,26 @@ public: CONTAINER_CANVAS_EDITOR_BOTTOM }; + enum DockSlot { + DOCK_SLOT_LEFT_UL, + DOCK_SLOT_LEFT_BL, + DOCK_SLOT_LEFT_UR, + DOCK_SLOT_LEFT_BR, + DOCK_SLOT_RIGHT_UL, + DOCK_SLOT_RIGHT_BL, + DOCK_SLOT_RIGHT_UR, + DOCK_SLOT_RIGHT_BR, + DOCK_SLOT_MAX + }; + //TODO: send a resoucre for editing to the editor node? - void add_custom_control(CustomControlContainer p_location,Control *p_control); + void add_control_to_container(CustomControlContainer p_location, Control *p_control); + void add_control_to_bottom_dock(Control *p_control, const String &p_title); + void add_control_to_dock(DockSlot p_slot,Control *p_control); + void remove_control_from_docks(Control *p_control); - virtual bool create_spatial_gizmo(Spatial* p_spatial); + virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial* p_spatial); virtual bool forward_input_event(const InputEvent& p_event); virtual bool forward_spatial_input_event(Camera* p_camera,const InputEvent& p_event); virtual String get_name() const; @@ -94,6 +115,19 @@ public: virtual void get_window_layout(Ref<ConfigFile> p_layout); virtual void edited_scene_changed(){}; // if changes are pending in editor, apply them + + Control *get_base_control(); + + void add_import_plugin(const Ref<EditorImportPlugin>& p_editor_import); + void remove_import_plugin(const Ref<EditorImportPlugin>& p_editor_import); + + void add_export_plugin(const Ref<EditorExportPlugin>& p_editor_export); + void remove_export_plugin(const Ref<EditorExportPlugin>& p_editor_export); + + EditorSelection* get_selection(); + //EditorImportExport *get_import_export(); + EditorSettings *get_editor_settings(); + virtual void restore_global_state(); virtual void save_global_state(); @@ -103,6 +137,7 @@ public: }; VARIANT_ENUM_CAST( EditorPlugin::CustomControlContainer ); +VARIANT_ENUM_CAST( EditorPlugin::DockSlot ); typedef EditorPlugin* (*EditorPluginCreateFunc)(EditorNode *); diff --git a/tools/editor/editor_plugin_settings.cpp b/tools/editor/editor_plugin_settings.cpp new file mode 100644 index 0000000000..d78e43c578 --- /dev/null +++ b/tools/editor/editor_plugin_settings.cpp @@ -0,0 +1,188 @@ +#include "editor_plugin_settings.h" +#include "scene/gui/margin_container.h" +#include "io/config_file.h" +#include "os/file_access.h" +#include "os/main_loop.h" +#include "globals.h" +#include "editor_node.h" + +void EditorPluginSettings::_notification(int p_what) { + + if (p_what==MainLoop::NOTIFICATION_WM_FOCUS_IN) { + update_plugins(); + } +} + +void EditorPluginSettings::update_plugins() { + + + plugin_list->clear(); + + DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + Error err = da->change_dir("res://addons"); + if (err!=OK) { + memdelete(da); + return; + } + + updating=true; + + TreeItem *root = plugin_list->create_item(); + + da->list_dir_begin(); + + String d = da->get_next(); + + Vector<String> plugins; + + while(d!=String()) { + + bool dir = da->current_is_dir(); + String path = "res://addons/"+d+"/plugin.cfg"; + + if (dir && FileAccess::exists(path)) { + + plugins.push_back(d); + } + + d = da->get_next(); + } + + da->list_dir_end(); + memdelete(da); + + plugins.sort(); + + Vector<String> active_plugins = Globals::get_singleton()->get("plugins/active"); + + for(int i=0;i<plugins.size();i++) { + + Ref<ConfigFile> cf; + cf.instance(); + String path = "res://addons/"+plugins[i]+"/plugin.cfg"; + + Error err = cf->load(path); + + if (err!=OK) { + WARN_PRINTS("Can't load plugin config: "+path); + } else if (!cf->has_section_key("plugin","name")) { + WARN_PRINTS("Plugin misses plugin/name: "+path); + } else if (!cf->has_section_key("plugin","author")) { + WARN_PRINTS("Plugin misses plugin/author: "+path); + } else if (!cf->has_section_key("plugin","version")) { + WARN_PRINTS("Plugin misses plugin/version: "+path); + } else if (!cf->has_section_key("plugin","description")) { + WARN_PRINTS("Plugin misses plugin/description: "+path); + } else if (!cf->has_section_key("plugin","script")) { + WARN_PRINTS("Plugin misses plugin/script: "+path); + } else { + + String d = plugins[i]; + String name = cf->get_value("plugin","name"); + String author = cf->get_value("plugin","author"); + String version = cf->get_value("plugin","version"); + String description = cf->get_value("plugin","description"); + String script = cf->get_value("plugin","script"); + + TreeItem *item = plugin_list->create_item(root); + item->set_text(0,name); + item->set_tooltip(0,"Name: "+name+"\nPath: "+path+"\nMain Script: "+script); + item->set_metadata(0,d); + item->set_text(1,version); + item->set_metadata(1,script); + item->set_text(2,author); + item->set_metadata(2,description); + item->set_cell_mode(3,TreeItem::CELL_MODE_RANGE); + item->set_range_config(3,0,1,1); + item->set_text(3,"Inactive,Active"); + item->set_editable(3,true); + + if (EditorNode::get_singleton()->is_addon_plugin_enabled(d)) { + item->set_custom_color(3,Color(0.2,1,0.2)); + item->set_range(3,1); + } else { + item->set_custom_color(3,Color(1,0.2,0.2)); + item->set_range(3,0); + } + } + + } + + updating=false; + +} + + +void EditorPluginSettings::_plugin_activity_changed() { + + if (updating) + return; + + TreeItem *ti=plugin_list->get_edited(); + ERR_FAIL_COND(!ti); + bool active = ti->get_range(3); + String name = ti->get_metadata(0); + + EditorNode::get_singleton()->set_addon_plugin_enabled(name,active); + + bool is_active = EditorNode::get_singleton()->is_addon_plugin_enabled(name); + + if (is_active!=active) { + updating=true; + ti->set_range(3,is_active?1:0); + updating=false; + } + + if (is_active) + ti->set_custom_color(3,Color(0.2,1,0.2)); + else + ti->set_custom_color(3,Color(1,0.2,0.2)); + + +} + +void EditorPluginSettings::_bind_methods() { + + ObjectTypeDB::bind_method("update_plugins",&EditorPluginSettings::update_plugins); + ObjectTypeDB::bind_method("_plugin_activity_changed",&EditorPluginSettings::_plugin_activity_changed); +} + +EditorPluginSettings::EditorPluginSettings() { + + HBoxContainer *title_hb = memnew( HBoxContainer ); + title_hb->add_child(memnew( Label("Installed Plugins:"))); + title_hb->add_spacer(); + update_list = memnew( Button("Update") ); + update_list->connect("pressed",this,"update_plugins"); + title_hb->add_child(update_list); + add_child(title_hb); + + plugin_list = memnew( Tree ); + plugin_list->set_v_size_flags(SIZE_EXPAND_FILL); + plugin_list->set_columns(4); + plugin_list->set_column_titles_visible(true); + plugin_list->set_column_title(0,"Name:"); + plugin_list->set_column_title(1,"Version:"); + plugin_list->set_column_title(2,"Author:"); + plugin_list->set_column_title(3,"Status:"); + plugin_list->set_column_expand(0,true); + plugin_list->set_column_expand(1,false); + plugin_list->set_column_expand(2,false); + plugin_list->set_column_expand(3,false); + plugin_list->set_column_min_width(1,100); + plugin_list->set_column_min_width(2,250); + plugin_list->set_column_min_width(3,80); + plugin_list->set_hide_root(true); + plugin_list->connect("item_edited",this,"_plugin_activity_changed"); + + + MarginContainer *mc = memnew( MarginContainer ); + mc->add_child(plugin_list); + mc->set_v_size_flags(SIZE_EXPAND_FILL); + + add_child(mc); + + updating=false; + +} + diff --git a/tools/editor/editor_plugin_settings.h b/tools/editor/editor_plugin_settings.h new file mode 100644 index 0000000000..4f3c5b8268 --- /dev/null +++ b/tools/editor/editor_plugin_settings.h @@ -0,0 +1,35 @@ +#ifndef EDITORPLUGINSETTINGS_H +#define EDITORPLUGINSETTINGS_H + + +#include "scene/gui/dialogs.h" +#include "property_editor.h" +#include "optimized_save_dialog.h" +#include "undo_redo.h" +#include "editor_data.h" + +class EditorPluginSettings : public VBoxContainer { + + OBJ_TYPE(EditorPluginSettings,VBoxContainer); + + Button* update_list; + Tree *plugin_list; + bool updating; + + + void _plugin_activity_changed(); +protected: + + void _notification(int p_what); + + static void _bind_methods(); + + +public: + + void update_plugins(); + + EditorPluginSettings(); +}; + +#endif // EDITORPLUGINSETTINGS_H diff --git a/tools/editor/editor_settings.cpp b/tools/editor/editor_settings.cpp index 4195ba97e6..47ef87cfb1 100644 --- a/tools/editor/editor_settings.cpp +++ b/tools/editor/editor_settings.cpp @@ -165,22 +165,33 @@ void EditorSettings::create() { return; //pointless DirAccess *dir=NULL; - Object *object; Variant meta; String config_path; String config_dir; String config_file="editor_settings.xml"; + Ref<ConfigFile> extra_config = memnew(ConfigFile); - if (OS::get_singleton()->has_environment("APPDATA")) { - // Most likely under windows, save here - config_path=OS::get_singleton()->get_environment("APPDATA"); - config_dir=String(_MKSTR(VERSION_SHORT_NAME)).capitalize(); - } else if (OS::get_singleton()->has_environment("HOME")) { + String exe_path = OS::get_singleton()->get_executable_path().get_base_dir(); + DirAccess* d = DirAccess::create_for_path(exe_path); + if (d->file_exists(exe_path + "/._sc_")) { - config_path=OS::get_singleton()->get_environment("HOME"); - config_dir="."+String(_MKSTR(VERSION_SHORT_NAME)).to_lower(); - } + // editor is self contained + config_path = exe_path; + config_dir = "editor_data"; + extra_config->load(exe_path + "/._sc_"); + } else { + + if (OS::get_singleton()->has_environment("APPDATA")) { + // Most likely under windows, save here + config_path=OS::get_singleton()->get_environment("APPDATA"); + config_dir=String(_MKSTR(VERSION_SHORT_NAME)).capitalize(); + } else if (OS::get_singleton()->has_environment("HOME")) { + + config_path=OS::get_singleton()->get_environment("HOME"); + config_dir="."+String(_MKSTR(VERSION_SHORT_NAME)).to_lower(); + } + }; ObjectTypeDB::register_type<EditorSettings>(); //otherwise it can't be unserialized String config_file_path; @@ -217,13 +228,6 @@ void EditorSettings::create() { dir->change_dir(".."); } - if (dir->change_dir("plugins")!=OK) { - dir->make_dir("plugins"); - } else { - - dir->change_dir(".."); - } - if (dir->change_dir("config")!=OK) { dir->make_dir("config"); } else { @@ -276,7 +280,6 @@ void EditorSettings::create() { singleton->setup_network(); singleton->load_favorites(); - singleton->scan_plugins(); return; @@ -286,12 +289,21 @@ void EditorSettings::create() { fail: + // patch init projects + if (extra_config->has_section("init_projects")) { + Vector<String> list = extra_config->get_value("init_projects", "list"); + for (int i=0; i<list.size(); i++) { + + list[i] = exe_path + "/" + list[i]; + }; + extra_config->set_value("init_projects", "list", list); + }; + singleton = Ref<EditorSettings>( memnew( EditorSettings ) ); singleton->config_file_path=config_file_path; singleton->settings_path=config_path+"/"+config_dir; - singleton->_load_defaults(); + singleton->_load_defaults(extra_config); singleton->setup_network(); - singleton->scan_plugins(); } @@ -302,35 +314,6 @@ String EditorSettings::get_settings_path() const { } -Error EditorSettings::_load_plugin(const String& p_path, Plugin &plugin) { - - if (!FileAccess::exists(p_path)) - return ERR_FILE_NOT_FOUND; - - Ref<ConfigFile> cf = memnew(ConfigFile); - Error err = cf->load(p_path); - ERR_EXPLAIN("Error loading plugin description for: "+p_path); - ERR_FAIL_COND_V(err!=OK,ERR_CANT_OPEN); - - plugin.instance=NULL; - ERR_FAIL_COND_V(!cf->has_section_key("plugin","name"),ERR_INVALID_DATA); - ERR_FAIL_COND_V(!cf->has_section_key("plugin","installs"),ERR_INVALID_DATA); - ERR_FAIL_COND_V(!cf->has_section_key("plugin","author"),ERR_INVALID_DATA); - ERR_FAIL_COND_V(!cf->has_section_key("plugin","version"),ERR_INVALID_DATA); - ERR_FAIL_COND_V(!cf->has_section_key("plugin","script"),ERR_INVALID_DATA); - plugin.name=cf->get_value("plugin","name"); - plugin.author=cf->get_value("plugin","author"); - plugin.version=cf->get_value("plugin","version"); - plugin.script=cf->get_value("plugin","script"); - - if (cf->has_section_key("plugin","description")) - plugin.description=cf->get_value("plugin","description"); - plugin.installs=cf->get_value("plugin","installs"); - if (cf->has_section_key("plugin","install_files")) - plugin.install_files=cf->get_value("plugin","install_files"); - - return OK; -} void EditorSettings::setup_network() { @@ -361,46 +344,6 @@ void EditorSettings::setup_network() { } -void EditorSettings::scan_plugins() { - - Map<String,Plugin> new_plugins; - - new_plugins.clear(); - DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - Error err = d->change_dir(get_settings_path().plus_file("plugins")); - if (err!=OK) { - memdelete(d); - ERR_EXPLAIN("Plugin dir does not exist!") - ERR_FAIL_COND(err!=OK); - } - d->list_dir_begin(); - - String base = d->get_current_dir(); - //print_line("list diring on: "+base); - while(true) { - String p = d->get_next(); - if (p=="") - break; - if (!d->current_is_dir() || p.begins_with(".")) - continue; - - String cfpath=d->get_current_dir().plus_file(p+"/plugin.cfg"); - - Plugin plugin; - Error err = _load_plugin(cfpath,plugin); - ERR_CONTINUE(err!=OK); - - if (plugins.has(p)) - plugin.instance=plugins[p].instance; - - new_plugins[p]=plugin; - } - - - plugins=new_plugins; - - memdelete(d); -} void EditorSettings::save() { @@ -435,7 +378,7 @@ void EditorSettings::destroy() { singleton=Ref<EditorSettings>(); } -void EditorSettings::_load_defaults() { +void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _THREAD_SAFE_METHOD_ @@ -490,6 +433,7 @@ void EditorSettings::_load_defaults() { hints["3d_editor/pan_modifier"]=PropertyInfo(Variant::INT,"3d_editor/pan_modifier",PROPERTY_HINT_ENUM,"None,Shift,Alt,Meta,Ctrl"); set("3d_editor/zoom_modifier",4); hints["3d_editor/zoom_modifier"]=PropertyInfo(Variant::INT,"3d_editor/zoom_modifier",PROPERTY_HINT_ENUM,"None,Shift,Alt,Meta,Ctrl"); + set("3d_editor/emulate_numpad",false); set("2d_editor/bone_width",5); set("2d_editor/bone_color1",Color(1.0,1.0,1.0,0.9)); @@ -541,6 +485,33 @@ void EditorSettings::_load_defaults() { set("run/auto_save_before_running",true); set("resources/save_compressed_resources",true); set("resources/auto_reload_modified_images",true); + + if (p_extra_config.is_valid()) { + + if (p_extra_config->has_section("init_projects") && p_extra_config->has_section_key("init_projects", "list")) { + + Vector<String> list = p_extra_config->get_value("init_projects", "list"); + for (int i=0; i<list.size(); i++) { + + String name = list[i].replace("/", "::"); + set("projects/"+name, list[i]); + }; + }; + + if (p_extra_config->has_section("presets")) { + + List<String> keys; + p_extra_config->get_section_keys("presets", &keys); + + for (List<String>::Element *E=keys.front();E;E=E->next()) { + + String key = E->get(); + Variant val = p_extra_config->get_value("presets", key); + set(key, val); + }; + }; + }; + } void EditorSettings::notify_changes() { @@ -574,148 +545,9 @@ void EditorSettings::add_property_hint(const PropertyInfo& p_hint) { } -bool EditorSettings::is_plugin_enabled(const String& p_plugin) { - - if (!has("_plugins/enabled")) - return false; - - StringArray sa=get("_plugins/enabled"); - - for(int i=0;i<sa.size();i++) { - - String plugin = sa[i]; - if (!plugins.has(plugin)) - continue; - if (plugin==p_plugin) - return true; - } - - return false; -} -void EditorSettings::enable_plugins() { - // editor plugins - if (has("_plugins/enabled")) { - StringArray sa=get("_plugins/enabled"); - - for(int i=0;i<sa.size();i++) { - - String plugin = sa[i]; - if (!plugins.has(plugin)) - continue; - if (plugins[plugin].installs) - continue; //not configured here - set_plugin_enabled(plugin,true); - } - } - - // installed plugins - List<PropertyInfo> pi; - Globals::get_singleton()->get_property_list(&pi); - for (List<PropertyInfo>::Element *E=pi.front();E;E=E->next()) { - - String p = E->get().name; - - if (p.begins_with("plugins/")) { - load_installed_plugin(p.replace_first("plugins/","")); - } - } - -} - -void EditorSettings::load_installed_plugin(const String& p_plugin) { - - ERR_FAIL_COND( !Globals::get_singleton()->has("plugins/"+p_plugin) ); - String path = Globals::get_singleton()->get("plugins/"+p_plugin); - - Plugin plugin; - Error err = _load_plugin(path.plus_file("plugin.cfg"),plugin); - - if (err) - return; - - print_line("installing plugin..."); - EditorPlugin *ep=_load_plugin_editor(path.plus_file(plugin.script)); - ERR_FAIL_COND(!ep); - print_line("load!"); - EditorNode::add_editor_plugin(ep); - -} - - -EditorPlugin *EditorSettings::_load_plugin_editor(const String& p_path) { - - Ref<Script> script = ResourceLoader::load(p_path); - ERR_EXPLAIN("Invalid Script for plugin: "+p_path); - ERR_FAIL_COND_V(script.is_null(),NULL); - ERR_EXPLAIN("Script has errors: "+p_path); - ERR_FAIL_COND_V(!script->can_instance(),NULL); - ERR_EXPLAIN("Script does not inherit EditorPlugin: "+p_path); - ERR_FAIL_COND_V(script->get_instance_base_type().operator String()!="EditorPlugin",NULL); - - EditorPlugin *ep = memnew( EditorPlugin ); - ep->set_script(script.get_ref_ptr()); - if (!ep->get_script_instance()) { - memdelete(ep); - ERR_EXPLAIN("Script could't load: "+p_path); - ERR_FAIL_V(NULL); - } - - - return ep; -} - -void EditorSettings::set_plugin_enabled(const String& p_plugin, bool p_enabled) { - - ERR_FAIL_COND(!plugins.has(p_plugin)); - if (p_enabled == (plugins[p_plugin].instance!=NULL)) //already enabled or disabled - return; - - print_line("REQUEST "+p_plugin+" to "+itos(p_enabled)); - StringArray sa; - if (has("_plugins/enabled")) - sa=get("_plugins/enabled"); - - int idx=-1; - for(int i=0;i<sa.size();i++) { - - if (sa[i]==p_plugin) { - idx=i; - break; - } - } - - if (p_enabled) { - - - String ppath = get_settings_path().plus_file("plugins/"+p_plugin+"/"+plugins[p_plugin].script); - EditorPlugin *ep=_load_plugin_editor(ppath); - if (!ep) - return; - plugins[p_plugin].instance=ep; - EditorNode::add_editor_plugin(ep); - - if (idx==-1) - sa.push_back(p_plugin); - } else { - - print_line("DISABLING"); - EditorNode::remove_editor_plugin(plugins[p_plugin].instance); - memdelete(plugins[p_plugin].instance); - plugins[p_plugin].instance=NULL; - if (idx!=-1) - sa.remove(idx); - - } - - if (sa.size()==0) - set("_plugins/enabled",Variant()); - else - set("_plugins/enabled",sa); - -} void EditorSettings::set_favorite_dirs(const Vector<String>& p_favorites) { @@ -785,6 +617,16 @@ void EditorSettings::load_favorites() { void EditorSettings::_bind_methods() { + ObjectTypeDB::bind_method(_MD("erase","property"),&EditorSettings::erase); + ObjectTypeDB::bind_method(_MD("get_settings_path"),&EditorSettings::get_settings_path); + ObjectTypeDB::bind_method(_MD("get_project_settings_path"),&EditorSettings::get_project_settings_path); + + ObjectTypeDB::bind_method(_MD("set_favorite_dirs","dirs"),&EditorSettings::set_favorite_dirs); + ObjectTypeDB::bind_method(_MD("get_favorite_dirs"),&EditorSettings::get_favorite_dirs); + + ObjectTypeDB::bind_method(_MD("set_recent_dirs","dirs"),&EditorSettings::set_recent_dirs); + ObjectTypeDB::bind_method(_MD("get_recent_dirs"),&EditorSettings::get_recent_dirs); + ADD_SIGNAL(MethodInfo("settings_changed")); } diff --git a/tools/editor/editor_settings.h b/tools/editor/editor_settings.h index d1a11360af..ae5bbcca89 100644 --- a/tools/editor/editor_settings.h +++ b/tools/editor/editor_settings.h @@ -33,6 +33,7 @@ #include "resource.h" #include "os/thread_safe.h" +#include "core/io/config_file.h" class EditorPlugin; @@ -56,7 +57,6 @@ public: Vector<String> install_files; }; private: - Map<String,Plugin> plugins; struct VariantContainer { int order; @@ -83,10 +83,7 @@ private: Ref<Resource> clipboard; - EditorPlugin *_load_plugin_editor(const String& p_path); - Error _load_plugin(const String& p_path,Plugin& plugin); - - void _load_defaults(); + void _load_defaults(Ref<ConfigFile> p_extra_config = NULL); String project_config_path; @@ -107,13 +104,10 @@ public: static EditorSettings *get_singleton(); void erase(String p_var); String get_settings_path() const; - String get_global_settings_path() const; + //String get_global_settings_path() const; String get_project_settings_path() const; - const Map<String,Plugin>& get_plugins() const { return plugins; } - void scan_plugins(); - void enable_plugins(); void setup_network(); void raise_order(const String& p_name); @@ -123,11 +117,6 @@ public: void notify_changes(); - void set_plugin_enabled(const String& p_plugin,bool p_enabled); - bool is_plugin_enabled(const String& p_plugin); - - void load_installed_plugin(const String& p_plugin); - void set_resource_clipboard(const Ref<Resource>& p_resource) { clipboard=p_resource; } Ref<Resource> get_resource_clipboard() const { return clipboard; } diff --git a/tools/editor/io_plugins/editor_font_import_plugin.cpp b/tools/editor/io_plugins/editor_font_import_plugin.cpp index 9b4ca246e7..ff126a8e8c 100644 --- a/tools/editor/io_plugins/editor_font_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_font_import_plugin.cpp @@ -540,7 +540,7 @@ class EditorFontImportDialog : public ConfirmationDialog { return; } - //_import_inc(dest->get_line_edit()->get_text()); + _import_inc(dest->get_line_edit()->get_text()); hide(); } diff --git a/tools/editor/io_plugins/editor_scene_import_plugin.cpp b/tools/editor/io_plugins/editor_scene_import_plugin.cpp index a3b6827cd4..322320780d 100644 --- a/tools/editor/io_plugins/editor_scene_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_scene_import_plugin.cpp @@ -57,11 +57,12 @@ void EditorScenePostImport::_bind_methods() { } -Error EditorScenePostImport::post_import(Node* p_scene) { +Node *EditorScenePostImport::post_import(Node* p_scene) { if (get_script_instance()) - return Error(int(get_script_instance()->call("post_import",p_scene))); - return OK; + return get_script_instance()->call("post_import",p_scene); + + return p_scene; } EditorScenePostImport::EditorScenePostImport() { @@ -2748,8 +2749,8 @@ Error EditorSceneImportPlugin::import2(Node *scene, const String& p_dest_path, c if (post_import_script.is_valid()) { - err = post_import_script->post_import(scene); - if (err) { + scene = post_import_script->post_import(scene); + if (!scene) { EditorNode::add_io_error("Error running Post-Import script: '"+post_import_script_path); return err; } diff --git a/tools/editor/io_plugins/editor_scene_import_plugin.h b/tools/editor/io_plugins/editor_scene_import_plugin.h index 1f3b73fe7f..a1a090de7e 100644 --- a/tools/editor/io_plugins/editor_scene_import_plugin.h +++ b/tools/editor/io_plugins/editor_scene_import_plugin.h @@ -87,7 +87,7 @@ protected: static void _bind_methods(); public: - virtual Error post_import(Node* p_scene); + virtual Node* post_import(Node* p_scene); EditorScenePostImport(); }; diff --git a/tools/editor/plugins/animation_player_editor_plugin.cpp b/tools/editor/plugins/animation_player_editor_plugin.cpp index 32afd86970..010753e88c 100644 --- a/tools/editor/plugins/animation_player_editor_plugin.cpp +++ b/tools/editor/plugins/animation_player_editor_plugin.cpp @@ -621,10 +621,11 @@ void AnimationPlayerEditor::ensure_visibility() { Dictionary AnimationPlayerEditor::get_state() const { + Dictionary d; d["visible"]=is_visible(); - if (is_visible() && player) { + if (EditorNode::get_singleton()->get_edited_scene() && is_visible() && player) { d["player"]=EditorNode::get_singleton()->get_edited_scene()->get_path_to(player); d["animation"]=player->get_current_animation(); @@ -637,6 +638,9 @@ void AnimationPlayerEditor::set_state(const Dictionary& p_state) { if (p_state.has("visible") && p_state["visible"]) { + if (!EditorNode::get_singleton()->get_edited_scene()) + return; + Node *n = EditorNode::get_singleton()->get_edited_scene()->get_node(p_state["player"]); if (n && n->cast_to<AnimationPlayer>()) { player=n->cast_to<AnimationPlayer>(); @@ -942,6 +946,14 @@ void AnimationPlayerEditor::_seek_value_changed(float p_value) { anim=player->get_animation(current); float pos = anim->get_length() * (p_value / frame->get_max()); + float step = anim->get_step(); + if (step) { + pos=Math::stepify(pos, step); + if (pos<0) + pos=0; + if (pos>=anim->get_length()) + pos=anim->get_length(); + } if (player->is_valid()) { float cpos = player->get_current_animation_pos(); diff --git a/tools/editor/plugins/baked_light_editor_plugin.cpp b/tools/editor/plugins/baked_light_editor_plugin.cpp index 26524b2437..22a188bce4 100644 --- a/tools/editor/plugins/baked_light_editor_plugin.cpp +++ b/tools/editor/plugins/baked_light_editor_plugin.cpp @@ -332,7 +332,7 @@ BakedLightEditorPlugin::BakedLightEditorPlugin(EditorNode *p_node) { editor=p_node; baked_light_editor = memnew( BakedLightEditor ); editor->get_viewport()->add_child(baked_light_editor); - add_custom_control(CONTAINER_SPATIAL_EDITOR_MENU,baked_light_editor->bake_hbox); + add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU,baked_light_editor->bake_hbox); baked_light_editor->hide(); baked_light_editor->bake_hbox->hide(); } diff --git a/tools/editor/plugins/canvas_item_editor_plugin.cpp b/tools/editor/plugins/canvas_item_editor_plugin.cpp index f3ff001d84..f8bc97a433 100644 --- a/tools/editor/plugins/canvas_item_editor_plugin.cpp +++ b/tools/editor/plugins/canvas_item_editor_plugin.cpp @@ -1560,7 +1560,7 @@ void CanvasItemEditor::_viewport_input_event(const InputEvent& p_event) { Matrix32 rot; rot.elements[1] = (dfrom - center).normalized(); rot.elements[0] = rot.elements[1].tangent(); - node->set_rot(snap_angle(rot.xform_inv(dto-center).angle(), node->get_rot())); + node->set_rot(snap_angle(rot.xform_inv(dto-center).angle() + node->get_rot(), node->get_rot())); display_rotate_to = dto; display_rotate_from = center; viewport->update(); diff --git a/tools/editor/plugins/color_ramp_editor_plugin.cpp b/tools/editor/plugins/color_ramp_editor_plugin.cpp index 42ff1b1de9..133775115d 100644 --- a/tools/editor/plugins/color_ramp_editor_plugin.cpp +++ b/tools/editor/plugins/color_ramp_editor_plugin.cpp @@ -13,9 +13,9 @@ ColorRampEditorPlugin::ColorRampEditorPlugin(EditorNode *p_node, bool p_2d) { _2d=p_2d; if (p_2d) - add_custom_control(CONTAINER_CANVAS_EDITOR_BOTTOM,ramp_editor); + add_control_to_container(CONTAINER_CANVAS_EDITOR_BOTTOM,ramp_editor); else - add_custom_control(CONTAINER_SPATIAL_EDITOR_BOTTOM,ramp_editor); + add_control_to_container(CONTAINER_SPATIAL_EDITOR_BOTTOM,ramp_editor); ramp_editor->set_custom_minimum_size(Size2(100, 48)); ramp_editor->hide(); diff --git a/tools/editor/plugins/path_editor_plugin.cpp b/tools/editor/plugins/path_editor_plugin.cpp index b99e632604..3c4428bdb0 100644 --- a/tools/editor/plugins/path_editor_plugin.cpp +++ b/tools/editor/plugins/path_editor_plugin.cpp @@ -267,17 +267,15 @@ PathSpatialGizmo::PathSpatialGizmo(Path* p_path){ } -bool PathEditorPlugin::create_spatial_gizmo(Spatial* p_spatial) { +Ref<SpatialEditorGizmo> PathEditorPlugin::create_spatial_gizmo(Spatial* p_spatial) { - if (p_spatial->cast_to<Path>()) { + if (p_spatial->cast_to<Path>()) { - Ref<PathSpatialGizmo> psg = memnew( PathSpatialGizmo(p_spatial->cast_to<Path>())); - p_spatial->set_gizmo(psg); - return true; + return memnew( PathSpatialGizmo(p_spatial->cast_to<Path>())); } - return false; + return Ref<SpatialEditorGizmo>(); } bool PathEditorPlugin::forward_spatial_input_event(Camera* p_camera,const InputEvent& p_event) { @@ -538,7 +536,7 @@ PathEditorPlugin::PathEditorPlugin(EditorNode *p_node) { path_thin_material->set_flag(Material::FLAG_DOUBLE_SIDED,true); path_thin_material->set_flag(Material::FLAG_UNSHADED,true); - SpatialEditor::get_singleton()->add_gizmo_plugin(this); +// SpatialEditor::get_singleton()->add_gizmo_plugin(this); sep = memnew( VSeparator); sep->hide(); diff --git a/tools/editor/plugins/path_editor_plugin.h b/tools/editor/plugins/path_editor_plugin.h index 18bad23bd1..0afd957af7 100644 --- a/tools/editor/plugins/path_editor_plugin.h +++ b/tools/editor/plugins/path_editor_plugin.h @@ -32,9 +32,9 @@ #include "tools/editor/spatial_editor_gizmos.h" #include "scene/3d/path.h" -class PathSpatialGizmo : public SpatialGizmoTool { +class PathSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(PathSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(PathSpatialGizmo,EditorSpatialGizmo); Path* path; mutable Vector3 original; @@ -83,7 +83,7 @@ public: virtual bool forward_spatial_input_event(Camera* p_camera,const InputEvent& p_event); // virtual bool forward_input_event(const InputEvent& p_event) { return collision_polygon_editor->forward_input_event(p_event); } - virtual bool create_spatial_gizmo(Spatial* p_spatial); + virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial* p_spatial); virtual String get_name() const { return "Path"; } bool has_main_screen() const { return false; } virtual void edit(Object *p_node); diff --git a/tools/editor/plugins/script_editor_plugin.cpp b/tools/editor/plugins/script_editor_plugin.cpp index 18f3787cff..8d0527cff7 100644 --- a/tools/editor/plugins/script_editor_plugin.cpp +++ b/tools/editor/plugins/script_editor_plugin.cpp @@ -609,7 +609,7 @@ void ScriptEditor::_breaked(bool p_breaked,bool p_can_debug) { void ScriptEditor::_show_debugger(bool p_show) { - debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW), p_show); +// debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW), p_show); } void ScriptEditor::_script_created(Ref<Script> p_script) { @@ -979,7 +979,7 @@ void ScriptEditor::_menu_option(int p_option) { } break; case SEARCH_WEBSITE: { - OS::get_singleton()->shell_open("http://www.godotengine.org/projects/godot-engine/wiki/Documentation#Tutorials"); + OS::get_singleton()->shell_open("http://docs.godotengine.org/"); } break; case WINDOW_NEXT: { diff --git a/tools/editor/plugins/shader_editor_plugin.cpp b/tools/editor/plugins/shader_editor_plugin.cpp index 18d8f5efc0..7161033111 100644 --- a/tools/editor/plugins/shader_editor_plugin.cpp +++ b/tools/editor/plugins/shader_editor_plugin.cpp @@ -578,9 +578,9 @@ ShaderEditorPlugin::ShaderEditorPlugin(EditorNode *p_node, bool p_2d) { shader_editor = memnew( ShaderEditor ); _2d=p_2d; if (p_2d) - add_custom_control(CONTAINER_CANVAS_EDITOR_BOTTOM,shader_editor); + add_control_to_container(CONTAINER_CANVAS_EDITOR_BOTTOM,shader_editor); else - add_custom_control(CONTAINER_SPATIAL_EDITOR_BOTTOM,shader_editor); + add_control_to_container(CONTAINER_SPATIAL_EDITOR_BOTTOM,shader_editor); // editor->get_viewport()->add_child(shader_editor); // shader_editor->set_area_as_parent_rect(); diff --git a/tools/editor/plugins/spatial_editor_plugin.cpp b/tools/editor/plugins/spatial_editor_plugin.cpp index cf92473919..1f264a2337 100644 --- a/tools/editor/plugins/spatial_editor_plugin.cpp +++ b/tools/editor/plugins/spatial_editor_plugin.cpp @@ -1631,8 +1631,11 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { _edit.snap=true; } } break; + case KEY_7: case KEY_KP_7: { - + bool emulate_numpad = EditorSettings::get_singleton()->get("3d_editor/emulate_numpad"); + if (!emulate_numpad && k.scancode==KEY_7) + return; cursor.y_rot=0; if (k.mod.shift) { cursor.x_rot=-Math_PI/2.0; @@ -1647,8 +1650,11 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { _update_name(); } } break; + case KEY_1: case KEY_KP_1: { - + bool emulate_numpad = EditorSettings::get_singleton()->get("3d_editor/emulate_numpad"); + if (!emulate_numpad && k.scancode==KEY_1) + return; cursor.x_rot=0; if (k.mod.shift) { cursor.y_rot=Math_PI; @@ -1664,8 +1670,11 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { } } break; + case KEY_3: case KEY_KP_3: { - + bool emulate_numpad = EditorSettings::get_singleton()->get("3d_editor/emulate_numpad"); + if (!emulate_numpad && k.scancode==KEY_3) + return; cursor.x_rot=0; if (k.mod.shift) { cursor.y_rot=Math_PI/2.0; @@ -1680,8 +1689,11 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { } } break; + case KEY_5: case KEY_KP_5: { - + bool emulate_numpad = EditorSettings::get_singleton()->get("3d_editor/emulate_numpad"); + if (!emulate_numpad && k.scancode==KEY_5) + return; //orthogonal = !orthogonal; _menu_option(orthogonal?VIEW_PERSPECTIVE:VIEW_ORTHOGONAL); @@ -3643,35 +3655,32 @@ void SpatialEditor::_request_gizmo(Object* p_obj) { Spatial *sp=p_obj->cast_to<Spatial>(); if (!sp) return; - if (editor->get_edited_scene() && (sp==editor->get_edited_scene() || sp->get_owner()==editor->get_edited_scene())) { - - Ref<SpatialEditorGizmo> seg = gizmos->get_gizmo(sp); + if (editor->get_edited_scene() && (sp==editor->get_edited_scene() || sp->get_owner()==editor->get_edited_scene() || editor->get_edited_scene()->is_editable_instance(sp->get_owner()))) { - if (seg.is_valid()) { - sp->set_gizmo(seg); - } + Ref<SpatialEditorGizmo> seg; - for (List<EditorPlugin*>::Element *E=gizmo_plugins.front();E;E=E->next()) { + for(int i=0;i<EditorNode::get_singleton()->get_editor_data().get_editor_plugin_count();i++) { - if (E->get()->create_spatial_gizmo(sp)) { + seg = EditorNode::get_singleton()->get_editor_data().get_editor_plugin(i)->create_spatial_gizmo(sp); + if (seg.is_valid()) + break; + } - seg = sp->get_gizmo(); - if (sp==selected && seg.is_valid()) { + if (!seg.is_valid()) { + seg = gizmos->get_gizmo(sp); + } - seg->set_selected(true); - selected->update_gizmo(); - } - return; - } + if (seg.is_valid()) { + sp->set_gizmo(seg); } + if (seg.is_valid() && sp==selected) { seg->set_selected(true); selected->update_gizmo(); } } - } void SpatialEditor::_toggle_maximize_view(Object* p_viewport) { diff --git a/tools/editor/plugins/spatial_editor_plugin.h b/tools/editor/plugins/spatial_editor_plugin.h index b0e366b140..af1b6919a2 100644 --- a/tools/editor/plugins/spatial_editor_plugin.h +++ b/tools/editor/plugins/spatial_editor_plugin.h @@ -457,8 +457,6 @@ private: Ref<Environment> viewport_environment; - List<EditorPlugin*> gizmo_plugins; - Spatial *selected; void _request_gizmo(Object* p_obj); @@ -518,8 +516,6 @@ public: UndoRedo *get_undo_redo() { return undo_redo; } - void add_gizmo_plugin(EditorPlugin* p_plugin) { gizmo_plugins.push_back(p_plugin); } - void add_control_to_menu_panel(Control *p_control); VSplitContainer *get_shader_split(); diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index 589d9d3d99..579eb8c7c7 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -788,7 +788,7 @@ void ProjectManager::_erase_project() { return; - erase_ask->set_text("Erase project from list?? (Folder contents will not be modified)"); + erase_ask->set_text("Remove project from list?? (Folder contents will not be modified)"); erase_ask->popup_centered_minsize(); } @@ -943,7 +943,7 @@ ProjectManager::ProjectManager() { Button* erase = memnew( Button ); - erase->set_text("Erase"); + erase->set_text("Remove"); tree_vb->add_child(erase); erase->connect("pressed", this,"_erase_project"); erase_btn=erase; @@ -970,7 +970,7 @@ ProjectManager::ProjectManager() { erase_ask = memnew( ConfirmationDialog ); - erase_ask->get_ok()->set_text("Erase"); + erase_ask->get_ok()->set_text("Remove"); erase_ask->get_ok()->connect("pressed", this,"_erase_project_confirm"); add_child(erase_ask); diff --git a/tools/editor/project_settings.cpp b/tools/editor/project_settings.cpp index 22e93c5a95..69e09d6053 100644 --- a/tools/editor/project_settings.cpp +++ b/tools/editor/project_settings.cpp @@ -97,26 +97,63 @@ void ProjectSettings::_notification(int p_what) { } } -void ProjectSettings::_action_persist_toggle() { +void ProjectSettings::_action_selected() { + TreeItem *ti=input_editor->get_selected(); + if (!ti || !ti->is_editable(0)) + return; + + add_at="input/"+ti->get_text(0); +} + +void ProjectSettings::_action_edited() { TreeItem *ti=input_editor->get_selected(); if (!ti) return; - String name="input/"+ti->get_text(0); + String new_name=ti->get_text(0); + String old_name=add_at.substr(add_at.find("/")+1,add_at.length()); + + if (new_name==old_name) + return; + + if (new_name.find("/")!=-1 || new_name.find(":")!=-1 || new_name=="") { + + ti->set_text(0,old_name); + add_at="input/"+old_name; - bool prev = Globals::get_singleton()->is_persisting(name); - print_line("prev persist: "+itos(prev)); - print_line("new persist: "+itos(ti->is_checked(0))); - if (prev==ti->is_checked(0)) + message->set_text("Invalid Action (Anything goes but / or :)."); + message->popup_centered(Size2(300,100)); return; + } + + String action_prop="input/"+new_name; + + if (Globals::get_singleton()->has(action_prop)) { + ti->set_text(0,old_name); + add_at="input/"+old_name; + + message->set_text("Action '"+new_name+"' already exists!."); + message->popup_centered(Size2(300,100)); + return; + } + + int order = Globals::get_singleton()->get_order(add_at); + Array va = Globals::get_singleton()->get(add_at); + bool persisting = Globals::get_singleton()->is_persisting(add_at); setting=true; - undo_redo->create_action("Change Input Action Persistence"); - undo_redo->add_do_method(Globals::get_singleton(),"set_persisting",name,ti->is_checked(0)); - undo_redo->add_undo_method(Globals::get_singleton(),"set_persisting",name,prev); + undo_redo->create_action("Rename Input Action Event"); + undo_redo->add_do_method(Globals::get_singleton(),"clear",add_at); + undo_redo->add_do_method(Globals::get_singleton(),"set",action_prop,va); + undo_redo->add_do_method(Globals::get_singleton(),"set_persisting",action_prop,persisting); + undo_redo->add_do_method(Globals::get_singleton(),"set_order",action_prop,order); + undo_redo->add_undo_method(Globals::get_singleton(),"clear",action_prop); + undo_redo->add_undo_method(Globals::get_singleton(),"set",add_at,va); + undo_redo->add_undo_method(Globals::get_singleton(),"set_persisting",add_at,persisting); + undo_redo->add_undo_method(Globals::get_singleton(),"set_order",add_at,order); undo_redo->add_do_method(this,"_update_actions"); undo_redo->add_undo_method(this,"_update_actions"); undo_redo->add_do_method(this,"_settings_changed"); @@ -124,6 +161,8 @@ void ProjectSettings::_action_persist_toggle() { undo_redo->commit_action(); setting=false; + add_at=action_prop; + } @@ -356,15 +395,6 @@ void ProjectSettings::_action_button_pressed(Object* p_obj, int p_column,int p_i add_at="input/"+ti->get_text(0); } else if (p_id==2) { - //rename - - add_at="input/"+ti->get_text(0); - rename_action->popup_centered(); - rename_action->get_line_edit()->set_text(ti->get_text(0)); - rename_action->get_line_edit()->set_cursor_pos(ti->get_text(0).length()); - rename_action->get_line_edit()->select_all(); - - } else if (p_id==3) { //remove if (ti->get_parent()==input_editor->get_root()) { @@ -446,15 +476,13 @@ void ProjectSettings::_update_actions() { item->set_text(0,name); item->add_button(0,get_icon("Add","EditorIcons"),1); if (!Globals::get_singleton()->get_input_presets().find(pi.name)) { - item->add_button(0,get_icon("Rename","EditorIcons"),2); - item->add_button(0,get_icon("Remove","EditorIcons"),3); + item->add_button(0,get_icon("Remove","EditorIcons"),2); + item->set_editable(0,true); } item->set_custom_bg_color(0,get_color("prop_subsection","Editor")); - item->set_editable(0,true); //item->set_checked(0,pi.usage&PROPERTY_USAGE_CHECKED); - Array actions=Globals::get_singleton()->get(pi.name); for(int i=0;i<actions.size();i++) { @@ -527,7 +555,7 @@ void ProjectSettings::_update_actions() { action->set_icon(0,get_icon("JoyAxis","EditorIcons")); } break; } - action->add_button(0,get_icon("Remove","EditorIcons"),3); + action->add_button(0,get_icon("Remove","EditorIcons"),2); action->set_metadata(0,i); } } @@ -542,6 +570,7 @@ void ProjectSettings::popup_project_settings() { globals_editor->edit(Globals::get_singleton()); _update_translations(); _update_autoload(); + plugin_settings->update_plugins(); } @@ -658,45 +687,6 @@ void ProjectSettings::_action_add() { } -void ProjectSettings::_action_rename(const String &p_name) { - - - if (p_name.find("/")!=-1 || p_name.find(":")!=-1 || p_name=="") { - message->set_text("Invalid Action (Anything goes but / or :)."); - message->popup_centered(Size2(300,100)); - return; - } - - String new_name = "input/"+p_name; - - if (Globals::get_singleton()->has(new_name)) { - message->set_text("Action '"+p_name+"' already exists!."); - message->popup_centered(Size2(300,100)); - return; - } - - int order = Globals::get_singleton()->get_order(add_at); - Array va = Globals::get_singleton()->get(add_at); - bool persisting = Globals::get_singleton()->is_persisting(add_at); - - undo_redo->create_action("Rename Input Action Event"); - undo_redo->add_do_method(Globals::get_singleton(),"clear",add_at); - undo_redo->add_do_method(Globals::get_singleton(),"set",new_name,va); - undo_redo->add_do_method(Globals::get_singleton(),"set_persisting",new_name,persisting); - undo_redo->add_do_method(Globals::get_singleton(),"set_order",new_name,order); - undo_redo->add_undo_method(Globals::get_singleton(),"clear",new_name); - undo_redo->add_undo_method(Globals::get_singleton(),"set",add_at,va); - undo_redo->add_undo_method(Globals::get_singleton(),"set_persisting",add_at,persisting); - undo_redo->add_undo_method(Globals::get_singleton(),"set_order",add_at,order); - undo_redo->add_do_method(this,"_update_actions"); - undo_redo->add_undo_method(this,"_update_actions"); - undo_redo->add_do_method(this,"_settings_changed"); - undo_redo->add_undo_method(this,"_settings_changed"); - undo_redo->commit_action(); - - rename_action->hide(); -} - void ProjectSettings::_item_checked(const String& p_item, bool p_check) { @@ -750,6 +740,10 @@ void ProjectSettings::_settings_changed() { timer->start(); } +void ProjectSettings::queue_save() { + _settings_changed(); +} + void ProjectSettings::_copy_to_platform(int p_which) { @@ -1403,9 +1397,9 @@ void ProjectSettings::_bind_methods() { ObjectTypeDB::bind_method(_MD("_save"),&ProjectSettings::_save); ObjectTypeDB::bind_method(_MD("_action_add"),&ProjectSettings::_action_add); ObjectTypeDB::bind_method(_MD("_action_adds"),&ProjectSettings::_action_adds); - ObjectTypeDB::bind_method(_MD("_action_persist_toggle"),&ProjectSettings::_action_persist_toggle); + ObjectTypeDB::bind_method(_MD("_action_selected"),&ProjectSettings::_action_selected); + ObjectTypeDB::bind_method(_MD("_action_edited"),&ProjectSettings::_action_edited); ObjectTypeDB::bind_method(_MD("_action_button_pressed"),&ProjectSettings::_action_button_pressed); - ObjectTypeDB::bind_method(_MD("_action_rename"),&ProjectSettings::_action_rename); ObjectTypeDB::bind_method(_MD("_update_actions"),&ProjectSettings::_update_actions); ObjectTypeDB::bind_method(_MD("_wait_for_key"),&ProjectSettings::_wait_for_key); ObjectTypeDB::bind_method(_MD("_add_item"),&ProjectSettings::_add_item); @@ -1620,19 +1614,13 @@ ProjectSettings::ProjectSettings(EditorData *p_data) { input_editor->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END, 35 ); input_editor->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN, 5 ); input_editor->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END, 5 ); - input_editor->connect("item_edited",this,"_action_persist_toggle"); + input_editor->connect("item_edited",this,"_action_edited"); + input_editor->connect("cell_selected",this,"_action_selected"); input_editor->connect("button_pressed",this,"_action_button_pressed"); popup_add = memnew( PopupMenu ); add_child(popup_add); popup_add->connect("item_pressed",this,"_add_item"); - rename_action = memnew( EditorNameDialog ); - add_child(rename_action); - rename_action->set_hide_on_ok(false); - rename_action->set_size(Size2(200, 70)); - rename_action->set_title("Rename Input Action"); - rename_action->connect("name_confirmed", this,"_action_rename"); - press_a_key = memnew( ConfirmationDialog ); press_a_key->set_focus_mode(FOCUS_ALL); add_child(press_a_key); @@ -1847,6 +1835,13 @@ ProjectSettings::ProjectSettings(EditorData *p_data) { } + { + + plugin_settings = memnew( EditorPluginSettings ); + plugin_settings->set_name("Plugins"); + tab_container->add_child(plugin_settings); + } + timer = memnew( Timer ); timer->set_wait_time(1.5); timer->connect("timeout",Globals::get_singleton(),"save"); diff --git a/tools/editor/project_settings.h b/tools/editor/project_settings.h index b689340fdf..922608fb9a 100644 --- a/tools/editor/project_settings.h +++ b/tools/editor/project_settings.h @@ -34,7 +34,9 @@ #include "optimized_save_dialog.h" #include "undo_redo.h" #include "editor_data.h" -#include "editor_name_dialog.h" + +#include "editor_plugin_settings.h" + //#include "project_export_settings.h" class ProjectSettings : public AcceptDialog { @@ -67,8 +69,6 @@ class ProjectSettings : public AcceptDialog { Label *device_index_label; MenuButton *popup_platform; - EditorNameDialog *rename_action; - LineEdit *action_name; Tree *input_editor; bool setting; @@ -92,6 +92,9 @@ class ProjectSettings : public AcceptDialog { LineEdit *autoload_add_name; LineEdit *autoload_add_path; + + EditorPluginSettings *plugin_settings; + void _update_autoload(); void _autoload_file_callback(const String& p_path); void _autoload_add(); @@ -111,11 +114,11 @@ class ProjectSettings : public AcceptDialog { void _action_adds(String); void _action_add(); - void _action_rename(const String& p_name); void _device_input_add(); void _item_checked(const String& p_item, bool p_check); - void _action_persist_toggle(); + void _action_selected(); + void _action_edited(); void _action_button_pressed(Object* p_obj, int p_column,int p_id); void _wait_for_key(const InputEvent& p_event); void _press_a_key_confirm(); @@ -145,6 +148,8 @@ class ProjectSettings : public AcceptDialog { void _toggle_search_bar(bool p_pressed); void _clear_search_box(); + + ProjectSettings(); @@ -160,6 +165,8 @@ public: static ProjectSettings *get_singleton() { return singleton; } void popup_project_settings(); + void queue_save(); + ProjectSettings(EditorData *p_data); }; diff --git a/tools/editor/settings_config_dialog.cpp b/tools/editor/settings_config_dialog.cpp index 86a3ab7001..6b7c2eb9b7 100644 --- a/tools/editor/settings_config_dialog.cpp +++ b/tools/editor/settings_config_dialog.cpp @@ -80,173 +80,6 @@ void EditorSettingsDialog::popup_edit_settings() { } -void EditorSettingsDialog::_plugin_install() { - - EditorSettings::Plugin plugin = EditorSettings::get_singleton()->get_plugins()[plugin_setting_edit]; - - DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); - da->change_dir("res://"); - if (da->change_dir("plugins")!=OK) { - - Error err = da->make_dir("plugins"); - if (err) - memdelete(da); - ERR_FAIL_COND(err!=OK); - err = da->change_dir("plugins"); - if (err) - memdelete(da); - ERR_FAIL_COND(err!=OK); - } - - if (da->change_dir(plugin_setting_edit)!=OK) { - - Error err = da->make_dir(plugin_setting_edit); - if (err) - memdelete(da); - ERR_FAIL_COND(err!=OK); - err = da->change_dir(plugin_setting_edit); - if (err) - memdelete(da); - ERR_FAIL_COND(err!=OK); - } - - Vector<String> ifiles=plugin.install_files; - - if (ifiles.find("plugin.cfg")==-1) { - ifiles.push_back("plugin.cfg"); - } - - if (ifiles.find(plugin.script)==-1) { - ifiles.push_back(plugin.script); - } - - for(int i=0;i<ifiles.size();i++) { - - String target = "res://plugins/"+plugin_setting_edit+"/"+ifiles[i]; - Error err = da->copy(EditorSettings::get_singleton()->get_settings_path().plus_file("plugins/"+plugin_setting_edit+"/"+ifiles[i]),target); - if (err) - memdelete(da); - ERR_EXPLAIN("Error copying to file "+target); - ERR_FAIL_COND(err!=OK); - EditorFileSystem::get_singleton()->update_file(target); - } - - memdelete(da); - - Globals::get_singleton()->set("plugins/"+plugin_setting_edit,"res://plugins/"+plugin_setting_edit); - Globals::get_singleton()->set_persisting("plugins/"+plugin_setting_edit,true); - EditorSettings::get_singleton()->load_installed_plugin(plugin_setting_edit); - Globals::get_singleton()->save(); - - - _update_plugins(); -} - -void EditorSettingsDialog::_rescan_plugins() { - - EditorSettings::get_singleton()->scan_plugins(); - _update_plugins(); -} - -void EditorSettingsDialog::_plugin_edited() { - - if (updating) - return; - - TreeItem *ti=plugins->get_edited(); - if (!ti) - return; - - String plugin = ti->get_metadata(0); - bool enabled = ti->is_checked(0); - - EditorSettings::get_singleton()->set_plugin_enabled(plugin,enabled); -} - -void EditorSettingsDialog::_plugin_settings(Object *p_obj,int p_cell,int p_index) { - - TreeItem *ti=p_obj->cast_to<TreeItem>(); - - EditorSettings::Plugin plugin = EditorSettings::get_singleton()->get_plugins()[ti->get_metadata(0)]; - - plugin_description->clear(); - plugin_description->parse_bbcode(plugin.description); - plugin_setting_edit = ti->get_metadata(0); - if (plugin.installs) { - if (Globals::get_singleton()->has("plugins/"+plugin_setting_edit)) - plugin_setting->get_ok()->set_text("Re-Install to Project"); - else - plugin_setting->get_ok()->set_text("Install to Project"); - plugin_setting->get_ok()->show(); - plugin_setting->get_cancel()->set_text("Close"); - } else { - plugin_setting->get_ok()->hide(); - plugin_setting->get_cancel()->set_text("Close"); - } - - plugin_setting->set_title(plugin.name); - plugin_setting->popup_centered(Size2(300,200)); -} - -void EditorSettingsDialog::_update_plugins() { - - - updating=true; - - plugins->clear(); - TreeItem *root = plugins->create_item(NULL); - plugins->set_hide_root(true); - - Color sc = get_color("prop_subsection","Editor"); - TreeItem *editor = plugins->create_item(root); - editor->set_text(0,"Editor Plugins"); - editor->set_custom_bg_color(0,sc); - editor->set_custom_bg_color(1,sc); - editor->set_custom_bg_color(2,sc); - - TreeItem *install = plugins->create_item(root); - install->set_text(0,"Installable Plugins"); - install->set_custom_bg_color(0,sc); - install->set_custom_bg_color(1,sc); - install->set_custom_bg_color(2,sc); - - for (const Map<String,EditorSettings::Plugin>::Element *E=EditorSettings::get_singleton()->get_plugins().front();E;E=E->next()) { - - - TreeItem *ti = plugins->create_item(E->get().installs?install:editor); - if (!E->get().installs) { - ti->set_cell_mode(0,TreeItem::CELL_MODE_CHECK); - ti->set_editable(0,true); - if (EditorSettings::get_singleton()->is_plugin_enabled(E->key())) - ti->set_checked(0,true); - - ti->set_text(0,E->get().name); - } else { - - if (Globals::get_singleton()->has("plugins/"+E->key())) { - - ti->set_text(0,E->get().name+" (Installed)"); - } else { - ti->set_text(0,E->get().name); - } - } - - - ti->add_button(0,get_icon("Tools","EditorIcons"),0); - ti->set_text(1,E->get().author); - ti->set_text(2,E->get().version); - ti->set_metadata(0,E->key()); - - } - - if (!editor->get_children()) - memdelete(editor); - if (!install->get_children()) - memdelete(install); - - updating=false; - -} void EditorSettingsDialog::_clear_search_box() { @@ -261,9 +94,7 @@ void EditorSettingsDialog::_notification(int p_what) { if (p_what==NOTIFICATION_ENTER_TREE) { - rescan_plugins->set_icon(get_icon("Reload","EditorIcons")); clear_button->set_icon(get_icon("Close","EditorIcons")); - _update_plugins(); } } @@ -271,10 +102,6 @@ void EditorSettingsDialog::_bind_methods() { ObjectTypeDB::bind_method(_MD("_settings_save"),&EditorSettingsDialog::_settings_save); ObjectTypeDB::bind_method(_MD("_settings_changed"),&EditorSettingsDialog::_settings_changed); - ObjectTypeDB::bind_method(_MD("_rescan_plugins"),&EditorSettingsDialog::_rescan_plugins); - ObjectTypeDB::bind_method(_MD("_plugin_settings"),&EditorSettingsDialog::_plugin_settings); - ObjectTypeDB::bind_method(_MD("_plugin_edited"),&EditorSettingsDialog::_plugin_edited); - ObjectTypeDB::bind_method(_MD("_plugin_install"),&EditorSettingsDialog::_plugin_install); ObjectTypeDB::bind_method(_MD("_clear_search_box"),&EditorSettingsDialog::_clear_search_box); } @@ -324,32 +151,6 @@ EditorSettingsDialog::EditorSettingsDialog() { //Button *load = memnew( Button ); //load->set_text("Load.."); //hbc->add_child(load); - Button *rescan = memnew( Button ); - rescan_plugins=rescan; - rescan_plugins->connect("pressed",this,"_rescan_plugins"); - hbc->add_child(rescan); - plugins = memnew( Tree ); - MarginContainer *mc = memnew( MarginContainer); - vbc->add_child(mc); - mc->add_child(plugins); - mc->set_v_size_flags(SIZE_EXPAND_FILL); - plugins->set_columns(3); - plugins->set_column_title(0,"Name"); - plugins->set_column_title(1,"Author"); - plugins->set_column_title(2,"Version"); - plugins->set_column_expand(2,false); - plugins->set_column_min_width(2,100); - plugins->set_column_titles_visible(true); - plugins->connect("button_pressed",this,"_plugin_settings"); - plugins->connect("item_edited",this,"_plugin_edited"); - - plugin_setting = memnew( ConfirmationDialog ); - add_child(plugin_setting); - plugin_description = memnew( RichTextLabel ); - plugin_setting->add_child(plugin_description); - plugin_setting->set_child_rect(plugin_description); - plugin_setting->connect("confirmed",this,"_plugin_install"); - //get_ok()->set_text("Apply"); @@ -363,8 +164,6 @@ EditorSettingsDialog::EditorSettingsDialog() { add_child(timer); EditorSettings::get_singleton()->connect("settings_changed",this,"_settings_changed"); get_ok()->set_text("Close"); - install_confirm = memnew( ConfirmationDialog ); - add_child(install_confirm); updating=false; diff --git a/tools/editor/settings_config_dialog.h b/tools/editor/settings_config_dialog.h index e1c3238a64..5085132108 100644 --- a/tools/editor/settings_config_dialog.h +++ b/tools/editor/settings_config_dialog.h @@ -40,17 +40,10 @@ class EditorSettingsDialog : public AcceptDialog { - ConfirmationDialog *install_confirm; bool updating; - ConfirmationDialog *plugin_setting; - String plugin_setting_edit; - - RichTextLabel *plugin_description; TabContainer *tabs; - Button *rescan_plugins; - Tree *plugins; LineEdit *search_box; ToolButton *clear_button; SectionedPropertyEditor *property_editor; @@ -60,18 +53,11 @@ class EditorSettingsDialog : public AcceptDialog { virtual void cancel_pressed(); virtual void ok_pressed(); - void _plugin_edited(); - - void _plugin_settings(Object *p_obj,int p_cell,int p_index); void _settings_changed(); void _settings_save(); - void _plugin_install(); - void _notification(int p_what); - void _rescan_plugins(); - void _update_plugins(); void _clear_search_box(); diff --git a/tools/editor/spatial_editor_gizmos.cpp b/tools/editor/spatial_editor_gizmos.cpp index 320b0c3a70..de35672278 100644 --- a/tools/editor/spatial_editor_gizmos.cpp +++ b/tools/editor/spatial_editor_gizmos.cpp @@ -43,7 +43,7 @@ #define HANDLE_HALF_SIZE 0.05 -void SpatialGizmoTool::clear() { +void EditorSpatialGizmo::clear() { for(int i=0;i<instances.size();i++) { @@ -61,7 +61,15 @@ void SpatialGizmoTool::clear() { secondary_handles.clear(); } -void SpatialGizmoTool::Instance::create_instance(Spatial *p_base) { +void EditorSpatialGizmo::redraw() { + + if (get_script_instance() && get_script_instance()->has_method("redraw")) + get_script_instance()->call("redraw"); + + +} + +void EditorSpatialGizmo::Instance::create_instance(Spatial *p_base) { instance = VS::get_singleton()->instance_create2(mesh->get_rid(),p_base->get_world()->get_scenario()); VS::get_singleton()->instance_attach_object_instance_ID(instance,p_base->get_instance_ID()); @@ -80,7 +88,7 @@ void SpatialGizmoTool::Instance::create_instance(Spatial *p_base) { -void SpatialGizmoTool::add_mesh(const Ref<Mesh>& p_mesh,bool p_billboard, const RID &p_skeleton) { +void EditorSpatialGizmo::add_mesh(const Ref<Mesh>& p_mesh,bool p_billboard, const RID &p_skeleton) { ERR_FAIL_COND(!spatial_node); Instance ins; @@ -97,7 +105,7 @@ void SpatialGizmoTool::add_mesh(const Ref<Mesh>& p_mesh,bool p_billboard, const } -void SpatialGizmoTool::add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material,bool p_billboard){ +void EditorSpatialGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material,bool p_billboard){ ERR_FAIL_COND(!spatial_node); Instance ins; @@ -150,7 +158,7 @@ void SpatialGizmoTool::add_lines(const Vector<Vector3> &p_lines, const Ref<Mater } -void SpatialGizmoTool::add_unscaled_billboard(const Ref<Material>& p_material,float p_scale) { +void EditorSpatialGizmo::add_unscaled_billboard(const Ref<Material>& p_material,float p_scale) { ERR_FAIL_COND(!spatial_node); Instance ins; @@ -201,12 +209,12 @@ void SpatialGizmoTool::add_unscaled_billboard(const Ref<Material>& p_material,fl } -void SpatialGizmoTool::add_collision_triangles(const Ref<TriangleMesh>& p_tmesh) { +void EditorSpatialGizmo::add_collision_triangles(const Ref<TriangleMesh>& p_tmesh) { collision_mesh=p_tmesh; } -void SpatialGizmoTool::add_collision_segments(const Vector<Vector3> &p_lines) { +void EditorSpatialGizmo::add_collision_segments(const Vector<Vector3> &p_lines) { int from=collision_segments.size(); collision_segments.resize(from+p_lines.size()); @@ -217,7 +225,7 @@ void SpatialGizmoTool::add_collision_segments(const Vector<Vector3> &p_lines) { } -void SpatialGizmoTool::add_handles(const Vector<Vector3> &p_handles, bool p_billboard,bool p_secondary){ +void EditorSpatialGizmo::add_handles(const Vector<Vector3> &p_handles, bool p_billboard,bool p_secondary){ billboard_handle=p_billboard; @@ -354,13 +362,14 @@ void SpatialGizmoTool::add_handles(const Vector<Vector3> &p_handles, bool p_bill } -void SpatialGizmoTool::set_spatial_node(Spatial *p_node){ +void EditorSpatialGizmo::set_spatial_node(Spatial *p_node){ + ERR_FAIL_NULL(p_node); spatial_node=p_node; } -bool SpatialGizmoTool::intersect_frustum(const Camera *p_camera,const Vector<Plane> &p_frustum) { +bool EditorSpatialGizmo::intersect_frustum(const Camera *p_camera,const Vector<Plane> &p_frustum) { ERR_FAIL_COND_V(!spatial_node,false); ERR_FAIL_COND_V(!valid,false); @@ -401,7 +410,7 @@ bool SpatialGizmoTool::intersect_frustum(const Camera *p_camera,const Vector<Pla } -bool SpatialGizmoTool::intersect_ray(const Camera *p_camera,const Point2& p_point, Vector3& r_pos, Vector3& r_normal,int *r_gizmo_handle,bool p_sec_first) { +bool EditorSpatialGizmo::intersect_ray(const Camera *p_camera,const Point2& p_point, Vector3& r_pos, Vector3& r_normal,int *r_gizmo_handle,bool p_sec_first) { ERR_FAIL_COND_V(!spatial_node,false); ERR_FAIL_COND_V(!valid,false); @@ -631,7 +640,7 @@ bool SpatialGizmoTool::intersect_ray(const Camera *p_camera,const Point2& p_poin -void SpatialGizmoTool::create() { +void EditorSpatialGizmo::create() { ERR_FAIL_COND(!spatial_node); ERR_FAIL_COND(valid); @@ -646,7 +655,7 @@ void SpatialGizmoTool::create() { } -void SpatialGizmoTool::transform(){ +void EditorSpatialGizmo::transform(){ ERR_FAIL_COND(!spatial_node); ERR_FAIL_COND(!valid); @@ -657,7 +666,7 @@ void SpatialGizmoTool::transform(){ } -void SpatialGizmoTool::free(){ +void EditorSpatialGizmo::free(){ ERR_FAIL_COND(!spatial_node); ERR_FAIL_COND(!valid); @@ -675,19 +684,39 @@ void SpatialGizmoTool::free(){ } +void EditorSpatialGizmo::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("add_lines","lines","material:Material","billboard"),&EditorSpatialGizmo::add_lines,DEFVAL(false)); + ObjectTypeDB::bind_method(_MD("add_mesh","mesh:Mesh","billboard","skeleton"),&EditorSpatialGizmo::add_mesh,DEFVAL(false),DEFVAL(RID())); + ObjectTypeDB::bind_method(_MD("add_collision_segments","segments"),&EditorSpatialGizmo::add_collision_segments); + ObjectTypeDB::bind_method(_MD("add_collision_triangles","triangles:TriangleMesh"),&EditorSpatialGizmo::add_collision_triangles); + ObjectTypeDB::bind_method(_MD("add_unscaled_billboard","material:Material","default_scale"),&EditorSpatialGizmo::add_unscaled_billboard,DEFVAL(1)); + ObjectTypeDB::bind_method(_MD("add_handles","handles","billboard","secondary"),&EditorSpatialGizmo::add_handles,DEFVAL(false),DEFVAL(false)); + ObjectTypeDB::bind_method(_MD("set_spatial_node","node:Spatial"),&EditorSpatialGizmo::_set_spatial_node); + + BIND_VMETHOD( MethodInfo("redraw")); + BIND_VMETHOD( MethodInfo(Variant::STRING,"get_handle_name",PropertyInfo(Variant::INT,"index"))); + { + BIND_VMETHOD( MethodInfo("get_handle_value:Variant",PropertyInfo(Variant::INT,"index"))); + } + BIND_VMETHOD( MethodInfo("set_handle",PropertyInfo(Variant::INT,"index"),PropertyInfo(Variant::OBJECT,"camera:Camera"),PropertyInfo(Variant::VECTOR2,"point"))); + MethodInfo cm = MethodInfo("commit_handle",PropertyInfo(Variant::INT,"index"),PropertyInfo(Variant::NIL,"restore:Variant"),PropertyInfo(Variant::BOOL,"cancel")); + cm.default_arguments.push_back(false); + BIND_VMETHOD( cm ); +} -SpatialGizmoTool::SpatialGizmoTool() { +EditorSpatialGizmo::EditorSpatialGizmo() { valid=false; billboard_handle=false; } -SpatialGizmoTool::~SpatialGizmoTool(){ +EditorSpatialGizmo::~EditorSpatialGizmo(){ clear(); } -Vector3 SpatialGizmoTool::get_handle_pos(int p_idx) const { +Vector3 EditorSpatialGizmo::get_handle_pos(int p_idx) const { ERR_FAIL_INDEX_V(p_idx,handles.size(),Vector3()); diff --git a/tools/editor/spatial_editor_gizmos.h b/tools/editor/spatial_editor_gizmos.h index 669d3e2380..346e360225 100644 --- a/tools/editor/spatial_editor_gizmos.h +++ b/tools/editor/spatial_editor_gizmos.h @@ -52,9 +52,9 @@ class Camera; -class SpatialGizmoTool : public SpatialEditorGizmo { +class EditorSpatialGizmo : public SpatialEditorGizmo { - OBJ_TYPE(SpatialGizmoTool,SpatialGizmo); + OBJ_TYPE(EditorSpatialGizmo,SpatialGizmo); struct Instance{ @@ -93,6 +93,8 @@ class SpatialGizmoTool : public SpatialEditorGizmo { Spatial *base; Vector<Instance> instances; Spatial *spatial_node; + + void _set_spatial_node(Node *p_node) { set_spatial_node(p_node->cast_to<Spatial>()); } protected: void add_lines(const Vector<Vector3> &p_lines,const Ref<Material>& p_material,bool p_billboard=false); void add_mesh(const Ref<Mesh>& p_mesh,bool p_billboard=false,const RID& p_skeleton=RID()); @@ -103,6 +105,7 @@ protected: void set_spatial_node(Spatial *p_node); + static void _bind_methods(); public: virtual Vector3 get_handle_pos(int p_idx) const; @@ -112,18 +115,18 @@ public: void clear(); void create(); void transform(); - //void redraw(); + virtual void redraw(); void free(); - SpatialGizmoTool(); - ~SpatialGizmoTool(); + EditorSpatialGizmo(); + ~EditorSpatialGizmo(); }; -class LightSpatialGizmo : public SpatialGizmoTool { +class LightSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(LightSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(LightSpatialGizmo,EditorSpatialGizmo); Light* light; @@ -140,9 +143,9 @@ public: }; -class CameraSpatialGizmo : public SpatialGizmoTool { +class CameraSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(CameraSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(CameraSpatialGizmo,EditorSpatialGizmo); Camera* camera; @@ -161,9 +164,9 @@ public: -class MeshInstanceSpatialGizmo : public SpatialGizmoTool { +class MeshInstanceSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(MeshInstanceSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(MeshInstanceSpatialGizmo,EditorSpatialGizmo); MeshInstance* mesh; @@ -174,9 +177,9 @@ public: }; -class Position3DSpatialGizmo : public SpatialGizmoTool { +class Position3DSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(Position3DSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(Position3DSpatialGizmo,EditorSpatialGizmo); Position3D* p3d; @@ -187,9 +190,9 @@ public: }; -class SkeletonSpatialGizmo : public SpatialGizmoTool { +class SkeletonSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(SkeletonSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(SkeletonSpatialGizmo,EditorSpatialGizmo); Skeleton* skel; @@ -203,9 +206,9 @@ public: -class SpatialPlayerSpatialGizmo : public SpatialGizmoTool { +class SpatialPlayerSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(SpatialPlayerSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(SpatialPlayerSpatialGizmo,EditorSpatialGizmo); SpatialPlayer* splayer; @@ -218,9 +221,9 @@ public: -class TestCubeSpatialGizmo : public SpatialGizmoTool { +class TestCubeSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(TestCubeSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(TestCubeSpatialGizmo,EditorSpatialGizmo); TestCube* tc; @@ -231,9 +234,9 @@ public: }; -class RoomSpatialGizmo : public SpatialGizmoTool { +class RoomSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(RoomSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(RoomSpatialGizmo,EditorSpatialGizmo); struct _EdgeKey { @@ -256,9 +259,9 @@ public: }; -class PortalSpatialGizmo : public SpatialGizmoTool { +class PortalSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(PortalSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(PortalSpatialGizmo,EditorSpatialGizmo); Portal* portal; @@ -270,9 +273,9 @@ public: }; -class VisibilityNotifierGizmo : public SpatialGizmoTool { +class VisibilityNotifierGizmo : public EditorSpatialGizmo { - OBJ_TYPE(VisibilityNotifierGizmo ,SpatialGizmoTool); + OBJ_TYPE(VisibilityNotifierGizmo ,EditorSpatialGizmo); VisibilityNotifier* notifier; @@ -291,9 +294,9 @@ public: -class CollisionShapeSpatialGizmo : public SpatialGizmoTool { +class CollisionShapeSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(CollisionShapeSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(CollisionShapeSpatialGizmo,EditorSpatialGizmo); CollisionShape* cs; @@ -308,9 +311,9 @@ public: }; -class CollisionPolygonSpatialGizmo : public SpatialGizmoTool { +class CollisionPolygonSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(CollisionPolygonSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(CollisionPolygonSpatialGizmo,EditorSpatialGizmo); CollisionPolygon* polygon; @@ -322,9 +325,9 @@ public: }; -class RayCastSpatialGizmo : public SpatialGizmoTool { +class RayCastSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(RayCastSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(RayCastSpatialGizmo,EditorSpatialGizmo); RayCast* raycast; @@ -337,9 +340,9 @@ public: -class VehicleWheelSpatialGizmo : public SpatialGizmoTool { +class VehicleWheelSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(VehicleWheelSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(VehicleWheelSpatialGizmo,EditorSpatialGizmo); VehicleWheel* car_wheel; @@ -351,9 +354,9 @@ public: }; -class NavigationMeshSpatialGizmo : public SpatialGizmoTool { +class NavigationMeshSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(NavigationMeshSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(NavigationMeshSpatialGizmo,EditorSpatialGizmo); struct _EdgeKey { @@ -376,9 +379,9 @@ public: }; -class PinJointSpatialGizmo : public SpatialGizmoTool { +class PinJointSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(PinJointSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(PinJointSpatialGizmo,EditorSpatialGizmo); PinJoint* p3d; @@ -390,9 +393,9 @@ public: }; -class HingeJointSpatialGizmo : public SpatialGizmoTool { +class HingeJointSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(HingeJointSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(HingeJointSpatialGizmo,EditorSpatialGizmo); HingeJoint* p3d; @@ -403,9 +406,9 @@ public: }; -class SliderJointSpatialGizmo : public SpatialGizmoTool { +class SliderJointSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(SliderJointSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(SliderJointSpatialGizmo,EditorSpatialGizmo); SliderJoint* p3d; @@ -416,9 +419,9 @@ public: }; -class ConeTwistJointSpatialGizmo : public SpatialGizmoTool { +class ConeTwistJointSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(ConeTwistJointSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(ConeTwistJointSpatialGizmo,EditorSpatialGizmo); ConeTwistJoint* p3d; @@ -430,9 +433,9 @@ public: }; -class Generic6DOFJointSpatialGizmo : public SpatialGizmoTool { +class Generic6DOFJointSpatialGizmo : public EditorSpatialGizmo { - OBJ_TYPE(Generic6DOFJointSpatialGizmo,SpatialGizmoTool); + OBJ_TYPE(Generic6DOFJointSpatialGizmo,EditorSpatialGizmo); Generic6DOFJoint* p3d; diff --git a/tools/scripts/sort-demos.sh b/tools/scripts/sort-demos.sh new file mode 100644 index 0000000000..d4770b337e --- /dev/null +++ b/tools/scripts/sort-demos.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# When scanning for demos, the project manager sorts them based on their +# timestamp, i.e. last modification date. This can make for a pretty +# messy output, so this script 'touches' each engine.cfg file in reverse +# alphabetical order to ensure a nice listing. +# +# It's good practice to run it once before packaging demos on the build +# server. + +if [ ! -d "demos" ]; then + echo "Run this script from the root directory where 'demos/' is contained." + exit 1 +fi + +if [ -e demos.list ]; then + rm -f demos.list +fi + +for dir in 2d 3d gui misc viewport; do + find "demos/$dir" -name "engine.cfg" |sort >> demos.list +done +cat demos.list |sort -r > demos_r.list + +while read line; do + touch $line + sleep 0.2 +done < demos_r.list + +#rm -f demos.list demos_r.list diff --git a/tools/steam/community_capsule.jpg b/tools/steam/community_capsule.jpg Binary files differnew file mode 100644 index 0000000000..abbc4793f7 --- /dev/null +++ b/tools/steam/community_capsule.jpg diff --git a/tools/steam/community_capsule.png b/tools/steam/community_capsule.png Binary files differnew file mode 100644 index 0000000000..ec9fa0a930 --- /dev/null +++ b/tools/steam/community_capsule.png diff --git a/tools/steam/header.png b/tools/steam/header.png Binary files differnew file mode 100644 index 0000000000..547b28df8d --- /dev/null +++ b/tools/steam/header.png diff --git a/tools/steam/icon32.icns b/tools/steam/icon32.icns new file mode 100644 index 0000000000..ad8e642d51 --- /dev/null +++ b/tools/steam/icon32.icns @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve"> <image id="image0" width="32" height="32" x="0" y="0" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJN +AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA +CXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4AIcEDAUYyVLmwAABuxJREFUWMPFl9tvVNcVxn/7 +nLnfgRl7xpdggrGxja2SpuXSEEUkVNCHqqmqpoJETatGkVpV6gP5L/rQ20vyVpFWLUilTUmhTeSQ +0DjUYCOgYGxMmfFtbOzx3K9nztl9OJ7xDbBDFXVJo9E+Z+29vr0u31pHSCkl/0dRNqtY1Q0mEgX6 +R+aIp4vr3sfTRfpH5phIFKjqxqYBWDZSkMC1WJLzN2a4NZ0mka/w8jMtvPlCO0Is6Uj4y/A0Z4en +2Oq2safZz7G+JvZu34L4Xz2gVQ3ODE7QPzJHIlcBCZfG5okl8nWdWCLPpbF5kLCYq9A/MseZwQm0 +6sae2NADiiKwWhQUIeo3TuTKvHNxnJDXAcB8tkQiV66/V8TSHmWj+28CgKoIvI71aleji9TSVwjT +6ErxOiyomwCwKgRlTSdZqNTXEhiNZ4glCqw5H0UIVMX8rTUuBMQSBUbjGVaWWLJQoazpq3VrZWhI +yenBCT4Zneebe5s51BFiYHyB3/7zPg+ypXVGNhJDShq8Dr7/3A4Otge5NDbPe9emeb4zxHe/+lT9 +vDqAgfEFfn7hDtmihsOq0t7oIbZQIFfWPrfxlSA8divbgy7G53KUNB2v08rJo7s52B5cDsFcpsS7 +A1FyJQ1VEWi6wa3pNPlK9YmN18KUr1S5NZ1G0w1URZArabw7EGUuU1oGMBrPEF3IrzKmCLFhDW9G +BKw7N7qQZzSeWQbQ1xqgu9mHYXzxrGwYku5mH32tgWUAAZeNE/vbCLhtrO0MhpTohsT4HC1DStAN +c59c8zzgXrLlsi0DANjT4qcj7F1lSBGC3RE/R/ZE6GoKbCofpIRwwMnh7jD7dwbx2C31SxlS0hH2 +sqfFX9e3rDRmUVbH6uUvt/DtvRFS87Ng9dF/38fZoak6yNp/DZghJb0tW/jBgSZslTRbt4W5k4jw +mw/HSOZNfrGs4Y2HMqEhJTsbPHzrSxH+9Iffce7c+4RCQV5/8ydcb/AyNptGEYL9O4M0B5ycvxmn +WNFx2iwc3e3nvVPv8Nnlf9HR0cHJt07yYk+YM4Oxh3rsoc1ISmjd5qaQTnDhwt9Jp9OMjo5xZeAT +mgIOpDQp+ht9TRw/sJ0Grx1DSvwuG7m5CT7++BK5XJ6hoWGGh66yq9GH+ojwPbIbpgoaQrXidrvR +dR1FUXC5vWRKVcAsrxoN15pOqaJjqDYcDju6rmOxWPB4vCzmyzyqwB4aAkUR3JlJcy/TyBtv/Ij3 +z/2VxnCELZ37uHA9uSKGZpZLTP5PFyvcr4R45cRrDA9epq+vl6ZdvZzuj7K6Hh4BwJCm+wVQrOi8 +ffEeR3qaef74T5lMljh7e55CuYoQUDUkd+JZpIRMQUNgEtfFsQT7nu7m0PGvoKPyq4tRxueyKEJQ +lXKdJ4SUUuqGpFjR+eDWLGeuTJiDhzBJw5ASVVEAaRpZEUqrqmBRBcXK6g5nSFNXlxIpJRZFAQF2 +i8J3nm3llX3bsapm+ISUUs6kivz6wzGe2xViOlnk9JUJXtjdwI6gm9hCnqlkkelUsd5K5VIOyKWF +EMvPWMqNBp+Dli1OntrmRgB/vjZNe4OH7+3bzkcjc7x+aAcRv9MMgW5IxmazuG0W2kJuFAHdER9C +CHaEPBzZE+bTuwv87foMiiI43NVIT5OfqmHUeSBVqHB2aIpcucrOBg8/PPQ0k4sFUgWNzrCX8zfj +eOwWJhfzDMeSvHqwbTkHAi4rDT4HD7IlXuoJ8+PDu2jZ6uL3n0W5NpHiaG+EoMdO1ZBYBHQ3+ZhM +Fogt5FEEOKwqL3aHcVhVUkUNp1Ullsjz9kf3cNtV3jrWxasH2gj7HQz+J0HIayfgsi4D8DqsfK09 +yKmBKL/8YJSuiI+SZpDMa6jCnJT6WgOUtFYSuTI+p5Xb/57l9oxJSC6byvOdDTzTtgVVCHpa/GSK +ZrlWDcnITIZcucq569PMpIqc2N+G17ECAMDR3ghDsUVuTqVZyM7z6d0FhABVVbg5lQKg0e+gp9lP +oayTKWpYFAUhzOqZThboiviZz5W4MZliZCYDAipVgz9emcAwzITsbQ1wtDeyugpqi7tzWX7xj1HG +ZrOrBkoJ9VZdmwXXdkdFiHrnhPWDqm6YjehnX+9kV6P34QAAJhcLnBqIMjC+QFnTUZQnH0xqwO1W +hYPtQV47uIPWra71PLB2Y0nTuXwvwfkbM9yZzVIoV+u33KgjSwlSmrznslvYHfZyrK+J/Tu34bCq +6/TF4z5OCxWd0XiGq9FFRmYyxNNFcqUqmm6YIajtXHK3VVXwOCxE/E66mnw827aVzogPl019lInH +A1gpxYpOIlfmQbZMIlcmU9QoL3162S0KPqeVbR47Ia+doMeO8zFGnwjAFyX/BYjmM60If3mlAAAA +JXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTAyLTI4VDE2OjQ4OjIwKzAxOjAwv25h8wAAACV0RVh0ZGF0 +ZTptb2RpZnkAMjAxNi0wMi0yOFQxNjo0ODoyMCswMTowMM4z2U8AAAAZdEVYdFNvZnR3YXJlAHd3 +dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC" /> +</svg> diff --git a/tools/steam/icon32.ico b/tools/steam/icon32.ico Binary files differnew file mode 100644 index 0000000000..f52b1466ea --- /dev/null +++ b/tools/steam/icon32.ico diff --git a/tools/steam/icons.zip b/tools/steam/icons.zip Binary files differnew file mode 100644 index 0000000000..54d6697e4e --- /dev/null +++ b/tools/steam/icons.zip diff --git a/tools/steam/large_capsule.png b/tools/steam/large_capsule.png Binary files differnew file mode 100644 index 0000000000..14c8ff86d7 --- /dev/null +++ b/tools/steam/large_capsule.png diff --git a/tools/steam/main_capsule.png b/tools/steam/main_capsule.png Binary files differnew file mode 100644 index 0000000000..5af9406d11 --- /dev/null +++ b/tools/steam/main_capsule.png diff --git a/tools/steam/make_icons.sh b/tools/steam/make_icons.sh new file mode 100644 index 0000000000..71037cd1c3 --- /dev/null +++ b/tools/steam/make_icons.sh @@ -0,0 +1,5 @@ +convert -resize 32x32 ../../icon.svg icon32.ico +convert -resize 32x32 ../../icon.svg icon32.icns +for s in 16 24 32 64 96 128 256; do convert -resize ${s}x$s ../../icon.svg icon$s.png; done +zip icons.zip icon*.png +rm icon*.png diff --git a/tools/steam/small_capsule.png b/tools/steam/small_capsule.png Binary files differnew file mode 100644 index 0000000000..991896728d --- /dev/null +++ b/tools/steam/small_capsule.png |