diff options
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 Binary files differdeleted file mode 100644 index 8d7ea2689e..0000000000 --- a/doc/tools/locales/es/LC_MESSAGES/makedocs.mo +++ /dev/null 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 = { - '"': """, - "'": "'" -} - -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 Binary files differdeleted file mode 100644 index 2161402438..0000000000 --- a/platform/bb10/bar/icon.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index abf0d2cc69..0000000000 --- a/platform/bb10/logo.png +++ /dev/null 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 |