summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LOGO_LICENSE.md5
-rw-r--r--core/io/file_access_pack.cpp9
-rw-r--r--core/io/ip.cpp65
-rw-r--r--core/message_queue.cpp10
-rw-r--r--core/os/input_event.h6
-rw-r--r--doc/Makefile19
-rw-r--r--doc/base/classes.xml2
-rw-r--r--[-rwxr-xr-x]doc/tools/doc_status.py0
-rw-r--r--doc/tools/locales/es/LC_MESSAGES/makedocs.mobin2321 -> 0 bytes
-rw-r--r--doc/tools/locales/es/LC_MESSAGES/makedocs.po142
-rw-r--r--doc/tools/main.css146
-rw-r--r--doc/tools/makedocs.pot108
-rw-r--r--doc/tools/makedocs.py383
-rw-r--r--doc/tools/makedoku.py499
-rw-r--r--doc/tools/makehtml.py689
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.cpp2
-rw-r--r--drivers/unix/packet_peer_udp_posix.cpp2
-rw-r--r--editor/animation_editor.cpp18
-rw-r--r--editor/editor_export.cpp143
-rw-r--r--editor/editor_export.h5
-rw-r--r--editor/editor_node.cpp33
-rw-r--r--editor/editor_node.h3
-rw-r--r--editor/editor_settings.cpp5
-rw-r--r--editor/import/resource_importer_obj.cpp7
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp4
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp4
-rw-r--r--editor/plugins/spatial_editor_plugin.cpp434
-rw-r--r--editor/plugins/spatial_editor_plugin.h22
-rw-r--r--editor/project_export.cpp2
-rw-r--r--editor/scene_tree_dock.cpp3
-rw-r--r--editor/script_create_dialog.cpp519
-rw-r--r--editor/script_create_dialog.h18
-rw-r--r--editor/script_editor_debugger.cpp32
-rw-r--r--editor/translations/ar.po3
-rw-r--r--editor/translations/bg.po3
-rw-r--r--editor/translations/bn.po3
-rw-r--r--editor/translations/ca.po3
-rw-r--r--editor/translations/cs.po3
-rw-r--r--editor/translations/da.po3
-rw-r--r--editor/translations/de.po3
-rw-r--r--editor/translations/de_CH.po3
-rw-r--r--editor/translations/editor.pot3
-rw-r--r--editor/translations/el.po3
-rw-r--r--editor/translations/es.po3
-rw-r--r--editor/translations/es_AR.po3
-rwxr-xr-xeditor/translations/extract.py3
-rw-r--r--editor/translations/fa.po3
-rw-r--r--editor/translations/fr.po3
-rw-r--r--editor/translations/hu.po3
-rw-r--r--editor/translations/id.po3
-rw-r--r--editor/translations/it.po3
-rw-r--r--editor/translations/ja.po3
-rw-r--r--editor/translations/ko.po3
-rw-r--r--editor/translations/nb.po3
-rw-r--r--editor/translations/nl.po3
-rw-r--r--editor/translations/pl.po3
-rw-r--r--editor/translations/pr.po3
-rw-r--r--editor/translations/pt_BR.po3
-rw-r--r--editor/translations/pt_PT.po3
-rw-r--r--editor/translations/ru.po3
-rw-r--r--editor/translations/sk.po3
-rw-r--r--editor/translations/sl.po3
-rw-r--r--editor/translations/th.po3
-rw-r--r--editor/translations/tr.po3
-rw-r--r--editor/translations/ur_PK.po3
-rw-r--r--editor/translations/zh_CN.po3
-rw-r--r--editor/translations/zh_HK.po3
-rw-r--r--editor/translations/zh_TW.po3
-rw-r--r--modules/gdnative/gdnative.cpp1
-rw-r--r--modules/gdnative/godot.cpp35
-rw-r--r--modules/gdnative/godot.h7
-rw-r--r--modules/gdnative/godot/godot_variant.cpp16
-rw-r--r--modules/gdnative/godot/godot_variant.h31
-rw-r--r--modules/gridmap/grid_map_editor_plugin.cpp4
-rw-r--r--modules/multiscript/SCsub7
-rw-r--r--modules/multiscript/config.py8
-rw-r--r--modules/multiscript/multiscript.cpp750
-rw-r--r--modules/multiscript/multiscript.h200
-rw-r--r--modules/multiscript/register_types.cpp51
-rw-r--r--modules/multiscript/register_types.h31
-rw-r--r--modules/webm/libvpx/SCsub2
-rw-r--r--platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java16
-rw-r--r--platform/android/java/src/com/android/vending/licensing/ILicensingService.java16
-rw-r--r--platform/android/power_android.cpp27
-rw-r--r--platform/bb10/SCsub23
-rw-r--r--platform/bb10/audio_driver_bb10.cpp254
-rw-r--r--platform/bb10/audio_driver_bb10.h77
-rw-r--r--platform/bb10/bar/bar-descriptor.xml53
-rw-r--r--platform/bb10/bar/icon.pngbin8809 -> 0 bytes
-rw-r--r--platform/bb10/bbutil.c513
-rw-r--r--platform/bb10/bbutil.h72
-rw-r--r--platform/bb10/detect.py92
-rw-r--r--platform/bb10/export/export.cpp829
-rw-r--r--platform/bb10/export/export.h30
-rw-r--r--platform/bb10/godot_bb10.cpp48
-rw-r--r--platform/bb10/logo.pngbin1244 -> 0 bytes
-rw-r--r--platform/bb10/os_bb10.cpp608
-rw-r--r--platform/bb10/os_bb10.h153
-rw-r--r--platform/bb10/payment_service.cpp149
-rw-r--r--platform/bb10/payment_service.h64
-rw-r--r--platform/bb10/platform_config.h30
-rw-r--r--platform/bb10/power_bb10.cpp72
-rw-r--r--platform/bb10/power_bb10.h51
-rw-r--r--platform/javascript/os_javascript.cpp35
-rw-r--r--platform/javascript/os_javascript.h1
-rw-r--r--platform/osx/os_osx.mm62
-rw-r--r--platform/osx/power_osx.cpp26
-rw-r--r--platform/uwp/power_uwp.cpp3
-rw-r--r--platform/uwp/power_uwp.h3
-rw-r--r--platform/windows/os_windows.cpp7
-rw-r--r--platform/windows/packet_peer_udp_winsock.cpp2
-rw-r--r--platform/windows/power_windows.cpp25
-rw-r--r--platform/x11/detect.py9
-rw-r--r--platform/x11/power_x11.cpp25
-rw-r--r--scene/2d/ray_cast_2d.cpp8
-rw-r--r--scene/gui/graph_edit.cpp12
-rw-r--r--scene/gui/item_list.cpp4
-rw-r--r--scene/gui/line_edit.cpp4
-rw-r--r--scene/gui/popup_menu.cpp4
-rw-r--r--scene/gui/rich_text_label.cpp6
-rw-r--r--scene/gui/scroll_container.cpp30
-rw-r--r--scene/gui/spin_box.cpp6
-rw-r--r--scene/gui/text_edit.cpp18
-rw-r--r--scene/gui/tree.cpp6
-rwxr-xr-xscene/main/node.cpp2
-rw-r--r--servers/physics/gjk_epa.cpp25
-rw-r--r--servers/physics/joints/cone_twist_joint_sw.cpp18
-rw-r--r--servers/physics/joints/generic_6dof_joint_sw.cpp23
-rw-r--r--servers/physics/joints/hinge_joint_sw.cpp16
-rw-r--r--servers/physics/joints/pin_joint_sw.cpp16
-rw-r--r--servers/physics/joints/slider_joint_sw.cpp22
-rw-r--r--thirdparty/misc/yuv2rgb.h25
132 files changed, 1464 insertions, 6743 deletions
diff --git a/LOGO_LICENSE.md b/LOGO_LICENSE.md
index 2858712f18..b357c49664 100644
--- a/LOGO_LICENSE.md
+++ b/LOGO_LICENSE.md
@@ -1,2 +1,3 @@
-Godot Logo (c) Andrea Calabró, distributed under the terms of the CC By License:
-https://creativecommons.org/licenses/by/3.0/legalcode \ No newline at end of file
+Godot Logo (C) Andrea Calabró
+Distributed under the terms of the Creative Commons Attribution License
+version 3.0 (CC-BY 3.0) <https://creativecommons.org/licenses/by/3.0/legalcode>.
diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp
index bb942b54d7..79aa39521f 100644
--- a/core/io/file_access_pack.cpp
+++ b/core/io/file_access_pack.cpp
@@ -440,13 +440,12 @@ Error DirAccessPack::change_dir(String p_dir) {
String DirAccessPack::get_current_dir() {
- String p;
PackedData::PackedDir *pd = current;
- while (pd->parent) {
+ String p = current->name;
- if (pd != current)
- p = "/" + p;
- p = p + pd->name;
+ while (pd->parent) {
+ pd = pd->parent;
+ p = pd->name + "/" + p;
}
return "res://" + p;
diff --git a/core/io/ip.cpp b/core/io/ip.cpp
index bf139eeacb..6c463b983c 100644
--- a/core/io/ip.cpp
+++ b/core/io/ip.cpp
@@ -68,6 +68,7 @@ struct _IP_ResolverPrivate {
return IP::RESOLVER_INVALID_ID;
}
+ Mutex *mutex;
Semaphore *sem;
Thread *thread;
@@ -96,8 +97,10 @@ struct _IP_ResolverPrivate {
while (!ipr->thread_abort) {
ipr->sem->wait();
- GLOBAL_LOCK_FUNCTION;
+
+ ipr->mutex->lock();
ipr->resolve_queues();
+ ipr->mutex->unlock();
}
}
@@ -110,24 +113,30 @@ struct _IP_ResolverPrivate {
IP_Address IP::resolve_hostname(const String &p_hostname, IP::Type p_type) {
- GLOBAL_LOCK_FUNCTION;
+ resolver->mutex->lock();
String key = _IP_ResolverPrivate::get_cache_key(p_hostname, p_type);
- if (resolver->cache.has(key))
- return resolver->cache[key];
+ if (resolver->cache.has(key)) {
+ IP_Address res = resolver->cache[key];
+ resolver->mutex->unlock();
+ return res;
+ }
IP_Address res = _resolve_hostname(p_hostname, p_type);
resolver->cache[key] = res;
+ resolver->mutex->unlock();
return res;
}
+
IP::ResolverID IP::resolve_hostname_queue_item(const String &p_hostname, IP::Type p_type) {
- GLOBAL_LOCK_FUNCTION;
+ resolver->mutex->lock();
ResolverID id = resolver->find_empty_id();
if (id == RESOLVER_INVALID_ID) {
WARN_PRINT("Out of resolver queries");
+ resolver->mutex->unlock();
return id;
}
@@ -146,6 +155,7 @@ IP::ResolverID IP::resolve_hostname_queue_item(const String &p_hostname, IP::Typ
resolver->resolve_queues();
}
+ resolver->mutex->unlock();
return id;
}
@@ -153,35 +163,51 @@ IP::ResolverStatus IP::get_resolve_item_status(ResolverID p_id) const {
ERR_FAIL_INDEX_V(p_id, IP::RESOLVER_MAX_QUERIES, IP::RESOLVER_STATUS_NONE);
- GLOBAL_LOCK_FUNCTION;
- ERR_FAIL_COND_V(resolver->queue[p_id].status == IP::RESOLVER_STATUS_NONE, IP::RESOLVER_STATUS_NONE);
+ resolver->mutex->lock();
+ if (resolver->queue[p_id].status == IP::RESOLVER_STATUS_NONE) {
+ ERR_PRINT("Condition status == IP::RESOLVER_STATUS_NONE");
+ resolver->mutex->unlock();
+ return IP::RESOLVER_STATUS_NONE;
+ }
+ IP::ResolverStatus res = resolver->queue[p_id].status;
- return resolver->queue[p_id].status;
+ resolver->mutex->unlock();
+ return res;
}
+
IP_Address IP::get_resolve_item_address(ResolverID p_id) const {
ERR_FAIL_INDEX_V(p_id, IP::RESOLVER_MAX_QUERIES, IP_Address());
- GLOBAL_LOCK_FUNCTION;
+ resolver->mutex->lock();
if (resolver->queue[p_id].status != IP::RESOLVER_STATUS_DONE) {
- ERR_EXPLAIN("Resolve of '" + resolver->queue[p_id].hostname + "'' didn't complete yet.");
- ERR_FAIL_COND_V(resolver->queue[p_id].status != IP::RESOLVER_STATUS_DONE, IP_Address());
+ ERR_PRINTS("Resolve of '" + resolver->queue[p_id].hostname + "'' didn't complete yet.");
+ resolver->mutex->unlock();
+ return IP_Address();
}
- return resolver->queue[p_id].response;
+ IP_Address res = resolver->queue[p_id].response;
+
+ resolver->mutex->unlock();
+ return res;
}
+
void IP::erase_resolve_item(ResolverID p_id) {
ERR_FAIL_INDEX(p_id, IP::RESOLVER_MAX_QUERIES);
- GLOBAL_LOCK_FUNCTION;
+ resolver->mutex->lock();
resolver->queue[p_id].status = IP::RESOLVER_STATUS_NONE;
+
+ resolver->mutex->unlock();
}
void IP::clear_cache(const String &p_hostname) {
+ resolver->mutex->lock();
+
if (p_hostname.empty()) {
resolver->cache.clear();
} else {
@@ -190,7 +216,9 @@ void IP::clear_cache(const String &p_hostname) {
resolver->cache.erase(_IP_ResolverPrivate::get_cache_key(p_hostname, IP::TYPE_IPV6));
resolver->cache.erase(_IP_ResolverPrivate::get_cache_key(p_hostname, IP::TYPE_ANY));
}
-};
+
+ resolver->mutex->unlock();
+}
Array IP::_get_local_addresses() const {
@@ -249,12 +277,11 @@ IP::IP() {
singleton = this;
resolver = memnew(_IP_ResolverPrivate);
resolver->sem = NULL;
+ resolver->mutex = Mutex::create();
#ifndef NO_THREADS
- //resolver->sem = Semaphore::create();
-
- resolver->sem = NULL;
+ resolver->sem = Semaphore::create();
if (resolver->sem) {
resolver->thread_abort = false;
@@ -281,7 +308,9 @@ IP::~IP() {
memdelete(resolver->thread);
memdelete(resolver->sem);
}
- memdelete(resolver);
#endif
+
+ memdelete(resolver->mutex);
+ memdelete(resolver);
}
diff --git a/core/message_queue.cpp b/core/message_queue.cpp
index 14e8913d9f..fa1c8112cc 100644
--- a/core/message_queue.cpp
+++ b/core/message_queue.cpp
@@ -51,9 +51,10 @@ Error MessageQueue::push_call(ObjectID p_id, const StringName &p_method, const V
type = ObjectDB::get_instance(p_id)->get_class();
print_line("failed method: " + type + ":" + p_method + " target ID: " + itos(p_id));
statistics();
+ ERR_EXPLAIN("Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings");
+ ERR_FAIL_V(ERR_OUT_OF_MEMORY);
}
- ERR_FAIL_COND_V((buffer_end + room_needed) >= buffer_size, ERR_OUT_OF_MEMORY);
Message *msg = memnew_placement(&buffer[buffer_end], Message);
msg->args = p_argcount;
msg->instance_ID = p_id;
@@ -101,10 +102,10 @@ Error MessageQueue::push_set(ObjectID p_id, const StringName &p_prop, const Vari
type = ObjectDB::get_instance(p_id)->get_class();
print_line("failed set: " + type + ":" + p_prop + " target ID: " + itos(p_id));
statistics();
+ ERR_EXPLAIN("Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings");
+ ERR_FAIL_V(ERR_OUT_OF_MEMORY);
}
- ERR_FAIL_COND_V((buffer_end + room_needed) >= buffer_size, ERR_OUT_OF_MEMORY);
-
Message *msg = memnew_placement(&buffer[buffer_end], Message);
msg->args = 1;
msg->instance_ID = p_id;
@@ -134,9 +135,10 @@ Error MessageQueue::push_notification(ObjectID p_id, int p_notification) {
type = ObjectDB::get_instance(p_id)->get_class();
print_line("failed notification: " + itos(p_notification) + " target ID: " + itos(p_id));
statistics();
+ ERR_EXPLAIN("Message queue out of memory. Try increasing 'message_queue_size_kb' in project settings");
+ ERR_FAIL_V(ERR_OUT_OF_MEMORY);
}
- ERR_FAIL_COND_V((buffer_end + room_needed) >= buffer_size, ERR_OUT_OF_MEMORY);
Message *msg = memnew_placement(&buffer[buffer_end], Message);
msg->type = TYPE_NOTIFICATION;
diff --git a/core/os/input_event.h b/core/os/input_event.h
index eb5c5685e5..93cceac27c 100644
--- a/core/os/input_event.h
+++ b/core/os/input_event.h
@@ -188,6 +188,7 @@ struct InputEventMouse {
struct InputEventMouseButton : public InputEventMouse {
+ double factor;
int button_index;
bool pressed; //otherwise released
bool doubleclick; //last even less than doubleclick time
@@ -272,7 +273,10 @@ struct InputEvent {
InputEvent xform_by(const Transform2D &p_xform) const;
bool operator==(const InputEvent &p_event) const;
operator String() const;
- InputEvent() { zeromem(this, sizeof(InputEvent)); }
+ InputEvent() {
+ zeromem(this, sizeof(InputEvent));
+ mouse_button.factor = 1;
+ }
};
#endif
diff --git a/doc/Makefile b/doc/Makefile
index d59c77063b..4914c657d2 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -8,25 +8,11 @@ TOOLSDIR = $(BASEDIR)/tools
clean:
rm -rf $(OUTPUTDIR)
-doku:
- rm -rf $(OUTPUTDIR)/doku
- mkdir -p $(OUTPUTDIR)/doku
- pushd $(OUTPUTDIR)/doku
- python2 $(TOOLSDIR)/makedoku.py $(CLASSES)
- popd
-
doxygen:
rm -rf $(OUTPUTDIR)/doxygen
mkdir -p $(OUTPUTDIR)/doxygen
doxygen Doxyfile
-html:
- rm -rf $(OUTPUTDIR)/html
- mkdir -p $(OUTPUTDIR)/html
- pushd $(OUTPUTDIR)/html
- python2 $(TOOLSDIR)/makehtml.py -multipage $(CLASSES)
- popd
-
markdown:
rm -rf $(OUTPUTDIR)/markdown
mkdir -p $(OUTPUTDIR)/markdown
@@ -40,8 +26,3 @@ rst:
pushd $(OUTPUTDIR)/rst
python2 $(TOOLSDIR)/makerst.py $(CLASSES)
popd
-
-textile:
- rm -rf $(OUTPUTDIR)/textile
- mkdir -p $(OUTPUTDIR)/textile
- python3 $(TOOLSDIR)/makedocs.py --input $(CLASSES) --output $(OUTPUTDIR)/textile
diff --git a/doc/base/classes.xml b/doc/base/classes.xml
index 03dd151eb2..d1ae66c02c 100644
--- a/doc/base/classes.xml
+++ b/doc/base/classes.xml
@@ -26264,7 +26264,7 @@
<return type="String">
</return>
<description>
- Return the name of the host OS. Possible values are: "Android", "BlackBerry 10", "Flash", "Haiku", "iOS", "HTML5", "OSX", "Server", "Windows", "UWP", "X11"
+ Return the name of the host OS. Possible values are: "Android", "Haiku", "iOS", "HTML5", "OSX", "Server", "Windows", "UWP", "X11".
</description>
</method>
<method name="get_power_percent_left">
diff --git a/doc/tools/doc_status.py b/doc/tools/doc_status.py
index 1386e91ce1..1386e91ce1 100755..100644
--- a/doc/tools/doc_status.py
+++ b/doc/tools/doc_status.py
diff --git a/doc/tools/locales/es/LC_MESSAGES/makedocs.mo b/doc/tools/locales/es/LC_MESSAGES/makedocs.mo
deleted file mode 100644
index 8d7ea2689e..0000000000
--- a/doc/tools/locales/es/LC_MESSAGES/makedocs.mo
+++ /dev/null
Binary files differ
diff --git a/doc/tools/locales/es/LC_MESSAGES/makedocs.po b/doc/tools/locales/es/LC_MESSAGES/makedocs.po
deleted file mode 100644
index 82115dd897..0000000000
--- a/doc/tools/locales/es/LC_MESSAGES/makedocs.po
+++ /dev/null
@@ -1,142 +0,0 @@
-# Translations template for PROJECT.
-# Copyright (C) 2015 ORGANIZATION
-# This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: makedocs\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-10-07 11:47-0600\n"
-"PO-Revision-Date: 2015-10-07 13:10-0600\n"
-"Last-Translator: Jorge Araya Navarro <elcorreo@deshackra.com>\n"
-"Language-Team: \n"
-"Language: es\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.0\n"
-"X-Generator: Poedit 1.8.4\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: makedocs.py:74
-msgid ""
-"\"<code>{gclass}</code>(Go to page of class {gclass})\":/class_{lkclass}"
-msgstr ""
-"\"<code>{gclass}</code>(Ir a la pagina de la clase {gclass})\":/"
-"class_{lkclass}"
-
-#: makedocs.py:76
-msgid ""
-"\"<code>{gclass}.{method}</code>(Go to page {gclass}, section {method})\":/"
-"class_{lkclass}#{lkmethod}"
-msgstr ""
-"\"<code>{gclass}.{method}</code>(Ir a la pagina {gclass}, sección "
-"{method})\":/class_{lkclass}#{lkmethod}"
-
-#: makedocs.py:79
-msgid "\"<code>{method}</code>(Jump to method {method})\":#{lkmethod}"
-msgstr "\"<code>{method}</code>(Saltar al método {method})\":#{lkmethod}"
-
-#: makedocs.py:81
-msgid " \"{rtype}(Go to page of class {rtype})\":/class_{link} "
-msgstr " \"{rtype}(Ir a la pagina de la clase {rtype})\":/class_{link} "
-
-#: makedocs.py:82
-msgid ""
-"\"*{funcname}*(Jump to description for node {funcname})\":#{link} <b>(</b> "
-msgstr ""
-"\"*{funcname}*(Saltar a la descripción para el nodo {funcname})\":#{link} "
-"<b>(</b> "
-
-#: makedocs.py:87
-msgid "h4. Inherits: "
-msgstr "h4. Hereda de: "
-
-#: makedocs.py:232
-msgid "<doc>'s version attribute missing"
-msgstr "El atributo version de <doc> no existe"
-
-#: makedocs.py:246
-msgid "|_. Index symbol |_. Class name |_. Index symbol |_. Class name |\n"
-msgstr ""
-"|_. Índice de símbolo |_. Nombre de la clase |_. Índice de símbolo |_. "
-"Nombre de la clase |\n"
-
-#: makedocs.py:305
-msgid ""
-"h4. Category: {}\n"
-"\n"
-msgstr ""
-"h4. Categoría: {}\n"
-"\n"
-
-#: makedocs.py:310
-msgid ""
-"h2. Brief Description\n"
-"\n"
-msgstr ""
-"h2. Descripción breve\n"
-"\n"
-
-#: makedocs.py:312
-msgid ""
-"\"read more\":#more\n"
-"\n"
-msgstr ""
-"\"Leer más\":#more\n"
-"\n"
-
-#: makedocs.py:317
-msgid ""
-"\n"
-"h3. Member Functions\n"
-"\n"
-msgstr ""
-"\n"
-"h3. Funciones miembro\n"
-"\n"
-
-#: makedocs.py:323
-msgid ""
-"\n"
-"h3. Signals\n"
-"\n"
-msgstr ""
-"\n"
-"h3. Señales\n"
-"\n"
-
-#: makedocs.py:331
-msgid ""
-"\n"
-"h3. Numeric Constants\n"
-"\n"
-msgstr ""
-"\n"
-"h3. Constantes numéricas\n"
-"\n"
-
-#: makedocs.py:347
-msgid ""
-"\n"
-"h3(#more). Description\n"
-"\n"
-msgstr ""
-"\n"
-"h3(#more). Descripción\n"
-"\n"
-
-#: makedocs.py:351
-msgid "_Nothing here, yet..._\n"
-msgstr "_Aún nada por aquí..._\n"
-
-#: makedocs.py:355
-msgid ""
-"\n"
-"h3. Member Function Description\n"
-"\n"
-msgstr ""
-"\n"
-"h3. Descripción de las funciones miembro\n"
-"\n"
diff --git a/doc/tools/main.css b/doc/tools/main.css
deleted file mode 100644
index 5eb3df2159..0000000000
--- a/doc/tools/main.css
+++ /dev/null
@@ -1,146 +0,0 @@
-BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV, SPAN {
- font-family: Arial, Geneva, Helvetica, sans-serif;
-}
-
-a {
-
- text-decoration: none;
-
-}
-
-a:hover {
-
- text-decoration: underline;
-}
-
-td.top_table {
-
- padding: 5px;
-}
-
-div.method_doc {
-
- padding-bottom: 30px;
-}
-
-div.method_description {
- margin-left: 30px;
-}
-
-list.inh_class_list {
- margin-left: 30px;
-
-}
-
-div.inh_class_list {
- margin-left: 30px;
-
-}
-
-div.method_doc div.method {
-
- font-size: 12pt;
- font-weight: bold;
-}
-
-span.funcdecl {
-
- color: #202060;
-}
-
-span.funcdef {
-
- color: #202060;
-}
-
-
-span.qualifier {
-
- font-weight: bold;
-}
-
-
-span.symbol {
-
- /*font-weight: bold;*/
- color: #471870;
-}
-
-
-span.datatype {
-
- color: #6a1533;
-}
-
-tr.category_title {
-
- background-color: #333333;
-}
-a.category_title {
- font-weight: bold;
- color: #FFFFFF;
-}
-
-div.method_list {
-
- margin-left: 30px;
-}
-
-div.constant_list {
-
- margin-left: 30px;
-}
-
-div.member_list {
-
- margin-left: 30px;
-}
-
-div.description {
-
- margin-left: 30px;
-}
-
-div.class_description {
-
- margin-left: 30px;
-}
-
-div.method_list li div {
-
- display: inline;
-}
-
-div.member_list li div.member {
-
- display: inline;
-}
-
-div.constant_list li div.constant {
-
- display: inline;
-}
-
-span.member_description {
-
- font-style: italic;
- color: grey;
-}
-
-span.constant_description {
-
- font-style: italic;
- color: grey;
-}
-
-span.identifier {
-
- font-weight: bold;
-}
-
-
-table.class_table td {
-
- vertical-align: top;
-}
-
diff --git a/doc/tools/makedocs.pot b/doc/tools/makedocs.pot
deleted file mode 100644
index be3220f686..0000000000
--- a/doc/tools/makedocs.pot
+++ /dev/null
@@ -1,108 +0,0 @@
-# Translations template for PROJECT.
-# Copyright (C) 2015 ORGANIZATION
-# This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: makedocs 0.1\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-10-07 11:47-0600\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.0\n"
-"X-Generator: Poedit 1.8.4\n"
-
-#: makedocs.py:74
-msgid "\"<code>{gclass}</code>(Go to page of class {gclass})\":/class_{lkclass}"
-msgstr ""
-
-#: makedocs.py:76
-msgid "\"<code>{gclass}.{method}</code>(Go to page {gclass}, section {method})\":/class_{lkclass}#{lkmethod}"
-msgstr ""
-
-#: makedocs.py:79
-msgid "\"<code>{method}</code>(Jump to method {method})\":#{lkmethod}"
-msgstr ""
-
-#: makedocs.py:81
-msgid " \"{rtype}(Go to page of class {rtype})\":/class_{link} "
-msgstr ""
-
-#: makedocs.py:82
-msgid "\"*{funcname}*(Jump to description for node {funcname})\":#{link} <b>(</b> "
-msgstr ""
-
-#: makedocs.py:87
-msgid "h4. Inherits: "
-msgstr ""
-
-#: makedocs.py:232
-msgid "<doc>'s version attribute missing"
-msgstr ""
-
-#: makedocs.py:246
-msgid "|_. Index symbol |_. Class name |_. Index symbol |_. Class name |\n"
-msgstr ""
-
-#: makedocs.py:305
-msgid ""
-"h4. Category: {}\n"
-"\n"
-msgstr ""
-
-#: makedocs.py:310
-msgid ""
-"h2. Brief Description\n"
-"\n"
-msgstr ""
-
-#: makedocs.py:312
-msgid ""
-"\"read more\":#more\n"
-"\n"
-msgstr ""
-
-#: makedocs.py:317
-msgid ""
-"\n"
-"h3. Member Functions\n"
-"\n"
-msgstr ""
-
-#: makedocs.py:323
-msgid ""
-"\n"
-"h3. Signals\n"
-"\n"
-msgstr ""
-
-#: makedocs.py:331
-msgid ""
-"\n"
-"h3. Numeric Constants\n"
-"\n"
-msgstr ""
-
-#: makedocs.py:347
-msgid ""
-"\n"
-"h3(#more). Description\n"
-"\n"
-msgstr ""
-
-#: makedocs.py:351
-msgid "_Nothing here, yet..._\n"
-msgstr ""
-
-#: makedocs.py:355
-msgid ""
-"\n"
-"h3. Member Function Description\n"
-"\n"
-msgstr ""
diff --git a/doc/tools/makedocs.py b/doc/tools/makedocs.py
deleted file mode 100644
index 9e0430bfbf..0000000000
--- a/doc/tools/makedocs.py
+++ /dev/null
@@ -1,383 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-
-#
-# makedocs.py: Generate documentation for Open Project Wiki
-# Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
-# Contributor: Jorge Araya Navarro <elcorreo@deshackra.com>
-#
-
-# IMPORTANT NOTICE:
-# If you are going to modify anything from this file, please be sure to follow
-# the Style Guide for Python Code or often called "PEP8". To do this
-# automagically just install autopep8:
-#
-# $ sudo pip3 install autopep8
-#
-# and run:
-#
-# $ autopep8 makedocs.py
-#
-# Before committing your changes. Also be sure to delete any trailing
-# whitespace you may left.
-#
-# TODO:
-# * Refactor code.
-# * Adapt this script for generating content in other markup formats like
-# reStructuredText, Markdown, DokuWiki, etc.
-#
-# Also check other TODO entries in this script for more information on what is
-# left to do.
-import argparse
-import gettext
-import logging
-import re
-from itertools import zip_longest
-from os import path, listdir
-from xml.etree import ElementTree
-
-
-# add an option to change the verbosity
-logging.basicConfig(level=logging.INFO)
-
-
-def getxmlfloc():
- """ Returns the supposed location of the XML file
- """
- filepath = path.dirname(path.abspath(__file__))
- return path.join(filepath, "class_list.xml")
-
-
-def langavailable():
- """ Return a list of languages available for translation
- """
- filepath = path.join(
- path.dirname(path.abspath(__file__)), "locales")
- files = listdir(filepath)
- choices = [x for x in files]
- choices.insert(0, "none")
- return choices
-
-
-desc = "Generates documentation from a XML file to different markup languages"
-
-parser = argparse.ArgumentParser(description=desc)
-parser.add_argument("--input", dest="xmlfp", default=getxmlfloc(),
- help="Input XML file, default: {}".format(getxmlfloc()))
-parser.add_argument("--output-dir", dest="outputdir", required=True,
- help="Output directory for generated files")
-parser.add_argument("--language", choices=langavailable(), default="none",
- help=("Choose the language of translation"
- " for the output files. Default is English (none). "
- "Note: This is NOT for the documentation itself!"))
-# TODO: add an option for outputting different markup formats
-
-args = parser.parse_args()
-# Let's check if the file and output directory exists
-if not path.isfile(args.xmlfp):
- logging.critical("File not found: {}".format(args.xmlfp))
- exit(1)
-elif not path.isdir(args.outputdir):
- logging.critical("Path does not exist: {}".format(args.outputdir))
- exit(1)
-
-_ = gettext.gettext
-if args.language != "none":
- lang = gettext.translation(domain="makedocs",
- localedir="locales",
- languages=[args.language])
- lang.install()
-
- _ = lang.gettext
-
-# Strings
-C_LINK = _("\"<code>{gclass}</code>(Go to page of class"
- " {gclass})\":/class_{lkclass}")
-MC_LINK = _("\"<code>{gclass}.{method}</code>(Go "
- "to page {gclass}, section {method})\""
- ":/class_{lkclass}#{lkmethod}")
-TM_JUMP = _("\"<code>{method}</code>(Jump to method"
- " {method})\":#{lkmethod}")
-GTC_LINK = _(" \"{rtype}(Go to page of class {rtype})\":/class_{link} ")
-DFN_JUMP = _("\"*{funcname}*(Jump to description for"
- " node {funcname})\":#{link} <b>(</b> ")
-M_ARG_DEFAULT = C_LINK + " {name}={default}"
-M_ARG = C_LINK + " {name}"
-
-OPENPROJ_INH = _("h4. Inherits: ") + C_LINK + "\n\n"
-
-
-def tb(string):
- """ Return a byte representation of a string
- """
- return bytes(string, "UTF-8")
-
-
-def sortkey(c):
- """ Symbols are first, letters second
- """
- if "_" == c.attrib["name"][0]:
- return "A"
- else:
- return c.attrib["name"]
-
-
-def toOP(text):
- """ Convert commands in text to Open Project commands
- """
- # TODO: Make this capture content between [command] ... [/command]
- groups = re.finditer((r'\[html (?P<command>/?\w+/?)(\]| |=)?(\]| |=)?(?P<a'
- 'rg>\w+)?(\]| |=)?(?P<value>"[^"]+")?/?\]'), text)
- alignstr = ""
- for group in groups:
- gd = group.groupdict()
- if gd["command"] == "br/":
- text = text.replace(group.group(0), "\n\n", 1)
- elif gd["command"] == "div":
- if gd["value"] == '"center"':
- alignstr = ("{display:block; margin-left:auto;"
- " margin-right:auto;}")
- elif gd["value"] == '"left"':
- alignstr = "<"
- elif gd["value"] == '"right"':
- alignstr = ">"
- text = text.replace(group.group(0), "\n\n", 1)
- elif gd["command"] == "/div":
- alignstr = ""
- text = text.replace(group.group(0), "\n\n", 1)
- elif gd["command"] == "img":
- text = text.replace(group.group(0), "!{align}{src}!".format(
- align=alignstr, src=gd["value"].strip('"')), 1)
- elif gd["command"] == "b" or gd["command"] == "/b":
- text = text.replace(group.group(0), "*", 1)
- elif gd["command"] == "i" or gd["command"] == "/i":
- text = text.replace(group.group(0), "_", 1)
- elif gd["command"] == "u" or gd["command"] == "/u":
- text = text.replace(group.group(0), "+", 1)
- # Process other non-html commands
- groups = re.finditer((r'\[method ((?P<class>[aA0-zZ9_]+)(?:\.))'
- r'?(?P<method>[aA0-zZ9_]+)\]'), text)
- for group in groups:
- gd = group.groupdict()
- if gd["class"]:
- replacewith = (MC_LINK.format(gclass=gd["class"],
- method=gd["method"],
- lkclass=gd["class"].lower(),
- lkmethod=gd["method"].lower()))
- else:
- # The method is located in the same wiki page
- replacewith = (TM_JUMP.format(method=gd["method"],
- lkmethod=gd["method"].lower()))
-
- text = text.replace(group.group(0), replacewith, 1)
- # Finally, [Classes] are around brackets, make them direct links
- groups = re.finditer(r'\[(?P<class>[az0-AZ0_]+)\]', text)
- for group in groups:
- gd = group.groupdict()
- replacewith = (C_LINK.
- format(gclass=gd["class"],
- lkclass=gd["class"].lower()))
- text = text.replace(group.group(0), replacewith, 1)
-
- return text + "\n\n"
-
-
-def mkfn(node, is_signal=False):
- """ Return a string containing a unsorted item for a function
- """
- finalstr = ""
- name = node.attrib["name"]
- rtype = node.find("return")
- if rtype:
- rtype = rtype.attrib["type"]
- else:
- rtype = "void"
- # write the return type and the function name first
- finalstr += "* "
- # return type
- if not is_signal:
- if rtype != "void":
- finalstr += GTC_LINK.format(
- rtype=rtype,
- link=rtype.lower())
- else:
- finalstr += " void "
-
- # function name
- if not is_signal:
- finalstr += DFN_JUMP.format(
- funcname=name,
- link=name.lower())
- else:
- # Signals have no description
- finalstr += "*{funcname}* <b>(</b>".format(funcname=name)
- # loop for the arguments of the function, if any
- args = []
- for arg in sorted(
- node.iter(tag="argument"),
- key=lambda a: int(a.attrib["index"])):
-
- ntype = arg.attrib["type"]
- nname = arg.attrib["name"]
-
- if "default" in arg.attrib:
- args.insert(-1, M_ARG_DEFAULT.format(
- gclass=ntype,
- lkclass=ntype.lower(),
- name=nname,
- default=arg.attrib["default"]))
- else:
- # No default value present
- args.insert(-1, M_ARG.format(gclass=ntype,
- lkclass=ntype.lower(), name=nname))
- # join the arguments together
- finalstr += ", ".join(args)
- # and, close the function with a )
- finalstr += " <b>)</b>"
- # write the qualifier, if any
- if "qualifiers" in node.attrib:
- qualifier = node.attrib["qualifiers"]
- finalstr += " " + qualifier
-
- finalstr += "\n"
-
- return finalstr
-
-# Let's begin
-tree = ElementTree.parse(args.xmlfp)
-root = tree.getroot()
-
-# Check version attribute exists in <doc>
-if "version" not in root.attrib:
- logging.critical(_("<doc>'s version attribute missing"))
- exit(1)
-
-version = root.attrib["version"]
-classes = sorted(root, key=sortkey)
-# first column is always longer, second column of classes should be shorter
-zclasses = zip_longest(classes[:int(len(classes) / 2 + 1)],
- classes[int(len(classes) / 2 + 1):],
- fillvalue="")
-
-# We write the class_list file and also each class file at once
-with open(path.join(args.outputdir, "class_list.txt"), "wb") as fcl:
- # Write header of table
- fcl.write(tb("|^.\n"))
- fcl.write(tb(_("|_. Index symbol |_. Class name "
- "|_. Index symbol |_. Class name |\n")))
- fcl.write(tb("|-.\n"))
-
- indexletterl = ""
- indexletterr = ""
- for gdclassl, gdclassr in zclasses:
- # write a row #
- # write the index symbol column, left
- if indexletterl != gdclassl.attrib["name"][0]:
- indexletterl = gdclassl.attrib["name"][0]
- fcl.write(tb("| *{}* |".format(indexletterl.upper())))
- else:
- # empty cell
- fcl.write(tb("| |"))
- # write the class name column, left
- fcl.write(tb(C_LINK.format(
- gclass=gdclassl.attrib["name"],
- lkclass=gdclassl.attrib["name"].lower())))
-
- # write the index symbol column, right
- if isinstance(gdclassr, ElementTree.Element):
- if indexletterr != gdclassr.attrib["name"][0]:
- indexletterr = gdclassr.attrib["name"][0]
- fcl.write(tb("| *{}* |".format(indexletterr.upper())))
- else:
- # empty cell
- fcl.write(tb("| |"))
- # We are dealing with an empty string
- else:
- # two empty cell
- fcl.write(tb("| | |\n"))
- # We won't get the name of the class since there is no ElementTree
- # object for the right side of the tuple, so we iterate the next
- # tuple instead
- continue
-
- # write the class name column (if any), right
- fcl.write(tb(C_LINK.format(
- gclass=gdclassl.attrib["name"],
- lkclass=gdclassl.attrib["name"].lower()) + "|\n"))
-
- # row written #
- # now, let's write each class page for each class
- for gdclass in [gdclassl, gdclassr]:
- if not isinstance(gdclass, ElementTree.Element):
- continue
-
- classname = gdclass.attrib["name"]
- with open(path.join(args.outputdir, "{}.txt".format(
- classname.lower())), "wb") as clsf:
- # First level header with the name of the class
- clsf.write(tb("h1. {}\n\n".format(classname)))
- # lay the attributes
- if "inherits" in gdclass.attrib:
- inh = gdclass.attrib["inherits"].strip()
- clsf.write(tb(OPENPROJ_INH.format(gclass=inh,
- lkclass=inh.lower())))
- if "category" in gdclass.attrib:
- clsf.write(tb(_("h4. Category: {}\n\n").
- format(gdclass.attrib["category"].strip())))
- # lay child nodes
- briefd = gdclass.find("brief_description")
- if briefd.text.strip():
- clsf.write(tb(_("h2. Brief Description\n\n")))
- clsf.write(tb(toOP(briefd.text.strip()) +
- _("\"read more\":#more\n\n")))
-
- # Write the list of member functions of this class
- methods = gdclass.find("methods")
- if methods and len(methods) > 0:
- clsf.write(tb(_("\nh3. Member Functions\n\n")))
- for method in methods.iter(tag='method'):
- clsf.write(tb(mkfn(method)))
-
- signals = gdclass.find("signals")
- if signals and len(signals) > 0:
- clsf.write(tb(_("\nh3. Signals\n\n")))
- for signal in signals.iter(tag='signal'):
- clsf.write(tb(mkfn(signal, True)))
- # TODO: <members> tag is necessary to process? it does not
- # exists in class_list.xml file.
-
- consts = gdclass.find("constants")
- if consts and len(consts) > 0:
- clsf.write(tb(_("\nh3. Numeric Constants\n\n")))
- for const in sorted(consts, key=lambda k:
- k.attrib["name"]):
- if const.text.strip():
- clsf.write(tb("* *{name}* = *{value}* - {desc}\n".
- format(
- name=const.attrib["name"],
- value=const.attrib["value"],
- desc=const.text.strip())))
- else:
- # Constant have no description
- clsf.write(tb("* *{name}* = *{value}*\n".
- format(
- name=const.attrib["name"],
- value=const.attrib["value"])))
- descrip = gdclass.find("description")
- clsf.write(tb(_("\nh3(#more). Description\n\n")))
- if descrip.text:
- clsf.write(tb(descrip.text.strip() + "\n"))
- else:
- clsf.write(tb(_("_Nothing here, yet..._\n")))
-
- # and finally, the description for each method
- if methods and len(methods) > 0:
- clsf.write(tb(_("\nh3. Member Function Description\n\n")))
- for method in methods.iter(tag='method'):
- clsf.write(tb("h4(#{n}). {name}\n\n".format(
- n=method.attrib["name"].lower(),
- name=method.attrib["name"])))
- clsf.write(tb(mkfn(method) + "\n"))
- clsf.write(tb(toOP(method.find(
- "description").text.strip())))
diff --git a/doc/tools/makedoku.py b/doc/tools/makedoku.py
deleted file mode 100644
index ad3bfd791d..0000000000
--- a/doc/tools/makedoku.py
+++ /dev/null
@@ -1,499 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import sys
-import xml.etree.ElementTree as ET
-
-input_list = []
-
-
-for arg in sys.argv[1:]:
- input_list.append(arg)
-
-if len(input_list) < 1:
- print("usage: makedoku.py <classes.xml>")
- sys.exit(0)
-
-
-def validate_tag(elem, tag):
- if (elem.tag != tag):
- print("Tag mismatch, expected '" + tag + "', got " + elem.tag)
- sys.exit(255)
-
-
-class_names = []
-classes = {}
-
-
-def make_class_list(class_list, columns):
-
- f = open("class_list.txt", "wb")
- prev = 0
- col_max = len(class_list) / columns + 1
- print("col max is ", col_max)
- col_count = 0
- row_count = 0
- last_initial = ""
- fit_columns = []
-
- for n in range(0, columns):
- fit_columns += [[]]
-
- indexers = []
- last_initial = ""
-
- idx = 0
- for n in class_list:
- col = idx / col_max
- if (col >= columns):
- col = columns - 1
- fit_columns[col] += [n]
- idx += 1
- if (n[:1] != last_initial):
- indexers += [n]
- last_initial = n[:1]
-
- row_max = 0
-
- for n in range(0, columns):
- if (len(fit_columns[n]) > row_max):
- row_max = len(fit_columns[n])
-
- for r in range(0, row_max):
- s = "|"
- for c in range(0, columns):
- if (r >= len(fit_columns[c])):
- continue
-
- classname = fit_columns[c][r]
- initial = classname[0]
- if (classname in indexers):
- s += "**" + initial + "**|"
- else:
- s += " |"
-
- s += "[[" + classname.lower() + "|" + classname + "]]|"
-
- s += "\n"
- f.write(s)
-
-
-def dokuize_text(txt):
-
- return txt
-
-
-def dokuize_text(text):
- pos = 0
- while(True):
- pos = text.find("[", pos)
- if (pos == -1):
- break
-
- endq_pos = text.find("]", pos + 1)
- if (endq_pos == -1):
- break
-
- pre_text = text[:pos]
- post_text = text[endq_pos + 1:]
- tag_text = text[pos + 1:endq_pos]
-
- if (tag_text in class_names):
- tag_text = "[[" + tag_text.lower() + "|" + tag_text + "]]"
- else: # command
- cmd = tag_text
- space_pos = tag_text.find(" ")
- if (cmd.find("html") == 0):
- cmd = tag_text[:space_pos]
- param = tag_text[space_pos + 1:]
- tag_text = "<" + param + ">"
- elif(cmd.find("method") == 0):
- cmd = tag_text[:space_pos]
- param = tag_text[space_pos + 1:]
-
- if (param.find(".") != -1):
- class_param, method_param = param.split(".")
- tag_text = "[[" + class_param.lower() + "#" + method_param + "|" + class_param + '.' + method_param + "]]"
- else:
- tag_text = "[[#" + param + "|" + param + "]]"
- elif (cmd.find("image=") == 0):
- tag_text = "{{" + cmd[6:] + "}}"
- elif (cmd.find("url=") == 0):
- tag_text = "[[" + cmd[4:] + "|"
- elif (cmd == "/url"):
- tag_text = "]]>"
- elif (cmd == "center"):
- tag_text = ""
- elif (cmd == "/center"):
- tag_text = ""
- elif (cmd == "br"):
- tag_text = "\\\\\n"
- elif (cmd == "i" or cmd == "/i"):
- tag_text = "//"
- elif (cmd == "b" or cmd == "/b"):
- tag_text = "**"
- elif (cmd == "u" or cmd == "/u"):
- tag_text = "__"
- else:
- tag_text = "[" + tag_text + "]"
-
- text = pre_text + tag_text + post_text
- pos = len(pre_text) + len(tag_text)
-
- #tnode = ET.SubElement(parent,"div")
- # tnode.text=text
- return text
-
-
-def make_type(t):
- global class_names
- if (t in class_names):
- return "[[" + t.lower() + "|" + t + "]]"
- return t
-
-
-def make_method(f, name, m, declare, event=False):
-
- s = " * "
- ret_type = "void"
- args = list(m)
- mdata = {}
- mdata["argidx"] = []
- for a in args:
- if (a.tag == "return"):
- idx = -1
- elif (a.tag == "argument"):
- idx = int(a.attrib["index"])
- else:
- continue
-
- mdata["argidx"].append(idx)
- mdata[idx] = a
-
- if (not event):
- if (-1 in mdata["argidx"]):
- s += make_type(mdata[-1].attrib["type"])
- else:
- s += "void"
- s += " "
-
- if (declare):
-
- # span.attrib["class"]="funcdecl"
- # a=ET.SubElement(span,"a")
- # a.attrib["name"]=name+"_"+m.attrib["name"]
- # a.text=name+"::"+m.attrib["name"]
- s += "**" + m.attrib["name"] + "**"
- else:
- s += "[[#" + m.attrib["name"] + "|" + m.attrib["name"] + "]]"
-
- s += "**(**"
- argfound = False
- for a in mdata["argidx"]:
- arg = mdata[a]
- if (a < 0):
- continue
- if (a > 0):
- s += ", "
- else:
- s += " "
-
- s += make_type(arg.attrib["type"])
- if ("name" in arg.attrib):
- s += " " + arg.attrib["name"]
- else:
- s += " arg" + str(a)
-
- if ("default" in arg.attrib):
- s += "=" + arg.attrib["default"]
-
- argfound = True
-
- if (argfound):
- s += " "
- s += "**)**"
-
- if ("qualifiers" in m.attrib):
- s += " " + m.attrib["qualifiers"]
-
- f.write(s + "\n")
-
-
-def make_doku_class(node):
-
- name = node.attrib["name"]
-
- f = open(name.lower() + ".txt", "wb")
-
- f.write("====== " + name + " ======\n")
-
- if ("inherits" in node.attrib):
- inh = node.attrib["inherits"].strip()
- f.write("**Inherits:** [[" + inh.lower() + "|" + inh + "]]\\\\\n")
- if ("category" in node.attrib):
- f.write("**Category:** " + node.attrib["category"].strip() + "\\\\\n")
-
- briefd = node.find("brief_description")
- if (briefd != None):
- f.write("===== Brief Description ======\n")
- f.write(dokuize_text(briefd.text.strip()) + "\n")
-
- methods = node.find("methods")
-
- if(methods != None and len(list(methods)) > 0):
- f.write("===== Member Functions ======\n")
- for m in list(methods):
- make_method(f, node.attrib["name"], m, False)
-
- events = node.find("signals")
- if(events != None and len(list(events)) > 0):
- f.write("===== Signals ======\n")
- for m in list(events):
- make_method(f, node.attrib["name"], m, True, True)
-
- members = node.find("members")
-
- if(members != None and len(list(members)) > 0):
- f.write("===== Member Variables ======\n")
-
- for c in list(members):
- s = " * "
- s += make_type(c.attrib["type"]) + " "
- s += "**" + c.attrib["name"] + "**"
- if (c.text.strip() != ""):
- s += " - " + c.text.strip()
- f.write(s + "\n")
-
- constants = node.find("constants")
- if(constants != None and len(list(constants)) > 0):
- f.write("===== Numeric Constants ======\n")
- for c in list(constants):
- s = " * "
- s += "**" + c.attrib["name"] + "**"
- if ("value" in c.attrib):
- s += " = **" + c.attrib["value"] + "**"
- if (c.text.strip() != ""):
- s += " - " + c.text.strip()
- f.write(s + "\n")
-
- descr = node.find("description")
- if (descr != None and descr.text.strip() != ""):
- f.write("===== Description ======\n")
- f.write(dokuize_text(descr.text.strip()) + "\n")
-
- methods = node.find("methods")
-
- if(methods != None and len(list(methods)) > 0):
- f.write("===== Member Function Description ======\n")
- for m in list(methods):
-
- d = m.find("description")
- if (d == None or d.text.strip() == ""):
- continue
- f.write("== " + m.attrib["name"] + " ==\n")
- make_method(f, node.attrib["name"], m, False)
- f.write("\\\\\n")
- f.write(dokuize_text(d.text.strip()))
- f.write("\n")
-
- """
- div=ET.Element("div")
- div.attrib["class"]="class";
-
- a=ET.SubElement(div,"a")
- a.attrib["name"]=node.attrib["name"]
-
- h3=ET.SubElement(a,"h3")
- h3.attrib["class"]="title class_title"
- h3.text=node.attrib["name"]
-
- briefd = node.find("brief_description")
- if (briefd!=None):
- div2=ET.SubElement(div,"div")
- div2.attrib["class"]="description class_description"
- div2.text=briefd.text
-
- if ("inherits" in node.attrib):
- ET.SubElement(div,"br")
-
- div2=ET.SubElement(div,"div")
- div2.attrib["class"]="inheritance";
-
- span=ET.SubElement(div2,"span")
- span.text="Inherits: "
-
- make_type(node.attrib["inherits"],div2)
-
- if ("category" in node.attrib):
- ET.SubElement(div,"br")
-
- div3=ET.SubElement(div,"div")
- div3.attrib["class"]="category";
-
- span=ET.SubElement(div3,"span")
- span.attrib["class"]="category"
- span.text="Category: "
-
- a = ET.SubElement(div3,"a")
- a.attrib["class"]="category_ref"
- a.text=node.attrib["category"]
- catname=a.text
- if (catname.rfind("/")!=-1):
- catname=catname[catname.rfind("/"):]
- catname="CATEGORY_"+catname
-
- if (single_page):
- a.attrib["href"]="#"+catname
- else:
- a.attrib["href"]="category.html#"+catname
-
-
- methods = node.find("methods")
-
- if(methods!=None and len(list(methods))>0):
-
- h4=ET.SubElement(div,"h4")
- h4.text="Public Methods:"
-
- method_table=ET.SubElement(div,"table")
- method_table.attrib["class"]="method_list";
-
- for m in list(methods):
-# li = ET.SubElement(div2, "li")
- method_table.append( make_method_def(node.attrib["name"],m,False) )
-
- events = node.find("signals")
-
- if(events!=None and len(list(events))>0):
- h4=ET.SubElement(div,"h4")
- h4.text="Events:"
-
- event_table=ET.SubElement(div,"table")
- event_table.attrib["class"]="method_list";
-
- for m in list(events):
-# li = ET.SubElement(div2, "li")
- event_table.append( make_method_def(node.attrib["name"],m,False,True) )
-
-
- members = node.find("members")
- if(members!=None and len(list(members))>0):
-
- h4=ET.SubElement(div,"h4")
- h4.text="Public Variables:"
- div2=ET.SubElement(div,"div")
- div2.attrib["class"]="member_list";
-
- for c in list(members):
-
- li = ET.SubElement(div2, "li")
- div3=ET.SubElement(li,"div")
- div3.attrib["class"]="member";
- make_type(c.attrib["type"],div3)
- span=ET.SubElement(div3,"span")
- span.attrib["class"]="identifier member_name"
- span.text=" "+c.attrib["name"]+" "
- span=ET.SubElement(div3,"span")
- span.attrib["class"]="member_description"
- span.text=c.text
-
-
- constants = node.find("constants")
- if(constants!=None and len(list(constants))>0):
-
- h4=ET.SubElement(div,"h4")
- h4.text="Constants:"
- div2=ET.SubElement(div,"div")
- div2.attrib["class"]="constant_list";
-
- for c in list(constants):
- li = ET.SubElement(div2, "li")
- div3=ET.SubElement(li,"div")
- div3.attrib["class"]="constant";
-
- span=ET.SubElement(div3,"span")
- span.attrib["class"]="identifier constant_name"
- span.text=c.attrib["name"]+" "
- if ("value" in c.attrib):
- span=ET.SubElement(div3,"span")
- span.attrib["class"]="symbol"
- span.text="= "
- span=ET.SubElement(div3,"span")
- span.attrib["class"]="constant_value"
- span.text=c.attrib["value"]+" "
- span=ET.SubElement(div3,"span")
- span.attrib["class"]="constant_description"
- span.text=c.text
-
-# ET.SubElement(div,"br")
-
-
- descr=node.find("description")
- if (descr!=None and descr.text.strip()!=""):
-
- h4=ET.SubElement(div,"h4")
- h4.text="Description:"
-
- make_text_def(node.attrib["name"],div,descr.text)
-# div2=ET.SubElement(div,"div")
-# div2.attrib["class"]="description";
-# div2.text=descr.text
-
-
-
- if(methods!=None or events!=None):
-
- h4=ET.SubElement(div,"h4")
- h4.text="Method Documentation:"
- iter_list = []
- if (methods!=None):
- iter_list+=list(methods)
- if (events!=None):
- iter_list+=list(events)
-
- for m in iter_list:
-
- descr=m.find("description")
-
- if (descr==None or descr.text.strip()==""):
- continue;
-
- div2=ET.SubElement(div,"div")
- div2.attrib["class"]="method_doc";
-
-
- div2.append( make_method_def(node.attrib["name"],m,True) )
- #anchor = ET.SubElement(div2, "a")
- #anchor.attrib["name"] =
- make_text_def(node.attrib["name"],div2,descr.text)
- #div3=ET.SubElement(div2,"div")
- #div3.attrib["class"]="description";
- #div3.text=descr.text
-
-
- return div
-"""
-for file in input_list:
- tree = ET.parse(file)
- doc = tree.getroot()
-
- if ("version" not in doc.attrib):
- print("Version missing from 'doc'")
- sys.exit(255)
-
- version = doc.attrib["version"]
-
- for c in list(doc):
- if (c.attrib["name"] in class_names):
- continue
- class_names.append(c.attrib["name"])
- classes[c.attrib["name"]] = c
-
-
-class_names.sort()
-
-make_class_list(class_names, 4)
-
-for cn in class_names:
- c = classes[cn]
- make_doku_class(c)
diff --git a/doc/tools/makehtml.py b/doc/tools/makehtml.py
deleted file mode 100644
index 3ecb8220cb..0000000000
--- a/doc/tools/makehtml.py
+++ /dev/null
@@ -1,689 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import sys
-import xml.etree.ElementTree as ET
-from xml.sax.saxutils import escape, unescape
-
-html_escape_table = {
- '"': "&quot;",
- "'": "&apos;"
-}
-
-html_unescape_table = {v: k for k, v in html_escape_table.items()}
-
-
-def html_escape(text):
- return escape(text, html_escape_table)
-
-
-def html_unescape(text):
- return unescape(text, html_unescape_table)
-
-input_list = []
-
-single_page = True
-
-for arg in sys.argv[1:]:
- if arg[:1] == "-":
- if arg[1:] == "multipage":
- single_page = False
- if arg[1:] == "singlepage":
- single_page = True
- else:
- input_list.append(arg)
-
-if len(input_list) < 1:
- print("usage: makehtml.py <classes.xml>")
- sys.exit(0)
-
-
-def validate_tag(elem, tag):
- if (elem.tag != tag):
- print("Tag mismatch, expected '" + tag + "', got " + elem.tag)
- sys.exit(255)
-
-
-def make_html_bottom(body):
- # make_html_top(body,True)
- ET.SubElement(body, "hr")
- copyright = ET.SubElement(body, "span")
- copyright.text = "Copyright 2008-2010 Codenix SRL"
-
-
-def make_html_top(body, bottom=False):
-
- if (bottom):
- ET.SubElement(body, "hr")
-
- table = ET.SubElement(body, "table")
- table.attrib["class"] = "top_table"
- tr = ET.SubElement(table, "tr")
- td = ET.SubElement(tr, "td")
- td.attrib["class"] = "top_table"
-
- img = ET.SubElement(td, "image")
- img.attrib["src"] = "images/logo.png"
- td = ET.SubElement(tr, "td")
- td.attrib["class"] = "top_table"
- a = ET.SubElement(td, "a")
- a.attrib["href"] = "index.html"
- a.text = "Index"
- td = ET.SubElement(tr, "td")
- td.attrib["class"] = "top_table"
- a = ET.SubElement(td, "a")
- a.attrib["href"] = "alphabetical.html"
- a.text = "Classes"
- td = ET.SubElement(tr, "td")
- td.attrib["class"] = "top_table"
- a = ET.SubElement(td, "a")
- a.attrib["href"] = "category.html"
- a.text = "Categories"
- td = ET.SubElement(tr, "td")
- a = ET.SubElement(td, "a")
- a.attrib["href"] = "inheritance.html"
- a.text = "Inheritance"
- if (not bottom):
- ET.SubElement(body, "hr")
-
-
-def make_html_class_list(class_list, columns):
-
- div = ET.Element("div")
- div.attrib["class"] = "ClassList"
-
- h1 = ET.SubElement(div, "h2")
- h1.text = "Alphabetical Class List"
-
- table = ET.SubElement(div, "table")
- table.attrib["class"] = "class_table"
- table.attrib["width"] = "100%"
- prev = 0
-
- col_max = len(class_list) / columns + 1
- print("col max is ", col_max)
- col_count = 0
- row_count = 0
- last_initial = ""
- fit_columns = []
-
- for n in range(0, columns):
- fit_columns += [[]]
-
- indexers = []
- last_initial = ""
-
- idx = 0
- for n in class_list:
- col = int(idx / col_max)
- if (col >= columns):
- col = columns - 1
- fit_columns[col] += [n]
- idx += 1
- if (n[:1] != last_initial):
- indexers += [n]
- last_initial = n[:1]
-
- row_max = 0
-
- for n in range(0, columns):
- if (len(fit_columns[n]) > row_max):
- row_max = len(fit_columns[n])
-
- for r in range(0, row_max):
- tr = ET.SubElement(table, "tr")
- for c in range(0, columns):
- tdi = ET.SubElement(tr, "td")
- tdi.attrib["align"] = "right"
- td = ET.SubElement(tr, "td")
- if (r >= len(fit_columns[c])):
- continue
-
- classname = fit_columns[c][r]
- print(classname)
- if (classname in indexers):
-
- span = ET.SubElement(tdi, "span")
- span.attrib["class"] = "class_index_letter"
- span.text = classname[:1].upper()
-
- if (single_page):
- link = "#" + classname
- else:
- link = classname + ".html"
-
- a = ET.SubElement(td, "a")
- a.attrib["href"] = link
- a.text = classname
-
- if (not single_page):
- cat_class_list = ET.Element("html")
- csscc = ET.SubElement(cat_class_list, "link")
- csscc.attrib["href"] = "main.css"
- csscc.attrib["rel"] = "stylesheet"
- csscc.attrib["type"] = "text/css"
- bodycc = ET.SubElement(cat_class_list, "body")
- make_html_top(bodycc)
-
- cat_class_parent = bodycc
- else:
- cat_class_parent = div
-
- h1 = ET.SubElement(cat_class_parent, "h2")
- h1.text = "Class List By Category"
-
- class_cat_table = {}
- class_cat_list = []
-
- for c in class_list:
- clss = classes[c]
- if ("category" in clss.attrib):
- class_cat = clss.attrib["category"]
- else:
- class_cat = "Core"
- if (class_cat.find("/") != -1):
- class_cat = class_cat[class_cat.rfind("/") + 1:]
- if (not class_cat in class_cat_list):
- class_cat_list.append(class_cat)
- class_cat_table[class_cat] = []
- class_cat_table[class_cat].append(c)
-
- class_cat_list.sort()
-
- ct = ET.SubElement(cat_class_parent, "table")
- for cl in class_cat_list:
- l = class_cat_table[cl]
- l.sort()
- tr = ET.SubElement(ct, "tr")
- tr.attrib["class"] = "category_title"
- td = ET.SubElement(ct, "td")
- td.attrib["class"] = "category_title"
-
- a = ET.SubElement(td, "a")
- a.attrib["class"] = "category_title"
- a.text = cl
- a.attrib["name"] = "CATEGORY_" + cl
-
- td = ET.SubElement(ct, "td")
- td.attrib["class"] = "category_title"
-
- for clt in l:
- tr = ET.SubElement(ct, "tr")
- td = ET.SubElement(ct, "td")
- make_type(clt, td)
- clss = classes[clt]
- bd = clss.find("brief_description")
- bdtext = ""
- if (bd != None):
- bdtext = bd.text
- td = ET.SubElement(ct, "td")
- td.text = bdtext
-
- if (not single_page):
- make_html_bottom(bodycc)
- catet_out = ET.ElementTree(cat_class_list)
- catet_out.write("category.html")
-
- if (not single_page):
- inh_class_list = ET.Element("html")
- cssic = ET.SubElement(inh_class_list, "link")
- cssic.attrib["href"] = "main.css"
- cssic.attrib["rel"] = "stylesheet"
- cssic.attrib["type"] = "text/css"
- bodyic = ET.SubElement(inh_class_list, "body")
- make_html_top(bodyic)
- inh_class_parent = bodyic
- else:
- inh_class_parent = div
-
- h1 = ET.SubElement(inh_class_parent, "h2")
- h1.text = "Class List By Inheritance"
-
- itemlist = ET.SubElement(inh_class_parent, "list")
-
- class_inh_table = {}
-
- def add_class(clss):
- if (clss.attrib["name"] in class_inh_table):
- return # already added
- parent_list = None
-
- if ("inherits" in clss.attrib):
- inhc = clss.attrib["inherits"]
- if (not (inhc in class_inh_table)):
- add_class(classes[inhc])
-
- parent_list = class_inh_table[inhc].find("div")
- if (parent_list == None):
- parent_div = ET.SubElement(class_inh_table[inhc], "div")
- parent_list = ET.SubElement(parent_div, "list")
- parent_div.attrib["class"] = "inh_class_list"
- else:
- parent_list = parent_list.find("list")
-
- else:
- parent_list = itemlist
-
- item = ET.SubElement(parent_list, "li")
-# item.attrib["class"]="inh_class_list"
- class_inh_table[clss.attrib["name"]] = item
- make_type(clss.attrib["name"], item)
-
- for c in class_list:
- add_class(classes[c])
-
- if (not single_page):
- make_html_bottom(bodyic)
- catet_out = ET.ElementTree(inh_class_list)
- catet_out.write("inheritance.html")
-
- # h1=ET.SubElement(div,"h2")
- #h1.text="Class List By Inheritance"
-
- return div
-
-
-def make_type(p_type, p_parent):
- if (p_type == "RefPtr"):
- p_type = "Resource"
-
- if (p_type in class_names):
- a = ET.SubElement(p_parent, "a")
- a.attrib["class"] = "datatype_existing"
- a.text = p_type + " "
- if (single_page):
- a.attrib["href"] = "#" + p_type
- else:
- a.attrib["href"] = p_type + ".html"
- else:
- span = ET.SubElement(p_parent, "span")
- span.attrib["class"] = "datatype"
- span.text = p_type + " "
-
-
-def make_text_def(class_name, parent, text):
- text = html_escape(text)
- pos = 0
- while(True):
- pos = text.find("[", pos)
- if (pos == -1):
- break
-
- endq_pos = text.find("]", pos + 1)
- if (endq_pos == -1):
- break
-
- pre_text = text[:pos]
- post_text = text[endq_pos + 1:]
- tag_text = text[pos + 1:endq_pos]
-
- if (tag_text in class_names):
- if (single_page):
- tag_text = '<a href="#' + tag_text + '">' + tag_text + '</a>'
- else:
- tag_text = '<a href="' + tag_text + '.html">' + tag_text + '</a>'
- else: # command
- cmd = tag_text
- space_pos = tag_text.find(" ")
- if (cmd.find("html") == 0):
- cmd = tag_text[:space_pos]
- param = tag_text[space_pos + 1:]
- tag_text = "<" + param + ">"
- elif(cmd.find("method") == 0):
- cmd = tag_text[:space_pos]
- param = tag_text[space_pos + 1:]
-
- if (not single_page and param.find(".") != -1):
- class_param, method_param = param.split(".")
- tag_text = tag_text = '<a href="' + class_param + '.html#' + class_param + "_" + method_param + '">' + class_param + '.' + method_param + '()</a>'
- else:
- tag_text = tag_text = '<a href="#' + class_name + "_" + param + '">' + class_name + '.' + param + '()</a>'
- elif (cmd.find("image=") == 0):
- print("found image: " + cmd)
- tag_text = "<img src=" + cmd[6:] + "/>"
- elif (cmd.find("url=") == 0):
- tag_text = "<a href=" + cmd[4:] + ">"
- elif (cmd == "/url"):
- tag_text = "</a>"
- elif (cmd == "center"):
- tag_text = "<div align=\"center\">"
- elif (cmd == "/center"):
- tag_text = "</div>"
- elif (cmd == "br"):
- tag_text = "<br/>"
- elif (cmd == "i" or cmd == "/i" or cmd == "b" or cmd == "/b" or cmd == "u" or cmd == "/u"):
- tag_text = "<" + tag_text + ">" # html direct mapping
- else:
- tag_text = "[" + tag_text + "]"
-
- text = pre_text + tag_text + post_text
- pos = len(pre_text) + len(tag_text)
-
- #tnode = ET.SubElement(parent,"div")
- # tnode.text=text
- text = "<div class=\"description\">" + text + "</div>"
- try:
- tnode = ET.XML(text)
- parent.append(tnode)
- except:
- print("Error parsing description text: '" + text + "'")
- sys.exit(255)
-
- return tnode
-
-
-def make_method_def(name, m, declare, event=False):
-
- mdata = {}
-
- if (not declare):
- div = ET.Element("tr")
- div.attrib["class"] = "method"
- ret_parent = ET.SubElement(div, "td")
- ret_parent.attrib["align"] = "right"
- func_parent = ET.SubElement(div, "td")
- else:
- div = ET.Element("div")
- div.attrib["class"] = "method"
- ret_parent = div
- func_parent = div
-
- mdata["argidx"] = []
- mdata["name"] = m.attrib["name"]
- qualifiers = ""
- if ("qualifiers" in m.attrib):
- qualifiers = m.attrib["qualifiers"]
-
- args = list(m)
- for a in args:
- if (a.tag == "return"):
- idx = -1
- elif (a.tag == "argument"):
- idx = int(a.attrib["index"])
- else:
- continue
-
- mdata["argidx"].append(idx)
- mdata[idx] = a
-
- if (not event):
- if (-1 in mdata["argidx"]):
- make_type(mdata[-1].attrib["type"], ret_parent)
- mdata["argidx"].remove(-1)
- else:
- make_type("void", ret_parent)
-
- span = ET.SubElement(func_parent, "span")
- if (declare):
- span.attrib["class"] = "funcdecl"
- a = ET.SubElement(span, "a")
- a.attrib["name"] = name + "_" + m.attrib["name"]
- a.text = name + "::" + m.attrib["name"]
- else:
- span.attrib["class"] = "identifier funcdef"
- a = ET.SubElement(span, "a")
- a.attrib["href"] = "#" + name + "_" + m.attrib["name"]
- a.text = m.attrib["name"]
-
- span = ET.SubElement(func_parent, "span")
- span.attrib["class"] = "symbol"
- span.text = " ("
-
- for a in mdata["argidx"]:
- arg = mdata[a]
- if (a > 0):
- span = ET.SubElement(func_parent, "span")
- span.text = ", "
- else:
- span = ET.SubElement(func_parent, "span")
- span.text = " "
-
- make_type(arg.attrib["type"], func_parent)
-
- span = ET.SubElement(func_parent, "span")
- span.text = arg.attrib["name"]
- if ("default" in arg.attrib):
- span.text = span.text + "=" + arg.attrib["default"]
-
- span = ET.SubElement(func_parent, "span")
- span.attrib["class"] = "symbol"
- if (len(mdata["argidx"])):
- span.text = " )"
- else:
- span.text = ")"
-
- if (qualifiers):
- span = ET.SubElement(func_parent, "span")
- span.attrib["class"] = "qualifier"
- span.text = " " + qualifiers
-
- return div
-
-
-def make_html_class(node):
-
- div = ET.Element("div")
- div.attrib["class"] = "class"
-
- a = ET.SubElement(div, "a")
- a.attrib["name"] = node.attrib["name"]
-
- h3 = ET.SubElement(a, "h3")
- h3.attrib["class"] = "title class_title"
- h3.text = node.attrib["name"]
-
- briefd = node.find("brief_description")
- if (briefd != None):
- div2 = ET.SubElement(div, "div")
- div2.attrib["class"] = "description class_description"
- div2.text = briefd.text
-
- if ("inherits" in node.attrib):
- ET.SubElement(div, "br")
-
- div2 = ET.SubElement(div, "div")
- div2.attrib["class"] = "inheritance"
-
- span = ET.SubElement(div2, "span")
- span.text = "Inherits: "
-
- make_type(node.attrib["inherits"], div2)
-
- if ("category" in node.attrib):
- ET.SubElement(div, "br")
-
- div3 = ET.SubElement(div, "div")
- div3.attrib["class"] = "category"
-
- span = ET.SubElement(div3, "span")
- span.attrib["class"] = "category"
- span.text = "Category: "
-
- a = ET.SubElement(div3, "a")
- a.attrib["class"] = "category_ref"
- a.text = node.attrib["category"]
- catname = a.text
- if (catname.rfind("/") != -1):
- catname = catname[catname.rfind("/"):]
- catname = "CATEGORY_" + catname
-
- if (single_page):
- a.attrib["href"] = "#" + catname
- else:
- a.attrib["href"] = "category.html#" + catname
-
- methods = node.find("methods")
-
- if(methods != None and len(list(methods)) > 0):
-
- h4 = ET.SubElement(div, "h4")
- h4.text = "Public Methods:"
-
- method_table = ET.SubElement(div, "table")
- method_table.attrib["class"] = "method_list"
-
- for m in list(methods):
- #li = ET.SubElement(div2, "li")
- method_table.append(make_method_def(node.attrib["name"], m, False))
-
- events = node.find("signals")
-
- if(events != None and len(list(events)) > 0):
- h4 = ET.SubElement(div, "h4")
- h4.text = "Events:"
-
- event_table = ET.SubElement(div, "table")
- event_table.attrib["class"] = "method_list"
-
- for m in list(events):
- #li = ET.SubElement(div2, "li")
- event_table.append(make_method_def(node.attrib["name"], m, False, True))
-
- members = node.find("members")
- if(members != None and len(list(members)) > 0):
-
- h4 = ET.SubElement(div, "h4")
- h4.text = "Public Variables:"
- div2 = ET.SubElement(div, "div")
- div2.attrib["class"] = "member_list"
-
- for c in list(members):
-
- li = ET.SubElement(div2, "li")
- div3 = ET.SubElement(li, "div")
- div3.attrib["class"] = "member"
- make_type(c.attrib["type"], div3)
- span = ET.SubElement(div3, "span")
- span.attrib["class"] = "identifier member_name"
- span.text = " " + c.attrib["name"] + " "
- span = ET.SubElement(div3, "span")
- span.attrib["class"] = "member_description"
- span.text = c.text
-
- constants = node.find("constants")
- if(constants != None and len(list(constants)) > 0):
-
- h4 = ET.SubElement(div, "h4")
- h4.text = "Constants:"
- div2 = ET.SubElement(div, "div")
- div2.attrib["class"] = "constant_list"
-
- for c in list(constants):
- li = ET.SubElement(div2, "li")
- div3 = ET.SubElement(li, "div")
- div3.attrib["class"] = "constant"
-
- span = ET.SubElement(div3, "span")
- span.attrib["class"] = "identifier constant_name"
- span.text = c.attrib["name"] + " "
- if ("value" in c.attrib):
- span = ET.SubElement(div3, "span")
- span.attrib["class"] = "symbol"
- span.text = "= "
- span = ET.SubElement(div3, "span")
- span.attrib["class"] = "constant_value"
- span.text = c.attrib["value"] + " "
- span = ET.SubElement(div3, "span")
- span.attrib["class"] = "constant_description"
- span.text = c.text
-
-# ET.SubElement(div,"br")
-
- descr = node.find("description")
- if (descr != None and descr.text.strip() != ""):
- h4 = ET.SubElement(div, "h4")
- h4.text = "Description:"
-
- make_text_def(node.attrib["name"], div, descr.text)
-# div2=ET.SubElement(div,"div")
-# div2.attrib["class"]="description";
-# div2.text=descr.text
-
- if(methods != None or events != None):
-
- h4 = ET.SubElement(div, "h4")
- h4.text = "Method Documentation:"
- iter_list = []
- if (methods != None):
- iter_list += list(methods)
- if (events != None):
- iter_list += list(events)
-
- for m in iter_list:
-
- descr = m.find("description")
-
- if (descr == None or descr.text.strip() == ""):
- continue
-
- div2 = ET.SubElement(div, "div")
- div2.attrib["class"] = "method_doc"
-
- div2.append(make_method_def(node.attrib["name"], m, True))
- #anchor = ET.SubElement(div2, "a")
- # anchor.attrib["name"] =
- make_text_def(node.attrib["name"], div2, descr.text)
- # div3=ET.SubElement(div2,"div")
- # div3.attrib["class"]="description";
- # div3.text=descr.text
-
- return div
-
-class_names = []
-classes = {}
-
-for file in input_list:
- tree = ET.parse(file)
- doc = tree.getroot()
-
- if ("version" not in doc.attrib):
- print("Version missing from 'doc'")
- sys.exit(255)
-
- version = doc.attrib["version"]
-
- for c in list(doc):
- if (c.attrib["name"] in class_names):
- continue
- class_names.append(c.attrib["name"])
- classes[c.attrib["name"]] = c
-
-html = ET.Element("html")
-css = ET.SubElement(html, "link")
-css.attrib["href"] = "main.css"
-css.attrib["rel"] = "stylesheet"
-css.attrib["type"] = "text/css"
-
-body = ET.SubElement(html, "body")
-if (not single_page):
- make_html_top(body)
-
-
-class_names.sort()
-
-body.append(make_html_class_list(class_names, 5))
-
-for cn in class_names:
- c = classes[cn]
- if (single_page):
- body.append(make_html_class(c))
- else:
- html2 = ET.Element("html")
- css = ET.SubElement(html2, "link")
- css.attrib["href"] = "main.css"
- css.attrib["rel"] = "stylesheet"
- css.attrib["type"] = "text/css"
- body2 = ET.SubElement(html2, "body")
- make_html_top(body2)
- body2.append(make_html_class(c))
- make_html_bottom(body2)
- et_out = ET.ElementTree(html2)
- et_out.write(c.attrib["name"] + ".html")
-
-
-et_out = ET.ElementTree(html)
-if (single_page):
- et_out.write("singlepage.html")
-else:
- make_html_bottom(body)
- et_out.write("alphabetical.html")
diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp
index 73547b5a16..1025acceb4 100644
--- a/drivers/gles3/rasterizer_storage_gles3.cpp
+++ b/drivers/gles3/rasterizer_storage_gles3.cpp
@@ -245,7 +245,7 @@ Image RasterizerStorageGLES3::_get_gl_image_and_format(const Image &p_image, Ima
if (config.s3tc_supported) {
- r_gl_internal_format = (config.srgb_decode_supported || p_flags & VS::TEXTURE_FLAG_CONVERT_TO_LINEAR) ? _EXT_COMPRESSED_SRGB_S3TC_DXT1_NV : _EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+ r_gl_internal_format = (config.srgb_decode_supported || p_flags & VS::TEXTURE_FLAG_CONVERT_TO_LINEAR) ? _EXT_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV : _EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT;
r_gl_format = GL_RGBA;
r_gl_type = GL_UNSIGNED_BYTE;
r_compressed = true;
diff --git a/drivers/unix/packet_peer_udp_posix.cpp b/drivers/unix/packet_peer_udp_posix.cpp
index 5dbccd4b63..74ceb3946a 100644
--- a/drivers/unix/packet_peer_udp_posix.cpp
+++ b/drivers/unix/packet_peer_udp_posix.cpp
@@ -216,6 +216,8 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) {
len = sizeof(struct sockaddr_storage);
++queue_count;
+ if (p_wait)
+ break;
};
// TODO: Should ECONNRESET be handled here?
diff --git a/editor/animation_editor.cpp b/editor/animation_editor.cpp
index 63ed27e60c..1e6562fcf2 100644
--- a/editor/animation_editor.cpp
+++ b/editor/animation_editor.cpp
@@ -1871,21 +1871,35 @@ void AnimationKeyEditor::_track_editor_gui_input(const InputEvent &p_input) {
if (mb.button_index == BUTTON_WHEEL_UP && mb.pressed) {
if (mb.mod.command) {
+
zoom->set_value(zoom->get_value() + zoom->get_step());
} else {
- v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() / 8);
+
+ v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() * mb.factor / 8);
}
}
if (mb.button_index == BUTTON_WHEEL_DOWN && mb.pressed) {
if (mb.mod.command) {
+
zoom->set_value(zoom->get_value() - zoom->get_step());
} else {
- v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() / 8);
+
+ v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * mb.factor / 8);
}
}
+ if (mb.button_index == BUTTON_WHEEL_RIGHT && mb.pressed) {
+
+ h_scroll->set_value(h_scroll->get_value() - h_scroll->get_page() * mb.factor / 8);
+ }
+
+ if (mb.button_index == BUTTON_WHEEL_LEFT && mb.pressed) {
+
+ v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * mb.factor / 8);
+ }
+
if (mb.button_index == BUTTON_RIGHT && mb.pressed) {
Point2 mpos = Point2(mb.x, mb.y) - ofs;
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
index 4796640a3d..3774c8d4c3 100644
--- a/editor/editor_export.cpp
+++ b/editor/editor_export.cpp
@@ -321,7 +321,7 @@ Error EditorExportPlatform::_save_zip_file(void *p_userdata, const String &p_pat
return OK;
}
-String EditorExportPlatform::find_export_template(String template_file_name) const {
+String EditorExportPlatform::find_export_template(String template_file_name, String *err) const {
String base_name = itos(VERSION_MAJOR) + "." + itos(VERSION_MINOR) + "-" + _MKSTR(VERSION_STATUS) + "/" + template_file_name;
String user_file = EditorSettings::get_singleton()->get_settings_path() + "/templates/" + base_name;
@@ -342,9 +342,20 @@ String EditorExportPlatform::find_export_template(String template_file_name) con
return system_file;
}
}
- print_line("none,sorry");
- return String(); //not found
+ // Not found
+ if (err) {
+ *err += "No export template found at \"" + user_file + "\"";
+ if (has_system_path)
+ *err += "\n or \"" + system_file + "\".";
+ else
+ *err += ".";
+ }
+ return String(); // not found
+}
+
+bool EditorExportPlatform::exists_export_template(String template_file_name, String *err) const {
+ return find_export_template(template_file_name, err) != "";
}
Ref<EditorExportPreset> EditorExportPlatform::create_preset() {
@@ -925,19 +936,47 @@ Ref<Texture> EditorExportPlatformPC::get_logo() const {
bool EditorExportPlatformPC::can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const {
- r_missing_templates = false;
+ String err;
+ bool valid = true;
+
+ if (use64 && (!exists_export_template(debug_file_64, &err) || !exists_export_template(release_file_64, &err))) {
+ valid = false;
+ }
+
+ if (!use64 && (!exists_export_template(debug_file_32, &err) || !exists_export_template(release_file_32, &err))) {
+ valid = false;
+ }
+
+ String custom_debug_binary = p_preset->get("custom_template/debug");
+ String custom_release_binary = p_preset->get("custom_template/release");
+
+ if (custom_debug_binary == "" && custom_release_binary == "") {
+ if (!err.empty())
+ r_error = err;
+ return valid;
+ }
+
+ bool dvalid = true;
+ bool rvalid = true;
+
+ if (!FileAccess::exists(custom_debug_binary)) {
+ dvalid = false;
+ err = "Custom debug binary not found.\n";
+ }
- if (find_export_template(release_file_32) == String()) {
- r_missing_templates = true;
- } else if (find_export_template(debug_file_32) == String()) {
- r_missing_templates = true;
- } else if (find_export_template(release_file_64) == String()) {
- r_missing_templates = true;
- } else if (find_export_template(debug_file_64) == String()) {
- r_missing_templates = true;
+ if (!FileAccess::exists(custom_release_binary)) {
+ rvalid = false;
+ err += "Custom release binary not found.\n";
}
- return !r_missing_templates;
+ if (dvalid || rvalid)
+ valid = true;
+ else
+ valid = false;
+
+ if (!err.empty())
+ r_error = err;
+ return valid;
}
String EditorExportPlatformPC::get_binary_extension() const {
@@ -1497,40 +1536,6 @@ Vector<StringName> EditorExportPlatform::get_dependencies(bool p_bundles) const
}
-String EditorExportPlatform::find_export_template(String template_file_name, String *err) const {
- String user_file = EditorSettings::get_singleton()->get_settings_path()
- +"/templates/"+template_file_name;
- String system_file=OS::get_singleton()->get_installed_templates_path();
- bool has_system_path=(system_file!="");
- system_file+=template_file_name;
-
- // Prefer user file
- if (FileAccess::exists(user_file)) {
- return user_file;
- }
-
- // Now check system file
- if (has_system_path) {
- if (FileAccess::exists(system_file)) {
- return system_file;
- }
- }
-
- // Not found
- if (err) {
- *err+="No export template found at \""+user_file+"\"";
- if (has_system_path)
- *err+="\n or \""+system_file+"\".";
- else
- *err+=".";
- }
- return "";
-}
-
-bool EditorExportPlatform::exists_export_template(String template_file_name, String *err) const {
- return find_export_template(template_file_name,err)!="";
-}
-
///////////////////////////////////////
@@ -2430,50 +2435,6 @@ void EditorExportPlatformPC::set_binary_extension(const String& p_extension) {
binary_extension=p_extension;
}
-bool EditorExportPlatformPC::can_export(String *r_error) const {
-
- String err;
- bool valid=true;
-
- if (use64 && (!exists_export_template(debug_binary64) || !exists_export_template(release_binary64))) {
- valid=false;
- err="No 64 bits export templates found.\nDownload and install export templates.\n";
- }
-
- if (!use64 && (!exists_export_template(debug_binary32) || !exists_export_template(release_binary32))) {
- valid=false;
- err="No 32 bits export templates found.\nDownload and install export templates.\n";
- }
-
- if(custom_debug_binary=="" && custom_release_binary=="") {
- if (r_error) *r_error=err;
- return valid;
- }
-
- bool dvalid = true;
- bool rvalid = true;
-
- if(!FileAccess::exists(custom_debug_binary)) {
- dvalid = false;
- err = "Custom debug binary not found.\n";
- }
-
- if(!FileAccess::exists(custom_release_binary)) {
- rvalid = false;
- err = "Custom release binary not found.\n";
- }
-
- if (dvalid || rvalid)
- valid = true;
- else
- valid = false;
-
- if (r_error)
- *r_error=err;
- return valid;
-}
-
-
EditorExportPlatformPC::EditorExportPlatformPC() {
export_mode=EXPORT_PACK;
diff --git a/editor/editor_export.h b/editor/editor_export.h
index a78762ad80..740f05174b 100644
--- a/editor/editor_export.h
+++ b/editor/editor_export.h
@@ -154,7 +154,8 @@ private:
protected:
virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) = 0;
- String find_export_template(String template_file_name) const;
+ bool exists_export_template(String template_file_name, String *err) const;
+ String find_export_template(String template_file_name, String *err = NULL) const;
void gen_export_flags(Vector<String> &r_flags, int p_flags);
public:
@@ -258,6 +259,8 @@ class EditorExportPlatformPC : public EditorExportPlatform {
String debug_file_32;
String debug_file_64;
+ bool use64;
+
public:
virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features);
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 6b23a02275..698066f188 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -1651,7 +1651,7 @@ void EditorNode::_run(bool p_current, const String &p_custom) {
current_option = -1;
//accept->get_cancel()->hide();
- pick_main_scene->set_text(TTR("No main scene has ever been defined, select one?\nYou can change it later in later in \"Project Settings\" under the 'application' category."));
+ pick_main_scene->set_text(TTR("No main scene has ever been defined, select one?\nYou can change it later in \"Project Settings\" under the 'application' category."));
pick_main_scene->popup_centered_minsize();
return;
}
@@ -2689,6 +2689,14 @@ void EditorNode::_editor_select(int p_which) {
editor_plugin_screen = new_editor;
editor_plugin_screen->make_visible(true);
editor_plugin_screen->selected_notify();
+
+ if (EditorSettings::get_singleton()->get("interface/separate_distraction_mode")) {
+ if (p_which == EDITOR_SCRIPT) {
+ set_distraction_free_mode(script_distraction);
+ } else {
+ set_distraction_free_mode(scene_distraction);
+ }
+ }
}
void EditorNode::add_editor_plugin(EditorPlugin *p_editor) {
@@ -4382,7 +4390,25 @@ bool EditorNode::get_docks_visible() const {
void EditorNode::_toggle_distraction_free_mode() {
- set_distraction_free_mode(distraction_free->is_pressed());
+ if (EditorSettings::get_singleton()->get("interface/separate_distraction_mode")) {
+ int screen = -1;
+ for (int i = 0; i < editor_table.size(); i++) {
+ if (editor_plugin_screen == editor_table[i]) {
+ screen = i;
+ break;
+ }
+ }
+
+ if (screen == EDITOR_SCRIPT) {
+ script_distraction = !script_distraction;
+ set_distraction_free_mode(script_distraction);
+ } else {
+ scene_distraction = !scene_distraction;
+ set_distraction_free_mode(scene_distraction);
+ }
+ } else {
+ set_distraction_free_mode(distraction_free->is_pressed());
+ }
}
void EditorNode::set_distraction_free_mode(bool p_enter) {
@@ -4806,6 +4832,9 @@ EditorNode::EditorNode() {
_initializing_addons = false;
docks_visible = true;
+ scene_distraction = false;
+ script_distraction = false;
+
FileAccess::set_backup_save(true);
TranslationServer::get_singleton()->set_enabled(false);
diff --git a/editor/editor_node.h b/editor/editor_node.h
index 7de713eae9..fc107bb505 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -357,6 +357,9 @@ private:
bool docks_visible;
ToolButton *distraction_free;
+ bool scene_distraction;
+ bool script_distraction;
+
String _tmp_import_path;
EditorExport *editor_export;
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index 1b4f77419b..9fd76590a6 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -509,6 +509,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
set("interface/dim_transition_time", 0.08f);
hints["interface/dim_transition_time"] = PropertyInfo(Variant::REAL, "interface/dim_transition_time", PROPERTY_HINT_RANGE, "0,1,0.001", PROPERTY_USAGE_DEFAULT);
+ set("interface/separate_distraction_mode", false);
+
set("filesystem/directories/autoscan_project_path", "");
hints["filesystem/directories/autoscan_project_path"] = PropertyInfo(Variant::STRING, "filesystem/directories/autoscan_project_path", PROPERTY_HINT_GLOBAL_DIR);
set("filesystem/directories/default_project_path", "");
@@ -589,6 +591,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
set("editors/3d/emulate_3_button_mouse", false);
set("editors/3d/warped_mouse_panning", true);
+ set("editors/3d/freelook_base_speed", 1);
+ set("editors/3d/freelook_modifier_speed_factor", 5.0);
+
set("editors/2d/bone_width", 5);
set("editors/2d/bone_color1", Color(1.0, 1.0, 1.0, 0.9));
set("editors/2d/bone_color2", Color(0.75, 0.75, 0.75, 0.9));
diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp
index 19fd1208b9..21c2ae6eb3 100644
--- a/editor/import/resource_importer_obj.cpp
+++ b/editor/import/resource_importer_obj.cpp
@@ -168,18 +168,23 @@ Error ResourceImporterOBJ::import(const String &p_source_file, const String &p_s
if (face[idx].size() == 3) {
int norm = face[idx][2].to_int() - 1;
+ if (norm < 0)
+ norm += normals.size() + 1;
ERR_FAIL_INDEX_V(norm, normals.size(), ERR_PARSE_ERROR);
surf_tool->add_normal(normals[norm]);
}
if (face[idx].size() >= 2 && face[idx][1] != String()) {
-
int uv = face[idx][1].to_int() - 1;
+ if (uv < 0)
+ uv += uvs.size() + 1;
ERR_FAIL_INDEX_V(uv, uvs.size(), ERR_PARSE_ERROR);
surf_tool->add_uv(uvs[uv]);
}
int vtx = face[idx][0].to_int() - 1;
+ if (vtx < 0)
+ vtx += vertices.size() + 1;
ERR_FAIL_INDEX_V(vtx, vertices.size(), ERR_PARSE_ERROR);
Vector3 vertex = vertices[vtx];
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index 430a5adeb1..27be6ea8f0 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -1049,7 +1049,7 @@ void CanvasItemEditor::_viewport_gui_input(const InputEvent &p_event) {
return;
float prev_zoom = zoom;
- zoom = zoom * 0.95;
+ zoom = zoom * (1 - (0.05 * b.factor));
{
Point2 ofs(b.x, b.y);
ofs = ofs / prev_zoom - ofs / zoom;
@@ -1067,7 +1067,7 @@ void CanvasItemEditor::_viewport_gui_input(const InputEvent &p_event) {
return;
float prev_zoom = zoom;
- zoom = zoom * (1.0 / 0.95);
+ zoom = zoom * ((0.95 + (0.05 * b.factor)) / 0.95);
{
Point2 ofs(b.x, b.y);
ofs = ofs / prev_zoom - ofs / zoom;
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index e84e782580..896a26c8e8 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -522,10 +522,10 @@ void Polygon2DEditor::_uv_input(const InputEvent &p_input) {
} else if (mb.button_index == BUTTON_WHEEL_UP && mb.pressed) {
- uv_zoom->set_value(uv_zoom->get_value() / 0.9);
+ uv_zoom->set_value(uv_zoom->get_value() / (1 - (0.1 * mb.factor)));
} else if (mb.button_index == BUTTON_WHEEL_DOWN && mb.pressed) {
- uv_zoom->set_value(uv_zoom->get_value() * 0.9);
+ uv_zoom->set_value(uv_zoom->get_value() * (1 - (0.1 * mb.factor)));
}
} else if (p_input.type == InputEvent::MOUSE_MOTION) {
diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp
index d73349f773..0bd4d7d6d2 100644
--- a/editor/plugins/spatial_editor_plugin.cpp
+++ b/editor/plugins/spatial_editor_plugin.cpp
@@ -51,6 +51,12 @@
//#define GIZMO_SCALE_DEFAULT 0.28
#define GIZMO_SCALE_DEFAULT 0.15
+#define ZOOM_MIN_DISTANCE 0.001
+#define ZOOM_MULTIPLIER 1.08
+#define ZOOM_INDICATOR_DELAY_S 1.5
+
+#define FREELOOK_MIN_SPEED 0.1
+
void SpatialEditorViewport::_update_camera() {
if (orthogonal) {
//camera->set_orthogonal(size.width*cursor.distance,get_znear(),get_zfar());
@@ -58,20 +64,26 @@ void SpatialEditorViewport::_update_camera() {
} else
camera->set_perspective(get_fov(), get_znear(), get_zfar());
+ Transform camera_transform = to_camera_transform(cursor);
+
+ if (camera->get_global_transform() != camera_transform) {
+ camera->set_global_transform(camera_transform);
+ update_transform_gizmo_view();
+ }
+}
+
+Transform SpatialEditorViewport::to_camera_transform(const Cursor &p_cursor) const {
Transform camera_transform;
- camera_transform.translate(cursor.pos);
- camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot);
- camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot);
+ camera_transform.translate(p_cursor.pos);
+ camera_transform.basis.rotate(Vector3(1, 0, 0), -p_cursor.x_rot);
+ camera_transform.basis.rotate(Vector3(0, 1, 0), -p_cursor.y_rot);
if (orthogonal)
camera_transform.translate(0, 0, 4096);
else
- camera_transform.translate(0, 0, cursor.distance);
+ camera_transform.translate(0, 0, p_cursor.distance);
- if (camera->get_global_transform() != camera_transform) {
- camera->set_global_transform(camera_transform);
- update_transform_gizmo_view();
- }
+ return camera_transform;
}
String SpatialEditorGizmo::get_handle_name(int p_idx) const {
@@ -669,8 +681,7 @@ void SpatialEditorViewport::_list_select(InputEventMouseButton b) {
selection_menu->add_item(spat->get_name());
selection_menu->set_item_icon(i, icon);
selection_menu->set_item_metadata(i, node_path);
- selection_menu->set_item_tooltip(i, String(spat->get_name()) +
- "\nType: " + spat->get_class() + "\nPath: " + node_path);
+ selection_menu->set_item_tooltip(i, String(spat->get_name()) + "\nType: " + spat->get_class() + "\nPath: " + node_path);
}
selection_menu->set_global_position(Vector2(b.global_x, b.global_y));
@@ -704,19 +715,13 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
switch (b.button_index) {
case BUTTON_WHEEL_UP: {
-
- cursor.distance /= 1.08;
- if (cursor.distance < 0.001)
- cursor.distance = 0.001;
-
+ scale_cursor_distance(is_freelook_active() ? ZOOM_MULTIPLIER : 1.0 / ZOOM_MULTIPLIER);
} break;
- case BUTTON_WHEEL_DOWN: {
-
- if (cursor.distance < 0.001)
- cursor.distance = 0.001;
- cursor.distance *= 1.08;
+ case BUTTON_WHEEL_DOWN: {
+ scale_cursor_distance(is_freelook_active() ? 1.0 / ZOOM_MULTIPLIER : ZOOM_MULTIPLIER);
} break;
+
case BUTTON_RIGHT: {
NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation_scheme").operator int();
@@ -729,76 +734,6 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
if (_edit.mode == TRANSFORM_NONE && b.pressed) {
- Plane cursor_plane(cursor.cursor_pos, _get_camera_normal());
-
- Vector3 ray_origin = _get_ray_pos(Vector2(b.x, b.y));
- Vector3 ray_dir = _get_ray(Vector2(b.x, b.y));
-
- //gizmo modify
-
- if (b.mod.control) {
-
- Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_ray(ray_origin, ray_dir, get_tree()->get_root()->get_world()->get_scenario());
-
- Plane p(ray_origin, _get_camera_normal());
-
- float min_d = 1e10;
- bool found = false;
-
- for (int i = 0; i < instances.size(); i++) {
-
- Object *obj = ObjectDB::get_instance(instances[i]);
-
- if (!obj)
- continue;
-
- VisualInstance *vi = obj->cast_to<VisualInstance>();
- if (!vi)
- continue;
-
- //optimize by checking AABB (although should pre sort by distance)
- Rect3 aabb = vi->get_global_transform().xform(vi->get_aabb());
- if (p.distance_to(aabb.get_support(-ray_dir)) > min_d)
- continue;
-
- PoolVector<Face3> faces = vi->get_faces(VisualInstance::FACES_SOLID);
- int c = faces.size();
- if (c > 0) {
- PoolVector<Face3>::Read r = faces.read();
-
- for (int j = 0; j < c; j++) {
-
- Vector3 inters;
- if (r[j].intersects_ray(ray_origin, ray_dir, &inters)) {
-
- float d = p.distance_to(inters);
- if (d < 0)
- continue;
-
- if (d < min_d) {
- min_d = d;
- found = true;
- }
- }
- }
- }
- }
-
- if (found) {
-
- //cursor.cursor_pos=ray_origin+ray_dir*min_d;
- //VisualServer::get_singleton()->instance_set_transform(cursor_instance,Transform(Matrix3(),cursor.cursor_pos));
- }
-
- } else {
- Vector3 new_pos;
- if (cursor_plane.intersects_ray(ray_origin, ray_dir, &new_pos)) {
-
- //cursor.cursor_pos=new_pos;
- //VisualServer::get_singleton()->instance_set_transform(cursor_instance,Transform(Matrix3(),cursor.cursor_pos));
- }
- }
-
if (b.mod.alt) {
if (nav_scheme == NAVIGATION_MAYA)
@@ -832,6 +767,9 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
//VisualServer::get_singleton()->poly_clear(indicators);
set_message(TTR("Transform Aborted."), 3);
}
+
+ freelook_active = b.pressed;
+
} break;
case BUTTON_MIDDLE: {
@@ -1043,6 +981,7 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
surface->update();
}
+
} break;
}
} break;
@@ -1090,7 +1029,7 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle);
set_message(n + ": " + String(v));
- } else if (m.button_mask & 1) {
+ } else if (m.button_mask & BUTTON_MASK_LEFT) {
if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) {
nav_mode = NAVIGATION_ORBIT;
@@ -1340,13 +1279,15 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
}
}
- } else if (m.button_mask & 2) {
+ } else if (m.button_mask & BUTTON_MASK_RIGHT) {
if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) {
nav_mode = NAVIGATION_ZOOM;
+ } else {
+ nav_mode = NAVIGATION_LOOK;
}
- } else if (m.button_mask & 4) {
+ } else if (m.button_mask & BUTTON_MASK_MIDDLE) {
if (nav_scheme == NAVIGATION_GODOT) {
@@ -1402,12 +1343,7 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
if (nav_scheme == NAVIGATION_MAYA && m.mod.shift)
pan_speed *= pan_speed_modifier;
- Point2i relative;
- if (bool(EditorSettings::get_singleton()->get("editors/3d/warped_mouse_panning"))) {
- relative = Input::get_singleton()->warp_mouse_motion(m, surface->get_global_rect());
- } else {
- relative = Point2i(m.relative_x, m.relative_y);
- }
+ Point2i relative = _get_warped_mouse_motion(m);
Transform camera_transform;
@@ -1430,21 +1366,22 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
NavigationZoomStyle zoom_style = (NavigationZoomStyle)EditorSettings::get_singleton()->get("editors/3d/zoom_style").operator int();
if (zoom_style == NAVIGATION_ZOOM_HORIZONTAL) {
if (m.relative_x > 0)
- cursor.distance *= 1 - m.relative_x * zoom_speed;
+ scale_cursor_distance(1 - m.relative_x * zoom_speed);
else if (m.relative_x < 0)
- cursor.distance /= 1 + m.relative_x * zoom_speed;
+ scale_cursor_distance(1.0 / (1 + m.relative_x * zoom_speed));
} else {
if (m.relative_y > 0)
- cursor.distance *= 1 + m.relative_y * zoom_speed;
+ scale_cursor_distance(1 + m.relative_y * zoom_speed);
else if (m.relative_y < 0)
- cursor.distance /= 1 - m.relative_y * zoom_speed;
+ scale_cursor_distance(1.0 / (1 - m.relative_y * zoom_speed));
}
} break;
case NAVIGATION_ORBIT: {
- cursor.x_rot += m.relative_y / 80.0;
- cursor.y_rot += m.relative_x / 80.0;
+ Point2i relative = _get_warped_mouse_motion(m);
+ cursor.x_rot += relative.y / 80.0;
+ cursor.y_rot += relative.x / 80.0;
if (cursor.x_rot > Math_PI / 2.0)
cursor.x_rot = Math_PI / 2.0;
if (cursor.x_rot < -Math_PI / 2.0)
@@ -1453,6 +1390,30 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
_update_name();
} break;
+ case NAVIGATION_LOOK: {
+ // Freelook only works properly in perspective.
+ // It technically works too in ortho, but it's awful for a user due to fov being near zero
+ if (!orthogonal) {
+ Point2i relative = _get_warped_mouse_motion(m);
+ cursor.x_rot += relative.y / 120.0;
+ cursor.y_rot += relative.x / 120.0;
+ if (cursor.x_rot > Math_PI / 2.0)
+ cursor.x_rot = Math_PI / 2.0;
+ if (cursor.x_rot < -Math_PI / 2.0)
+ cursor.x_rot = -Math_PI / 2.0;
+
+ // Look is like Orbit, except the cursor translates, not the camera
+ Transform camera_transform = to_camera_transform(cursor);
+ Vector3 pos = camera_transform.xform(Vector3(0, 0, 0));
+ Vector3 diff = camera->get_translation() - pos;
+ cursor.pos += diff;
+
+ name = "";
+ _update_name();
+ }
+
+ } break;
+
default: {}
}
} break;
@@ -1543,6 +1504,104 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
}
}
+void SpatialEditorViewport::scale_cursor_distance(real_t scale) {
+
+ // Prevents zero distance which would short-circuit any scaling
+ if (cursor.distance < ZOOM_MIN_DISTANCE)
+ cursor.distance = ZOOM_MIN_DISTANCE;
+
+ real_t prev_distance = cursor.distance;
+ cursor.distance *= scale;
+
+ if (cursor.distance < ZOOM_MIN_DISTANCE)
+ cursor.distance = ZOOM_MIN_DISTANCE;
+
+ if (is_freelook_active()) {
+ // In freelook mode, cursor reference is reversed so it needs to be adjusted
+ Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
+ cursor.pos += (cursor.distance - prev_distance) * forward;
+ }
+
+ zoom_indicator_delay = ZOOM_INDICATOR_DELAY_S;
+ surface->update();
+}
+
+Point2i SpatialEditorViewport::_get_warped_mouse_motion(const InputEventMouseMotion &p_ev_mouse_motion) const {
+ Point2i relative;
+ if (bool(EditorSettings::get_singleton()->get("editors/3d/warped_mouse_panning"))) {
+ relative = Input::get_singleton()->warp_mouse_motion(p_ev_mouse_motion, surface->get_global_rect());
+ } else {
+ relative = Point2i(p_ev_mouse_motion.relative_x, p_ev_mouse_motion.relative_y);
+ }
+ return relative;
+}
+
+void SpatialEditorViewport::_update_freelook(real_t delta) {
+
+ if (!is_freelook_active())
+ return;
+
+ Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
+ Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0));
+ Vector3 up = camera->get_transform().basis.xform(Vector3(0, 1, 0));
+
+ int key_left = ED_SHORTCUT("spatial_editor/freelook_left", TTR("Freelook Left"), KEY_A)->get_shortcut().key.scancode;
+ int key_right = ED_SHORTCUT("spatial_editor/freelook_right", TTR("Freelook Right"), KEY_D)->get_shortcut().key.scancode;
+ int key_forward = ED_SHORTCUT("spatial_editor/freelook_forward", TTR("Freelook Forward"), KEY_W)->get_shortcut().key.scancode;
+ int key_backwards = ED_SHORTCUT("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), KEY_S)->get_shortcut().key.scancode;
+ int key_up = ED_SHORTCUT("spatial_editor/freelook_up", TTR("Freelook Up"), KEY_Q)->get_shortcut().key.scancode;
+ int key_down = ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), KEY_E)->get_shortcut().key.scancode;
+ int key_speed_modifier = ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), KEY_SHIFT)->get_shortcut().key.scancode;
+
+ Vector3 velocity;
+ bool pressed = false;
+ bool speed_modifier = false;
+
+ const Input &input = *Input::get_singleton();
+
+ if (input.is_key_pressed(key_left)) {
+ velocity -= right;
+ pressed = true;
+ }
+ if (input.is_key_pressed(key_right)) {
+ velocity += right;
+ pressed = true;
+ }
+ if (input.is_key_pressed(key_forward)) {
+ velocity += forward;
+ pressed = true;
+ }
+ if (input.is_key_pressed(key_backwards)) {
+ velocity -= forward;
+ pressed = true;
+ }
+ if (input.is_key_pressed(key_up)) {
+ velocity += up;
+ pressed = true;
+ }
+ if (input.is_key_pressed(key_down)) {
+ velocity -= up;
+ pressed = true;
+ }
+ if (input.is_key_pressed(key_speed_modifier)) {
+ speed_modifier = true;
+ }
+
+ if (pressed) {
+ const EditorSettings &s = *EditorSettings::get_singleton();
+ const real_t base_speed = s.get("editors/3d/freelook_base_speed");
+ const real_t modifier_speed_factor = s.get("editors/3d/freelook_modifier_speed_factor");
+
+ real_t speed = base_speed * cursor.distance;
+ if (speed_modifier)
+ speed *= modifier_speed_factor;
+
+ velocity.normalize();
+
+ cursor.pos += velocity * (speed * delta);
+ }
+}
+
void SpatialEditorViewport::set_message(String p_message, float p_time) {
message = p_message;
@@ -1579,6 +1638,17 @@ void SpatialEditorViewport::_notification(int p_what) {
}
*/
+ real_t delta = get_tree()->get_idle_process_time();
+
+ if (zoom_indicator_delay > 0) {
+ zoom_indicator_delay -= delta;
+ if (zoom_indicator_delay <= 0) {
+ surface->update();
+ }
+ }
+
+ _update_freelook(delta);
+
_update_camera();
Map<Node *, Object *> &selection = editor_selection->get_selection();
@@ -1674,6 +1744,23 @@ void SpatialEditorViewport::_notification(int p_what) {
}
}
+// TODO That should be part of the drawing API...
+static void stroke_rect(CanvasItem *ci, Rect2 rect, Color color, real_t width = 1.0) {
+
+ // a---b
+ // | |
+ // c---d
+ Vector2 a(rect.pos);
+ Vector2 b(rect.pos.x + rect.size.x, rect.pos.y);
+ Vector2 c(rect.pos.x, rect.pos.y + rect.size.y);
+ Vector2 d(rect.pos + rect.size);
+
+ ci->draw_line(a, b, color, width);
+ ci->draw_line(b, d, color, width);
+ ci->draw_line(d, c, color, width);
+ ci->draw_line(c, a, color, width);
+}
+
void SpatialEditorViewport::_draw() {
if (surface->has_focus()) {
@@ -1730,10 +1817,37 @@ void SpatialEditorViewport::_draw() {
draw_rect = Rect2(Vector2(), s).clip(draw_rect);
- surface->draw_line(draw_rect.pos, draw_rect.pos + Vector2(draw_rect.size.x, 0), Color(0.6, 0.6, 0.1, 0.5), 2.0);
- surface->draw_line(draw_rect.pos + Vector2(draw_rect.size.x, 0), draw_rect.pos + draw_rect.size, Color(0.6, 0.6, 0.1, 0.5), 2.0);
- surface->draw_line(draw_rect.pos + draw_rect.size, draw_rect.pos + Vector2(0, draw_rect.size.y), Color(0.6, 0.6, 0.1, 0.5), 2.0);
- surface->draw_line(draw_rect.pos, draw_rect.pos + Vector2(0, draw_rect.size.y), Color(0.6, 0.6, 0.1, 0.5), 2.0);
+ stroke_rect(surface, draw_rect, Color(0.6, 0.6, 0.1, 0.5), 2.0);
+
+ } else {
+
+ if (zoom_indicator_delay > 0.0) {
+ // Show indicative zoom factor
+
+ real_t min_distance = ZOOM_MIN_DISTANCE; // TODO Why not pick znear to limit zoom?
+ real_t max_distance = camera->get_zfar();
+ real_t scale_length = (max_distance - min_distance);
+
+ if (Math::abs(scale_length) > CMP_EPSILON) {
+ real_t logscale_t = 1.0 - Math::log(1 + cursor.distance - min_distance) / Math::log(1 + scale_length);
+
+ // There is no real maximum distance so that factor can become negative,
+ // Let's make it look asymptotic instead (will decrease slower and slower).
+ if (logscale_t < 0.25)
+ logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0);
+
+ Vector2 surface_size = surface->get_size();
+ real_t h = surface_size.y / 2.0;
+ real_t y = (surface_size.y - h) / 2.0;
+
+ Rect2 r(10, y, 6, h);
+ real_t sy = r.size.y * logscale_t;
+
+ surface->draw_rect(r, Color(1, 1, 1, 0.2));
+ surface->draw_rect(Rect2(r.pos.x, r.pos.y + r.size.y - sy, r.size.x, sy), Color(1, 1, 1, 0.6));
+ stroke_rect(surface, r.grow(1), Color(0, 0, 0, 0.7));
+ }
+ }
}
}
@@ -2143,6 +2257,7 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed
clicked_includes_current = false;
orthogonal = false;
message_time = 0;
+ zoom_indicator_delay = 0.0;
spatial_editor = p_spatial_editor;
ViewportContainer *c = memnew(ViewportContainer);
@@ -2205,6 +2320,8 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed
preview = NULL;
gizmo_scale = 1.0;
+ freelook_active = false;
+
selection_menu = memnew(PopupMenu);
add_child(selection_menu);
selection_menu->set_custom_minimum_size(Vector2(100, 0));
@@ -2278,7 +2395,7 @@ void SpatialEditor::update_transform_gizmo() {
gizmo.transform.origin = pcenter;
gizmo.transform.basis = gizmo_basis;
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < VIEWPORTS_COUNT; i++) {
viewports[i]->update_transform_gizmo_view();
}
}
@@ -2434,7 +2551,7 @@ void SpatialEditor::set_state(const Dictionary &p_state) {
Array vp = d["viewports"];
ERR_FAIL_COND(vp.size() > 4);
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < VIEWPORTS_COUNT; i++) {
viewports[i]->set_state(vp[i]);
}
}
@@ -2726,7 +2843,7 @@ void SpatialEditor::_menu_item_pressed(int p_option) {
} break;
case MENU_VIEW_USE_3_VIEWPORTS: {
- for (int i = 1; i < 4; i++) {
+ for (int i = 1; i < VIEWPORTS_COUNT; i++) {
if (i == 1)
viewports[i]->hide();
@@ -2752,7 +2869,7 @@ void SpatialEditor::_menu_item_pressed(int p_option) {
} break;
case MENU_VIEW_USE_3_VIEWPORTS_ALT: {
- for (int i = 1; i < 4; i++) {
+ for (int i = 1; i < VIEWPORTS_COUNT; i++) {
if (i == 1)
viewports[i]->hide();
@@ -2778,7 +2895,7 @@ void SpatialEditor::_menu_item_pressed(int p_option) {
} break;
case MENU_VIEW_USE_4_VIEWPORTS: {
- for (int i = 1; i < 4; i++) {
+ for (int i = 1; i < VIEWPORTS_COUNT; i++) {
viewports[i]->show();
}
@@ -3149,34 +3266,12 @@ void SpatialEditor::_finish_indicators() {
VisualServer::get_singleton()->free(cursor_mesh);
}
-void SpatialEditor::_instance_scene() {
-#if 0
- EditorNode *en = get_scene()->get_root_node()->cast_to<EditorNode>();
- ERR_FAIL_COND(!en);
- String path = en->get_filesystem_dock()->get_selected_path();
- if (path=="") {
- set_message(TTR("No scene selected to instance!"));
- return;
- }
-
- undo_redo->create_action(TTR("Instance at Cursor"));
-
- Node* scene = en->request_instance_scene(path);
-
- if (!scene) {
- set_message(TTR("Could not instance scene!"));
- undo_redo->commit_action(); //bleh
- return;
- }
-
- Spatial *s = scene->cast_to<Spatial>();
- if (s) {
-
- undo_redo->add_do_method(s,"set_global_transform",Transform(Matrix3(),cursor.cursor_pos));
+bool SpatialEditor::is_any_freelook_active() const {
+ for (unsigned int i = 0; i < VIEWPORTS_COUNT; ++i) {
+ if (viewports[i]->is_freelook_active())
+ return true;
}
-
- undo_redo->commit_action();
-#endif
+ return false;
}
void SpatialEditor::_unhandled_key_input(InputEvent p_event) {
@@ -3203,19 +3298,27 @@ void SpatialEditor::_unhandled_key_input(InputEvent p_event) {
case InputEvent::KEY: {
- const InputEventKey &k = p_event.key;
+ // Note: need to check is_echo because first person movement keys might still be held
+ if (!is_any_freelook_active() && !p_event.is_echo()) {
- if (!k.pressed)
- break;
+ const InputEventKey &k = p_event.key;
+
+ if (!k.pressed)
+ break;
+
+ if (ED_IS_SHORTCUT("spatial_editor/tool_select", p_event))
+ _menu_item_pressed(MENU_TOOL_SELECT);
+
+ else if (ED_IS_SHORTCUT("spatial_editor/tool_move", p_event))
+ _menu_item_pressed(MENU_TOOL_MOVE);
- switch (k.scancode) {
+ else if (ED_IS_SHORTCUT("spatial_editor/tool_rotate", p_event))
+ _menu_item_pressed(MENU_TOOL_ROTATE);
- case KEY_Q: _menu_item_pressed(MENU_TOOL_SELECT); break;
- case KEY_W: _menu_item_pressed(MENU_TOOL_MOVE); break;
- case KEY_E: _menu_item_pressed(MENU_TOOL_ROTATE); break;
- case KEY_R: _menu_item_pressed(MENU_TOOL_SCALE); break;
+ else if (ED_IS_SHORTCUT("spatial_editor/tool_scale", p_event))
+ _menu_item_pressed(MENU_TOOL_SCALE);
- case KEY_Z: {
+ else if (ED_IS_SHORTCUT("spatial_editor/display_wireframe", p_event)) {
if (k.mod.shift || k.mod.control || k.mod.command)
break;
@@ -3224,10 +3327,7 @@ void SpatialEditor::_unhandled_key_input(InputEvent p_event) {
} else {
_menu_item_pressed(MENU_VIEW_DISPLAY_WIREFRAME);
}
- } break;
-
-#if 0
-#endif
+ }
}
} break;
@@ -3242,8 +3342,6 @@ void SpatialEditor::_notification(int p_what) {
tool_button[SpatialEditor::TOOL_MODE_ROTATE]->set_icon(get_icon("ToolRotate", "EditorIcons"));
tool_button[SpatialEditor::TOOL_MODE_SCALE]->set_icon(get_icon("ToolScale", "EditorIcons"));
tool_button[SpatialEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_icon("ListSelect", "EditorIcons"));
- instance_button->set_icon(get_icon("SpatialAdd", "EditorIcons"));
- instance_button->hide();
view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), get_icon("Panels1", "EditorIcons"));
view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), get_icon("Panels2", "EditorIcons"));
@@ -3344,7 +3442,7 @@ void SpatialEditor::_toggle_maximize_view(Object *p_viewport) {
if (!maximized) {
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < VIEWPORTS_COUNT; i++) {
if (i == index)
viewports[i]->set_area_as_parent_rect();
else
@@ -3352,7 +3450,7 @@ void SpatialEditor::_toggle_maximize_view(Object *p_viewport) {
}
} else {
- for (int i = 0; i < 4; i++)
+ for (int i = 0; i < VIEWPORTS_COUNT; i++)
viewports[i]->show();
if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT)))
@@ -3383,7 +3481,6 @@ void SpatialEditor::_bind_methods() {
ClassDB::bind_method("_node_removed", &SpatialEditor::_node_removed);
ClassDB::bind_method("_menu_item_pressed", &SpatialEditor::_menu_item_pressed);
ClassDB::bind_method("_xform_dialog_action", &SpatialEditor::_xform_dialog_action);
- ClassDB::bind_method("_instance_scene", &SpatialEditor::_instance_scene);
ClassDB::bind_method("_get_editor_data", &SpatialEditor::_get_editor_data);
ClassDB::bind_method("_request_gizmo", &SpatialEditor::_request_gizmo);
ClassDB::bind_method("_default_light_angle_input", &SpatialEditor::_default_light_angle_input);
@@ -3399,7 +3496,7 @@ void SpatialEditor::clear() {
settings_znear->set_value(EDITOR_DEF("editors/3d/default_z_near", 0.1));
settings_zfar->set_value(EDITOR_DEF("editors/3d/default_z_far", 1500.0));
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < VIEWPORTS_COUNT; i++) {
viewports[i]->reset();
}
@@ -3415,7 +3512,7 @@ void SpatialEditor::clear() {
}
}
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < VIEWPORTS_COUNT; i++) {
viewports[i]->view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(SpatialEditorViewport::VIEW_AUDIO_LISTENER), i == 0);
viewports[i]->viewport->set_as_audio_listener(i == 0);
@@ -3520,12 +3617,6 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
tool_button[TOOL_MODE_SCALE]->connect("pressed", this, "_menu_item_pressed", button_binds);
tool_button[TOOL_MODE_SCALE]->set_tooltip(TTR("Scale Mode (R)"));
- instance_button = memnew(Button);
- hbc_menu->add_child(instance_button);
- instance_button->set_flat(true);
- instance_button->connect("pressed", this, "_instance_scene");
- instance_button->hide();
-
VSeparator *vs = memnew(VSeparator);
hbc_menu->add_child(vs);
@@ -3553,6 +3644,13 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F);
ED_SHORTCUT("spatial_editor/align_selection_with_view", TTR("Align Selection With View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F);
+ ED_SHORTCUT("spatial_editor/tool_select", TTR("Tool Select"), KEY_Q);
+ ED_SHORTCUT("spatial_editor/tool_move", TTR("Tool Move"), KEY_W);
+ ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Tool Rotate"), KEY_E);
+ ED_SHORTCUT("spatial_editor/tool_scale", TTR("Tool Scale"), KEY_R);
+
+ ED_SHORTCUT("spatial_editor/display_wireframe", TTR("Display Wireframe"), KEY_Z);
+
PopupMenu *p;
transform_menu = memnew(MenuButton);
@@ -3618,7 +3716,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
viewport_base = memnew(Control);
shader_split->add_child(viewport_base);
viewport_base->set_v_size_flags(SIZE_EXPAND_FILL);
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < VIEWPORTS_COUNT; i++) {
viewports[i] = memnew(SpatialEditorViewport(this, editor, i));
viewports[i]->connect("toggle_maximize_view", this, "_toggle_maximize_view");
diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h
index 4302927426..01435028ac 100644
--- a/editor/plugins/spatial_editor_plugin.h
+++ b/editor/plugins/spatial_editor_plugin.h
@@ -114,6 +114,8 @@ private:
bool orthogonal;
float gizmo_scale;
+ bool freelook_active;
+
struct _RayResult {
Spatial *item;
@@ -168,7 +170,8 @@ private:
NAVIGATION_NONE,
NAVIGATION_PAN,
NAVIGATION_ZOOM,
- NAVIGATION_ORBIT
+ NAVIGATION_ORBIT,
+ NAVIGATION_LOOK
};
enum TransformMode {
TRANSFORM_NONE,
@@ -203,8 +206,6 @@ private:
struct Cursor {
- Vector3 cursor_pos;
-
Vector3 pos;
float x_rot, y_rot, distance;
bool region_select;
@@ -217,6 +218,10 @@ private:
}
} cursor;
+ void scale_cursor_distance(real_t scale);
+
+ real_t zoom_indicator_delay;
+
RID move_gizmo_instance[3], rotate_gizmo_instance[3];
String last_message;
@@ -227,10 +232,12 @@ private:
//
void _update_camera();
+ Transform to_camera_transform(const Cursor &p_cursor) const;
void _draw();
void _smouseenter();
void _sinput(const InputEvent &p_ie);
+ void _update_freelook(real_t delta);
SpatialEditor *spatial_editor;
Camera *previewing;
@@ -243,6 +250,7 @@ private:
void _selection_result_pressed(int);
void _selection_menu_hide();
void _list_select(InputEventMouseButton b);
+ Point2i _get_warped_mouse_motion(const InputEventMouseMotion &p_ev_mouse_motion) const;
protected:
void _notification(int p_what);
@@ -255,6 +263,7 @@ public:
void set_state(const Dictionary &p_state);
Dictionary get_state() const;
void reset();
+ bool is_freelook_active() const { return freelook_active; }
void focus_selection();
@@ -295,11 +304,13 @@ public:
};
private:
+ static const unsigned int VIEWPORTS_COUNT = 4;
+
EditorNode *editor;
EditorSelection *editor_selection;
Control *viewport_base;
- SpatialEditorViewport *viewports[4];
+ SpatialEditorViewport *viewports[VIEWPORTS_COUNT];
VSplitContainer *shader_split;
HSplitContainer *palette_split;
@@ -385,7 +396,6 @@ private:
};
Button *tool_button[TOOL_MAX];
- Button *instance_button;
MenuButton *transform_menu;
MenuButton *view_menu;
@@ -456,6 +466,8 @@ private:
void _update_default_light_angle();
void _default_light_angle_input(const InputEvent &p_event);
+ bool is_any_freelook_active() const;
+
protected:
void _notification(int p_what);
//void _gui_input(InputEvent p_event);
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
index 90db23d236..40ffb8e246 100644
--- a/editor/project_export.cpp
+++ b/editor/project_export.cpp
@@ -229,6 +229,8 @@ void ProjectExportDialog::_edit_preset(int p_index) {
}
if (needs_templates)
export_templates_error->show();
+ else
+ export_templates_error->hide();
export_button->set_disabled(true);
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index 901b259960..835243e401 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -362,8 +362,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
else {
String path = selected->get_filename();
script_create_dialog->config(selected->get_class(), path);
- script_create_dialog->popup_centered(Size2(300, 290));
- //script_create_dialog->popup_centered_minsize();
+ script_create_dialog->popup_centered();
}
} break;
diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp
index 15c540e132..1e86d8db4b 100644
--- a/editor/script_create_dialog.cpp
+++ b/editor/script_create_dialog.cpp
@@ -29,12 +29,23 @@
/*************************************************************************/
#include "script_create_dialog.h"
+#include "editor/editor_scale.h"
#include "editor_file_system.h"
#include "global_config.h"
#include "io/resource_saver.h"
#include "os/file_access.h"
#include "script_language.h"
+void ScriptCreateDialog::_notification(int p_what) {
+
+ switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ path_button->set_icon(get_icon("Folder", "EditorIcons"));
+ parent_browse_button->set_icon(get_icon("Folder", "EditorIcons"));
+ }
+ }
+}
+
void ScriptCreateDialog::config(const String &p_base_name, const String &p_base_path) {
class_name->set_text("");
@@ -46,6 +57,8 @@ void ScriptCreateDialog::config(const String &p_base_name, const String &p_base_
initial_bp = "";
file_path->set_text("");
}
+ _lang_changed(current_language);
+ _parent_name_changed(parent_name->get_text());
_class_name_changed("");
_path_changed(file_path->get_text());
}
@@ -85,54 +98,40 @@ bool ScriptCreateDialog::_validate(const String &p_string) {
void ScriptCreateDialog::_class_name_changed(const String &p_name) {
- if (!_validate(parent_name->get_text())) {
- error_label->set_text(TTR("Invalid parent class name or path"));
- error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8));
- } else if (class_name->is_editable()) {
- if (class_name->get_text() == "") {
- error_label->set_text(TTR("Valid chars:") + " a-z A-Z 0-9 _");
- error_label->add_color_override("font_color", Color(1, 1, 1, 0.6));
- } else if (!_validate(class_name->get_text())) {
- error_label->set_text(TTR("Invalid class name"));
- error_label->add_color_override("font_color", Color(1, 0.2, 0.2, 0.8));
- } else {
- error_label->set_text(TTR("Valid name"));
- error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8));
- }
+ if (_validate(class_name->get_text())) {
+ is_class_name_valid = true;
} else {
+ is_class_name_valid = false;
+ }
+ _update_dialog();
+}
- error_label->set_text(TTR("N/A"));
- error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8));
+void ScriptCreateDialog::_parent_name_changed(const String &p_parent) {
+
+ if (_validate(parent_name->get_text())) {
+ is_parent_name_valid = true;
+ } else {
+ is_parent_name_valid = false;
}
+ _update_dialog();
}
void ScriptCreateDialog::ok_pressed() {
- if (create_new) {
+ if (is_new_script_created) {
_create_new();
} else {
_load_exist();
}
- create_new = true;
- _update_controls();
+ is_new_script_created = true;
+ _update_dialog();
}
void ScriptCreateDialog::_create_new() {
- if (class_name->is_editable() && !_validate(class_name->get_text())) {
- alert->set_text(TTR("Class name is invalid!"));
- alert->popup_centered_minsize();
- return;
- }
- if (!_validate(parent_name->get_text())) {
- alert->set_text(TTR("Parent class name is invalid!"));
- alert->popup_centered_minsize();
- return;
- }
-
String cname;
- if (class_name->is_editable())
+ if (has_named_classes)
cname = class_name->get_text();
Ref<Script> scr = ScriptServer::get_language(language_menu->get_selected())->get_template(cname, parent_name->get_text());
@@ -143,18 +142,13 @@ void ScriptCreateDialog::_create_new() {
if (cname != "")
scr->set_name(cname);
- if (!internal->is_pressed()) {
+ if (!is_built_in) {
String lpath = GlobalConfig::get_singleton()->localize_path(file_path->get_text());
scr->set_path(lpath);
- if (!path_valid) {
- alert->set_text(TTR("Invalid path!"));
- alert->popup_centered_minsize();
- return;
- }
Error err = ResourceSaver::save(lpath, scr, ResourceSaver::FLAG_CHANGE_PATH);
if (err != OK) {
- alert->set_text(TTR("Could not create script in filesystem."));
- alert->popup_centered_minsize();
+ alert->set_text(TTR("Error - Could not create script in filesystem."));
+ alert->popup_centered();
return;
}
}
@@ -168,9 +162,9 @@ void ScriptCreateDialog::_load_exist() {
String path = file_path->get_text();
RES p_script = ResourceLoader::load(path, "Script");
if (p_script.is_null()) {
- alert->get_ok()->set_text(TTR("Ugh"));
+ alert->get_ok()->set_text(TTR("OK"));
alert->set_text(vformat(TTR("Error loading script from %s"), path));
- alert->popup_centered_minsize();
+ alert->popup_centered();
return;
}
@@ -182,55 +176,59 @@ void ScriptCreateDialog::_lang_changed(int l) {
l = language_menu->get_selected();
if (ScriptServer::get_language(l)->has_named_classes()) {
- class_name->set_editable(true);
+ has_named_classes = true;
} else {
- class_name->set_editable(false);
+ has_named_classes = false;
}
if (ScriptServer::get_language(l)->can_inherit_from_file()) {
- parent_browse_button->show();
+ can_inherit_from_file = true;
} else {
- parent_browse_button->hide();
+ can_inherit_from_file = false;
}
String selected_ext = "." + ScriptServer::get_language(l)->get_extension();
String path = file_path->get_text();
String extension = "";
- if (path.find(".") >= 0) {
- extension = path.get_extension();
- }
-
- if (extension.length() == 0) {
- // add extension if none
- path += selected_ext;
- _path_changed(path);
- } else {
- // change extension by selected language
- List<String> extensions;
- // get all possible extensions for script
- for (int l = 0; l < language_menu->get_item_count(); l++) {
- ScriptServer::get_language(l)->get_recognized_extensions(&extensions);
+ if (path != "") {
+ if (path.find(".") >= 0) {
+ extension = path.get_extension();
}
- for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
- if (E->get().nocasecmp_to(extension) == 0) {
- path = path.get_basename() + selected_ext;
- _path_changed(path);
- break;
+ if (extension.length() == 0) {
+ // add extension if none
+ path += selected_ext;
+ _path_changed(path);
+ } else {
+ // change extension by selected language
+ List<String> extensions;
+ // get all possible extensions for script
+ for (int l = 0; l < language_menu->get_item_count(); l++) {
+ ScriptServer::get_language(l)->get_recognized_extensions(&extensions);
+ }
+
+ for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
+ if (E->get().nocasecmp_to(extension) == 0) {
+ path = path.get_basename() + selected_ext;
+ _path_changed(path);
+ break;
+ }
}
}
+ file_path->set_text(path);
}
- file_path->set_text(path);
- _class_name_changed(class_name->get_text());
+
+ _update_dialog();
}
void ScriptCreateDialog::_built_in_pressed() {
if (internal->is_pressed()) {
- path_vb->hide();
+ is_built_in = true;
} else {
- path_vb->show();
+ is_built_in = false;
}
+ _update_dialog();
}
void ScriptCreateDialog::_browse_path(bool browse_parent) {
@@ -269,40 +267,45 @@ void ScriptCreateDialog::_file_selected(const String &p_file) {
void ScriptCreateDialog::_path_changed(const String &p_path) {
- path_valid = false;
+ is_path_valid = false;
+ is_new_script_created = true;
String p = p_path;
if (p == "") {
-
- path_error_label->set_text(TTR("Path is empty"));
- path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8));
+ _msg_path_valid(false, TTR("Path is empty"));
+ _update_dialog();
return;
}
p = GlobalConfig::get_singleton()->localize_path(p);
if (!p.begins_with("res://")) {
-
- path_error_label->set_text(TTR("Path is not local"));
- path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8));
+ _msg_path_valid(false, TTR("Path is not local"));
+ _update_dialog();
return;
}
if (p.find("/") || p.find("\\")) {
DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
-
if (d->change_dir(p.get_base_dir()) != OK) {
-
- path_error_label->set_text(TTR("Invalid base path"));
- path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8));
+ _msg_path_valid(false, TTR("Invalid base path"));
memdelete(d);
+ _update_dialog();
return;
}
memdelete(d);
}
- FileAccess *f = FileAccess::create(FileAccess::ACCESS_RESOURCES);
- create_new = !f->file_exists(p);
+ /* Does file already exist */
+
+ DirAccess *f = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+ if (f->file_exists(p) && !(f->current_is_dir())) {
+ is_new_script_created = false;
+ is_path_valid = true;
+ }
memdelete(f);
+ _update_dialog();
+
+ /* Check file extension */
String extension = p.get_extension();
List<String> extensions;
@@ -313,45 +316,156 @@ void ScriptCreateDialog::_path_changed(const String &p_path) {
}
bool found = false;
+ bool match = false;
int index = 0;
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
if (E->get().nocasecmp_to(extension) == 0) {
- language_menu->select(index); // change Language option by extension
+ //FIXME (?) - changing language this way doesn't update controls, needs rework
+ //language_menu->select(index); // change Language option by extension
found = true;
+ if (E->get() == ScriptServer::get_language(language_menu->get_selected())->get_extension()) {
+ match = true;
+ }
break;
}
index++;
}
if (!found) {
- path_error_label->set_text(TTR("Invalid extension"));
- path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8));
+ _msg_path_valid(false, TTR("Invalid extension"));
+ _update_dialog();
+ return;
+ }
+
+ if (!match) {
+ _msg_path_valid(false, TTR("Wrong extension chosen"));
+ _update_dialog();
return;
}
- _update_controls();
+ /* All checks passed */
+
+ is_path_valid = true;
+ _update_dialog();
+}
+
+void ScriptCreateDialog::_msg_script_valid(bool valid, const String &p_msg) {
+
+ error_label->set_text(TTR(p_msg));
+ if (valid) {
+ error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8));
+ } else {
+ error_label->add_color_override("font_color", Color(1, 0.2, 0.2, 0.8));
+ }
+}
- path_error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8));
+void ScriptCreateDialog::_msg_path_valid(bool valid, const String &p_msg) {
- path_valid = true;
+ path_error_label->set_text(TTR(p_msg));
+ if (valid) {
+ path_error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8));
+ } else {
+ path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8));
+ }
}
-void ScriptCreateDialog::_update_controls() {
+void ScriptCreateDialog::_update_dialog() {
+
+ bool script_ok = true;
+
+ /* "Add Script Dialog" gui logic and script checks */
+
+ // Is Script Valid (order from top to bottom)
+ get_ok()->set_disabled(true);
+ if (!is_built_in) {
+ if (!is_path_valid) {
+ _msg_script_valid(false, TTR("Invalid Path"));
+ script_ok = false;
+ }
+ }
+ if (has_named_classes && (!is_class_name_valid)) {
+ _msg_script_valid(false, TTR("Invalid class name"));
+ script_ok = false;
+ }
+ if (!is_parent_name_valid) {
+ _msg_script_valid(false, TTR("Invalid inherited parent name or path"));
+ script_ok = false;
+ }
+ if (script_ok) {
+ _msg_script_valid(true, TTR("Script valid"));
+ get_ok()->set_disabled(false);
+ }
+
+ /* Does script have named classes */
- if (create_new) {
- path_error_label->set_text(TTR("Create new script"));
+ if (has_named_classes) {
+ if (is_new_script_created) {
+ class_name->set_editable(true);
+ class_name->set_placeholder(TTR("Allowed: a-z, A-Z, 0-9 and _"));
+ class_name->set_placeholder_alpha(0.3);
+ } else {
+ class_name->set_editable(false);
+ }
+ } else {
+ class_name->set_editable(false);
+ class_name->set_placeholder(TTR("N/A"));
+ class_name->set_placeholder_alpha(1);
+ }
+
+ /* Can script inherit from a file */
+
+ if (can_inherit_from_file) {
+ parent_browse_button->set_disabled(false);
+ } else {
+ parent_browse_button->set_disabled(true);
+ }
+
+ /* Is script Built-in */
+
+ if (is_built_in) {
+ file_path->set_editable(false);
+ path_button->set_disabled(true);
+ re_check_path = true;
+ } else {
+ file_path->set_editable(true);
+ path_button->set_disabled(false);
+ if (re_check_path) {
+ re_check_path = false;
+ _path_changed(file_path->get_text());
+ }
+ }
+
+ /* Is Script created or loaded from existing file */
+
+ if (is_new_script_created) {
+ // New Script Created
get_ok()->set_text(TTR("Create"));
+ parent_name->set_editable(true);
+ parent_browse_button->set_disabled(false);
+ internal->set_disabled(false);
+ if (is_built_in) {
+ _msg_path_valid(true, TTR("Built-in script (into scene file)"));
+ } else {
+ if (script_ok) {
+ _msg_path_valid(true, TTR("Create new script file"));
+ }
+ }
} else {
- path_error_label->set_text(TTR("Load existing script"));
+ // Script Loaded
get_ok()->set_text(TTR("Load"));
+ parent_name->set_editable(false);
+ parent_browse_button->set_disabled(true);
+ internal->set_disabled(true);
+ if (script_ok) {
+ _msg_path_valid(true, TTR("Load existing script file"));
+ }
}
- parent_name->set_editable(create_new);
- internal->set_disabled(!create_new);
}
void ScriptCreateDialog::_bind_methods() {
ClassDB::bind_method("_class_name_changed", &ScriptCreateDialog::_class_name_changed);
+ ClassDB::bind_method("_parent_name_changed", &ScriptCreateDialog::_parent_name_changed);
ClassDB::bind_method("_lang_changed", &ScriptCreateDialog::_lang_changed);
ClassDB::bind_method("_built_in_pressed", &ScriptCreateDialog::_built_in_pressed);
ClassDB::bind_method("_browse_path", &ScriptCreateDialog::_browse_path);
@@ -362,37 +476,100 @@ void ScriptCreateDialog::_bind_methods() {
ScriptCreateDialog::ScriptCreateDialog() {
- /* SNAP DIALOG */
+ editor_settings = EditorSettings::get_singleton();
+ GridContainer *gc = memnew(GridContainer);
VBoxContainer *vb = memnew(VBoxContainer);
- add_child(vb);
- //set_child_rect(vb);
+ HBoxContainer *hb = memnew(HBoxContainer);
+ Label *l = memnew(Label);
+ Control *empty = memnew(Control);
+ Control *empty_h = memnew(Control);
+ Control *empty_v = memnew(Control);
+ PanelContainer *pc = memnew(PanelContainer);
- class_name = memnew(LineEdit);
- VBoxContainer *vb2 = memnew(VBoxContainer);
- vb2->add_child(class_name);
- class_name->connect("text_changed", this, "_class_name_changed");
- error_label = memnew(Label);
- error_label->set_text("valid chars: a-z A-Z 0-9 _");
- error_label->set_align(Label::ALIGN_CENTER);
- vb2->add_child(error_label);
- vb->add_margin_child(TTR("Class Name:"), vb2);
+ /* DIALOG */
- HBoxContainer *hb1 = memnew(HBoxContainer);
- parent_name = memnew(LineEdit);
- parent_name->connect("text_changed", this, "_class_name_changed");
- parent_name->set_h_size_flags(SIZE_EXPAND_FILL);
- hb1->add_child(parent_name);
- parent_browse_button = memnew(Button);
- parent_browse_button->set_text(" .. ");
- parent_browse_button->connect("pressed", this, "_browse_path", varray(true));
- hb1->add_child(parent_browse_button);
- parent_browse_button->hide();
- vb->add_margin_child(TTR("Inherits:"), hb1);
- is_browsing_parent = false;
+ /* Main Controls */
+
+ gc = memnew(GridContainer);
+ gc->set_columns(2);
+
+ /* Error Stylebox Background */
+
+ StyleBoxFlat *sb = memnew(StyleBoxFlat);
+ sb->set_bg_color(Color(0, 0, 0, 0.05));
+ sb->set_light_color(Color(1, 1, 1, 0.05));
+ sb->set_dark_color(Color(1, 1, 1, 0.05));
+ sb->set_border_blend(false);
+ sb->set_border_size(1);
+ sb->set_default_margin(MARGIN_TOP, 10.0 * EDSCALE);
+ sb->set_default_margin(MARGIN_BOTTOM, 10.0 * EDSCALE);
+ sb->set_default_margin(MARGIN_LEFT, 10.0 * EDSCALE);
+ sb->set_default_margin(MARGIN_RIGHT, 10.0 * EDSCALE);
+
+ /* Error Messages Field */
+
+ vb = memnew(VBoxContainer);
+
+ hb = memnew(HBoxContainer);
+ l = memnew(Label);
+ l->set_text(" - ");
+ hb->add_child(l);
+ error_label = memnew(Label);
+ error_label->set_text(TTR("Error!"));
+ error_label->set_align(Label::ALIGN_LEFT);
+ hb->add_child(error_label);
+ vb->add_child(hb);
+
+ hb = memnew(HBoxContainer);
+ l = memnew(Label);
+ l->set_text(" - ");
+ hb->add_child(l);
+ path_error_label = memnew(Label);
+ path_error_label->set_text(TTR("Error!"));
+ path_error_label->set_align(Label::ALIGN_LEFT);
+ hb->add_child(path_error_label);
+ vb->add_child(hb);
+
+ pc = memnew(PanelContainer);
+ pc->set_h_size_flags(Control::SIZE_FILL);
+ pc->add_style_override("panel", sb);
+ pc->add_child(vb);
+
+ /* Margins */
+
+ empty_h = memnew(Control);
+ empty_h->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ empty_h->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ empty_h->set_custom_minimum_size(Size2(0, 10 * EDSCALE));
+ empty_v = memnew(Control);
+ empty_v->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ empty_v->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+ empty_v->set_custom_minimum_size(Size2(10, 0 * EDSCALE));
+
+ vb = memnew(VBoxContainer);
+ vb->add_child(empty_h->duplicate());
+ vb->add_child(gc);
+ vb->add_child(empty_h->duplicate());
+ vb->add_child(pc);
+ vb->add_child(empty_h->duplicate());
+ hb = memnew(HBoxContainer);
+ hb->add_child(empty_v->duplicate());
+ hb->add_child(vb);
+ hb->add_child(empty_v->duplicate());
+
+ add_child(hb);
+
+ /* Language */
language_menu = memnew(OptionButton);
- vb->add_margin_child(TTR("Language"), language_menu);
+ language_menu->set_custom_minimum_size(Size2(250, 0) * EDSCALE);
+ language_menu->set_h_size_flags(SIZE_EXPAND_FILL);
+ l = memnew(Label);
+ l->set_text(TTR("Language"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gc->add_child(l);
+ gc->add_child(language_menu);
int default_lang = 0;
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
@@ -404,60 +581,108 @@ ScriptCreateDialog::ScriptCreateDialog() {
}
}
- editor_settings = EditorSettings::get_singleton();
String last_selected_language = editor_settings->get_project_metadata("script_setup", "last_selected_language", "");
if (last_selected_language != "") {
for (int i = 0; i < language_menu->get_item_count(); i++) {
if (language_menu->get_item_text(i) == last_selected_language) {
language_menu->select(i);
+ current_language = i;
break;
}
}
} else {
language_menu->select(default_lang);
+ current_language = default_lang;
}
language_menu->connect("item_selected", this, "_lang_changed");
- //parent_name->set_text();
+ /* Inherits */
- vb2 = memnew(VBoxContainer);
- path_vb = memnew(VBoxContainer);
- vb2->add_child(path_vb);
+ hb = memnew(HBoxContainer);
+ hb->set_h_size_flags(SIZE_EXPAND_FILL);
+ parent_name = memnew(LineEdit);
+ parent_name->connect("text_changed", this, "_parent_name_changed");
+ parent_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ hb->add_child(parent_name);
+ parent_browse_button = memnew(Button);
+ parent_browse_button->set_flat(true);
+ parent_browse_button->connect("pressed", this, "_browse_path", varray(true));
+ hb->add_child(parent_browse_button);
+ l = memnew(Label);
+ l->set_text(TTR("Inherits"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gc->add_child(l);
+ gc->add_child(hb);
+ is_browsing_parent = false;
- HBoxContainer *hbc = memnew(HBoxContainer);
- file_path = memnew(LineEdit);
- file_path->connect("text_changed", this, "_path_changed");
- hbc->add_child(file_path);
- file_path->set_h_size_flags(SIZE_EXPAND_FILL);
- Button *b = memnew(Button);
- b->set_text(" .. ");
- b->connect("pressed", this, "_browse_path", varray(false));
- hbc->add_child(b);
- path_vb->add_child(hbc);
- path_error_label = memnew(Label);
- path_vb->add_child(path_error_label);
- path_error_label->set_text(TTR("Error!"));
- path_error_label->set_align(Label::ALIGN_CENTER);
+ /* Class Name */
- internal = memnew(CheckButton);
- internal->set_text(TTR("Built-In Script"));
- vb2->add_child(internal);
- internal->connect("pressed", this, "_built_in_pressed");
+ class_name = memnew(LineEdit);
+ class_name->connect("text_changed", this, "_class_name_changed");
+ class_name->set_h_size_flags(SIZE_EXPAND_FILL);
+ l = memnew(Label);
+ l->set_text(TTR("Class Name"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gc->add_child(l);
+ gc->add_child(class_name);
- vb->add_margin_child(TTR("Path:"), vb2);
+ /* Built-in Script */
- set_size(Size2(200, 150));
- set_hide_on_ok(false);
- set_title(TTR("Attach Node Script"));
+ internal = memnew(CheckButton);
+ internal->connect("pressed", this, "_built_in_pressed");
+ hb = memnew(HBoxContainer);
+ empty = memnew(Control);
+ hb->add_child(internal);
+ hb->add_child(empty);
+ l = memnew(Label);
+ l->set_text(TTR("Built-in Script"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gc->add_child(l);
+ gc->add_child(hb);
+
+ /* Path */
+
+ hb = memnew(HBoxContainer);
+ file_path = memnew(LineEdit);
+ file_path->connect("text_changed", this, "_path_changed");
+ file_path->set_h_size_flags(SIZE_EXPAND_FILL);
+ hb->add_child(file_path);
+ path_button = memnew(Button);
+ path_button->set_flat(true);
+ path_button->connect("pressed", this, "_browse_path", varray(false));
+ hb->add_child(path_button);
+ l = memnew(Label);
+ l->set_text(TTR("Path"));
+ l->set_align(Label::ALIGN_RIGHT);
+ gc->add_child(l);
+ gc->add_child(hb);
+
+ /* Dialog Setup */
file_browse = memnew(EditorFileDialog);
file_browse->connect("file_selected", this, "_file_selected");
add_child(file_browse);
get_ok()->set_text(TTR("Create"));
alert = memnew(AcceptDialog);
+ alert->set_as_minsize();
+ alert->get_label()->set_autowrap(true);
+ alert->get_label()->set_align(Label::ALIGN_CENTER);
+ alert->get_label()->set_valign(Label::VALIGN_CENTER);
+ alert->get_label()->set_custom_minimum_size(Size2(325, 60) * EDSCALE);
add_child(alert);
- _lang_changed(0);
- create_new = true;
+ set_as_minsize();
+ set_hide_on_ok(false);
+ set_title(TTR("Attach Node Script"));
+
+ is_parent_name_valid = false;
+ is_class_name_valid = false;
+ is_path_valid = false;
+
+ has_named_classes = false;
+ can_inherit_from_file = false;
+ is_built_in = false;
+
+ is_new_script_created = true;
}
diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h
index 113d4a468c..862d4f88f2 100644
--- a/editor/script_create_dialog.h
+++ b/editor/script_create_dialog.h
@@ -34,8 +34,10 @@
#include "editor/editor_settings.h"
#include "scene/gui/check_button.h"
#include "scene/gui/dialogs.h"
+#include "scene/gui/grid_container.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/option_button.h"
+#include "scene/gui/panel_container.h"
class ScriptCreateDialog : public ConfirmationDialog {
GDCLASS(ScriptCreateDialog, ConfirmationDialog);
@@ -47,6 +49,7 @@ class ScriptCreateDialog : public ConfirmationDialog {
Button *parent_browse_button;
OptionButton *language_menu;
LineEdit *file_path;
+ Button *path_button;
EditorFileDialog *file_browse;
CheckButton *internal;
VBoxContainer *path_vb;
@@ -56,20 +59,33 @@ class ScriptCreateDialog : public ConfirmationDialog {
bool is_browsing_parent;
String initial_bp;
EditorSettings *editor_settings;
+ bool is_new_script_created;
+ bool is_path_valid;
+ bool has_named_classes;
+ bool can_inherit_from_file;
+ bool is_parent_name_valid;
+ bool is_class_name_valid;
+ bool is_built_in;
+ int current_language;
+ bool re_check_path;
void _path_changed(const String &p_path = String());
void _lang_changed(int l = 0);
void _built_in_pressed();
bool _validate(const String &p_strin);
void _class_name_changed(const String &p_name);
+ void _parent_name_changed(const String &p_parent);
void _browse_path(bool browse_parent);
void _file_selected(const String &p_file);
virtual void ok_pressed();
void _create_new();
void _load_exist();
- void _update_controls();
+ void _msg_script_valid(bool valid, const String &p_msg = String());
+ void _msg_path_valid(bool valid, const String &p_msg = String());
+ void _update_dialog();
protected:
+ void _notification(int p_what);
static void _bind_methods();
public:
diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp
index 2bc00c62fb..ebf4b1cf3a 100644
--- a/editor/script_editor_debugger.cpp
+++ b/editor/script_editor_debugger.cpp
@@ -90,11 +90,13 @@ public:
return "";
}
- void add_property(const String &p_name, const Variant &p_value) {
+ void add_property(const String &p_name, const Variant &p_value, const PropertyHint &p_hint, const String p_hint_string) {
PropertyInfo pinfo;
pinfo.name = p_name;
pinfo.type = p_value.get_type();
+ pinfo.hint = p_hint;
+ pinfo.hint_string = p_hint_string;
props.push_back(pinfo);
values[p_name] = p_value;
}
@@ -437,7 +439,11 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
inspected_object->last_edited_id = id;
- inspect_properties->edit(inspected_object);
+ if (tabs->get_current_tab() == 2) {
+ inspect_properties->edit(inspected_object);
+ } else {
+ editor->push_item(inspected_object);
+ }
} else if (p_msg == "message:video_mem") {
@@ -499,13 +505,20 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
String n = p_data[ofs + i * 2 + 0];
Variant v = p_data[ofs + i * 2 + 1];
+ PropertyHint h = PROPERTY_HINT_NONE;
+ String hs = String();
if (n.begins_with("*")) {
n = n.substr(1, n.length());
+ h = PROPERTY_HINT_OBJECT_ID;
+ String s = v;
+ s = s.replace("[", "");
+ hs = s.get_slice(":", 0);
+ v = s.get_slice(":", 1).to_int();
}
- variables->add_property("members/" + n, v);
+ variables->add_property("members/" + n, v, h, hs);
}
ofs += mcount * 2;
@@ -516,13 +529,20 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
String n = p_data[ofs + i * 2 + 0];
Variant v = p_data[ofs + i * 2 + 1];
+ PropertyHint h = PROPERTY_HINT_NONE;
+ String hs = String();
if (n.begins_with("*")) {
n = n.substr(1, n.length());
+ h = PROPERTY_HINT_OBJECT_ID;
+ String s = v;
+ s = s.replace("[", "");
+ hs = s.get_slice(":", 0);
+ v = s.get_slice(":", 1).to_int();
}
- variables->add_property("locals/" + n, v);
+ variables->add_property("locals/" + n, v, h, hs);
}
variables->update();
@@ -1056,6 +1076,9 @@ void ScriptEditorDebugger::stop() {
EditorNode::get_singleton()->get_pause_button()->set_pressed(false);
EditorNode::get_singleton()->get_pause_button()->set_disabled(true);
+ //avoid confusion when stopped debugging but an object is still edited
+ EditorNode::get_singleton()->push_item(NULL);
+
if (hide_on_stop) {
if (is_visible_in_tree())
EditorNode::get_singleton()->hide_bottom_panel();
@@ -1636,6 +1659,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
inspector->get_scene_tree()->set_column_title(0, TTR("Variable"));
inspector->set_enable_capitalize_paths(false);
inspector->set_read_only(true);
+ inspector->connect("object_id_selected", this, "_scene_tree_property_select_object");
sc->add_child(inspector);
server = TCP_Server::create_ref();
diff --git a/editor/translations/ar.po b/editor/translations/ar.po
index 766d8f9676..867302b657 100644
--- a/editor/translations/ar.po
+++ b/editor/translations/ar.po
@@ -1,5 +1,6 @@
# Arabic translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# athomield <athomield@hotmail.com>, 2017.
diff --git a/editor/translations/bg.po b/editor/translations/bg.po
index b23fa3a8fb..f884b33773 100644
--- a/editor/translations/bg.po
+++ b/editor/translations/bg.po
@@ -1,5 +1,6 @@
# Bulgarian translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Bojidar Marinov <bojidar.marinov.bg@gmail.com>, 2016.
diff --git a/editor/translations/bn.po b/editor/translations/bn.po
index 224c00cf5d..3e4dec7656 100644
--- a/editor/translations/bn.po
+++ b/editor/translations/bn.po
@@ -1,5 +1,6 @@
# Bengali translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Abu Md. Maruf Sarker <maruf.webdev@gmail.com>, 2016-2017.
diff --git a/editor/translations/ca.po b/editor/translations/ca.po
index 581e862716..6d7b245e58 100644
--- a/editor/translations/ca.po
+++ b/editor/translations/ca.po
@@ -1,5 +1,6 @@
# Catalan translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Roger BR <drai_kin@hotmail.com>, 2016.
diff --git a/editor/translations/cs.po b/editor/translations/cs.po
index 89d88a234f..4643a9ac21 100644
--- a/editor/translations/cs.po
+++ b/editor/translations/cs.po
@@ -1,5 +1,6 @@
# Czech translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Jan 'spl!te' Kondelík <j.kondelik@centrum.cz>, 2016.
diff --git a/editor/translations/da.po b/editor/translations/da.po
index b84be76247..ba9d018e5a 100644
--- a/editor/translations/da.po
+++ b/editor/translations/da.po
@@ -1,5 +1,6 @@
# Danish translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# David Lamhauge <davidlamhauge@gmail.com>, 2016.
diff --git a/editor/translations/de.po b/editor/translations/de.po
index ba6805d1f1..a10eaefa29 100644
--- a/editor/translations/de.po
+++ b/editor/translations/de.po
@@ -1,5 +1,6 @@
# German translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Alexander Mahr <alex.mahr@gmail.com>, 2016.
diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po
index aeae6a5537..183f09e9a6 100644
--- a/editor/translations/de_CH.po
+++ b/editor/translations/de_CH.po
@@ -1,5 +1,6 @@
# Swiss High German translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Christian Fisch <christian.fiesel@gmail.com>, 2016.
diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot
index 5b62f132fa..5f50c159b8 100644
--- a/editor/translations/editor.pot
+++ b/editor/translations/editor.pot
@@ -1,5 +1,6 @@
# LANGUAGE translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
diff --git a/editor/translations/el.po b/editor/translations/el.po
index 292c5a6fd3..0879b693ff 100644
--- a/editor/translations/el.po
+++ b/editor/translations/el.po
@@ -1,5 +1,6 @@
# Greek translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# gtsiam <gtsiam@windowslive.com>, 2017.
diff --git a/editor/translations/es.po b/editor/translations/es.po
index a7b9553892..f01c84718b 100644
--- a/editor/translations/es.po
+++ b/editor/translations/es.po
@@ -1,5 +1,6 @@
# Spanish translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Alejandro Alvarez <eliluminado00@gmail.com>, 2017.
diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po
index 6c9579916f..f826517b27 100644
--- a/editor/translations/es_AR.po
+++ b/editor/translations/es_AR.po
@@ -1,5 +1,6 @@
# Spanish (Argentina) translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017.
diff --git a/editor/translations/extract.py b/editor/translations/extract.py
index 616fec17a0..5e6c894936 100755
--- a/editor/translations/extract.py
+++ b/editor/translations/extract.py
@@ -38,7 +38,8 @@ unique_str = []
unique_loc = {}
main_po = """
# LANGUAGE translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
diff --git a/editor/translations/fa.po b/editor/translations/fa.po
index 2ec9b18d78..e8402fcb25 100644
--- a/editor/translations/fa.po
+++ b/editor/translations/fa.po
@@ -1,5 +1,6 @@
# Persian translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# alabd14313 <alabd14313@yahoo.com>, 2016.
diff --git a/editor/translations/fr.po b/editor/translations/fr.po
index 1418e6f493..8db0cf2555 100644
--- a/editor/translations/fr.po
+++ b/editor/translations/fr.po
@@ -1,5 +1,6 @@
# French translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Brice <bbric@free.fr>, 2016.
diff --git a/editor/translations/hu.po b/editor/translations/hu.po
index 8cb6c2caf1..2d1b36d2ea 100644
--- a/editor/translations/hu.po
+++ b/editor/translations/hu.po
@@ -1,5 +1,6 @@
# Hungarian translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Varga Dániel <danikah.danikah@gmail.com>, 2016.
diff --git a/editor/translations/id.po b/editor/translations/id.po
index 2126d324dd..2abf4090c8 100644
--- a/editor/translations/id.po
+++ b/editor/translations/id.po
@@ -1,5 +1,6 @@
# Indonesian translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Abdul Aziz Muslim Alqudsy <abdul.aziz.muslim.alqudsy@gmail.com>, 2016.
diff --git a/editor/translations/it.po b/editor/translations/it.po
index e055c6996a..08d04d296b 100644
--- a/editor/translations/it.po
+++ b/editor/translations/it.po
@@ -1,5 +1,6 @@
# Italian translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Dario Bonfanti <bonfi.96@hotmail.it>, 2016-2017.
diff --git a/editor/translations/ja.po b/editor/translations/ja.po
index f34e0d118b..beeaf264a2 100644
--- a/editor/translations/ja.po
+++ b/editor/translations/ja.po
@@ -1,5 +1,6 @@
# Japanese translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# akirakido <achts.y@gmail.com>, 2016.
diff --git a/editor/translations/ko.po b/editor/translations/ko.po
index 769089b860..08b10d2f7a 100644
--- a/editor/translations/ko.po
+++ b/editor/translations/ko.po
@@ -1,5 +1,6 @@
# Korean translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# 박한얼 (volzhs) <volzhs@gmail.com>, 2016-2017.
diff --git a/editor/translations/nb.po b/editor/translations/nb.po
index e7a64f501a..7ce577ebfa 100644
--- a/editor/translations/nb.po
+++ b/editor/translations/nb.po
@@ -1,5 +1,6 @@
# Norwegian Bokmål translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Anonymous <GentleSaucepan@protonmail.com>, 2017.
diff --git a/editor/translations/nl.po b/editor/translations/nl.po
index 55407145d2..f0d54ebd9d 100644
--- a/editor/translations/nl.po
+++ b/editor/translations/nl.po
@@ -1,5 +1,6 @@
# Dutch translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Aram Nap <xyphex.aram@gmail.com>, 2017
diff --git a/editor/translations/pl.po b/editor/translations/pl.po
index 8eb2e9c884..ccee170c57 100644
--- a/editor/translations/pl.po
+++ b/editor/translations/pl.po
@@ -1,5 +1,6 @@
# Polish translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# 8-bit Pixel <dawdejw@gmail.com>, 2016.
diff --git a/editor/translations/pr.po b/editor/translations/pr.po
index 4df9c04664..4629c24f45 100644
--- a/editor/translations/pr.po
+++ b/editor/translations/pr.po
@@ -1,5 +1,6 @@
# Pirate translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Zion Nimchuk <zionnimchuk@gmail.com>, 2016-2017.
diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po
index 75be59068c..25055a0b7b 100644
--- a/editor/translations/pt_BR.po
+++ b/editor/translations/pt_BR.po
@@ -1,5 +1,6 @@
# Portuguese (Brazil) translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Allyson Souza <allyson_as@outlook.com>, 2017.
diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po
index 913455b999..fa4629c5c1 100644
--- a/editor/translations/pt_PT.po
+++ b/editor/translations/pt_PT.po
@@ -1,5 +1,6 @@
# Portuguese (Portugal) translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# António Sarmento <antonio.luis.sarmento@gmail.com>, 2016.
diff --git a/editor/translations/ru.po b/editor/translations/ru.po
index 9f7aa6e26a..0c4a29fb63 100644
--- a/editor/translations/ru.po
+++ b/editor/translations/ru.po
@@ -1,5 +1,6 @@
# Russian translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# DimOkGamer <dimokgamer@gmail.com>, 2016-2017.
diff --git a/editor/translations/sk.po b/editor/translations/sk.po
index 697def1043..b0bee6aa6f 100644
--- a/editor/translations/sk.po
+++ b/editor/translations/sk.po
@@ -1,5 +1,6 @@
# Slovak translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# J08nY <johnenter@gmail.com>, 2016.
diff --git a/editor/translations/sl.po b/editor/translations/sl.po
index fad12d7f13..ea634658ce 100644
--- a/editor/translations/sl.po
+++ b/editor/translations/sl.po
@@ -1,5 +1,6 @@
# Slovenian translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# matevž lapajne <sivar.lapajne@gmail.com>, 2016.
diff --git a/editor/translations/th.po b/editor/translations/th.po
index 79cdaf6b10..b31532f3bf 100644
--- a/editor/translations/th.po
+++ b/editor/translations/th.po
@@ -1,5 +1,6 @@
# Thai translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Poommetee Ketson <poommetee@protonmail.com>, 2017.
diff --git a/editor/translations/tr.po b/editor/translations/tr.po
index 20a794b34a..b4d8975649 100644
--- a/editor/translations/tr.po
+++ b/editor/translations/tr.po
@@ -1,5 +1,6 @@
# Turkish translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Aprın Çor Tigin <kabusturk38@gmail.com>, 2016-2017.
diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po
index 651aa62001..ef3e3b30ca 100644
--- a/editor/translations/ur_PK.po
+++ b/editor/translations/ur_PK.po
@@ -1,5 +1,6 @@
# Urdu (Pakistan) translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Muhammad Ali <ali@codeonion.com>, 2016.
diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po
index 87ca113ce2..f3afcab79d 100644
--- a/editor/translations/zh_CN.po
+++ b/editor/translations/zh_CN.po
@@ -1,5 +1,6 @@
# Chinese (China) translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# 纯洁的坏蛋 <tqj.zyy@gmail.com>, 2016.
diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po
index dfac75ecab..e49582e901 100644
--- a/editor/translations/zh_HK.po
+++ b/editor/translations/zh_HK.po
@@ -1,5 +1,6 @@
# Chinese (Honk Kong) translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016.
diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po
index 48b76484e0..7836cd2f76 100644
--- a/editor/translations/zh_TW.po
+++ b/editor/translations/zh_TW.po
@@ -1,5 +1,6 @@
# Chinese (Taiwan) translation of the Godot Engine editor
-# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community
+# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur
+# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# popcade <popcade@gmail.com>, 2016.
diff --git a/modules/gdnative/gdnative.cpp b/modules/gdnative/gdnative.cpp
index 09859d95bd..e74d601d74 100644
--- a/modules/gdnative/gdnative.cpp
+++ b/modules/gdnative/gdnative.cpp
@@ -515,7 +515,6 @@ static const char *_dl_platforms_info[] = {
"unix|x11|so|X11",
"unix|server|so|Server",
"unix|android|so|Android",
- "unix|blackberry|so|Blackberry 10",
"unix|haiku|so|Haiku", // Right?
"|mac|dynlib|Mac",
"mac|ios|dynlib|iOS",
diff --git a/modules/gdnative/godot.cpp b/modules/gdnative/godot.cpp
index 7477a28db6..bc53eb93f4 100644
--- a/modules/gdnative/godot.cpp
+++ b/modules/gdnative/godot.cpp
@@ -30,6 +30,7 @@
#include "godot.h"
#include "class_db.h"
+#include "error_macros.h"
#include "gdnative.h"
#include "global_config.h"
#include "global_constants.h"
@@ -115,6 +116,28 @@ void GDAPI godot_method_bind_ptrcall(godot_method_bind *p_method_bind, godot_obj
mb->ptrcall(o, p_args, p_ret);
}
+godot_variant GDAPI godot_method_bind_call(godot_method_bind *p_method_bind, godot_object *p_instance, const godot_variant **p_args, const int p_arg_count, godot_variant_call_error *p_call_error) {
+ MethodBind *mb = (MethodBind *)p_method_bind;
+ Object *o = (Object *)p_instance;
+ const Variant **args = (const Variant **)p_args;
+
+ godot_variant ret;
+ godot_variant_new_nil(&ret);
+
+ Variant *ret_val = (Variant *)&ret;
+
+ Variant::CallError r_error;
+ *ret_val = mb->call(o, args, p_arg_count, r_error);
+
+ if (p_call_error) {
+ p_call_error->error = (godot_variant_call_error_error)r_error.error;
+ p_call_error->argument = r_error.argument;
+ p_call_error->expected = (godot_variant_type)r_error.expected;
+ }
+
+ return ret;
+}
+
// @Todo
/*
void GDAPI godot_method_bind_varcall(godot_method_bind *p_method_bind)
@@ -215,6 +238,18 @@ void GDAPI godot_free(void *p_ptr) {
memfree(p_ptr);
}
+void GDAPI godot_print_error(const char *p_description, const char *p_function, const char *p_file, int p_line) {
+ _err_print_error(p_function, p_file, p_line, p_description, ERR_HANDLER_ERROR);
+}
+
+void GDAPI godot_print_warning(const char *p_description, const char *p_function, const char *p_file, int p_line) {
+ _err_print_error(p_function, p_file, p_line, p_description, ERR_HANDLER_WARNING);
+}
+
+void GDAPI godot_print(const godot_string *p_message) {
+ print_line(*(String *)p_message);
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/modules/gdnative/godot.h b/modules/gdnative/godot.h
index b05cafbe50..7214ce62df 100644
--- a/modules/gdnative/godot.h
+++ b/modules/gdnative/godot.h
@@ -228,7 +228,7 @@ typedef struct godot_method_bind {
godot_method_bind GDAPI *godot_method_bind_get_method(const char *p_classname, const char *p_methodname);
void GDAPI godot_method_bind_ptrcall(godot_method_bind *p_method_bind, godot_object *p_instance, const void **p_args, void *p_ret);
-
+godot_variant GDAPI godot_method_bind_call(godot_method_bind *p_method_bind, godot_object *p_instance, const godot_variant **p_args, const int p_arg_count, godot_variant_call_error *p_call_error);
////// Script API
typedef struct godot_native_init_options {
@@ -404,6 +404,11 @@ void GDAPI *godot_alloc(int p_bytes);
void GDAPI *godot_realloc(void *p_ptr, int p_bytes);
void GDAPI godot_free(void *p_ptr);
+//print using Godot's error handler list
+void GDAPI godot_print_error(const char *p_description, const char *p_function, const char *p_file, int p_line);
+void GDAPI godot_print_warning(const char *p_description, const char *p_function, const char *p_file, int p_line);
+void GDAPI godot_print(const godot_string *p_message);
+
#ifdef __cplusplus
}
#endif
diff --git a/modules/gdnative/godot/godot_variant.cpp b/modules/gdnative/godot/godot_variant.cpp
index 2214f85056..e9fa4eb8c6 100644
--- a/modules/gdnative/godot/godot_variant.cpp
+++ b/modules/gdnative/godot/godot_variant.cpp
@@ -457,12 +457,22 @@ godot_pool_color_array GDAPI godot_variant_as_pool_color_array(const godot_varia
return pba;
}
-godot_variant GDAPI godot_variant_call(godot_variant *p_v, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount /*, godot_variant_call_error *r_error */) {
+godot_variant GDAPI godot_variant_call(godot_variant *p_v, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount, godot_variant_call_error *p_error) {
Variant *v = (Variant *)p_v;
String *method = (String *)p_method;
- Variant **args = (Variant **)p_args;
+ const Variant **args = (const Variant **)p_args;
godot_variant res;
- memnew_placement_custom((Variant *)&res, Variant, Variant(v->call(*method, args, p_argcount)));
+ godot_variant_new_nil(&res);
+
+ Variant *ret_val = (Variant *)&res;
+
+ Variant::CallError r_error;
+ *ret_val = v->call(StringName(*method), args, p_argcount, r_error);
+ if (p_error) {
+ p_error->error = (godot_variant_call_error_error)r_error.error;
+ p_error->argument = r_error.argument;
+ p_error->expected = (godot_variant_type)r_error.expected;
+ }
return res;
}
diff --git a/modules/gdnative/godot/godot_variant.h b/modules/gdnative/godot/godot_variant.h
index 6f98b32363..0a5771d2f6 100644
--- a/modules/gdnative/godot/godot_variant.h
+++ b/modules/gdnative/godot/godot_variant.h
@@ -45,13 +45,6 @@ typedef struct godot_variant {
struct godot_transform2d;
typedef struct godot_transform2d godot_transform2d;
-#include "godot_array.h"
-#include "godot_dictionary.h"
-#include "godot_input_event.h"
-#include "godot_node_path.h"
-#include "godot_rid.h"
-#include "godot_transform2d.h"
-
typedef enum godot_variant_type {
GODOT_VARIANT_TYPE_NIL,
@@ -93,6 +86,28 @@ typedef enum godot_variant_type {
GODOT_VARIANT_TYPE_POOL_COLOR_ARRAY,
} godot_variant_type;
+typedef enum godot_variant_call_error_error {
+ GODOT_CALL_ERROR_CALL_OK,
+ GODOT_CALL_ERROR_CALL_ERROR_INVALID_METHOD,
+ GODOT_CALL_ERROR_CALL_ERROR_INVALID_ARGUMENT,
+ GODOT_CALL_ERROR_CALL_ERROR_TOO_MANY_ARGUMENTS,
+ GODOT_CALL_ERROR_CALL_ERROR_TOO_FEW_ARGUMENTS,
+ GODOT_CALL_ERROR_CALL_ERROR_INSTANCE_IS_NULL,
+} godot_variant_call_error_error;
+
+typedef struct godot_variant_call_error {
+ godot_variant_call_error_error error;
+ int argument;
+ godot_variant_type expected;
+} godot_variant_call_error;
+
+#include "godot_array.h"
+#include "godot_dictionary.h"
+#include "godot_input_event.h"
+#include "godot_node_path.h"
+#include "godot_rid.h"
+#include "godot_transform2d.h"
+
godot_variant_type GDAPI godot_variant_get_type(const godot_variant *p_v);
void GDAPI godot_variant_copy(godot_variant *p_dest, const godot_variant *p_src);
@@ -159,7 +174,7 @@ godot_pool_vector2_array GDAPI godot_variant_as_pool_vector2_array(const godot_v
godot_pool_vector3_array GDAPI godot_variant_as_pool_vector3_array(const godot_variant *p_v);
godot_pool_color_array GDAPI godot_variant_as_pool_color_array(const godot_variant *p_v);
-godot_variant GDAPI godot_variant_call(godot_variant *p_v, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount /*, godot_variant_call_error *r_error */);
+godot_variant GDAPI godot_variant_call(godot_variant *p_v, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount, godot_variant_call_error *p_error);
godot_bool GDAPI godot_variant_has_method(godot_variant *p_v, const godot_string *p_method);
diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp
index 39fe0a1675..d8993710a4 100644
--- a/modules/gridmap/grid_map_editor_plugin.cpp
+++ b/modules/gridmap/grid_map_editor_plugin.cpp
@@ -519,12 +519,12 @@ bool GridMapEditor::forward_spatial_input_event(Camera *p_camera, const InputEve
if (p_event.mouse_button.button_index == BUTTON_WHEEL_UP && (p_event.mouse_button.mod.command || p_event.mouse_button.mod.shift)) {
if (p_event.mouse_button.pressed)
- floor->set_value(floor->get_value() + 1);
+ floor->set_value(floor->get_value() + p_event.mouse_button.factor);
return true; //eaten
} else if (p_event.mouse_button.button_index == BUTTON_WHEEL_DOWN && (p_event.mouse_button.mod.command || p_event.mouse_button.mod.shift)) {
if (p_event.mouse_button.pressed)
- floor->set_value(floor->get_value() - 1);
+ floor->set_value(floor->get_value() - p_event.mouse_button.factor);
return true;
}
diff --git a/modules/multiscript/SCsub b/modules/multiscript/SCsub
deleted file mode 100644
index 0882406761..0000000000
--- a/modules/multiscript/SCsub
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env python
-
-Import('env')
-
-env.add_source_files(env.modules_sources, "*.cpp")
-
-Export('env')
diff --git a/modules/multiscript/config.py b/modules/multiscript/config.py
deleted file mode 100644
index 5698a37295..0000000000
--- a/modules/multiscript/config.py
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-def can_build(platform):
- return True
-
-
-def configure(env):
- pass
diff --git a/modules/multiscript/multiscript.cpp b/modules/multiscript/multiscript.cpp
deleted file mode 100644
index b2633b7207..0000000000
--- a/modules/multiscript/multiscript.cpp
+++ /dev/null
@@ -1,750 +0,0 @@
-/*************************************************************************/
-/* multiscript.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include "multiscript.h"
-
-bool MultiScriptInstance::set(const StringName &p_name, const Variant &p_value) {
-
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- bool found = sarr[i]->set(p_name, p_value);
- if (found)
- return true;
- }
-
- if (String(p_name).begins_with("script_")) {
- bool valid;
- owner->set(p_name, p_value, &valid);
- return valid;
- }
- return false;
-}
-
-bool MultiScriptInstance::get(const StringName &p_name, Variant &r_ret) const {
-
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- bool found = sarr[i]->get(p_name, r_ret);
- if (found)
- return true;
- }
- if (String(p_name).begins_with("script_")) {
- bool valid;
- r_ret = owner->get(p_name, &valid);
- return valid;
- }
- return false;
-}
-void MultiScriptInstance::get_property_list(List<PropertyInfo> *p_properties) const {
-
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- Set<String> existing;
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- List<PropertyInfo> pl;
- sarr[i]->get_property_list(&pl);
-
- for (List<PropertyInfo>::Element *E = pl.front(); E; E = E->next()) {
-
- if (existing.has(E->get().name))
- continue;
-
- p_properties->push_back(E->get());
- existing.insert(E->get().name);
- }
- }
-
- p_properties->push_back(PropertyInfo(Variant::NIL, "Scripts", PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
-
- for (int i = 0; i < owner->scripts.size(); i++) {
-
- p_properties->push_back(PropertyInfo(Variant::OBJECT, "script_" + String::chr('a' + i), PROPERTY_HINT_RESOURCE_TYPE, "Script", PROPERTY_USAGE_EDITOR));
- }
-
- if (owner->scripts.size() < 25) {
-
- p_properties->push_back(PropertyInfo(Variant::OBJECT, "script_" + String::chr('a' + (owner->scripts.size())), PROPERTY_HINT_RESOURCE_TYPE, "Script", PROPERTY_USAGE_EDITOR));
- }
-}
-
-void MultiScriptInstance::get_method_list(List<MethodInfo> *p_list) const {
-
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- Set<StringName> existing;
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- List<MethodInfo> ml;
- sarr[i]->get_method_list(&ml);
-
- for (List<MethodInfo>::Element *E = ml.front(); E; E = E->next()) {
-
- if (existing.has(E->get().name))
- continue;
-
- p_list->push_back(E->get());
- existing.insert(E->get().name);
- }
- }
-}
-bool MultiScriptInstance::has_method(const StringName &p_method) const {
-
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- if (sarr[i]->has_method(p_method))
- return true;
- }
-
- return false;
-}
-
-Variant MultiScriptInstance::call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) {
-
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- Variant r = sarr[i]->call(p_method, p_args, p_argcount, r_error);
- if (r_error.error == Variant::CallError::CALL_OK)
- return r;
- else if (r_error.error != Variant::CallError::CALL_ERROR_INVALID_METHOD)
- return r;
- }
-
- r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD;
- return Variant();
-}
-
-void MultiScriptInstance::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) {
-
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- sarr[i]->call_multilevel(p_method, p_args, p_argcount);
- }
-}
-void MultiScriptInstance::notification(int p_notification) {
-
- // ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- ScriptInstance *instance = instances[i];
-
- if (!instance)
- continue;
-
- instance->notification(p_notification);
- }
-}
-
-Ref<Script> MultiScriptInstance::get_script() const {
-
- return owner;
-}
-
-ScriptLanguage *MultiScriptInstance::get_language() {
-
- return MultiScriptLanguage::get_singleton();
-}
-
-MultiScriptInstance::~MultiScriptInstance() {
-
- owner->remove_instance(object);
-}
-
-Variant::Type MultiScriptInstance::get_property_type(const StringName &p_name, bool *r_is_valid) const {
- bool valid = false;
- Variant::Type type;
-
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- type = sarr[i]->get_property_type(p_name, &valid);
- if (valid) {
- *r_is_valid = valid;
- return type;
- }
- }
- *r_is_valid = false;
- return Variant::NIL;
-}
-
-ScriptInstance::RPCMode MultiScriptInstance::get_rpc_mode(const StringName &p_method) const {
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
- if (sarr[i]->has_method(p_method))
- return sarr[i]->get_rpc_mode(p_method);
- }
- return RPC_MODE_DISABLED;
-}
-
-ScriptInstance::RPCMode MultiScriptInstance::get_rset_mode(const StringName &p_variable) const {
- ScriptInstance **sarr = instances.ptr();
- int sc = instances.size();
-
- for (int i = 0; i < sc; i++) {
-
- if (!sarr[i])
- continue;
-
- List<PropertyInfo> properties;
- sarr[i]->get_property_list(&properties);
-
- for (List<PropertyInfo>::Element *P = properties.front(); P; P = P->next()) {
- if (P->get().name == p_variable) {
- return sarr[i]->get_rset_mode(p_variable);
- }
- }
- }
- return RPC_MODE_DISABLED;
-}
-
-///////////////////
-
-bool MultiScript::is_tool() const {
-
- for (int i = 0; i < scripts.size(); i++) {
-
- if (scripts[i]->is_tool())
- return true;
- }
-
- return false;
-}
-
-bool MultiScript::_set(const StringName &p_name, const Variant &p_value) {
-
- _THREAD_SAFE_METHOD_
-
- String s = String(p_name);
- if (s.begins_with("script_")) {
-
- int idx = s[7];
- if (idx == 0)
- return false;
- idx -= 'a';
-
- ERR_FAIL_COND_V(idx < 0, false);
-
- Ref<Script> s = p_value;
-
- if (idx < scripts.size()) {
-
- if (s.is_null())
- remove_script(idx);
- else
- set_script(idx, s);
- } else if (idx == scripts.size()) {
- if (s.is_null())
- return false;
- add_script(s);
- } else
- return false;
-
- return true;
- }
-
- return false;
-}
-
-bool MultiScript::_get(const StringName &p_name, Variant &r_ret) const {
-
- _THREAD_SAFE_METHOD_
-
- String s = String(p_name);
- if (s.begins_with("script_")) {
-
- int idx = s[7];
- if (idx == 0)
- return false;
- idx -= 'a';
-
- ERR_FAIL_COND_V(idx < 0, false);
-
- if (idx < scripts.size()) {
-
- r_ret = get_script(idx);
- return true;
- } else if (idx == scripts.size()) {
- r_ret = Ref<Script>();
- return true;
- }
- }
-
- return false;
-}
-void MultiScript::_get_property_list(List<PropertyInfo> *p_list) const {
-
- _THREAD_SAFE_METHOD_
-
- for (int i = 0; i < scripts.size(); i++) {
-
- p_list->push_back(PropertyInfo(Variant::OBJECT, "script_" + String::chr('a' + i), PROPERTY_HINT_RESOURCE_TYPE, "Script"));
- }
-
- if (scripts.size() < 25) {
-
- p_list->push_back(PropertyInfo(Variant::OBJECT, "script_" + String::chr('a' + (scripts.size())), PROPERTY_HINT_RESOURCE_TYPE, "Script"));
- }
-}
-
-void MultiScript::set_script(int p_idx, const Ref<Script> &p_script) {
-
- _THREAD_SAFE_METHOD_
-
- ERR_FAIL_INDEX(p_idx, scripts.size());
- ERR_FAIL_COND(p_script.is_null());
-
- scripts[p_idx] = p_script;
- Ref<Script> s = p_script;
-
- for (Map<Object *, MultiScriptInstance *>::Element *E = instances.front(); E; E = E->next()) {
-
- MultiScriptInstance *msi = E->get();
- ScriptInstance *si = msi->instances[p_idx];
- if (si) {
- msi->instances[p_idx] = NULL;
- memdelete(si);
- }
-
- if (p_script->can_instance())
- msi->instances[p_idx] = s->instance_create(msi->object);
- }
-}
-
-Ref<Script> MultiScript::get_script(int p_idx) const {
-
- _THREAD_SAFE_METHOD_
-
- ERR_FAIL_INDEX_V(p_idx, scripts.size(), Ref<Script>());
-
- return scripts[p_idx];
-}
-void MultiScript::add_script(const Ref<Script> &p_script) {
-
- _THREAD_SAFE_METHOD_
- ERR_FAIL_COND(p_script.is_null());
- Multi *script_owner = memnew(Multi);
- script_instances.push_back(script_owner);
- scripts.push_back(p_script);
- Ref<Script> s = p_script;
-
- for (Map<Object *, MultiScriptInstance *>::Element *E = instances.front(); E; E = E->next()) {
-
- MultiScriptInstance *msi = E->get();
-
- if (p_script->can_instance()) {
- script_owner->real_owner = msi->object;
- msi->instances.push_back(s->instance_create(script_owner));
- } else {
- msi->instances.push_back(NULL);
- }
-
- msi->object->_change_notify();
- }
-
- _change_notify();
-}
-
-void MultiScript::remove_script(int p_idx) {
-
- _THREAD_SAFE_METHOD_
-
- ERR_FAIL_INDEX(p_idx, scripts.size());
-
- scripts.remove(p_idx);
- script_instances.remove(p_idx);
-
- for (Map<Object *, MultiScriptInstance *>::Element *E = instances.front(); E; E = E->next()) {
-
- MultiScriptInstance *msi = E->get();
- ScriptInstance *si = msi->instances[p_idx];
- msi->instances.remove(p_idx);
- if (si) {
- memdelete(si);
- }
-
- msi->object->_change_notify();
- }
-}
-
-void MultiScript::remove_instance(Object *p_object) {
-
- _THREAD_SAFE_METHOD_
- instances.erase(p_object);
-}
-
-bool MultiScript::can_instance() const {
-
- return true;
-}
-
-StringName MultiScript::get_instance_base_type() const {
-
- return StringName();
-}
-ScriptInstance *MultiScript::instance_create(Object *p_this) {
-
- _THREAD_SAFE_METHOD_
- MultiScriptInstance *msi = memnew(MultiScriptInstance);
- msi->object = p_this;
- msi->owner = this;
-
- for (int i = 0; i < scripts.size(); i++) {
-
- ScriptInstance *si;
-
- if (scripts[i]->can_instance()) {
- script_instances[i]->real_owner = p_this;
- si = scripts[i]->instance_create(script_instances[i]);
- } else {
- si = NULL;
- }
-
- msi->instances.push_back(si);
- }
-
- instances[p_this] = msi;
- p_this->_change_notify();
- return msi;
-}
-bool MultiScript::instance_has(const Object *p_this) const {
-
- _THREAD_SAFE_METHOD_
- return instances.has((Object *)p_this);
-}
-
-bool MultiScript::has_source_code() const {
-
- return false;
-}
-String MultiScript::get_source_code() const {
-
- return "";
-}
-void MultiScript::set_source_code(const String &p_code) {
-}
-Error MultiScript::reload(bool p_keep_state) {
-
- for (int i = 0; i < scripts.size(); i++)
- scripts[i]->reload(p_keep_state);
-
- return OK;
-}
-
-String MultiScript::get_node_type() const {
-
- return "";
-}
-
-void MultiScript::_bind_methods() {
-}
-
-ScriptLanguage *MultiScript::get_language() const {
-
- return MultiScriptLanguage::get_singleton();
-}
-
-///////////////
-
-MultiScript::MultiScript() {
-}
-
-MultiScript::~MultiScript() {
- for (int i = 0; i < script_instances.size(); i++) {
- memdelete(script_instances[i]);
- }
-
- script_instances.resize(0);
-}
-
-Ref<Script> MultiScript::get_base_script() const {
- Ref<MultiScript> base_script;
- return base_script;
-}
-
-bool MultiScript::has_method(const StringName &p_method) const {
- for (int i = 0; i < scripts.size(); i++) {
- if (scripts[i]->has_method(p_method)) {
- return true;
- }
- }
- return false;
-}
-
-MethodInfo MultiScript::get_method_info(const StringName &p_method) const {
- for (int i = 0; i < scripts.size(); i++) {
- if (scripts[i]->has_method(p_method)) {
- return scripts[i]->get_method_info(p_method);
- }
- }
- return MethodInfo();
-}
-
-bool MultiScript::has_script_signal(const StringName &p_signal) const {
- for (int i = 0; i < scripts.size(); i++) {
- if (scripts[i]->has_script_signal(p_signal)) {
- return true;
- }
- }
- return false;
-}
-
-void MultiScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
- for (int i = 0; i < scripts.size(); i++) {
- scripts[i]->get_script_signal_list(r_signals);
- }
-}
-
-bool MultiScript::get_property_default_value(const StringName &p_property, Variant &r_value) const {
- for (int i = 0; i < scripts.size(); i++) {
-
- if (scripts[i]->get_property_default_value(p_property, r_value)) {
- return true;
- }
- }
- return false;
-}
-
-void MultiScript::get_script_method_list(List<MethodInfo> *p_list) const {
- for (int i = 0; i < scripts.size(); i++) {
- scripts[i]->get_script_method_list(p_list);
- }
-}
-
-void MultiScript::get_script_property_list(List<PropertyInfo> *p_list) const {
- for (int i = 0; i < scripts.size(); i++) {
- scripts[i]->get_script_property_list(p_list);
- }
-}
-
-void MultiScript::update_exports() {
- for (int i = 0; i < scripts.size(); i++) {
- scripts[i]->update_exports();
- }
-}
-
-MultiScriptLanguage *MultiScriptLanguage::singleton = NULL;
-
-MultiScriptLanguage *MultiScriptLanguage::get_singleton() {
- return singleton;
-}
-
-String MultiScriptLanguage::get_name() const {
- return "MultiScript";
-}
-
-void MultiScriptLanguage::init() {}
-
-String MultiScriptLanguage::get_type() const {
- return "MultiScript";
-}
-
-String MultiScriptLanguage::get_extension() const {
- return "";
-}
-
-Error MultiScriptLanguage::execute_file(const String &p_path) {
- return OK;
-}
-
-void MultiScriptLanguage::finish() {}
-
-void MultiScriptLanguage::get_reserved_words(List<String> *p_words) const {}
-
-void MultiScriptLanguage::get_comment_delimiters(List<String> *p_delimiters) const {}
-
-void MultiScriptLanguage::get_string_delimiters(List<String> *p_delimiters) const {}
-
-Ref<Script> MultiScriptLanguage::get_template(const String &p_class_name, const String &p_base_class_name) const {
- MultiScript *s = memnew(MultiScript);
- s->base_class_name = p_base_class_name;
- return Ref<MultiScript>(s);
-}
-
-bool MultiScriptLanguage::validate(const String &p_script, int &r_line_error, int &r_col_error, String &r_test_error, const String &p_path, List<String> *r_fn) const {
- return true;
-}
-
-Script *MultiScriptLanguage::create_script() const {
- return memnew(MultiScript);
-}
-
-bool MultiScriptLanguage::has_named_classes() const {
- return false;
-}
-
-int MultiScriptLanguage::find_function(const String &p_function, const String &p_code) const {
- return -1;
-}
-
-String MultiScriptLanguage::make_function(const String &p_class, const String &p_name, const PoolStringArray &p_args) const {
- return "";
-}
-
-String MultiScriptLanguage::debug_get_error() const {
- return "";
-}
-
-int MultiScriptLanguage::debug_get_stack_level_count() const {
- return 0;
-}
-
-int MultiScriptLanguage::debug_get_stack_level_line(int p_level) const {
- return 0;
-}
-
-String MultiScriptLanguage::debug_get_stack_level_function(int p_level) const {
- return "";
-}
-
-String MultiScriptLanguage::debug_get_stack_level_source(int p_level) const {
- return "";
-}
-
-void MultiScriptLanguage::debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {}
-
-void MultiScriptLanguage::debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {}
-
-void MultiScriptLanguage::debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {}
-
-String MultiScriptLanguage::debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems, int p_max_depth) {
- return "";
-}
-
-void MultiScriptLanguage::get_recognized_extensions(List<String> *p_extensions) const {}
-
-void MultiScriptLanguage::get_public_functions(List<MethodInfo> *p_functions) const {}
-
-MultiScriptLanguage::MultiScriptLanguage() {
- singleton = this;
-}
-
-MultiScriptLanguage::~MultiScriptLanguage() {}
-
-void MultiScriptLanguage::auto_indent_code(String &p_code, int p_from_line, int p_to_line) const {
-}
-
-void MultiScriptLanguage::add_global_constant(const StringName &p_variable, const Variant &p_value) {
-}
-
-void MultiScriptLanguage::reload_all_scripts() {
-}
-
-void MultiScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload) {
-}
-
-void MultiScriptLanguage::get_public_constants(List<Pair<String, Variant> > *p_constants) const {
-}
-
-void MultiScriptLanguage::profiling_start() {
-}
-
-void MultiScriptLanguage::profiling_stop() {
-}
-
-int MultiScriptLanguage::profiling_get_accumulated_data(ScriptLanguage::ProfilingInfo *p_info_arr, int p_info_max) {
- return 0;
-}
-
-int MultiScriptLanguage::profiling_get_frame_data(ScriptLanguage::ProfilingInfo *p_info_arr, int p_info_max) {
- return 0;
-}
-
-void Multi::_bind_methods() {
- // ClassDB::bind_method("call", &Multi::call);
- // ClassDB::bind_method("call_multilevel", &Multi::call_multilevel);
- // ClassDB::bind_method("call_multilevel_reversed", &Multi::call_multilevel_reversed);
-}
-
-Variant Multi::call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) {
- if (real_owner)
- return real_owner->call(p_method, p_args, p_argcount, r_error);
- return Variant();
-}
-
-void Multi::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) {
- if (real_owner)
- real_owner->call_multilevel(p_method, p_args, p_argcount);
-}
-
-void Multi::call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) {
- if (real_owner)
- real_owner->call_multilevel_reversed(p_method, p_args, p_argcount);
-}
diff --git a/modules/multiscript/multiscript.h b/modules/multiscript/multiscript.h
deleted file mode 100644
index 7ec1d5402f..0000000000
--- a/modules/multiscript/multiscript.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*************************************************************************/
-/* multiscript.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#ifndef MULTISCRIPT_H
-#define MULTISCRIPT_H
-
-#include "os/thread_safe.h"
-#include "script_language.h"
-
-class MultiScript;
-
-class Multi : public Object {
- GDCLASS(Multi, Object)
-
- friend class MultiScript;
-
- Object *real_owner;
-
-public:
- static void _bind_methods();
-
- virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error);
- virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount);
- virtual void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount);
-};
-
-class MultiScriptInstance : public ScriptInstance {
- friend class MultiScript;
- mutable Vector<ScriptInstance *> instances;
- Object *object;
- mutable MultiScript *owner;
-
-public:
- virtual bool set(const StringName &p_name, const Variant &p_value);
- virtual bool get(const StringName &p_name, Variant &r_ret) const;
- virtual void get_property_list(List<PropertyInfo> *p_properties) const;
-
- virtual void get_method_list(List<MethodInfo> *p_list) const;
- virtual bool has_method(const StringName &p_method) const;
- virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error);
- virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount);
- virtual void notification(int p_notification);
-
- virtual Ref<Script> get_script() const;
-
- virtual ScriptLanguage *get_language();
- virtual ~MultiScriptInstance();
-
- // ScriptInstance interface
-public:
- Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid) const;
- RPCMode get_rpc_mode(const StringName &p_method) const;
- RPCMode get_rset_mode(const StringName &p_variable) const;
-};
-
-class MultiScript : public Script {
-
- _THREAD_SAFE_CLASS_
- friend class MultiScriptInstance;
- friend class MultiScriptLanguage;
- GDCLASS(MultiScript, Script)
-
- StringName base_class_name;
-
- Vector<Ref<Script> > scripts;
- Vector<Multi *> script_instances;
-
- Map<Object *, MultiScriptInstance *> instances;
-
-protected:
- bool _set(const StringName &p_name, const Variant &p_value);
- bool _get(const StringName &p_name, Variant &r_ret) const;
- void _get_property_list(List<PropertyInfo> *p_list) const;
-
- static void _bind_methods();
-
-public:
- void remove_instance(Object *p_object);
- virtual bool can_instance() const;
-
- virtual StringName get_instance_base_type() const;
- virtual ScriptInstance *instance_create(Object *p_this);
- virtual bool instance_has(const Object *p_this) const;
-
- virtual bool has_source_code() const;
- virtual String get_source_code() const;
- virtual void set_source_code(const String &p_code);
- virtual Error reload(bool p_keep_state = false);
-
- virtual bool is_tool() const;
-
- virtual String get_node_type() const;
-
- void set_script(int p_idx, const Ref<Script> &p_script);
- Ref<Script> get_script(int p_idx) const;
- void remove_script(int p_idx);
- void add_script(const Ref<Script> &p_script);
-
- virtual ScriptLanguage *get_language() const;
-
- MultiScript();
- ~MultiScript();
-
- virtual Ref<Script> get_base_script() const;
- virtual bool has_method(const StringName &p_method) const;
- virtual MethodInfo get_method_info(const StringName &p_method) const;
- virtual bool has_script_signal(const StringName &p_signal) const;
- virtual void get_script_signal_list(List<MethodInfo> *r_signals) const;
- virtual bool get_property_default_value(const StringName &p_property, Variant &r_value) const;
- virtual void get_script_method_list(List<MethodInfo> *p_list) const;
- virtual void get_script_property_list(List<PropertyInfo> *p_list) const;
- virtual void update_exports();
-};
-
-class MultiScriptLanguage : public ScriptLanguage {
-
- static MultiScriptLanguage *singleton;
-
-public:
- static _FORCE_INLINE_ MultiScriptLanguage *get_singleton();
- virtual String get_name() const;
-
- /* LANGUAGE FUNCTIONS */
- virtual void init();
- virtual String get_type() const;
- virtual String get_extension() const;
- virtual Error execute_file(const String &p_path);
- virtual void finish();
-
- /* EDITOR FUNCTIONS */
- virtual void get_reserved_words(List<String> *p_words) const;
- virtual void get_comment_delimiters(List<String> *p_delimiters) const;
- virtual void get_string_delimiters(List<String> *p_delimiters) const;
- virtual Ref<Script> get_template(const String &p_class_name, const String &p_base_class_name) const;
- virtual bool validate(const String &p_script, int &r_line_error, int &r_col_error, String &r_test_error, const String &p_path = "", List<String> *r_fn = NULL) const;
- virtual Script *create_script() const;
- virtual bool has_named_classes() const;
- virtual int find_function(const String &p_function, const String &p_code) const;
- virtual String make_function(const String &p_class, const String &p_name, const PoolStringArray &p_args) const;
-
- /* DEBUGGER FUNCTIONS */
-
- virtual String debug_get_error() const;
- virtual int debug_get_stack_level_count() const;
- virtual int debug_get_stack_level_line(int p_level) const;
- virtual String debug_get_stack_level_function(int p_level) const;
- virtual String debug_get_stack_level_source(int p_level) const;
- virtual void debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1);
- virtual void debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1);
- virtual void debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1);
- virtual String debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems = -1, int p_max_depth = -1);
-
- /* LOADER FUNCTIONS */
-
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual void get_public_functions(List<MethodInfo> *p_functions) const;
-
- MultiScriptLanguage();
- virtual ~MultiScriptLanguage();
-
- // ScriptLanguage interface
-public:
- void auto_indent_code(String &p_code, int p_from_line, int p_to_line) const;
- void add_global_constant(const StringName &p_variable, const Variant &p_value);
- void reload_all_scripts();
- void reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload);
- void get_public_constants(List<Pair<String, Variant> > *p_constants) const;
- void profiling_start();
- void profiling_stop();
- int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max);
- int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max);
-};
-
-#endif // MULTISCRIPT_H
diff --git a/modules/multiscript/register_types.cpp b/modules/multiscript/register_types.cpp
deleted file mode 100644
index 8170a2d9c1..0000000000
--- a/modules/multiscript/register_types.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*************************************************************************/
-/* register_types.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include "register_types.h"
-
-#include "multiscript.h"
-
-#include "core/script_language.h"
-
-static MultiScriptLanguage *script_multi_script = NULL;
-
-void register_multiscript_types() {
- script_multi_script = memnew(MultiScriptLanguage);
- ScriptServer::register_language(script_multi_script);
- ClassDB::register_class<MultiScript>();
-
- // ClassDB::register_class<Multi>();
-}
-
-void unregister_multiscript_types() {
- if (script_multi_script) {
- ScriptServer::unregister_language(script_multi_script);
- memdelete(script_multi_script);
- }
-}
diff --git a/modules/multiscript/register_types.h b/modules/multiscript/register_types.h
deleted file mode 100644
index b18d1adff2..0000000000
--- a/modules/multiscript/register_types.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*************************************************************************/
-/* register_types.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-void register_multiscript_types();
-void unregister_multiscript_types();
diff --git a/modules/webm/libvpx/SCsub b/modules/webm/libvpx/SCsub
index 241d6e30cd..0ee2ed45b8 100644
--- a/modules/webm/libvpx/SCsub
+++ b/modules/webm/libvpx/SCsub
@@ -273,7 +273,7 @@ else:
webm_cpu_x86 = True
else:
webm_cpu_x86 = not is_x11_or_server_arm and (cpu_bits == '32' or cpu_bits == '64') and (env["platform"] == 'windows' or env["platform"] == 'x11' or env["platform"] == 'osx' or env["platform"] == 'haiku' or is_android_x86 or is_ios_x86)
- webm_cpu_arm = is_x11_or_server_arm or (not is_ios_x86 and env["platform"] == 'iphone') or env["platform"] == 'bb10' or (not is_android_x86 and env["platform"] == 'android')
+ webm_cpu_arm = is_x11_or_server_arm or (not is_ios_x86 and env["platform"] == 'iphone') or (not is_android_x86 and env["platform"] == 'android')
if webm_cpu_x86:
import subprocess
diff --git a/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java b/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java
index d90d6eac7b..63720999a7 100644
--- a/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java
+++ b/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java
@@ -1,4 +1,20 @@
/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: aidl/ILicenseResultListener.aidl
*/
diff --git a/platform/android/java/src/com/android/vending/licensing/ILicensingService.java b/platform/android/java/src/com/android/vending/licensing/ILicensingService.java
index 95599544e4..36afc0537d 100644
--- a/platform/android/java/src/com/android/vending/licensing/ILicensingService.java
+++ b/platform/android/java/src/com/android/vending/licensing/ILicensingService.java
@@ -1,4 +1,20 @@
/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: aidl/ILicensingService.aidl
*/
diff --git a/platform/android/power_android.cpp b/platform/android/power_android.cpp
index 57977dd4b9..bb5a1db250 100644
--- a/platform/android/power_android.cpp
+++ b/platform/android/power_android.cpp
@@ -28,10 +28,35 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#include "core/error_macros.h"
+/*
+Adapted from corresponding SDL 2.0 code.
+*/
+
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
#include "power_android.h"
+#include "core/error_macros.h"
+
static void LocalReferenceHolder_Cleanup(struct LocalReferenceHolder *refholder) {
if (refholder->m_env) {
JNIEnv *env = refholder->m_env;
diff --git a/platform/bb10/SCsub b/platform/bb10/SCsub
deleted file mode 100644
index c19f46d579..0000000000
--- a/platform/bb10/SCsub
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env python
-
-Import('env')
-
-bb10_lib = [
-
- 'bbutil.c',
- 'os_bb10.cpp',
- 'audio_driver_bb10.cpp',
- 'godot_bb10.cpp',
- 'payment_service.cpp',
-]
-
-env_bps = env.Clone()
-if env['bb10_payment_service'] == "yes":
- env_bps.Append(CPPFLAGS=['-DPAYMENT_SERVICE_ENABLED'])
-
-if env['bb10_lgles_override'] == "yes":
- env_bps.Append(CPPFLAGS=['-DBB10_LGLES_OVERRIDE'])
-
-
-prog = None
-prog = env_bps.Program('#bin/godot', bb10_lib)
diff --git a/platform/bb10/audio_driver_bb10.cpp b/platform/bb10/audio_driver_bb10.cpp
deleted file mode 100644
index 5658dc5334..0000000000
--- a/platform/bb10/audio_driver_bb10.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-/*************************************************************************/
-/* audio_driver_bb10.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include "audio_driver_bb10.h"
-
-#include <errno.h>
-
-Error AudioDriverBB10::init() {
- return init(NULL);
-};
-
-Error AudioDriverBB10::init(const char *p_name) {
-
- active = false;
- thread_exited = false;
- exit_thread = false;
- pcm_open = false;
- samples_in = NULL;
- samples_out = NULL;
-
- mix_rate = 44100;
- speaker_mode = SPEAKER_MODE_STEREO;
-
- char *dev_name;
- if (p_name == NULL) {
- dev_name = "pcmPreferred";
- } else {
- dev_name = (char *)p_name;
- }
- printf("******** reconnecting to device %s\n", dev_name);
- int ret = snd_pcm_open_name(&pcm_handle, dev_name, SND_PCM_OPEN_PLAYBACK);
- ERR_FAIL_COND_V(ret < 0, FAILED);
- pcm_open = true;
-
- snd_pcm_channel_info_t cinfo;
- zeromem(&cinfo, sizeof(cinfo));
- cinfo.channel = SND_PCM_CHANNEL_PLAYBACK;
- snd_pcm_plugin_info(pcm_handle, &cinfo);
-
- printf("rates %i, %i, %i, %i, %i\n", cinfo.rates, cinfo.rates & SND_PCM_RATE_44100, cinfo.rates & SND_PCM_RATE_32000, cinfo.rates & SND_PCM_RATE_22050, cinfo.max_rate);
-
- mix_rate = cinfo.max_rate;
-
- printf("formats %i, %i, %i\n", cinfo.formats, cinfo.formats & SND_PCM_FMT_S16_BE, cinfo.formats & SND_PCM_FMT_S16_LE);
- ERR_FAIL_COND_V(!(cinfo.formats & SND_PCM_FMT_S16_LE), FAILED);
-
- printf("voices %i\n", cinfo.max_voices);
- speaker_mode = SPEAKER_MODE_STEREO;
-
- snd_pcm_channel_params_t cp;
- zeromem(&cp, sizeof(cp));
- cp.mode = SND_PCM_MODE_BLOCK;
- cp.channel = SND_PCM_CHANNEL_PLAYBACK;
- cp.start_mode = SND_PCM_START_DATA;
- cp.stop_mode = SND_PCM_STOP_STOP;
- //cp.buf.block.frag_size = cinfo.max_fragment_size;
- cp.buf.block.frag_size = 512;
- cp.buf.block.frags_max = 1;
- cp.buf.block.frags_min = 1;
- cp.format.interleave = 1;
- cp.format.rate = mix_rate;
- cp.format.voices = speaker_mode;
- cp.format.format = SND_PCM_SFMT_S16_LE;
-
- ret = snd_pcm_plugin_params(pcm_handle, &cp);
- printf("ret is %i, %i\n", ret, cp.why_failed);
- ERR_FAIL_COND_V(ret < 0, FAILED);
-
- ret = snd_pcm_plugin_prepare(pcm_handle, SND_PCM_CHANNEL_PLAYBACK);
- ERR_FAIL_COND_V(ret < 0, FAILED);
-
- snd_mixer_group_t group;
- zeromem(&group, sizeof(group));
- snd_pcm_channel_setup_t setup;
- zeromem(&setup, sizeof(setup));
- setup.channel = SND_PCM_CHANNEL_PLAYBACK;
- setup.mode = SND_PCM_MODE_BLOCK;
- setup.mixer_gid = &group.gid;
- ret = snd_pcm_plugin_setup(pcm_handle, &setup);
- ERR_FAIL_COND_V(ret < 0, FAILED);
-
- pcm_frag_size = setup.buf.block.frag_size;
- pcm_max_frags = 1;
-
- sample_buf_count = pcm_frag_size * pcm_max_frags / 2;
- printf("sample count %i, %i, %i\n", sample_buf_count, pcm_frag_size, pcm_max_frags);
- samples_in = memnew_arr(int32_t, sample_buf_count);
- samples_out = memnew_arr(int16_t, sample_buf_count);
-
- thread = Thread::create(AudioDriverBB10::thread_func, this);
-
- return OK;
-};
-
-void AudioDriverBB10::thread_func(void *p_udata) {
-
- AudioDriverBB10 *ad = (AudioDriverBB10 *)p_udata;
-
- int channels = speaker_mode;
- int frame_count = ad->sample_buf_count / channels;
- int bytes_out = frame_count * channels * 2;
-
- while (!ad->exit_thread) {
-
- if (!ad->active) {
-
- for (int i = 0; i < ad->sample_buf_count; i++) {
-
- ad->samples_out[i] = 0;
- };
- } else {
-
- ad->lock();
-
- ad->audio_server_process(frame_count, ad->samples_in);
-
- ad->unlock();
-
- for (int i = 0; i < frame_count * channels; i++) {
-
- ad->samples_out[i] = ad->samples_in[i] >> 16;
- }
- };
-
- int todo = bytes_out;
- int total = 0;
-
- while (todo) {
-
- uint8_t *src = (uint8_t *)ad->samples_out;
- int wrote = snd_pcm_plugin_write(ad->pcm_handle, (void *)(src + total), todo);
- if (wrote < 0) {
- // error?
- break;
- };
- total += wrote;
- todo -= wrote;
- if (wrote < todo) {
- if (ad->thread_exited) {
- break;
- };
- printf("pcm_write underrun %i, errno %i\n", (int)ad->thread_exited, errno);
- snd_pcm_channel_status_t status;
- zeromem(&status, sizeof(status));
- // put in non-blocking mode
- snd_pcm_nonblock_mode(ad->pcm_handle, 1);
- status.channel = SND_PCM_CHANNEL_PLAYBACK;
- int ret = snd_pcm_plugin_status(ad->pcm_handle, &status);
- //printf("status return %i, %i, %i, %i, %i\n", ret, errno, status.status, SND_PCM_STATUS_READY, SND_PCM_STATUS_UNDERRUN);
- snd_pcm_nonblock_mode(ad->pcm_handle, 0);
- if (ret < 0) {
- break;
- };
- if (status.status == SND_PCM_STATUS_READY ||
- status.status == SND_PCM_STATUS_UNDERRUN) {
- snd_pcm_plugin_prepare(ad->pcm_handle, SND_PCM_CHANNEL_PLAYBACK);
- } else {
- break;
- };
- };
- };
- };
-
- snd_pcm_plugin_flush(ad->pcm_handle, SND_PCM_CHANNEL_PLAYBACK);
-
- ad->thread_exited = true;
- printf("**************** audio thread exit\n");
-};
-
-void AudioDriverBB10::start() {
-
- active = true;
-};
-
-int AudioDriverBB10::get_mix_rate() const {
-
- return mix_rate;
-};
-
-AudioDriver::SpeakerMode AudioDriverBB10::get_speaker_mode() const {
-
- return speaker_mode;
-};
-
-void AudioDriverBB10::lock() {
-
- if (!thread)
- return;
- mutex->lock();
-};
-
-void AudioDriverBB10::unlock() {
-
- if (!thread)
- return;
- mutex->unlock();
-};
-
-void AudioDriverBB10::finish() {
-
- if (!thread)
- return;
-
- exit_thread = true;
- Thread::wait_to_finish(thread);
-
- if (pcm_open)
- snd_pcm_close(pcm_handle);
-
- if (samples_in) {
- memdelete_arr(samples_in);
- memdelete_arr(samples_out);
- };
-
- memdelete(thread);
- thread = NULL;
-};
-
-AudioDriverBB10::AudioDriverBB10() {
-
- mutex = Mutex::create();
-};
-
-AudioDriverBB10::~AudioDriverBB10() {
-
- memdelete(mutex);
- mutex = NULL;
-};
diff --git a/platform/bb10/audio_driver_bb10.h b/platform/bb10/audio_driver_bb10.h
deleted file mode 100644
index c5d64236b8..0000000000
--- a/platform/bb10/audio_driver_bb10.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*************************************************************************/
-/* audio_driver_bb10.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include "servers/audio_server.h"
-
-#include "core/os/mutex.h"
-#include "core/os/thread.h"
-
-#include <sys/asoundlib.h>
-
-class AudioDriverBB10 : public AudioDriver {
-
- Thread *thread;
- Mutex *mutex;
-
- snd_pcm_t *pcm_handle;
-
- int32_t *samples_in;
- int16_t *samples_out;
- int sample_buf_count;
-
- static void thread_func(void *p_udata);
-
- int mix_rate;
- SpeakerMode speaker_mode;
-
- int pcm_frag_size;
- int pcm_max_frags;
-
- bool active;
- bool thread_exited;
- mutable bool exit_thread;
- bool pcm_open;
-
-public:
- const char *get_name() const {
- return "BB10";
- };
-
- virtual Error init();
- virtual Error init(const char *p_name);
- virtual void start();
- virtual int get_mix_rate() const;
- virtual SpeakerMode get_speaker_mode() const;
- virtual void lock();
- virtual void unlock();
- virtual void finish();
-
- AudioDriverBB10();
- ~AudioDriverBB10();
-};
diff --git a/platform/bb10/bar/bar-descriptor.xml b/platform/bb10/bar/bar-descriptor.xml
deleted file mode 100644
index 0ba70b7180..0000000000
--- a/platform/bb10/bar/bar-descriptor.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version='1.0' encoding='utf-8' standalone='no'?>
-<qnx xmlns="http://www.qnx.com/schemas/application/1.0">
- <!-- BlackBerry® 10 application descriptor file.
-
- Specifies parameters for identifying, installing, and launching native applications on BlackBerry® 10 OS.
--->
- <!-- A universally unique application identifier. Must be unique across all BlackBerry applications.
- Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->
- <id>com.godot.game</id>
- <!-- The name that is displayed in the BlackBerry application installer.
- May have multiple values for each language. See samples or xsd schema file. Optional. -->
- <name>Godot Game</name>
- <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade.
- Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.
- An updated version of application must have a versionNumber value higher than the previous version. Required. -->
- <versionNumber>0.0.1</versionNumber>
- <!-- Fourth digit segment of the package version. First three segments are taken from the
- <versionNumber> element. Must be an integer from 0 to 2^16-1 -->
- <buildId>0</buildId>
- <!-- Description, displayed in the BlackBerry application installer.
- May have multiple values for each language. See samples or xsd schema file. Optional. -->
- <description>Game made with Godot Engine</description>
- <!-- Name of author which is used for signing. Must match the developer name of your development certificate. -->
- <author>You Name or Company</author>
- <authorId>authorIDherePlease</authorId>
- <!-- Unique author ID assigned by signing authority. Required if using debug tokens. -->
- <!-- <authorId>ABC1234YjsnUk235h</authorId> -->
- <initialWindow>
- <aspectRatio>landscape</aspectRatio>
- <autoOrients>false</autoOrients>
- <systemChrome>none</systemChrome>
- <transparent>false</transparent>
- </initialWindow>
- <!-- The category where the application appears. Either core.games or core.media. -->
- <category>core.games</category>
- <permission>read_device_identifying_information</permission>
- <permission>access_internet</permission>
- <asset path="data.pck">data.pck</asset>
- <configuration name="Device-Debug">
- <platformArchitecture>armle-v7</platformArchitecture>
- <asset type="Qnx/Elf" path="godot.bb10.debug.qnx.armle" entry="true">godot.bb10.debug.qnx.armle</asset>
- </configuration>
- <configuration name="Device-Release">
- <platformArchitecture>armle-v7</platformArchitecture>
- <asset type="Qnx/Elf" path="godot.bb10.opt.qnx.armle" entry="true">godot.bb10.opt.qnx.armle</asset>
- </configuration>
- <!-- The icon for the application. -->
- <icon>
- <image>icon.png</image>
- </icon>
- <!-- Ensure that shared libraries in the package are found at run-time. -->
- <env value="app/native/lib:/usr/lib/qt4/lib" var="LD_LIBRARY_PATH"/>
-</qnx>
diff --git a/platform/bb10/bar/icon.png b/platform/bb10/bar/icon.png
deleted file mode 100644
index 2161402438..0000000000
--- a/platform/bb10/bar/icon.png
+++ /dev/null
Binary files differ
diff --git a/platform/bb10/bbutil.c b/platform/bb10/bbutil.c
deleted file mode 100644
index ab3dcf69b2..0000000000
--- a/platform/bb10/bbutil.c
+++ /dev/null
@@ -1,513 +0,0 @@
-#include <assert.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/keycodes.h>
-#include <time.h>
-
-#include "bbutil.h"
-
-EGLDisplay egl_disp;
-EGLSurface egl_surf;
-
-static EGLConfig egl_conf;
-static EGLContext egl_ctx;
-
-static screen_context_t screen_ctx;
-static screen_window_t screen_win;
-static screen_display_t screen_disp;
-
-
-static void
-bbutil_egl_perror(const char *msg) {
- static const char *errmsg[] = {
- "function succeeded",
- "EGL is not initialized, or could not be initialized, for the specified display",
- "cannot access a requested resource",
- "failed to allocate resources for the requested operation",
- "an unrecognized attribute or attribute value was passed in an attribute list",
- "an EGLConfig argument does not name a valid EGLConfig",
- "an EGLContext argument does not name a valid EGLContext",
- "the current surface of the calling thread is no longer valid",
- "an EGLDisplay argument does not name a valid EGLDisplay",
- "arguments are inconsistent",
- "an EGLNativePixmapType argument does not refer to a valid native pixmap",
- "an EGLNativeWindowType argument does not refer to a valid native window",
- "one or more argument values are invalid",
- "an EGLSurface argument does not name a valid surface configured for rendering",
- "a power management event has occurred",
- };
-
- fprintf(stderr, "%s: %s\n", msg, errmsg[eglGetError() - EGL_SUCCESS]);
-}
-EGLConfig bbutil_choose_config(EGLDisplay egl_disp, enum RENDERING_API api) {
- EGLConfig egl_conf = (EGLConfig)0;
- EGLConfig *egl_configs;
- EGLint egl_num_configs;
- EGLint val;
- EGLBoolean rc;
- EGLint i;
-
- rc = eglGetConfigs(egl_disp, NULL, 0, &egl_num_configs);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglGetConfigs");
- return egl_conf;
- }
- if (egl_num_configs == 0) {
- fprintf(stderr, "eglGetConfigs: could not find a configuration\n");
- return egl_conf;
- }
-
- egl_configs = malloc(egl_num_configs * sizeof(*egl_configs));
- if (egl_configs == NULL) {
- fprintf(stderr, "could not allocate memory for %d EGL configs\n", egl_num_configs);
- return egl_conf;
- }
-
- rc = eglGetConfigs(egl_disp, egl_configs,
- egl_num_configs, &egl_num_configs);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglGetConfigs");
- free(egl_configs);
- return egl_conf;
- }
-
- for (i = 0; i < egl_num_configs; i++) {
- eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_SURFACE_TYPE, &val);
- if (!(val & EGL_WINDOW_BIT)) {
- continue;
- }
-
- eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_RENDERABLE_TYPE, &val);
- if (!(val & api)) {
- continue;
- }
-
- eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_DEPTH_SIZE, &val);
- if ((api & (GL_ES_1|GL_ES_2)) && (val == 0)) {
- continue;
- }
-
- eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_RED_SIZE, &val);
- if (val != 8) {
- continue;
- }
- eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_GREEN_SIZE, &val);
- if (val != 8) {
- continue;
- }
-
- eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_BLUE_SIZE, &val);
- if (val != 8) {
- continue;
- }
-
- eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_BUFFER_SIZE, &val);
- if (val != 32) {
- continue;
- }
-
- egl_conf = egl_configs[i];
- break;
- }
-
- free(egl_configs);
-
- if (egl_conf == (EGLConfig)0) {
- fprintf(stderr, "bbutil_choose_config: could not find a matching configuration\n");
- }
-
- return egl_conf;
-}
-
-int
-bbutil_init_egl(screen_context_t ctx, enum RENDERING_API api) {
- int usage;
- int format = SCREEN_FORMAT_RGBX8888;
- int nbuffers = 2;
- EGLint interval = 1;
- int rc;
- EGLint attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
-
- if (api == GL_ES_1) {
- usage = SCREEN_USAGE_OPENGL_ES1 | SCREEN_USAGE_ROTATION;
- } else if (api == GL_ES_2) {
- usage = SCREEN_USAGE_OPENGL_ES2 | SCREEN_USAGE_ROTATION;
- } else if (api == VG) {
- usage = SCREEN_USAGE_OPENVG | SCREEN_USAGE_ROTATION;
- } else {
- fprintf(stderr, "invalid api setting\n");
- return EXIT_FAILURE;
- }
-
- //Simple egl initialization
- screen_ctx = ctx;
-
- egl_disp = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (egl_disp == EGL_NO_DISPLAY) {
- bbutil_egl_perror("eglGetDisplay");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = eglInitialize(egl_disp, NULL, NULL);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglInitialize");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- if ((api == GL_ES_1) || (api == GL_ES_2)) {
- rc = eglBindAPI(EGL_OPENGL_ES_API);
- } else if (api == VG) {
- rc = eglBindAPI(EGL_OPENVG_API);
- }
-
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglBindApi");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- egl_conf = bbutil_choose_config(egl_disp, api);
- if (egl_conf == (EGLConfig)0) {
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- if (api == GL_ES_2) {
- egl_ctx = eglCreateContext(egl_disp, egl_conf, EGL_NO_CONTEXT, attributes);
- } else {
- egl_ctx = eglCreateContext(egl_disp, egl_conf, EGL_NO_CONTEXT, NULL);
- }
-
- if (egl_ctx == EGL_NO_CONTEXT) {
- bbutil_egl_perror("eglCreateContext");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = screen_create_window(&screen_win, screen_ctx);
- if (rc) {
- perror("screen_create_window");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_FORMAT, &format);
- if (rc) {
- perror("screen_set_window_property_iv(SCREEN_PROPERTY_FORMAT)");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_USAGE, &usage);
- if (rc) {
- perror("screen_set_window_property_iv(SCREEN_PROPERTY_USAGE)");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = screen_get_window_property_pv(screen_win, SCREEN_PROPERTY_DISPLAY, (void **)&screen_disp);
- if (rc) {
- perror("screen_get_window_property_pv");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- int screen_resolution[2];
-
- rc = screen_get_display_property_iv(screen_disp, SCREEN_PROPERTY_SIZE, screen_resolution);
- if (rc) {
- perror("screen_get_display_property_iv");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- int angle = atoi(getenv("ORIENTATION"));
-
- screen_display_mode_t screen_mode;
- rc = screen_get_display_property_pv(screen_disp, SCREEN_PROPERTY_MODE, (void**)&screen_mode);
- if (rc) {
- perror("screen_get_display_property_pv");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- int size[2];
- rc = screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size);
- if (rc) {
- perror("screen_get_window_property_iv");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- int buffer_size[2] = {size[0], size[1]};
-
- if ((angle == 0) || (angle == 180)) {
- if (((screen_mode.width > screen_mode.height) && (size[0] < size[1])) ||
- ((screen_mode.width < screen_mode.height) && (size[0] > size[1]))) {
- buffer_size[1] = size[0];
- buffer_size[0] = size[1];
- }
- } else if ((angle == 90) || (angle == 270)){
- if (((screen_mode.width > screen_mode.height) && (size[0] > size[1])) ||
- ((screen_mode.width < screen_mode.height && size[0] < size[1]))) {
- buffer_size[1] = size[0];
- buffer_size[0] = size[1];
- }
- } else {
- fprintf(stderr, "Navigator returned an unexpected orientation angle.\n");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, buffer_size);
- if (rc) {
- perror("screen_set_window_property_iv");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &angle);
- if (rc) {
- perror("screen_set_window_property_iv");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = screen_create_window_buffers(screen_win, nbuffers);
- if (rc) {
- perror("screen_create_window_buffers");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = screen_create_window_group(screen_win, get_window_group_id());
- if (rc) {
- perror("screen_create_window_group");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
- /* if (screen_create_window_group(screen_win, get_window_group_id()) != 0) goto fail; */
-
- int idle_mode = SCREEN_IDLE_MODE_KEEP_AWAKE;
- screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_IDLE_MODE, &idle_mode);
-
- egl_surf = eglCreateWindowSurface(egl_disp, egl_conf, screen_win, NULL);
- if (egl_surf == EGL_NO_SURFACE) {
- bbutil_egl_perror("eglCreateWindowSurface");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = eglMakeCurrent(egl_disp, egl_surf, egl_surf, egl_ctx);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglMakeCurrent");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- rc = eglSwapInterval(egl_disp, interval);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglSwapInterval");
- bbutil_terminate();
- return EXIT_FAILURE;
- }
-
- return EXIT_SUCCESS;
-}
-
-int
-bbutil_init_gl2d() {
-#if 0
- EGLint surface_width, surface_height;
-
- if ((egl_disp == EGL_NO_DISPLAY) || (egl_surf == EGL_NO_SURFACE) ){
- return EXIT_FAILURE;
- }
-
- eglQuerySurface(egl_disp, egl_surf, EGL_WIDTH, &surface_width);
- eglQuerySurface(egl_disp, egl_surf, EGL_HEIGHT, &surface_height);
-
- glShadeModel(GL_SMOOTH);
-
- glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
-
- glViewport(0, 0, surface_width, surface_height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- glOrthof(0.0f, (float)(surface_width) / (float)(surface_height), 0.0f, 1.0f, -1.0f, 1.0f);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-#endif
-
- return EXIT_SUCCESS;
-}
-
-int
-bbutil_init(screen_context_t ctx, enum RENDERING_API api) {
- if (EXIT_SUCCESS != bbutil_init_egl(ctx, api)) {
- return EXIT_FAILURE;
- }
-
- if ((GL_ES_1 == api) && (EXIT_SUCCESS != bbutil_init_gl2d())) {
- return EXIT_FAILURE;
- }
-
- return EXIT_SUCCESS;
-}
-
-int bbutil_is_flipped() {
-
- int ret;
- screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_FLIP, &ret);
- return ret;
-};
-
-int bbutil_get_rotation() {
-
- int ret;
- screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &ret);
- return ret;
-};
-
-
-void
-bbutil_terminate() {
- //Typical EGL cleanup
- if (egl_disp != EGL_NO_DISPLAY) {
- eglMakeCurrent(egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
- if (egl_surf != EGL_NO_SURFACE) {
- eglDestroySurface(egl_disp, egl_surf);
- egl_surf = EGL_NO_SURFACE;
- }
- if (egl_ctx != EGL_NO_CONTEXT) {
- eglDestroyContext(egl_disp, egl_ctx);
- egl_ctx = EGL_NO_CONTEXT;
- }
- if (screen_win != NULL) {
- screen_destroy_window(screen_win);
- screen_win = NULL;
- }
- eglTerminate(egl_disp);
- egl_disp = EGL_NO_DISPLAY;
- }
- eglReleaseThread();
-}
-
-void
-bbutil_swap() {
- int rc = eglSwapBuffers(egl_disp, egl_surf);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglSwapBuffers");
- }
-}
-
-void
-bbutil_clear() {
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-char *
-get_window_group_id()
-{
- static char s_window_group_id[16] = "";
-
- if (s_window_group_id[0] == '\0') {
- snprintf(s_window_group_id, sizeof(s_window_group_id), "%d", getpid());
- }
-
- return s_window_group_id;
-}
-
-
-int bbutil_rotate_screen_surface(int angle) {
- int rc, rotation, skip = 1, temp;
- EGLint interval = 1;
- int size[2];
-
- if ((angle != 0) && (angle != 90) && (angle != 180) && (angle != 270)) {
- fprintf(stderr, "Invalid angle\n");
- return EXIT_FAILURE;
- }
-
- rc = screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &rotation);
- if (rc) {
- perror("screen_set_window_property_iv");
- return EXIT_FAILURE;
- }
-
- rc = screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size);
- if (rc) {
- perror("screen_set_window_property_iv");
- return EXIT_FAILURE;
- }
-
- switch (angle - rotation) {
- case -270:
- case -90:
- case 90:
- case 270:
- temp = size[0];
- size[0] = size[1];
- size[1] = temp;
- skip = 0;
- break;
- }
-
- if (!skip) {
- rc = eglMakeCurrent(egl_disp, NULL, NULL, NULL);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglMakeCurrent");
- return EXIT_FAILURE;
- }
-
- rc = eglDestroySurface(egl_disp, egl_surf);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglMakeCurrent");
- return EXIT_FAILURE;
- }
-
- rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_SOURCE_SIZE, size);
- if (rc) {
- perror("screen_set_window_property_iv");
- return EXIT_FAILURE;
- }
-
- rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size);
- if (rc) {
- perror("screen_set_window_property_iv");
- return EXIT_FAILURE;
- }
- egl_surf = eglCreateWindowSurface(egl_disp, egl_conf, screen_win, NULL);
- if (egl_surf == EGL_NO_SURFACE) {
- bbutil_egl_perror("eglCreateWindowSurface");
- return EXIT_FAILURE;
- }
-
- rc = eglMakeCurrent(egl_disp, egl_surf, egl_surf, egl_ctx);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglMakeCurrent");
- return EXIT_FAILURE;
- }
-
- rc = eglSwapInterval(egl_disp, interval);
- if (rc != EGL_TRUE) {
- bbutil_egl_perror("eglSwapInterval");
- return EXIT_FAILURE;
- }
- }
-
- rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &angle);
- if (rc) {
- perror("screen_set_window_property_iv");
- return EXIT_FAILURE;
- }
-
- return EXIT_SUCCESS;
-}
-
diff --git a/platform/bb10/bbutil.h b/platform/bb10/bbutil.h
deleted file mode 100644
index 77f4402fbd..0000000000
--- a/platform/bb10/bbutil.h
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef _UTILITY_H_INCLUDED
-#define _UTILITY_H_INCLUDED
-
-#include <EGL/egl.h>
-#include <GLES2/gl2.h>
-#include <screen/screen.h>
-#include <sys/platform.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern EGLDisplay egl_disp;
-extern EGLSurface egl_surf;
-
-enum RENDERING_API {
- GL_ES_1 = EGL_OPENGL_ES_BIT,
- GL_ES_2 = EGL_OPENGL_ES2_BIT,
- VG = EGL_OPENVG_BIT
-};
-
-/**
- * Initializes EGL, GL and loads a default font
- *
- * \param libscreen context that will be used for EGL setup
- * \return EXIT_SUCCESS if initialization succeeded otherwise EXIT_FAILURE
- */
-int bbutil_init(screen_context_t ctx, enum RENDERING_API api);
-
-/**
- * Initializes EGL
- *
- * \param libscreen context that will be used for EGL setup
- * \return EXIT_SUCCESS if initialization succeeded otherwise EXIT_FAILURE
- */
-int bbutil_init_egl(screen_context_t ctx, enum RENDERING_API api);
-
-/**
- * Initializes GL 1.1 for simple 2D rendering. GL2 initialization will be added at a later point.
- *
- * \return EXIT_SUCCESS if initialization succeeded otherwise EXIT_FAILURE
- */
-int bbutil_init_gl2d();
-
-int bbutil_is_flipped();
-int bbutil_get_rotation();
-
-char *get_window_group_id();
-
-int bbutil_rotate_screen_surface(int angle);
-
-/**
- * Terminates EGL
- */
-void bbutil_terminate();
-
-/**
- * Swaps default bbutil window surface to the screen
- */
-void bbutil_swap();
-
-/**
- * Clears the screen of any existing text.
- * NOTE: must be called after a successful return from bbutil_init() or bbutil_init_egl() call
- */
-void bbutil_clear();
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif
diff --git a/platform/bb10/detect.py b/platform/bb10/detect.py
deleted file mode 100644
index d3ee9f0124..0000000000
--- a/platform/bb10/detect.py
+++ /dev/null
@@ -1,92 +0,0 @@
-import os
-import sys
-import string
-import methods
-
-
-def is_active():
- return True
-
-
-def get_name():
- return "BlackBerry 10"
-
-
-def can_build():
-
- import os
- if (not os.environ.has_key("QNX_TARGET")):
- return False
- return True
-
-
-def get_opts():
-
- return [
- ('QNX_HOST', 'path to qnx host', os.environ.get("QNX_HOST", 0)),
- ('QNX_TARGET', 'path to qnx target', os.environ.get("QNX_TARGET", 0)),
- ('QNX_CONFIGURATION', 'path to qnx configuration', os.environ.get("QNX_CONFIGURATION", 0)),
- ('qnx_target', 'Qnx target (armle or x86', 'armle'),
- ('bb10_payment_service', 'Enable Payment Service for BlackBerry10', 'yes'),
- ('bb10_lgles_override', 'Force legacy GLES (1.1) on iOS', 'no'),
- ('bb10_exceptions', 'Use exceptions when compiling on bb10', 'no'),
- ]
-
-
-def get_flags():
-
- return [
- ('tools', 'no'),
- ('module_theora_enabled', 'no'),
- ]
-
-
-def configure(env):
-
- if env['PLATFORM'] == 'win32':
- env.Tool('mingw')
- env['SPAWN'] = methods.win32_spawn
-
- env['qnx_target_ver'] = env['qnx_target']
- if env['qnx_target'] == "armle":
- env['qnx_prefix'] = 'ntoarmv7'
- env['qnx_target_ver'] = 'armle-v7'
- else:
- env['qnx_prefix'] = 'ntox86'
-
- env['OBJSUFFIX'] = ".qnx.${qnx_target}.o"
- env['LIBSUFFIX'] = ".qnx.${qnx_target}.a"
- env['PROGSUFFIX'] = ".qnx.${qnx_target}"
- print("PROGSUFFIX: " + env['PROGSUFFIX'] + " target: " + env['qnx_target'])
-
- env.PrependENVPath('PATH', env['QNX_CONFIGURATION'] + '/bin')
- env.PrependENVPath('PATH', env['QNX_CONFIGURATION'] + '/usr/bin')
- env['ENV']['QNX_HOST'] = env['QNX_HOST']
- env['ENV']['QNX_TARGET'] = env['QNX_TARGET']
- env['ENV']['QNX_CONFIGURATION'] = env['QNX_CONFIGURATION']
-
- env['CC'] = '$qnx_prefix-gcc'
- env['CXX'] = '$qnx_prefix-g++'
- env['AR'] = '$qnx_prefix-ar'
- env['RANLIB'] = '$qnx_prefix-ranlib'
-
- env.Append(CPPPATH=['#platform/bb10'])
- env.Append(LIBPATH=['#platform/bb10/lib/$qnx_target', '#platform/bb10/lib/$qnx_target_ver'])
- env.Append(CCFLAGS=string.split('-DBB10_ENABLED -DUNIX_ENABLED -DGLES2_ENABLED -DGLES1_ENABLED -D_LITTLE_ENDIAN -DNO_THREADS -DNO_FCNTL'))
- if env['bb10_exceptions'] == "yes":
- env.Append(CCFLAGS=['-fexceptions'])
- else:
- env.Append(CCFLAGS=['-fno-exceptions'])
-
- # env.Append(LINKFLAGS = string.split()
-
- if (env["target"] == "release"):
-
- env.Append(CCFLAGS=['-O3', '-DRELEASE_BUILD'])
-
- elif (env["target"] == "debug"):
-
- env.Append(CCFLAGS=['-g', '-O0', '-DDEBUG_ENABLED', '-D_DEBUG'])
- env.Append(LINKFLAGS=['-g'])
-
- env.Append(LIBS=['bps', 'pps', 'screen', 'socket', 'EGL', 'GLESv2', 'GLESv1_CM', 'm', 'asound'])
diff --git a/platform/bb10/export/export.cpp b/platform/bb10/export/export.cpp
deleted file mode 100644
index b620cea230..0000000000
--- a/platform/bb10/export/export.cpp
+++ /dev/null
@@ -1,829 +0,0 @@
-/*************************************************************************/
-/* export.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include "export.h"
-#include "editor/editor_export.h"
-#include "editor/editor_node.h"
-#include "editor/editor_settings.h"
-#include "global_config.h"
-#include "io/marshalls.h"
-#include "io/xml_parser.h"
-#include "io/zip_io.h"
-#include "os/file_access.h"
-#include "os/os.h"
-#include "platform/bb10/logo.h"
-#include "version.h"
-
-#define MAX_DEVICES 5
-#if 0
-class EditorExportPlatformBB10 : public EditorExportPlatform {
-
- GDCLASS( EditorExportPlatformBB10,EditorExportPlatform );
-
- String custom_package;
-
- int version_code;
- String version_name;
- String package;
- String name;
- String category;
- String description;
- String author_name;
- String author_id;
- String icon;
-
-
-
- struct Device {
-
- int index;
- String name;
- String description;
- };
-
- Vector<Device> devices;
- bool devices_changed;
- Mutex *device_lock;
- Thread *device_thread;
- Ref<ImageTexture> logo;
-
- volatile bool quit_request;
-
-
- static void _device_poll_thread(void *ud);
-
- void _fix_descriptor(Vector<uint8_t>& p_manifest);
-protected:
-
- bool _set(const StringName& p_name, const Variant& p_value);
- bool _get(const StringName& p_name,Variant &r_ret) const;
- void _get_property_list( List<PropertyInfo> *p_list) const;
-
-public:
-
- virtual String get_name() const { return "BlackBerry 10"; }
- virtual ImageCompression get_image_compression() const { return IMAGE_COMPRESSION_ETC1; }
- virtual Ref<Texture> get_logo() const { return logo; }
-
-
- virtual bool poll_devices();
- virtual int get_device_count() const;
- virtual String get_device_name(int p_device) const;
- virtual String get_device_info(int p_device) const;
- virtual Error run(int p_device,int p_flags=0);
-
- virtual bool requires_password(bool p_debug) const { return !p_debug; }
- virtual String get_binary_extension() const { return "bar"; }
- virtual Error export_project(const String& p_path,bool p_debug,int p_flags=0);
-
- virtual bool can_export(String *r_error=NULL) const;
-
- EditorExportPlatformBB10();
- ~EditorExportPlatformBB10();
-};
-
-bool EditorExportPlatformBB10::_set(const StringName& p_name, const Variant& p_value) {
-
- String n=p_name;
-
- if (n=="version/code")
- version_code=p_value;
- else if (n=="version/name")
- version_name=p_value;
- else if (n=="package/unique_name")
- package=p_value;
- else if (n=="package/category")
- category=p_value;
- else if (n=="package/name")
- name=p_value;
- else if (n=="package/description")
- description=p_value;
- else if (n=="package/icon")
- icon=p_value;
- else if (n=="package/custom_template")
- custom_package=p_value;
- else if (n=="release/author")
- author_name=p_value;
- else if (n=="release/author_id")
- author_id=p_value;
- else
- return false;
-
- return true;
-}
-
-bool EditorExportPlatformBB10::_get(const StringName& p_name,Variant &r_ret) const{
-
- String n=p_name;
-
- if (n=="version/code")
- r_ret=version_code;
- else if (n=="version/name")
- r_ret=version_name;
- else if (n=="package/unique_name")
- r_ret=package;
- else if (n=="package/category")
- r_ret=category;
- else if (n=="package/name")
- r_ret=name;
- else if (n=="package/description")
- r_ret=description;
- else if (n=="package/icon")
- r_ret=icon;
- else if (n=="package/custom_template")
- r_ret=custom_package;
- else if (n=="release/author")
- r_ret=author_name;
- else if (n=="release/author_id")
- r_ret=author_id;
- else
- return false;
-
- return true;
-}
-void EditorExportPlatformBB10::_get_property_list( List<PropertyInfo> *p_list) const{
-
- p_list->push_back( PropertyInfo( Variant::INT, "version/code", PROPERTY_HINT_RANGE,"1,65535,1"));
- p_list->push_back( PropertyInfo( Variant::STRING, "version/name") );
- p_list->push_back( PropertyInfo( Variant::STRING, "package/unique_name") );
- p_list->push_back( PropertyInfo( Variant::STRING, "package/category") );
- p_list->push_back( PropertyInfo( Variant::STRING, "package/name") );
- p_list->push_back( PropertyInfo( Variant::STRING, "package/description",PROPERTY_HINT_MULTILINE_TEXT) );
- p_list->push_back( PropertyInfo( Variant::STRING, "package/icon",PROPERTY_HINT_FILE,"png") );
- p_list->push_back( PropertyInfo( Variant::STRING, "package/custom_template", PROPERTY_HINT_GLOBAL_FILE,"zip"));
- p_list->push_back( PropertyInfo( Variant::STRING, "release/author") );
- p_list->push_back( PropertyInfo( Variant::STRING, "release/author_id") );
-
- //p_list->push_back( PropertyInfo( Variant::INT, "resources/pack_mode", PROPERTY_HINT_ENUM,"Copy,Single Exec.,Pack (.pck),Bundles (Optical)"));
-
-}
-
-void EditorExportPlatformBB10::_fix_descriptor(Vector<uint8_t>& p_descriptor) {
-
- String fpath = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp_bar-settings.xml");
- {
- FileAccessRef f = FileAccess::open(fpath,FileAccess::WRITE);
- f->store_buffer(p_descriptor.ptr(),p_descriptor.size());
- }
-
- Ref<XMLParser> parser = memnew( XMLParser );
- Error err = parser->open(fpath);
- ERR_FAIL_COND(err!=OK);
-
- String txt;
- err = parser->read();
- Vector<String> depth;
-
- while(err!=ERR_FILE_EOF) {
-
- ERR_FAIL_COND(err!=OK);
-
- switch(parser->get_node_type()) {
-
- case XMLParser::NODE_NONE: {
- print_line("???");
- } break;
- case XMLParser::NODE_ELEMENT: {
- String e="<";
- e+=parser->get_node_name();
- for(int i=0;i<parser->get_attribute_count();i++) {
- e+=" ";
- e+=parser->get_attribute_name(i)+"=\"";
- e+=parser->get_attribute_value(i)+"\" ";
- }
-
-
-
- if (parser->is_empty()) {
- e+="/";
- } else {
- depth.push_back(parser->get_node_name());
- }
-
- e+=">";
- txt+=e;
-
- } break;
- case XMLParser::NODE_ELEMENT_END: {
-
- txt+="</"+parser->get_node_name()+">";
- if (depth.size() && depth[depth.size()-1]==parser->get_node_name()) {
- depth.resize(depth.size()-1);
- }
-
-
- } break;
- case XMLParser::NODE_TEXT: {
- if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="id") {
-
- txt+=package;
- } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="name") {
-
- String aname;
- if (this->name!="") {
- aname=this->name;
- } else {
- aname = GlobalConfig::get_singleton()->get("application/name");
-
- }
-
- if (aname=="") {
- aname=_MKSTR(VERSION_NAME);
- }
-
- txt+=aname;
-
- } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="versionNumber") {
- txt+=itos(version_code);
- } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="description") {
- txt+=description;
- } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="author") {
- txt+=author_name;
- } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="authorId") {
- txt+=author_id;
- } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="category") {
- txt+=category;
- } else {
- txt+=parser->get_node_data();
- }
- } break;
- case XMLParser::NODE_COMMENT: {
- txt+="<!--"+parser->get_node_name()+"-->";
- } break;
- case XMLParser::NODE_CDATA: {
- //ignore
- //print_line("cdata");
- } break;
- case XMLParser::NODE_UNKNOWN: {
- //ignore
- txt+="<"+parser->get_node_name()+">";
- } break;
- }
-
- err = parser->read();
- }
-
-
- CharString cs = txt.utf8();
- p_descriptor.resize(cs.length());
- for(int i=0;i<cs.length();i++)
- p_descriptor[i]=cs[i];
-
-}
-
-
-
-Error EditorExportPlatformBB10::export_project(const String& p_path, bool p_debug, int p_flags) {
-
-
- EditorProgress ep("export","Exporting for BlackBerry 10",104);
-
- String src_template=custom_package;
-
- if (src_template=="") {
- String err;
- src_template = find_export_template("bb10.zip", &err);
- if (src_template=="") {
- EditorNode::add_io_error(err);
- return ERR_FILE_NOT_FOUND;
- }
- }
-
- FileAccess *src_f=NULL;
- zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
-
- ep.step("Creating FileSystem for BAR",0);
-
- unzFile pkg = unzOpen2(src_template.utf8().get_data(), &io);
- if (!pkg) {
-
- EditorNode::add_io_error("Could not find template zip to export:\n"+src_template);
- return ERR_FILE_NOT_FOUND;
- }
-
- DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
- da->change_dir(EditorSettings::get_singleton()->get_settings_path());
-
-
- if (da->change_dir("tmp")!=OK) {
- da->make_dir("tmp");
- if (da->change_dir("tmp")!=OK)
- return ERR_CANT_CREATE;
- }
-
- if (da->change_dir("bb10_export")!=OK) {
- da->make_dir("bb10_export");
- if (da->change_dir("bb10_export")!=OK) {
- return ERR_CANT_CREATE;
- }
- }
-
-
- String bar_dir = da->get_current_dir();
- if (bar_dir.ends_with("/")) {
- bar_dir=bar_dir.substr(0,bar_dir.length()-1);
- }
-
- //THIS IS SUPER, SUPER DANGEROUS!!!!
- //CAREFUL WITH THIS CODE, MIGHT DELETE USERS HARD DRIVE OR HOME DIR
- //EXTRA CHECKS ARE IN PLACE EVERYWERE TO MAKE SURE NOTHING BAD HAPPENS BUT STILL....
- //BE SUPER CAREFUL WITH THIS PLEASE!!!
- //BLACKBERRY THIS IS YOUR FAULT FOR NOT MAKING A BETTER WAY!!
-
- bool berr = bar_dir.ends_with("bb10_export");
- if (berr) {
- if (da->list_dir_begin()) {
- EditorNode::add_io_error("Can't ensure that dir is empty:\n"+bar_dir);
- ERR_FAIL_COND_V(berr,FAILED);
- };
-
- String f = da->get_next();
- while (f != "") {
-
- if (f == "." || f == "..") {
- f = da->get_next();
- continue;
- };
- Error err = da->remove(bar_dir + "/" + f);
- if (err != OK) {
- EditorNode::add_io_error("Can't ensure that dir is empty:\n"+bar_dir);
- ERR_FAIL_COND_V(err!=OK,err);
- };
- f = da->get_next();
- };
-
- da->list_dir_end();
-
- } else {
- print_line("ARE YOU CRAZY??? THIS IS A SERIOUS BUG HERE!!!");
- ERR_FAIL_V(ERR_OMFG_THIS_IS_VERY_VERY_BAD);
- }
-
-
- ERR_FAIL_COND_V(!pkg, ERR_CANT_OPEN);
- int ret = unzGoToFirstFile(pkg);
-
-
-
- while(ret==UNZ_OK) {
-
- //get filename
- unz_file_info info;
- char fname[16384];
- ret = unzGetCurrentFileInfo(pkg,&info,fname,16384,NULL,0,NULL,0);
-
- String file=fname;
-
- Vector<uint8_t> data;
- data.resize(info.uncompressed_size);
-
- //read
- unzOpenCurrentFile(pkg);
- unzReadCurrentFile(pkg,data.ptr(),data.size());
- unzCloseCurrentFile(pkg);
-
- //write
-
- if (file=="bar-descriptor.xml") {
-
- _fix_descriptor(data);
- }
-
- if (file=="icon.png") {
- bool found=false;
-
- if (this->icon!="" && this->icon.ends_with(".png")) {
-
- FileAccess *f = FileAccess::open(this->icon,FileAccess::READ);
- if (f) {
-
- data.resize(f->get_len());
- f->get_buffer(data.ptr(),data.size());
- memdelete(f);
- found=true;
- }
-
- }
-
- if (!found) {
-
- String appicon = GlobalConfig::get_singleton()->get("application/icon");
- if (appicon!="" && appicon.ends_with(".png")) {
- FileAccess*f = FileAccess::open(appicon,FileAccess::READ);
- if (f) {
- data.resize(f->get_len());
- f->get_buffer(data.ptr(),data.size());
- memdelete(f);
- }
- }
- }
- }
-
-
- if (file.find("/")) {
-
- da->make_dir_recursive(file.get_base_dir());
- }
-
- FileAccessRef wf = FileAccess::open(bar_dir.plus_file(file),FileAccess::WRITE);
- wf->store_buffer(data.ptr(),data.size());
-
- ret = unzGoToNextFile(pkg);
- }
-
- ep.step("Adding Files..",2);
-
- FileAccess* dst = FileAccess::open(bar_dir+"/data.pck", FileAccess::WRITE);
- if (!dst) {
- EditorNode::add_io_error("Can't copy executable file to:\n "+p_path);
- return ERR_FILE_CANT_WRITE;
- }
- save_pack(dst, false, 1024);
- dst->close();
- memdelete(dst);
-
- ep.step("Creating BAR Package..",104);
-
- String bb_packager=EditorSettings::get_singleton()->get("export/blackberry/host_tools");
- bb_packager=bb_packager.plus_file("blackberry-nativepackager");
- if (OS::get_singleton()->get_name()=="Windows")
- bb_packager+=".bat";
-
-
- if (!FileAccess::exists(bb_packager)) {
- EditorNode::add_io_error("Can't find packager:\n"+bb_packager);
- return ERR_CANT_OPEN;
- }
-
- List<String> args;
- args.push_back("-package");
- args.push_back(p_path);
- if (p_debug) {
-
- String debug_token=EditorSettings::get_singleton()->get("export/blackberry/debug_token");
- if (!FileAccess::exists(debug_token)) {
- EditorNode::add_io_error("Debug token not found!");
- } else {
- args.push_back("-debugToken");
- args.push_back(debug_token);
- }
- args.push_back("-devMode");
- args.push_back("-configuration");
- args.push_back("Device-Debug");
- } else {
-
- args.push_back("-configuration");
- args.push_back("Device-Release");
- }
- args.push_back(bar_dir.plus_file("bar-descriptor.xml"));
-
- int ec;
-
- Error err = OS::get_singleton()->execute(bb_packager,args,true,NULL,NULL,&ec);
-
- if (err!=OK)
- return err;
- if (ec!=0)
- return ERR_CANT_CREATE;
-
- return OK;
-
-}
-
-bool EditorExportPlatformBB10::poll_devices() {
-
- bool dc=devices_changed;
- devices_changed=false;
- return dc;
-}
-
-int EditorExportPlatformBB10::get_device_count() const {
-
- device_lock->lock();
- int dc=devices.size();
- device_lock->unlock();
-
- return dc;
-
-}
-String EditorExportPlatformBB10::get_device_name(int p_device) const {
-
- ERR_FAIL_INDEX_V(p_device,devices.size(),"");
- device_lock->lock();
- String s=devices[p_device].name;
- device_lock->unlock();
- return s;
-}
-String EditorExportPlatformBB10::get_device_info(int p_device) const {
-
- ERR_FAIL_INDEX_V(p_device,devices.size(),"");
- device_lock->lock();
- String s=devices[p_device].description;
- device_lock->unlock();
- return s;
-}
-
-void EditorExportPlatformBB10::_device_poll_thread(void *ud) {
-
- EditorExportPlatformBB10 *ea=(EditorExportPlatformBB10 *)ud;
-
- while(!ea->quit_request) {
-
- String bb_deploy=EditorSettings::get_singleton()->get("export/blackberry/host_tools");
- bb_deploy=bb_deploy.plus_file("blackberry-deploy");
- bool windows = OS::get_singleton()->get_name()=="Windows";
- if (windows)
- bb_deploy+=".bat";
-
- if (FileAccess::exists(bb_deploy)) {
-
- Vector<Device> devices;
-
-
- for (int i=0;i<MAX_DEVICES;i++) {
-
- String host = EditorSettings::get_singleton()->get("export/blackberry/device_"+itos(i+1)+"/host");
- if (host==String())
- continue;
- String pass = EditorSettings::get_singleton()->get("export/blackberry/device_"+itos(i+1)+"/password");
- if (pass==String())
- continue;
-
- List<String> args;
- args.push_back("-listDeviceInfo");
- args.push_back(host);
- args.push_back("-password");
- args.push_back(pass);
-
-
- int ec;
- String dp;
-
- Error err = OS::get_singleton()->execute(bb_deploy,args,true,NULL,&dp,&ec);
-
- if (err==OK && ec==0) {
-
- Device dev;
- dev.index=i;
- String descr;
- Vector<String> ls=dp.split("\n");
-
- for(int i=0;i<ls.size();i++) {
-
- String l = ls[i].strip_edges();
- if (l.begins_with("modelfullname::")) {
- dev.name=l.get_slice("::",1);
- descr+="Model: "+dev.name+"\n";
- }
- if (l.begins_with("modelnumber::")) {
- String s = l.get_slice("::",1);
- dev.name+=" ("+s+")";
- descr+="Model Number: "+s+"\n";
- }
- if (l.begins_with("scmbundle::"))
- descr+="OS Version: "+l.get_slice("::",1)+"\n";
- if (l.begins_with("[n]debug_token_expiration::"))
- descr+="Debug Token Expires:: "+l.get_slice("::",1)+"\n";
-
- }
-
- dev.description=descr;
- devices.push_back(dev);
- }
-
- }
-
- bool changed=false;
-
-
- ea->device_lock->lock();
-
- if (ea->devices.size()!=devices.size()) {
- changed=true;
- } else {
-
- for(int i=0;i<ea->devices.size();i++) {
-
- if (ea->devices[i].index!=devices[i].index) {
- changed=true;
- break;
- }
- }
- }
-
- if (changed) {
-
- ea->devices=devices;
- ea->devices_changed=true;
- }
-
- ea->device_lock->unlock();
- }
-
-
- uint64_t wait = 3000000;
- uint64_t time = OS::get_singleton()->get_ticks_usec();
- while(OS::get_singleton()->get_ticks_usec() - time < wait ) {
- OS::get_singleton()->delay_usec(1000);
- if (ea->quit_request)
- break;
- }
- }
-
-}
-
-Error EditorExportPlatformBB10::run(int p_device, int p_flags) {
-
- ERR_FAIL_INDEX_V(p_device,devices.size(),ERR_INVALID_PARAMETER);
-
- String bb_deploy=EditorSettings::get_singleton()->get("export/blackberry/host_tools");
- bb_deploy=bb_deploy.plus_file("blackberry-deploy");
- if (OS::get_singleton()->get_name()=="Windows")
- bb_deploy+=".bat";
-
- if (!FileAccess::exists(bb_deploy)) {
- EditorNode::add_io_error("Blackberry Deploy not found:\n"+bb_deploy);
- return ERR_FILE_NOT_FOUND;
- }
-
-
- device_lock->lock();
-
-
- EditorProgress ep("run","Running on "+devices[p_device].name,3);
-
- //export_temp
- ep.step("Exporting APK",0);
-
- String export_to=EditorSettings::get_singleton()->get_settings_path().plus_file("/tmp/tmpexport.bar");
- Error err = export_project(export_to,true,p_flags);
- if (err) {
- device_lock->unlock();
- return err;
- }
-#if 0
- ep.step("Uninstalling..",1);
-
- print_line("Uninstalling previous version: "+devices[p_device].name);
- List<String> args;
- args.push_back("-s");
- args.push_back(devices[p_device].id);
- args.push_back("uninstall");
- args.push_back(package);
- int rv;
- err = OS::get_singleton()->execute(adb,args,true,NULL,NULL,&rv);
-
- if (err || rv!=0) {
- EditorNode::add_io_error("Could not install to device.");
- device_lock->unlock();
- return ERR_CANT_CREATE;
- }
-
- print_line("Installing into device (please wait..): "+devices[p_device].name);
-
-#endif
- ep.step("Installing to Device (please wait..)..",2);
-
- List<String> args;
- args.clear();
- args.push_back("-installApp");
- args.push_back("-launchApp");
- args.push_back("-device");
- String host = EditorSettings::get_singleton()->get("export/blackberry/device_"+itos(p_device+1)+"/host");
- String pass = EditorSettings::get_singleton()->get("export/blackberry/device_"+itos(p_device+1)+"/password");
- args.push_back(host);
- args.push_back("-password");
- args.push_back(pass);
- args.push_back(export_to);
-
- int rv;
- err = OS::get_singleton()->execute(bb_deploy,args,true,NULL,NULL,&rv);
- if (err || rv!=0) {
- EditorNode::add_io_error("Could not install to device.");
- device_lock->unlock();
- return ERR_CANT_CREATE;
- }
-
- device_lock->unlock();
- return OK;
-
-
-}
-
-
-EditorExportPlatformBB10::EditorExportPlatformBB10() {
-
- version_code=1;
- version_name="1.0";
- package="com.godot.noname";
- category="core.games";
- name="";
- author_name="Cert. Name";
- author_id="Cert. ID";
- description="Game made with Godot Engine";
-
- device_lock = Mutex::create();
- quit_request=false;
-
- device_thread=Thread::create(_device_poll_thread,this);
- devices_changed=true;
-
- Image img( _bb10_logo );
- logo = Ref<ImageTexture>( memnew( ImageTexture ));
- logo->create_from_image(img);
-}
-
-bool EditorExportPlatformBB10::can_export(String *r_error) const {
-
- bool valid=true;
- String bb_deploy=EditorSettings::get_singleton()->get("export/blackberry/host_tools");
- String err;
-
- if (!FileAccess::exists(bb_deploy.plus_file("blackberry-deploy"))) {
-
- valid=false;
- err+="Blackberry host tools not configured in editor settings.\n";
- }
-
- if (!exists_export_template("bb10.zip")) {
- valid=false;
- err+="No export template found.\nDownload and install export templates.\n";
- }
-
- String debug_token=EditorSettings::get_singleton()->get("export/blackberry/debug_token");
-
- if (!FileAccess::exists(debug_token)) {
- valid=false;
- err+="No debug token set, will not be able to test on device.\n";
- }
-
-
- if (custom_package!="" && !FileAccess::exists(custom_package)) {
- valid=false;
- err+="Custom release package not found.\n";
- }
-
- if (r_error)
- *r_error=err;
-
- return valid;
-}
-
-
-EditorExportPlatformBB10::~EditorExportPlatformBB10() {
-
- quit_request=true;
- Thread::wait_to_finish(device_thread);
- memdelete(device_lock);
- memdelete(device_thread);
-}
-
-#endif
-void register_bb10_exporter() {
-#if 0
- EDITOR_DEF("export/blackberry/host_tools","");
- EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"export/blackberry/host_tools",PROPERTY_HINT_GLOBAL_DIR));
- EDITOR_DEF("export/blackberry/debug_token","");
- EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"export/blackberry/debug_token",PROPERTY_HINT_GLOBAL_FILE,"bar"));
- EDITOR_DEF("export/blackberry/device_1/host","");
- EDITOR_DEF("export/blackberry/device_1/password","");
- EDITOR_DEF("export/blackberry/device_2/host","");
- EDITOR_DEF("export/blackberry/device_2/password","");
- EDITOR_DEF("export/blackberry/device_3/host","");
- EDITOR_DEF("export/blackberry/device_3/password","");
- EDITOR_DEF("export/blackberry/device_4/host","");
- EDITOR_DEF("export/blackberry/device_4/password","");
- EDITOR_DEF("export/blackberry/device_5/host","");
- EDITOR_DEF("export/blackberry/device_5/password","");
-
- Ref<EditorExportPlatformBB10> exporter = Ref<EditorExportPlatformBB10>( memnew(EditorExportPlatformBB10) );
- EditorImportExport::get_singleton()->add_export_platform(exporter);
-
-#endif
-}
diff --git a/platform/bb10/export/export.h b/platform/bb10/export/export.h
deleted file mode 100644
index 7939754bfa..0000000000
--- a/platform/bb10/export/export.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*************************************************************************/
-/* export.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-void register_bb10_exporter();
diff --git a/platform/bb10/godot_bb10.cpp b/platform/bb10/godot_bb10.cpp
deleted file mode 100644
index 4d382ddd15..0000000000
--- a/platform/bb10/godot_bb10.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*************************************************************************/
-/* godot_bb10.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include "main/main.h"
-#include "os_bb10.h"
-
-#include <unistd.h>
-
-int main(int argc, char *argv[]) {
-
- OSBB10 os;
-
- Error err = Main::setup(argv[0], argc - 1, &argv[1]);
- if (err != OK)
- return 255;
-
- if (Main::start())
- os.run(); // it is actually the OS that decides how to run
- Main::cleanup();
-
- return os.get_exit_code();
-}
diff --git a/platform/bb10/logo.png b/platform/bb10/logo.png
deleted file mode 100644
index abf0d2cc69..0000000000
--- a/platform/bb10/logo.png
+++ /dev/null
Binary files differ
diff --git a/platform/bb10/os_bb10.cpp b/platform/bb10/os_bb10.cpp
deleted file mode 100644
index b571d1640c..0000000000
--- a/platform/bb10/os_bb10.cpp
+++ /dev/null
@@ -1,608 +0,0 @@
-/*************************************************************************/
-/* os_bb10.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include "os_bb10.h"
-
-#include "bbutil.h"
-#include "core/global_config.h"
-#include "core/os/dir_access.h"
-#include "core/os/keyboard.h"
-#include "drivers/gles2/rasterizer_gles2.h"
-#include "main/main.h"
-#include "servers/visual/visual_server_raster.h"
-
-#include <assert.h>
-#include <bps/accelerometer.h>
-#include <bps/audiodevice.h>
-#include <bps/bps.h>
-#include <bps/navigator.h>
-#include <bps/orientation.h>
-#include <bps/screen.h>
-#include <bps/virtualkeyboard.h>
-#include <stdbool.h>
-#include <stdlib.h>
-
-#ifdef BB10_SCORELOOP_ENABLED
-#include "modules/scoreloop/scoreloop_bb10.h"
-#endif
-
-static char launch_dir[512];
-char *launch_dir_ptr;
-
-int OSBB10::get_video_driver_count() const {
-
- return 1;
-}
-const char *OSBB10::get_video_driver_name(int p_driver) const {
-
- return "GLES2";
-}
-
-OS::VideoMode OSBB10::get_default_video_mode() const {
-
- return OS::VideoMode();
-}
-
-int OSBB10::get_audio_driver_count() const {
-
- return 1;
-}
-const char *OSBB10::get_audio_driver_name(int p_driver) const {
-
- return "BB10";
-}
-
-void OSBB10::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
-
- data_dir = getenv("HOME");
-
- //Create a screen context that will be used to create an EGL surface to to receive libscreen events
- screen_create_context(&screen_cxt, 0);
-
- //Initialize BPS library
- bps_initialize();
-
- //Use utility code to initialize EGL for 2D rendering with GL ES 1.1
- enum RENDERING_API api = GL_ES_2;
-#ifdef BB10_LGLES_OVERRIDE
- api = GL_ES_1;
-#endif
- if (EXIT_SUCCESS != bbutil_init(screen_cxt, api)) {
- bbutil_terminate();
- screen_destroy_context(screen_cxt);
- return;
- };
-
- EGLint surface_width, surface_height;
-
- eglQuerySurface(egl_disp, egl_surf, EGL_WIDTH, &surface_width);
- eglQuerySurface(egl_disp, egl_surf, EGL_HEIGHT, &surface_height);
- printf("screen size: %ix%i\n", surface_width, surface_height);
- VideoMode mode;
- mode.width = surface_width;
- mode.height = surface_height;
- mode.fullscreen = true;
- mode.resizable = false;
- set_video_mode(mode);
-
- //Signal BPS library that navigator and screen events will be requested
- screen_request_events(screen_cxt);
- navigator_request_events(0);
- virtualkeyboard_request_events(0);
- audiodevice_request_events(0);
-
-#ifdef DEBUG_ENABLED
- bps_set_verbosity(3);
-#endif
-
- accel_supported = accelerometer_is_supported();
- if (accel_supported)
- accelerometer_set_update_frequency(FREQ_40_HZ);
- pitch = 0;
- roll = 0;
-
-#ifdef BB10_LGLES_OVERRIDE
- rasterizer = memnew(RasterizerGLES1(false));
-#else
- rasterizer = memnew(RasterizerGLES2(false, false));
-#endif
-
- visual_server = memnew(VisualServerRaster(rasterizer));
- visual_server->init();
- visual_server->cursor_set_visible(false, 0);
-
- audio_driver = memnew(AudioDriverBB10);
- audio_driver->set_singleton();
- audio_driver->init(NULL);
-
- physics_server = memnew(PhysicsServerSW);
- physics_server->init();
- physics_2d_server = memnew(Physics2DServerSW);
- physics_2d_server->init();
-
- input = memnew(InputDefault);
-
- power_manager = memnew(PowerBB10);
-
-#ifdef PAYMENT_SERVICE_ENABLED
- payment_service = memnew(PaymentService);
- Globals::get_singleton()->add_singleton(Globals::Singleton("InAppStore", payment_service));
-#endif
-}
-
-void OSBB10::set_main_loop(MainLoop *p_main_loop) {
-
- input->set_main_loop(p_main_loop);
- main_loop = p_main_loop;
-}
-
-void OSBB10::delete_main_loop() {
-
- memdelete(main_loop);
- main_loop = NULL;
-}
-
-void OSBB10::finalize() {
-
- if (main_loop)
- memdelete(main_loop);
- main_loop = NULL;
-
- /*
- if (debugger_connection_console) {
- memdelete(debugger_connection_console);
- }
- */
-
- visual_server->finish();
- memdelete(visual_server);
- memdelete(rasterizer);
-
- physics_server->finish();
- memdelete(physics_server);
-
- physics_2d_server->finish();
- memdelete(physics_2d_server);
-
-#ifdef PAYMENT_SERVICE_ENABLED
- memdelete(payment_service);
-#endif
-
- memdelete(input);
-
- bbutil_terminate();
- screen_destroy_context(screen_cxt);
-
- bps_shutdown();
-}
-
-void OSBB10::set_mouse_show(bool p_show) {
-
- //android has no mouse...
-}
-
-void OSBB10::set_mouse_grab(bool p_grab) {
-
- //it really has no mouse...!
-}
-
-bool OSBB10::is_mouse_grab_enabled() const {
-
- //*sigh* technology has evolved so much since i was a kid..
- return false;
-}
-Point2 OSBB10::get_mouse_position() const {
-
- return Point2();
-}
-int OSBB10::get_mouse_button_state() const {
-
- return 0;
-}
-void OSBB10::set_window_title(const String &p_title) {
-}
-
-//interesting byt not yet
-//void set_clipboard(const String& p_text);
-//String get_clipboard() const;
-
-void OSBB10::set_video_mode(const VideoMode &p_video_mode, int p_screen) {
-
- default_videomode = p_video_mode;
-}
-
-OS::VideoMode OSBB10::get_video_mode(int p_screen) const {
-
- return default_videomode;
-}
-void OSBB10::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) const {
-
- p_list->push_back(default_videomode);
-}
-
-String OSBB10::get_name() {
-
- return "BlackBerry 10";
-}
-
-MainLoop *OSBB10::get_main_loop() const {
-
- return main_loop;
-}
-
-bool OSBB10::can_draw() const {
-
- return !minimized;
-}
-
-void OSBB10::set_cursor_shape(CursorShape p_shape) {
-
- //android really really really has no mouse.. how amazing..
-}
-
-void OSBB10::handle_screen_event(bps_event_t *event) {
-
- screen_event_t screen_event = screen_event_get_event(event);
-
- int screen_val;
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TYPE, &screen_val);
-
- int pos[2];
-
- switch (screen_val) {
- case SCREEN_EVENT_MTOUCH_TOUCH:
- case SCREEN_EVENT_MTOUCH_RELEASE: {
-
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_POSITION, pos);
-
- InputEvent ievent;
- ievent.type = InputEvent::SCREEN_TOUCH;
- ievent.device = 0;
- ievent.screen_touch.pressed = (screen_val == SCREEN_EVENT_MTOUCH_TOUCH);
- ievent.screen_touch.x = pos[0];
- ievent.screen_touch.y = pos[1];
- Point2 mpos(ievent.screen_touch.x, ievent.screen_touch.y);
-
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TOUCH_ID, &pos[0]);
- ievent.screen_touch.index = pos[0];
-
- last_touch_x[pos[0]] = ievent.screen_touch.x;
- last_touch_y[pos[0]] = ievent.screen_touch.y;
-
- input->parse_input_event(ievent);
-
- if (ievent.screen_touch.index == 0) {
-
- InputEvent ievent;
- ievent.type = InputEvent::MOUSE_BUTTON;
- ievent.device = 0;
- ievent.mouse_button.pressed = (screen_val == SCREEN_EVENT_MTOUCH_TOUCH);
- ievent.mouse_button.button_index = BUTTON_LEFT;
- ievent.mouse_button.doubleclick = 0;
- ievent.mouse_button.x = ievent.mouse_button.global_x = mpos.x;
- ievent.mouse_button.y = ievent.mouse_button.global_y = mpos.y;
- input->parse_input_event(ievent);
- };
-
- } break;
- case SCREEN_EVENT_MTOUCH_MOVE: {
-
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_POSITION, pos);
-
- InputEvent ievent;
- ievent.type = InputEvent::SCREEN_DRAG;
- ievent.device = 0;
- ievent.screen_drag.x = pos[0];
- ievent.screen_drag.y = pos[1];
-
- /*
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_SOURCE_POSITION, pos);
- ievent.screen_drag.relative_x = ievent.screen_drag.x - pos[0];
- ievent.screen_drag.relative_y = ievent.screen_drag.y - pos[1];
- */
-
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TOUCH_ID, &pos[0]);
- ievent.screen_drag.index = pos[0];
-
- ievent.screen_drag.relative_x = ievent.screen_drag.x - last_touch_x[ievent.screen_drag.index];
- ievent.screen_drag.relative_y = ievent.screen_drag.y - last_touch_y[ievent.screen_drag.index];
-
- last_touch_x[ievent.screen_drag.index] = ievent.screen_drag.x;
- last_touch_y[ievent.screen_drag.index] = ievent.screen_drag.y;
-
- Point2 mpos(ievent.screen_drag.x, ievent.screen_drag.y);
- Point2 mrel(ievent.screen_drag.relative_x, ievent.screen_drag.relative_y);
-
- input->parse_input_event(ievent);
-
- if (ievent.screen_touch.index == 0) {
-
- InputEvent ievent;
- ievent.type = InputEvent::MOUSE_MOTION;
- ievent.device = 0;
- ievent.mouse_motion.x = ievent.mouse_motion.global_x = mpos.x;
- ievent.mouse_motion.y = ievent.mouse_motion.global_y = mpos.y;
- input->set_mouse_position(Point2(ievent.mouse_motion.x, ievent.mouse_motion.y));
- ievent.mouse_motion.speed_x = input->get_last_mouse_speed().x;
- ievent.mouse_motion.speed_y = input->get_last_mouse_speed().y;
- ievent.mouse_motion.relative_x = mrel.x;
- ievent.mouse_motion.relative_y = mrel.y;
- ievent.mouse_motion.button_mask = 1; // pressed
-
- input->parse_input_event(ievent);
- };
- } break;
-
- case SCREEN_EVENT_KEYBOARD: {
-
- InputEvent ievent;
- ievent.type = InputEvent::KEY;
- ievent.device = 0;
- int val = 0;
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_SCAN, &val);
- ievent.key.scancode = val;
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_SYM, &val);
- ievent.key.unicode = val;
- if (val == 61448) {
- ievent.key.scancode = KEY_BACKSPACE;
- ievent.key.unicode = KEY_BACKSPACE;
- };
- if (val == 61453) {
- ievent.key.scancode = KEY_ENTER;
- ievent.key.unicode = KEY_ENTER;
- };
-
- int flags;
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_FLAGS, &flags);
- ievent.key.pressed = flags & 1; // bit 1 is pressed apparently
-
- int mod;
- screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_MODIFIERS, &mod);
-
- input->parse_input_event(ievent);
- } break;
-
- default:
- break;
- }
-};
-
-void OSBB10::handle_accelerometer() {
-
- if (!accel_supported)
- return;
-
- if (!fullscreen)
- return;
-
- double force_x, force_y, force_z;
- accelerometer_read_forces(&force_x, &force_y, &force_z);
- Vector3 accel = Vector3(force_x, flip_accelerometer ? force_y : -force_y, force_z);
- input->set_accelerometer(accel);
- // rotate 90 degrees
- //input->set_accelerometer(Vector3(force_y, flip_accelerometer?force_x:(-force_x), force_z));
-};
-
-void OSBB10::_resize(bps_event_t *event) {
-
- int angle = navigator_event_get_orientation_angle(event);
- bbutil_rotate_screen_surface(angle);
-
- EGLint surface_width, surface_height;
- eglQuerySurface(egl_disp, egl_surf, EGL_WIDTH, &surface_width);
- eglQuerySurface(egl_disp, egl_surf, EGL_HEIGHT, &surface_height);
-
- VideoMode mode;
- mode.width = surface_width;
- mode.height = surface_height;
- mode.fullscreen = true;
- mode.resizable = false;
- set_video_mode(mode);
-};
-
-void OSBB10::process_events() {
-
- handle_accelerometer();
-
- bps_event_t *event = NULL;
-
- do {
- int rc = bps_get_event(&event, 0);
- assert(rc == BPS_SUCCESS);
-
- if (!event) break;
-
-#ifdef BB10_SCORELOOP_ENABLED
- ScoreloopBB10 *sc = Globals::get_singleton()->get_singleton_object("Scoreloop")->cast_to<ScoreloopBB10>();
- if (sc->handle_event(event))
- continue;
-#endif
-
-#ifdef PAYMENT_SERVICE_ENABLED
- if (payment_service->handle_event(event))
- continue;
-#endif
-
- int domain = bps_event_get_domain(event);
- if (domain == screen_get_domain()) {
-
- handle_screen_event(event);
-
- } else if (domain == navigator_get_domain()) {
-
- if (NAVIGATOR_EXIT == bps_event_get_code(event)) {
- if (main_loop)
- main_loop->notification(MainLoop::NOTIFICATION_WM_QUIT_REQUEST);
- bps_event_destroy(event);
- exit(0);
- return;
- /*
- } else if (bps_event_get_code(event) == NAVIGATOR_ORIENTATION_CHECK) {
-
- int angle = navigator_event_get_orientation_angle(event);
- navigator_orientation_check_response(event, false);
-
- } else if (bps_event_get_code(event) == NAVIGATOR_ORIENTATION) {
-
- _resize(event);
- */
- } else if (bps_event_get_code(event) == NAVIGATOR_WINDOW_STATE) {
-
- int state = navigator_event_get_window_state(event);
- bool was_fullscreen = fullscreen;
- minimized = state == NAVIGATOR_WINDOW_INVISIBLE;
- fullscreen = state == NAVIGATOR_WINDOW_FULLSCREEN;
- set_low_processor_usage_mode(!fullscreen);
- if (fullscreen != was_fullscreen) {
- if (fullscreen) {
- audio_server->set_fx_global_volume_scale(fullscreen_mixer_volume);
- audio_server->set_stream_global_volume_scale(fullscreen_stream_volume);
- } else {
- fullscreen_mixer_volume = audio_server->get_fx_global_volume_scale();
- fullscreen_stream_volume = audio_server->get_stream_global_volume_scale();
- audio_server->set_fx_global_volume_scale(0);
- audio_server->set_stream_global_volume_scale(0);
- };
- };
- };
- } else if (domain == audiodevice_get_domain()) {
-
- const char *audiodevice_path = audiodevice_event_get_path(event);
- printf("************* got audiodevice event, path %s\n", audiodevice_path);
- audio_driver->finish();
- audio_driver->init(audiodevice_path);
- audio_driver->start();
- };
-
- //bps_event_destroy(event);
- } while (event);
-};
-
-bool OSBB10::has_virtual_keyboard() const {
-
- return true;
-};
-
-void OSBB10::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect) {
-
- virtualkeyboard_show();
-};
-
-void OSBB10::hide_virtual_keyboard() {
-
- virtualkeyboard_hide();
-};
-
-void OSBB10::run() {
-
- if (!main_loop)
- return;
-
- main_loop->init();
-
- int flip = bbutil_is_flipped();
- int rot = bbutil_get_rotation();
- flip_accelerometer = rot == 90;
- printf("**************** rot is %i, flip %i\n", rot, (int)flip_accelerometer);
- /*
- orientation_direction_t orientation;
- int angle;
- orientation_get(&orientation, &angle);
- printf("******************** orientation %i, %i, %i\n", orientation, ORIENTATION_BOTTOM_UP, ORIENTATION_TOP_UP);
- if (orientation == ORIENTATION_BOTTOM_UP) {
- flip_accelerometer = true;
- };
- */
-
- while (true) {
-
- process_events(); // get rid of pending events
- if (Main::iteration() == true)
- break;
- bbutil_swap();
- //#ifdef DEBUG_ENABLED
- fflush(stdout);
- //#endif
- };
-
- main_loop->finish();
-};
-
-bool OSBB10::has_touchscreen_ui_hint() const {
-
- return true;
-}
-
-Error OSBB10::shell_open(String p_uri) {
-
- char *msg = NULL;
- int ret = navigator_invoke(p_uri.utf8().get_data(), &msg);
-
- return ret == BPS_SUCCESS ? OK : FAILED;
-};
-
-String OSBB10::get_data_dir() const {
-
- return data_dir;
-};
-
-Size2 OSBB10::get_window_size() const {
- return Vector2(default_videomode.width, default_videomode.height);
-}
-
-PowerState OSBB10::get_power_state() {
- return power_manager->get_power_state();
-}
-
-int OSBB10::get_power_seconds_left() {
- return power_manager->get_power_seconds_left();
-}
-
-int OSBB10::get_power_percent_left() {
- return power_manager->get_power_percent_left();
-}
-
-OSBB10::OSBB10() {
-
- main_loop = NULL;
- minimized = false;
- fullscreen = true;
- flip_accelerometer = true;
- fullscreen_mixer_volume = 1;
- fullscreen_stream_volume = 1;
-
- printf("godot bb10!\n");
- getcwd(launch_dir, sizeof(launch_dir));
- printf("launch dir %s\n", launch_dir);
- chdir("app/native");
- launch_dir_ptr = launch_dir;
-}
-
-OSBB10::~OSBB10() {
-}
diff --git a/platform/bb10/os_bb10.h b/platform/bb10/os_bb10.h
deleted file mode 100644
index 91149b6f68..0000000000
--- a/platform/bb10/os_bb10.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*************************************************************************/
-/* os_bb10.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#ifndef OS_BB10_H
-#define OS_BB10_H
-
-#include "audio_driver_bb10.h"
-#include "drivers/unix/os_unix.h"
-#include "main/input_default.h"
-#include "os/input.h"
-#include "os/main_loop.h"
-#include "payment_service.h"
-#include "power_bb10.h"
-#include "servers/audio_server.h"
-#include "servers/physics/physics_server_sw.h"
-#include "servers/physics_2d/physics_2d_server_sw.h"
-#include "servers/visual/rasterizer.h"
-
-#include <bps/event.h>
-#include <screen/screen.h>
-#include <stdint.h>
-#include <sys/platform.h>
-
-class OSBB10 : public OS_Unix {
-
- screen_context_t screen_cxt;
- float fullscreen_mixer_volume;
- float fullscreen_stream_volume;
-
- Rasterizer *rasterizer;
- VisualServer *visual_server;
- PhysicsServer *physics_server;
- Physics2DServer *physics_2d_server;
- AudioDriverBB10 *audio_driver;
- PowerBB10 *power_manager;
-
-#ifdef PAYMENT_SERVICE_ENABLED
- PaymentService *payment_service;
-#endif
-
- VideoMode default_videomode;
- MainLoop *main_loop;
-
- void process_events();
-
- void _resize(bps_event_t *event);
- void handle_screen_event(bps_event_t *event);
- void handle_accelerometer();
-
- int last_touch_x[16];
- int last_touch_y[16];
-
- bool accel_supported;
- float pitch;
- float roll;
-
- bool minimized;
- bool fullscreen;
- bool flip_accelerometer;
- String data_dir;
-
- InputDefault *input;
-
-public:
- // functions used by main to initialize/deintialize the OS
- virtual int get_video_driver_count() const;
- virtual const char *get_video_driver_name(int p_driver) const;
-
- virtual VideoMode get_default_video_mode() const;
-
- virtual String get_data_dir() const;
-
- virtual int get_audio_driver_count() const;
- virtual const char *get_audio_driver_name(int p_driver) const;
-
- virtual void initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
-
- virtual void set_main_loop(MainLoop *p_main_loop);
- virtual void delete_main_loop();
-
- virtual void finalize();
-
- typedef int64_t ProcessID;
-
- static OS *get_singleton();
-
- virtual void set_mouse_show(bool p_show);
- virtual void set_mouse_grab(bool p_grab);
- virtual bool is_mouse_grab_enabled() const;
- virtual Point2 get_mouse_position() const;
- virtual int get_mouse_button_state() const;
- virtual void set_window_title(const String &p_title);
-
- //virtual void set_clipboard(const String& p_text);
- //virtual String get_clipboard() const;
-
- virtual bool has_virtual_keyboard() const;
- virtual void show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect);
- virtual void hide_virtual_keyboard();
-
- virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0);
- virtual VideoMode get_video_mode(int p_screen = 0) const;
- virtual void get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen = 0) const;
-
- virtual Size2 get_window_size() const;
- virtual String get_name();
- virtual MainLoop *get_main_loop() const;
-
- virtual bool can_draw() const;
-
- virtual void set_cursor_shape(CursorShape p_shape);
-
- virtual bool has_touchscreen_ui_hint() const;
-
- virtual Error shell_open(String p_uri);
-
- void run();
-
- virtual PowerState get_power_state();
- virtual int get_power_seconds_left();
- virtual int get_power_percent_left();
-
- OSBB10();
- ~OSBB10();
-};
-
-#endif
diff --git a/platform/bb10/payment_service.cpp b/platform/bb10/payment_service.cpp
deleted file mode 100644
index 353845583f..0000000000
--- a/platform/bb10/payment_service.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*************************************************************************/
-/* payment_service.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#ifdef PAYMENT_SERVICE_ENABLED
-
-#include "payment_service.h"
-
-#include "bbutil.h"
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-extern char *launch_dir_ptr;
-
-void PaymentService::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("request_product_info"), &PaymentService::request_product_info);
- ClassDB::bind_method(D_METHOD("purchase"), &PaymentService::purchase);
-
- ClassDB::bind_method(D_METHOD("get_pending_event_count"), &PaymentService::get_pending_event_count);
- ClassDB::bind_method(D_METHOD("pop_pending_event"), &PaymentService::pop_pending_event);
-};
-
-Error PaymentService::request_product_info(Variant p_params) {
-
- return ERR_UNAVAILABLE;
-};
-
-Error PaymentService::purchase(Variant p_params) {
-
- Dictionary params = p_params;
- ERR_FAIL_COND_V((!params.has("product_id")) && (!params.has("product_sku")), ERR_INVALID_PARAMETER);
-
- char *id = NULL;
- char *sku = NULL;
-
- CharString p_id = params.has("product_id") ? String(params["product_id"]).ascii() : CharString();
- CharString p_sku = params.has("product_sku") ? String(params["product_sku"]).ascii() : CharString();
- unsigned int request_id;
- chdir(launch_dir_ptr);
- int ret = paymentservice_purchase_request(params.has("product_sku") ? NULL : p_id.get_data(),
- params.has("product_sku") ? p_sku.get_data() : NULL,
- NULL, NULL, NULL, NULL, get_window_group_id(), &request_id);
- chdir("app/native");
-
- if (ret != BPS_SUCCESS) {
- int eret = errno;
- printf("purchase error %i, %x, %i, %x\n", ret, ret, eret, eret);
- ERR_FAIL_V((Error)eret);
- return (Error)eret;
- };
- return OK;
-};
-
-bool PaymentService::handle_event(bps_event_t *p_event) {
-
- if (bps_event_get_domain(p_event) != paymentservice_get_domain()) {
- return false;
- };
-
- Dictionary dict;
- int res = paymentservice_event_get_response_code(p_event);
- if (res == SUCCESS_RESPONSE) {
- dict["result"] = "ok";
-
- res = bps_event_get_code(p_event);
- if (res == PURCHASE_RESPONSE) {
- dict["type"] = "purchase";
- const char *pid = paymentservice_event_get_digital_good_id(p_event, 0);
- dict["product_id"] = String(pid ? pid : "");
- };
-
- } else {
- const char *desc = paymentservice_event_get_error_text(p_event);
- if (strcmp(desc, "alreadyPurchased") == 0) {
- dict["result"] = "ok";
- } else {
- dict["result"] = "error";
- dict["error_description"] = paymentservice_event_get_error_text(p_event);
- dict["error_code"] = paymentservice_event_get_error_id(p_event);
- printf("error code is %i\n", paymentservice_event_get_error_id(p_event));
- printf("error description is %s\n", paymentservice_event_get_error_text(p_event));
- };
- dict["product_id"] = "";
- };
-
- res = bps_event_get_code(p_event);
- if (res == PURCHASE_RESPONSE) {
- dict["type"] = "purchase";
- };
-
- printf("********** adding event with result %ls\n", String(dict["result"]).c_str());
- pending_events.push_back(dict);
-
- return true;
-};
-
-int PaymentService::get_pending_event_count() {
- return pending_events.size();
-};
-
-Variant PaymentService::pop_pending_event() {
-
- Variant front = pending_events.front()->get();
- pending_events.pop_front();
-
- return front;
-};
-
-PaymentService::PaymentService() {
-
- paymentservice_request_events(0);
-#ifdef DEBUG_ENABLED
- paymentservice_set_connection_mode(true);
-#else
- paymentservice_set_connection_mode(false);
-#endif
-};
-
-PaymentService::~PaymentService(){
-
-};
-
-#endif
diff --git a/platform/bb10/payment_service.h b/platform/bb10/payment_service.h
deleted file mode 100644
index 64dc982ab2..0000000000
--- a/platform/bb10/payment_service.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*************************************************************************/
-/* payment_service.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#ifdef PAYMENT_SERVICE_ENABLED
-
-#ifndef PAYMENT_SERVICE_H
-#define PAYMENT_SERVICE_H
-
-#include <bps/bps.h>
-#include <bps/event.h>
-#include <bps/paymentservice.h>
-
-#include "core/object.h"
-
-class PaymentService : public Object {
-
- GDCLASS(PaymentService, Object);
-
- static void _bind_methods();
-
- List<Variant> pending_events;
-
-public:
- Error request_product_info(Variant p_params);
- Error purchase(Variant p_params);
-
- int get_pending_event_count();
- Variant pop_pending_event();
-
- bool handle_event(bps_event_t *p_event);
-
- PaymentService();
- ~PaymentService();
-};
-
-#endif
-
-#endif
diff --git a/platform/bb10/platform_config.h b/platform/bb10/platform_config.h
deleted file mode 100644
index 48bcadcc29..0000000000
--- a/platform/bb10/platform_config.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*************************************************************************/
-/* platform_config.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include <alloca.h>
diff --git a/platform/bb10/power_bb10.cpp b/platform/bb10/power_bb10.cpp
deleted file mode 100644
index a683b61376..0000000000
--- a/platform/bb10/power_bb10.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*************************************************************************/
-/* power_bb10.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "power_bb10.h"
-
-#include "core/error_macros.h"
-
-bool PowerBB10::UpdatePowerInfo() {
-
- return false;
-}
-
-PowerState PowerBB10::get_power_state() {
- if (UpdatePowerInfo()) {
- return power_state;
- } else {
- WARN_PRINT("Power management is not implemented on this platform, defaulting to POWERSTATE_UNKNOWN");
- return POWERSTATE_UNKNOWN;
- }
-}
-
-int PowerBB10::get_power_seconds_left() {
- if (UpdatePowerInfo()) {
- return nsecs_left;
- } else {
- WARN_PRINT("Power management is not implemented on this platform, defaulting to -1");
- return -1;
- }
-}
-
-int PowerBB10::get_power_percent_left() {
- if (UpdatePowerInfo()) {
- return percent_left;
- } else {
- WARN_PRINT("Power management is not implemented on this platform, defaulting to -1");
- return -1;
- }
-}
-
-PowerBB10::PowerBB10()
- : nsecs_left(-1), percent_left(-1), power_state(POWERSTATE_UNKNOWN) {
-}
-
-PowerBB10::~PowerBB10() {
-}
diff --git a/platform/bb10/power_bb10.h b/platform/bb10/power_bb10.h
deleted file mode 100644
index c5c18d5f69..0000000000
--- a/platform/bb10/power_bb10.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*************************************************************************/
-/* power_bb10.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef PLATFORM_BB10_POWER_BB10_H_
-#define PLATFORM_BB10_POWER_BB10_H_
-
-class PowerBB10 {
-private:
- int nsecs_left;
- int percent_left;
- PowerState power_state;
-
- bool UpdatePowerInfo();
-
-public:
- PowerBB10();
- virtual ~PowerBB10();
-
- PowerState get_power_state();
- int get_power_seconds_left();
- int get_power_percent_left();
-};
-
-#endif /* PLATFORM_BB10_POWER_BB10_H_ */
diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp
index 1cd1991608..dda619a54d 100644
--- a/platform/javascript/os_javascript.cpp
+++ b/platform/javascript/os_javascript.cpp
@@ -517,6 +517,31 @@ void OS_JavaScript::alert(const String &p_alert, const String &p_title) {
/* clang-format on */
}
+static const char *godot2dom_cursor(OS::CursorShape p_shape) {
+
+ switch (p_shape) {
+ case OS::CURSOR_ARROW:
+ default:
+ return "auto";
+ case OS::CURSOR_IBEAM: return "text";
+ case OS::CURSOR_POINTING_HAND: return "pointer";
+ case OS::CURSOR_CROSS: return "crosshair";
+ case OS::CURSOR_WAIT: return "progress";
+ case OS::CURSOR_BUSY: return "wait";
+ case OS::CURSOR_DRAG: return "grab";
+ case OS::CURSOR_CAN_DROP: return "grabbing";
+ case OS::CURSOR_FORBIDDEN: return "no-drop";
+ case OS::CURSOR_VSIZE: return "ns-resize";
+ case OS::CURSOR_HSIZE: return "ew-resize";
+ case OS::CURSOR_BDIAGSIZE: return "nesw-resize";
+ case OS::CURSOR_FDIAGSIZE: return "nwse-resize";
+ case OS::CURSOR_MOVE: return "move";
+ case OS::CURSOR_VSPLIT: return "row-resize";
+ case OS::CURSOR_HSPLIT: return "col-resize";
+ case OS::CURSOR_HELP: return "help";
+ }
+}
+
void OS_JavaScript::set_css_cursor(const char *p_cursor) {
/* clang-format off */
@@ -547,7 +572,7 @@ void OS_JavaScript::set_mouse_mode(OS::MouseMode p_mode) {
if (p_mode == MOUSE_MODE_VISIBLE) {
- set_css_cursor("auto");
+ set_css_cursor(godot2dom_cursor(cursor_shape));
emscripten_exit_pointerlock();
} else if (p_mode == MOUSE_MODE_HIDDEN) {
@@ -561,7 +586,7 @@ void OS_JavaScript::set_mouse_mode(OS::MouseMode p_mode) {
ERR_EXPLAIN("MOUSE_MODE_CAPTURED can only be entered from within an appropriate input callback");
ERR_FAIL_COND(result == EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED);
ERR_FAIL_COND(result != EMSCRIPTEN_RESULT_SUCCESS);
- set_css_cursor("auto");
+ set_css_cursor(godot2dom_cursor(cursor_shape));
}
}
@@ -706,7 +731,11 @@ bool OS_JavaScript::can_draw() const {
void OS_JavaScript::set_cursor_shape(CursorShape p_shape) {
- //javascript really really really has no mouse.. how amazing..
+ ERR_FAIL_INDEX(p_shape, CURSOR_MAX);
+
+ cursor_shape = p_shape;
+ if (get_mouse_mode() != MOUSE_MODE_HIDDEN)
+ set_css_cursor(godot2dom_cursor(cursor_shape));
}
void OS_JavaScript::main_loop_begin() {
diff --git a/platform/javascript/os_javascript.h b/platform/javascript/os_javascript.h
index ffd269b512..2bc603d8d9 100644
--- a/platform/javascript/os_javascript.h
+++ b/platform/javascript/os_javascript.h
@@ -61,6 +61,7 @@ class OS_JavaScript : public OS_Unix {
InputDefault *input;
bool window_maximized;
VideoMode video_mode;
+ CursorShape cursor_shape;
MainLoop *main_loop;
GetDataDirFunc get_data_dir_func;
diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm
index c6c2e6dab1..7a914a88fb 100644
--- a/platform/osx/os_osx.mm
+++ b/platform/osx/os_osx.mm
@@ -788,6 +788,22 @@ static int translateKey(unsigned int key) {
*/
}
+inline void sendScrollEvent(int button, double factor) {
+ InputEvent ev;
+ ev.type = InputEvent::MOUSE_BUTTON;
+ ev.mouse_button.button_index = button;
+ ev.mouse_button.factor = factor;
+ ev.mouse_button.pressed = true;
+ ev.mouse_button.x = mouse_x;
+ ev.mouse_button.y = mouse_y;
+ ev.mouse_button.global_x = mouse_x;
+ ev.mouse_button.global_y = mouse_y;
+ ev.mouse_button.button_mask = button_mask;
+ OS_OSX::singleton->push_input(ev);
+ ev.mouse_button.pressed = false;
+ OS_OSX::singleton->push_input(ev);
+}
+
- (void)scrollWheel:(NSEvent *)event {
double deltaX, deltaY;
@@ -797,48 +813,21 @@ static int translateKey(unsigned int key) {
deltaY = [event scrollingDeltaY];
if ([event hasPreciseScrollingDeltas]) {
- deltaX *= 0.1;
- deltaY *= 0.1;
+ deltaX *= 0.03;
+ deltaY *= 0.03;
}
- } else {
+ } else
+#endif // MAC_OS_X_VERSION_MAX_ALLOWED
+ {
deltaX = [event deltaX];
deltaY = [event deltaY];
}
-#else
- deltaX = [event deltaX];
- deltaY = [event deltaY];
-#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/
-
- if (fabs(deltaY)) {
-
- InputEvent ev;
- ev.type = InputEvent::MOUSE_BUTTON;
- ev.mouse_button.button_index = deltaY > 0 ? BUTTON_WHEEL_UP : BUTTON_WHEEL_DOWN;
- ev.mouse_button.pressed = true;
- ev.mouse_button.x = mouse_x;
- ev.mouse_button.y = mouse_y;
- ev.mouse_button.global_x = mouse_x;
- ev.mouse_button.global_y = mouse_y;
- ev.mouse_button.button_mask = button_mask;
- OS_OSX::singleton->push_input(ev);
- ev.mouse_button.pressed = false;
- OS_OSX::singleton->push_input(ev);
- }
if (fabs(deltaX)) {
-
- InputEvent ev;
- ev.type = InputEvent::MOUSE_BUTTON;
- ev.mouse_button.button_index = deltaX < 0 ? BUTTON_WHEEL_RIGHT : BUTTON_WHEEL_LEFT;
- ev.mouse_button.pressed = true;
- ev.mouse_button.x = mouse_x;
- ev.mouse_button.y = mouse_y;
- ev.mouse_button.global_x = mouse_x;
- ev.mouse_button.global_y = mouse_y;
- ev.mouse_button.button_mask = button_mask;
- OS_OSX::singleton->push_input(ev);
- ev.mouse_button.pressed = false;
- OS_OSX::singleton->push_input(ev);
+ sendScrollEvent(0 > deltaX ? BUTTON_WHEEL_RIGHT : BUTTON_WHEEL_LEFT, fabs(deltaX * 0.3));
+ }
+ if (fabs(deltaY)) {
+ sendScrollEvent(0 < deltaY ? BUTTON_WHEEL_UP : BUTTON_WHEEL_DOWN, fabs(deltaY * 0.3));
}
}
@@ -1630,7 +1619,6 @@ void OS_OSX::process_events() {
void OS_OSX::push_input(const InputEvent &p_event) {
InputEvent ev = p_event;
- //print_line("EV: "+String(ev));
input->parse_input_event(ev);
}
diff --git a/platform/osx/power_osx.cpp b/platform/osx/power_osx.cpp
index 0057fe8acc..2ef1a65ff1 100644
--- a/platform/osx/power_osx.cpp
+++ b/platform/osx/power_osx.cpp
@@ -27,6 +27,32 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
+/*
+Adapted from corresponding SDL 2.0 code.
+*/
+
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
#include "power_osx.h"
#include <CoreFoundation/CoreFoundation.h>
diff --git a/platform/uwp/power_uwp.cpp b/platform/uwp/power_uwp.cpp
index a8f0f5ba6d..ece07f84ad 100644
--- a/platform/uwp/power_uwp.cpp
+++ b/platform/uwp/power_uwp.cpp
@@ -5,7 +5,8 @@
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/power_uwp.h b/platform/uwp/power_uwp.h
index 465473bc1d..c23d712980 100644
--- a/platform/uwp/power_uwp.h
+++ b/platform/uwp/power_uwp.h
@@ -5,7 +5,8 @@
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index 99b6890913..9dee2da21e 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -509,10 +509,13 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (!motion)
return 0;
- if (motion < 0)
+ if (motion < 0) {
mb.button_index = BUTTON_WHEEL_LEFT;
- else
+ mb.factor = fabs((double)motion / (double)WHEEL_DELTA);
+ } else {
mb.button_index = BUTTON_WHEEL_RIGHT;
+ mb.factor = fabs((double)motion / (double)WHEEL_DELTA);
+ }
} break;
/*
case WM_XBUTTONDOWN: {
diff --git a/platform/windows/packet_peer_udp_winsock.cpp b/platform/windows/packet_peer_udp_winsock.cpp
index f69c0bd2ed..f3b91c1b56 100644
--- a/platform/windows/packet_peer_udp_winsock.cpp
+++ b/platform/windows/packet_peer_udp_winsock.cpp
@@ -203,6 +203,8 @@ Error PacketPeerUDPWinsock::_poll(bool p_wait) {
len = sizeof(struct sockaddr_storage);
++queue_count;
+ if (p_wait)
+ break;
};
if (ret == SOCKET_ERROR) {
diff --git a/platform/windows/power_windows.cpp b/platform/windows/power_windows.cpp
index 1d9756f68b..428bc5dcc2 100644
--- a/platform/windows/power_windows.cpp
+++ b/platform/windows/power_windows.cpp
@@ -28,6 +28,31 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+/*
+Adapted from corresponding SDL 2.0 code.
+*/
+
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
#include "power_windows.h"
// CODE CHUNK IMPORTED FROM SDL 2.0
diff --git a/platform/x11/detect.py b/platform/x11/detect.py
index 34306c8d0f..0ba0f68393 100644
--- a/platform/x11/detect.py
+++ b/platform/x11/detect.py
@@ -141,6 +141,15 @@ def configure(env):
env.ParseConfig('pkg-config xrandr --cflags --libs')
if (env['builtin_openssl'] == 'no'):
+ # Currently not compatible with OpenSSL 1.1.0+
+ # https://github.com/godotengine/godot/issues/8624
+ import subprocess
+ openssl_version = subprocess.check_output(['pkg-config', 'openssl', '--modversion']).strip('\n')
+ if (openssl_version >= "1.1.0"):
+ print("Error: Found system-installed OpenSSL %s, currently only supporting version 1.0.x." % openssl_version)
+ print("Aborting.. You can compile with 'builtin_openssl=yes' to use the bundled version.\n")
+ sys.exit(255)
+
env.ParseConfig('pkg-config openssl --cflags --libs')
if (env['builtin_libwebp'] == 'no'):
diff --git a/platform/x11/power_x11.cpp b/platform/x11/power_x11.cpp
index 3454a6313e..093d24f406 100644
--- a/platform/x11/power_x11.cpp
+++ b/platform/x11/power_x11.cpp
@@ -28,6 +28,31 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+/*
+Adapted from corresponding SDL 2.0 code.
+*/
+
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
#include "power_x11.h"
#include <stdio.h>
diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp
index 792861cbf3..0a1a8b56ff 100644
--- a/scene/2d/ray_cast_2d.cpp
+++ b/scene/2d/ray_cast_2d.cpp
@@ -157,16 +157,16 @@ void RayCast2D::_notification(int p_what) {
break;
Transform2D xf;
xf.rotate(cast_to.angle());
- xf.translate(Vector2(0, cast_to.length()));
+ xf.translate(Vector2(cast_to.length(), 0));
//Vector2 tip = Vector2(0,s->get_length());
Color dcol = get_tree()->get_debug_collisions_color(); //0.9,0.2,0.2,0.4);
draw_line(Vector2(), cast_to, dcol, 3);
Vector<Vector2> pts;
float tsize = 4;
- pts.push_back(xf.xform(Vector2(0, tsize)));
- pts.push_back(xf.xform(Vector2(0.707 * tsize, 0)));
- pts.push_back(xf.xform(Vector2(-0.707 * tsize, 0)));
+ pts.push_back(xf.xform(Vector2(tsize, 0)));
+ pts.push_back(xf.xform(Vector2(0, 0.707 * tsize)));
+ pts.push_back(xf.xform(Vector2(0, -0.707 * tsize)));
Vector<Color> cols;
for (int i = 0; i < 3; i++)
cols.push_back(dcol);
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index 0bc48677dd..d5df3bac67 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -962,6 +962,18 @@ void GraphEdit::_gui_input(const InputEvent &p_ev) {
//too difficult to get right
//set_zoom(zoom/ZOOM_SCALE);
}
+ if (b.button_index == BUTTON_WHEEL_UP) {
+ h_scroll->set_value(h_scroll->get_value() - h_scroll->get_page() * b.factor / 8);
+ }
+ if (b.button_index == BUTTON_WHEEL_DOWN) {
+ h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() * b.factor / 8);
+ }
+ if (b.button_index == BUTTON_WHEEL_RIGHT) {
+ v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * b.factor / 8);
+ }
+ if (b.button_index == BUTTON_WHEEL_LEFT) {
+ v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() * b.factor / 8);
+ }
}
if (p_ev.type == InputEvent::KEY && p_ev.key.scancode == KEY_D && p_ev.key.pressed && p_ev.key.mod.command) {
diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp
index 1dc4230d2a..b79104ba39 100644
--- a/scene/gui/item_list.cpp
+++ b/scene/gui/item_list.cpp
@@ -533,10 +533,14 @@ void ItemList::_gui_input(const InputEvent &p_event) {
}
if (p_event.type == InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index == BUTTON_WHEEL_UP && p_event.mouse_button.pressed) {
+ scroll_bar->set_value(scroll_bar->get_value() - scroll_bar->get_page() * p_event.mouse_button.factor / 8);
+
scroll_bar->set_value(scroll_bar->get_value() - scroll_bar->get_page() / 8);
}
if (p_event.type == InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index == BUTTON_WHEEL_DOWN && p_event.mouse_button.pressed) {
+ scroll_bar->set_value(scroll_bar->get_value() + scroll_bar->get_page() * p_event.mouse_button.factor / 8);
+
scroll_bar->set_value(scroll_bar->get_value() + scroll_bar->get_page() / 8);
}
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index 0acb7265e3..8bb6828fa6 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -633,8 +633,8 @@ void LineEdit::_notification(int p_what) {
if (char_ofs >= t.length())
break;
- CharType cchar = pass ? '*' : t[char_ofs];
- CharType next = pass ? '*' : t[char_ofs + 1];
+ CharType cchar = (pass && !text.empty()) ? '*' : t[char_ofs];
+ CharType next = (pass && !text.empty()) ? '*' : t[char_ofs + 1];
int char_width = font->get_char_size(cchar, next).width;
// end of widget, break!
diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp
index 6ac6eac655..9b9dd820b2 100644
--- a/scene/gui/popup_menu.cpp
+++ b/scene/gui/popup_menu.cpp
@@ -273,7 +273,7 @@ void PopupMenu::_gui_input(const InputEvent &p_event) {
Point2 pos = get_position();
int s = (vseparation + font->get_height()) * 3;
- pos.y -= s;
+ pos.y -= (s * b.factor);
set_position(pos);
//update hover
@@ -293,7 +293,7 @@ void PopupMenu::_gui_input(const InputEvent &p_event) {
Point2 pos = get_position();
int s = (vseparation + font->get_height()) * 3;
- pos.y += s;
+ pos.y += (s * b.factor);
set_position(pos);
//update hover
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index e5a17298e4..6e5f218a66 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -780,12 +780,14 @@ void RichTextLabel::_gui_input(InputEvent p_event) {
if (b.button_index == BUTTON_WHEEL_UP) {
if (scroll_active)
- vscroll->set_value(vscroll->get_value() - vscroll->get_page() / 8);
+
+ vscroll->set_value(vscroll->get_value() - vscroll->get_page() * b.factor * 0.5 / 8);
}
if (b.button_index == BUTTON_WHEEL_DOWN) {
if (scroll_active)
- vscroll->set_value(vscroll->get_value() + vscroll->get_page() / 8);
+
+ vscroll->set_value(vscroll->get_value() + vscroll->get_page() * b.factor * 0.5 / 8);
}
} break;
case InputEvent::KEY: {
diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp
index 9146fa9393..a89c2b27c9 100644
--- a/scene/gui/scroll_container.cpp
+++ b/scene/gui/scroll_container.cpp
@@ -85,20 +85,32 @@ void ScrollContainer::_gui_input(const InputEvent &p_gui_input) {
const InputEventMouseButton &mb = p_gui_input.mouse_button;
if (mb.button_index == BUTTON_WHEEL_UP && mb.pressed) {
- if (h_scroll->is_visible_in_tree() && !v_scroll->is_visible_in_tree()) {
- // only horizontal is enabled, scroll horizontally
- h_scroll->set_value(h_scroll->get_value() - h_scroll->get_page() / 8);
+ // only horizontal is enabled, scroll horizontally
+ if (h_scroll->is_visible() && !v_scroll->is_visible()) {
+ h_scroll->set_value(h_scroll->get_value() - h_scroll->get_page() / 8 * mb.factor);
} else if (v_scroll->is_visible_in_tree()) {
- v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() / 8);
+ v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() / 8 * mb.factor);
}
}
if (mb.button_index == BUTTON_WHEEL_DOWN && mb.pressed) {
- if (h_scroll->is_visible_in_tree() && !v_scroll->is_visible_in_tree()) {
- // only horizontal is enabled, scroll horizontally
- h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() / 8);
- } else if (v_scroll->is_visible_in_tree()) {
- v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() / 8);
+ // only horizontal is enabled, scroll horizontally
+ if (h_scroll->is_visible() && !v_scroll->is_visible()) {
+ h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() / 8 * mb.factor);
+ } else if (v_scroll->is_visible()) {
+ v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() / 8 * mb.factor);
+ }
+ }
+
+ if (mb.button_index == BUTTON_WHEEL_LEFT && mb.pressed) {
+ if (h_scroll->is_visible_in_tree()) {
+ h_scroll->set_value(h_scroll->get_value() - h_scroll->get_page() * mb.factor / 8);
+ }
+ }
+
+ if (mb.button_index == BUTTON_WHEEL_RIGHT && mb.pressed) {
+ if (h_scroll->is_visible_in_tree()) {
+ h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() * mb.factor / 8);
}
}
diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp
index ba8ca63721..83d535a2e7 100644
--- a/scene/gui/spin_box.cpp
+++ b/scene/gui/spin_box.cpp
@@ -115,13 +115,15 @@ void SpinBox::_gui_input(const InputEvent &p_event) {
} break;
case BUTTON_WHEEL_UP: {
if (line_edit->has_focus()) {
- set_value(get_value() + get_step());
+
+ set_value(get_value() + get_step() * mb.factor);
accept_event();
}
} break;
case BUTTON_WHEEL_DOWN: {
if (line_edit->has_focus()) {
- set_value(get_value() - get_step());
+
+ set_value(get_value() - get_step() * mb.factor);
accept_event();
}
} break;
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index 3c8545bd75..fb986cfb97 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -334,7 +334,10 @@ void TextEdit::_update_scrollbars() {
v_scroll->show();
v_scroll->set_max(total_rows);
v_scroll->set_page(visible_rows);
- v_scroll->set_value(cursor.line_ofs);
+
+ if (fabs(v_scroll->get_value() - (double)cursor.line_ofs) >= 1) {
+ v_scroll->set_value(cursor.line_ofs);
+ }
} else {
cursor.line_ofs = 0;
@@ -346,7 +349,9 @@ void TextEdit::_update_scrollbars() {
h_scroll->show();
h_scroll->set_max(total_width);
h_scroll->set_page(visible_width);
- h_scroll->set_value(cursor.x_ofs);
+ if (fabs(h_scroll->get_value() - (double)cursor.x_ofs) >= 1) {
+ h_scroll->set_value(cursor.x_ofs);
+ }
} else {
@@ -1480,17 +1485,18 @@ void TextEdit::_gui_input(const InputEvent &p_gui_input) {
}
if (mb.pressed) {
+
if (mb.button_index == BUTTON_WHEEL_UP && !mb.mod.command) {
- v_scroll->set_value(v_scroll->get_value() - 3);
+ v_scroll->set_value(v_scroll->get_value() - (3 * mb.factor));
}
if (mb.button_index == BUTTON_WHEEL_DOWN && !mb.mod.command) {
- v_scroll->set_value(v_scroll->get_value() + 3);
+ v_scroll->set_value(v_scroll->get_value() + (3 * mb.factor));
}
if (mb.button_index == BUTTON_WHEEL_LEFT) {
- h_scroll->set_value(h_scroll->get_value() - 3);
+ h_scroll->set_value(h_scroll->get_value() - (100 * mb.factor));
}
if (mb.button_index == BUTTON_WHEEL_RIGHT) {
- h_scroll->set_value(h_scroll->get_value() + 3);
+ h_scroll->set_value(h_scroll->get_value() + (100 * mb.factor));
}
if (mb.button_index == BUTTON_LEFT) {
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index 6f2d725353..67c97c2e52 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -1518,6 +1518,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool
if (p_doubleclick && (!c.editable || c.mode == TreeItem::CELL_MODE_CUSTOM || c.mode == TreeItem::CELL_MODE_ICON /*|| c.mode==TreeItem::CELL_MODE_CHECK*/)) { //it' s confusing for check
emit_signal("item_activated");
+ incr_search.clear();
return -1;
}
@@ -2071,6 +2072,7 @@ void Tree::_gui_input(InputEvent p_event) {
//bring up editor if possible
if (!edit_selected()) {
emit_signal("item_activated");
+ incr_search.clear();
}
}
accept_event();
@@ -2339,11 +2341,11 @@ void Tree::_gui_input(InputEvent p_event) {
} break;
case BUTTON_WHEEL_UP: {
- v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() / 8);
+ v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() * b.factor / 8);
} break;
case BUTTON_WHEEL_DOWN: {
- v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() / 8);
+ v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * b.factor / 8);
} break;
}
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index cfee5066b4..bf91b109ad 100755
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -463,7 +463,7 @@ Node::PauseMode Node::get_pause_mode() const {
void Node::_propagate_pause_owner(Node *p_owner) {
- if (data.pause_mode != PAUSE_MODE_INHERIT)
+ if (this != p_owner && data.pause_mode != PAUSE_MODE_INHERIT)
return;
data.pause_owner = p_owner;
for (int i = 0; i < data.children.size(); i++) {
diff --git a/servers/physics/gjk_epa.cpp b/servers/physics/gjk_epa.cpp
index 2819aa7ca0..ab2a9b507a 100644
--- a/servers/physics/gjk_epa.cpp
+++ b/servers/physics/gjk_epa.cpp
@@ -34,6 +34,31 @@
/*************** Bullet's GJK-EPA2 IMPLEMENTATION *******************/
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the
+use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+claim that you wrote the original software. If you use this software in a
+product, an acknowledgment in the product documentation would be appreciated
+but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+GJK-EPA collision solver by Nathanael Presson, 2008
+*/
+
// Config
/* GJK */
diff --git a/servers/physics/joints/cone_twist_joint_sw.cpp b/servers/physics/joints/cone_twist_joint_sw.cpp
index d94618fd9f..7e13909592 100644
--- a/servers/physics/joints/cone_twist_joint_sw.cpp
+++ b/servers/physics/joints/cone_twist_joint_sw.cpp
@@ -30,7 +30,23 @@
/*
Adapted to Godot from the Bullet library.
-See corresponding header file for licensing info.
+*/
+
+/*
+Bullet Continuous Collision Detection and Physics Library
+ConeTwistJointSW is Copyright (c) 2007 Starbreeze Studios
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Written by: Marcus Hennix
*/
#include "cone_twist_joint_sw.h"
diff --git a/servers/physics/joints/generic_6dof_joint_sw.cpp b/servers/physics/joints/generic_6dof_joint_sw.cpp
index a1d0360db6..e4349bda9a 100644
--- a/servers/physics/joints/generic_6dof_joint_sw.cpp
+++ b/servers/physics/joints/generic_6dof_joint_sw.cpp
@@ -30,7 +30,28 @@
/*
Adapted to Godot from the Bullet library.
-See corresponding header file for licensing info.
+*/
+
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+2007-09-09
+Generic6DOFJointSW Refactored by Francisco Le?n
+email: projectileman@yahoo.com
+http://gimpact.sf.net
*/
#include "generic_6dof_joint_sw.h"
diff --git a/servers/physics/joints/hinge_joint_sw.cpp b/servers/physics/joints/hinge_joint_sw.cpp
index b63fcaecd1..3938427cea 100644
--- a/servers/physics/joints/hinge_joint_sw.cpp
+++ b/servers/physics/joints/hinge_joint_sw.cpp
@@ -30,7 +30,21 @@
/*
Adapted to Godot from the Bullet library.
-See corresponding header file for licensing info.
+*/
+
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
*/
#include "hinge_joint_sw.h"
diff --git a/servers/physics/joints/pin_joint_sw.cpp b/servers/physics/joints/pin_joint_sw.cpp
index 80a4bd7f44..0792ffeecd 100644
--- a/servers/physics/joints/pin_joint_sw.cpp
+++ b/servers/physics/joints/pin_joint_sw.cpp
@@ -30,7 +30,21 @@
/*
Adapted to Godot from the Bullet library.
-See corresponding header file for licensing info.
+*/
+
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
*/
#include "pin_joint_sw.h"
diff --git a/servers/physics/joints/slider_joint_sw.cpp b/servers/physics/joints/slider_joint_sw.cpp
index ecc4be3b5e..947f46e960 100644
--- a/servers/physics/joints/slider_joint_sw.cpp
+++ b/servers/physics/joints/slider_joint_sw.cpp
@@ -30,7 +30,27 @@
/*
Adapted to Godot from the Bullet library.
-See corresponding header file for licensing info.
+*/
+
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+Added by Roman Ponomarev (rponom@gmail.com)
+April 04, 2008
+
*/
#include "slider_joint_sw.h"
diff --git a/thirdparty/misc/yuv2rgb.h b/thirdparty/misc/yuv2rgb.h
index a9bef76da8..d0c2813a75 100644
--- a/thirdparty/misc/yuv2rgb.h
+++ b/thirdparty/misc/yuv2rgb.h
@@ -1,5 +1,28 @@
/* Thirdparty code presumably from http://wss.co.uk/pinknoise/yuv2rgb/ */
-/* FIXME: Move to thirdparty dir */
+
+/*
+This YUV2RGB code is Copyright (C) 2008-11 Robin Watts
+<theorarm@wss.co.uk>.
+
+The software is released under the BSD license.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+In particular, I warrant absolutely nothing about how patent free
+this method is. It is your responsibility to ensure that this code
+does not infringe any patents that apply in your area before you
+ship it.
+*/
#ifndef YUV2RGB_H
#define YUV2RGB_H