diff options
97 files changed, 812 insertions, 2341 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/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/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..7d7db5ac75 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,11 @@ 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", 5); + set("editors/3d/freelook_acceleration", 10); + set("editors/3d/freelook_max_speed", 100); + set("editors/3d/freelook_modifier_speed_factor", 1.0 / 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..8a8add5611 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -58,20 +58,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 +675,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)); @@ -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) @@ -1344,6 +1279,8 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) { nav_mode = NAVIGATION_ZOOM; + } else { + nav_mode = NAVIGATION_LOOK; } } else if (m.button_mask & 4) { @@ -1453,6 +1390,29 @@ 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) { + cursor.x_rot += m.relative_y / 120.0; + cursor.y_rot += m.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 +1503,75 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { } } +void SpatialEditorViewport::_update_freelook(real_t delta) { + + const Input &input = *Input::get_singleton(); + + if (!input.is_mouse_button_pressed(BUTTON_RIGHT)) + 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 = 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; + + 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; + } + + const EditorSettings &s = *EditorSettings::get_singleton(); + + real_t base_speed = s.get("editors/3d/freelook_base_speed"); + real_t acceleration = s.get("editors/3d/freelook_acceleration"); + real_t max_speed = s.get("editors/3d/freelook_max_speed"); + real_t modifier_speed_factor = s.get("editors/3d/freelook_modifier_speed_factor"); + + if (pressed) { + velocity.normalize(); + freelook_speed += acceleration * delta; + if (freelook_speed > max_speed) + freelook_speed = max_speed; + cursor.pos += velocity * ((freelook_speed * (speed_modifier ? modifier_speed_factor : 1.0) * delta)); + } else { + freelook_speed = base_speed; + } +} + void SpatialEditorViewport::set_message(String p_message, float p_time) { message = p_message; @@ -1579,6 +1608,8 @@ void SpatialEditorViewport::_notification(int p_what) { } */ + _update_freelook(get_tree()->get_idle_process_time()); + _update_camera(); Map<Node *, Object *> &selection = editor_selection->get_selection(); @@ -2204,6 +2235,7 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed previewing = NULL; preview = NULL; gizmo_scale = 1.0; + freelook_speed = 0; selection_menu = memnew(PopupMenu); add_child(selection_menu); @@ -3149,36 +3181,6 @@ 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)); - } - - undo_redo->commit_action(); -#endif -} - void SpatialEditor::_unhandled_key_input(InputEvent p_event) { if (!is_visible_in_tree() || get_viewport()->gui_has_modal_stack()) @@ -3242,8 +3244,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")); @@ -3383,7 +3383,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); @@ -3520,12 +3519,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); diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 4302927426..c7336cef86 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -113,6 +113,7 @@ private: bool transforming; bool orthogonal; float gizmo_scale; + real_t freelook_speed; struct _RayResult { @@ -168,7 +169,8 @@ private: NAVIGATION_NONE, NAVIGATION_PAN, NAVIGATION_ZOOM, - NAVIGATION_ORBIT + NAVIGATION_ORBIT, + NAVIGATION_LOOK }; enum TransformMode { TRANSFORM_NONE, @@ -203,8 +205,6 @@ private: struct Cursor { - Vector3 cursor_pos; - Vector3 pos; float x_rot, y_rot, distance; bool region_select; @@ -227,10 +227,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; @@ -385,7 +387,6 @@ private: }; Button *tool_button[TOOL_MAX]; - Button *instance_button; MenuButton *transform_menu; MenuButton *view_menu; 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/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/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/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/bbutil.c b/platform/bb10/bbutil.c index ab3dcf69b2..6c3c814ab6 100644 --- a/platform/bb10/bbutil.c +++ b/platform/bb10/bbutil.c @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2011-2013 Research In Motion Limited. + * + * 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. + */ + #include <assert.h> #include <ctype.h> #include <stdio.h> diff --git a/platform/bb10/bbutil.h b/platform/bb10/bbutil.h index 77f4402fbd..ff25ddf976 100644 --- a/platform/bb10/bbutil.h +++ b/platform/bb10/bbutil.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2011-2013 Research In Motion Limited. + * + * 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. + */ + #ifndef _UTILITY_H_INCLUDED #define _UTILITY_H_INCLUDED 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/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 |