diff options
282 files changed, 4760 insertions, 10552 deletions
diff --git a/.editorconfig b/.editorconfig index e19057f0e8..b7ef43c340 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,6 +5,9 @@ charset = utf-8 end_of_line = lf indent_style = tab +[*.{cpp,hpp,c,h,mm}] +trim_trailing_whitespace = true + [.travis.yml] indent_style = space indent_size = 2 diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt new file mode 100644 index 0000000000..9a525d4f89 --- /dev/null +++ b/COPYRIGHT.txt @@ -0,0 +1,1139 @@ +# Exhaustive licensing information for files in the Godot Engine repository +# ========================================================================= +# +# This file aims at documenting the copyright and license for every source +# file in the Godot Engine repository, and especially outline the files +# whose license differs from the MIT/Expat license used by Godot Engine. +# +# It is written as a machine-readable format following the debian/copyright +# specification. Globbing patterns (e.g. "Files: *") mean that they affect +# all corresponding files (also recursively in subfolders), apart from those +# with a more explicit copyright statement. +# +# Licenses are given with their SPDX identifier, and are all included in +# plain text at the end of this file (in alphabetical order). +# +# Disclaimer for thirdparty libraries: +# ------------------------------------ +# +# Licensing details for thirdparty libraries in the 'thirdparty/' directory +# are given in summarized form, i.e. with only the "main" license described +# in the library's license statement. Different licenses of single files or +# code snippets in thirdparty libraries are not documented here. +# For example: +# Files: ./thirdparty/zlib/ +# Copyright: 1995-2017, Jean-loup Gailly and Mark Adler +# License: Zlib +# The exact copyright for each file in that library *may* differ, and some +# files or code snippets might be distributed under other compatible licenses +# (e.g. a public domain dedication), but as far as Godot Engine is concerned +# the library is considered as a whole under the Zlib license. +# +# Nota: When linking dynamically against thirdparty libraries instead of +# building them into the Godot binary, you may remove the corresponding +# license details from this file. + +----------------------------------------------------------------------- + +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: Godot Engine +Upstream-Contact: Rémi Verschelde <contact@godotengine.org> +Source: https://github.com/godotengine/godot + +Files: * +Copyright: 2007-2017, Juan Linietsky, Ariel Manzur. + 2014-2017, Godot Engine contributors (cf. AUTHORS.md) +License: Expat + +Files: ./icon.png + ./icon.svg + ./logo.png + ./logo.svg +Copyright: Andrea Calabró +License: CC-BY-3.0 + +Files: ./platform/android/android_native_app_glue.c + ./platform/android/android_native_app_glue.h + ./platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl + ./platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml + ./platform/android/java/src/com/android/vending/licensing/* + ./platform/android/java/src/com/google/android/vending/expansion/downloader/* + ./platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java + ./platform/android/java/src/org/godotengine/godot/input/InputManagerV16.java + ./platform/android/java/src/org/godotengine/godot/input/InputManagerV9.java +Copyright: 2008-2013, The Android Open Source Project +License: Apache-2.0 + +Files: ./platform/android/cpu-features.c + ./platform/android/cpu-features.h +Copyright: 2010, The Android Open Source Project +License: BSD-2-clause + +Files: ./platform/android/ifaddrs_android.cpp + ./platform/android/ifaddrs_android.h +Copyright: 2012-2013, Google Inc. +License: BSD-3-clause + +Files: ./platform/android/java/src/com/android/vending/licensing/util/Base64.java + ./platform/android/java/src/com/android/vending/licensing/util/Base64DecoderException.java +Copyright: 2002, Google Inc. +License: Apache-2.0 + +Files: ./platform/android/power_android.cpp + ./platform/osx/power_osx.cpp + ./platform/windows/power_windows.cpp + ./platform/x11/power_x11.cpp +Copyright: 1997-2017, Sam Lantinga + 2007-2017, Juan Linietsky, Ariel Manzur. + 2014-2017, Godot Engine contributors (cf. AUTHORS.md) +License: Expat and Zlib + +Files: ./platform/uwp/export/export.cpp +Copyright: 2016, Facebook, Inc. All rights reserved. + 2007-2017, Juan Linietsky, Ariel Manzur. + 2014-2017, Godot Engine contributors (cf. AUTHORS.md) +License: BSD-3-clause and Expat + +Files: ./servers/physics/gjk_epa.cpp + ./servers/physics/joints/generic_6dof_joint_sw.cpp + ./servers/physics/joints/generic_6dof_joint_sw.h + ./servers/physics/joints/hinge_joint_sw.cpp + ./servers/physics/joints/hinge_joint_sw.h + ./servers/physics/joints/jacobian_entry_sw.h + ./servers/physics/joints/pin_joint_sw.cpp + ./servers/physics/joints/pin_joint_sw.h + ./servers/physics/joints/slider_joint_sw.cpp + ./servers/physics/joints/slider_joint_sw.h +Copyright: 2003-2008, Erwin Coumans + 2007-2017, Juan Linietsky, Ariel Manzur. + 2014-2017, Godot Engine contributors (cf. AUTHORS.md) +License: Expat and Zlib + +Files: ./servers/physics/joints/cone_twist_joint_sw.cpp + ./servers/physics/joints/cone_twist_joint_sw.h +Copyright: 2007, Starbreeze Studios + 2007-2017, Juan Linietsky, Ariel Manzur. + 2014-2017, Godot Engine contributors (cf. AUTHORS.md) +License: Expat and Zlib + +Files: ./thirdparty/b2d_convexdecomp/ +Copyright: 2007, Eric Jordan +Copyright: 2006-2009, Erin Catto +License: Zlib + +Files: ./thirdparty/certs/ca-certificates.crt +Copyright: FIXME +License: FIXME + +Files: ./thirdparty/enet/ +Copyright: 2002-2016, Lee Salzman +License: Expat + +Files: ./thirdparty/fonts/DroidSans*.ttf +Copyright: 2008, The Android Open Source Project +License: Apache-2.0 + +Files: ./thirdparty/fonts/source_code_pro.otf +Copyright: 2010, 2012, Adobe Systems Incorporated +License: OFL-1.1 + +Files: ./thirdparty/freetype/ +Copyright: 1996-2016, David Turner, Robert Wilhelm, and Werner Lemberg. +License: FTL + +Files: ./thirdparty/glad/ +Copyright: 2013, David Herberth +License: Expat + +Files: ./thirdparty/jpeg_compressor/ +Copyright: 2012, Rich Geldreich +License: public-domain + +Files: ./thirdparty/libogg/ +Copyright: 2002, Xiph.org Foundation +License: BSD-3-clause + +Files: ./thirdparty/libpng/ +Copyright: 1995-1996, Guy Eric Schalnat, Group 42, Inc. + 1996-1997, Andreas Dilger + 1998-2016, Glenn Randers-Pehrson +License: Zlib + +Files: ./thirdparty/libsimplewebm/ +Copyright: 2016, Błażej Szczygieł +License: Expat + +Files: ./thirdparty/libsimplewebm/libwebm/ +Copyright: 2010, Google Inc. +License: BSD-3-clause + +Files: ./thirdparty/libtheora/ +Copyright: 2002-2009, Xiph.org Foundation +License: BSD-3-clause + +Files: ./thirdparty/libvorbis/ +Copyright: 2002-2015, Xiph.org Foundation +License: BSD-3-clause + +Files: ./thirdparty/libvpx/ +Copyright: 2010, The WebM Project authors. +License: BSD-3-clause + +Files: ./thirdparty/libwebp/COPYING +Copyright: 2010, Google Inc. +License: BSD-3-clause + +Files: ./thirdparty/minizip/ +Copyright: 1998-2010, Gilles Vollant + 2007-2008, Even Rouault + 2009-2010, Mathias Svensson +License: Zlib + +Files: ./thirdparty/misc/aes256.cpp + ./thirdparty/misc/aes256.h + ./thirdparty/misc/sha256.c + ./thirdparty/misc/sha256.h +Copyright: 2007-2011, Ilya O. Levin +License: ISC + +Files: ./thirdparty/misc/base64.c + ./thirdparty/misc/base64.h +Copyright: Ari Edelkind +License: public-domain + +Files: ./thirdparty/misc/curl_hostcheck.c + ./thirdparty/misc/curl_hostcheck.h +Copyright: 1998-2012, Daniel Stenberg et al. +License: curl + +Files: ./thirdparty/misc/fastlz.c + ./thirdparty/misc/fastlz.h +Copyright: 2005-2007, Ariya Hidayat +License: Expat + +Files: ./thirdparty/misc/hq2x.cpp + ./thirdparty/misc/hq2x.h +Copyright: 2016, Bruno Ribeiro +License: Apache-2.0 + +Files: ./thirdparty/misc/md5.cpp + ./thirdparty/misc/md5.h +Copyright: 1990, RSA Data Security, Inc. +License: RSA-MD + +Files: ./thirdparty/misc/mikktspace.c + ./thirdparty/misc/mikktspace.h +Copyright: 2011, Morten S. Mikkelsen +License: Zlib + +Files: ./thirdparty/misc/pcg.cpp + ./thirdparty/misc/pcg.h +Copyright: 2014, M.E. O'Neill +License: Apache-2.0 + +Files: ./thirdparty/misc/smaz.c + ./thirdparty/misc/smaz.h +Copyright: 2006-2009, Salvatore Sanfilippo +License: BSD-3-clause + +Files: ./thirdparty/misc/stb_truetype.h + ./thirdparty/misc/stb_vorbis.c +Copyright: 2007-2015, Sean Barrett +License: public-domain + +Files: ./thirdparty/misc/triangulator.cpp + ./thirdparty/misc/triangulator.h +Copyright: 2011, Ivan Fratric +License: Expat + +Files: ./thirdparty/misc/yuv2rgb.h +Copyright: 2008-2011, Robin Watts +License: BSD-2-clause + +Files: ./thirdparty/openssl/ +Copyright: 1998-2016, The OpenSSL Project. +License: OpenSSL + +Files: ./thirdparty/opus/ +Copyright: 2001-2011, Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo +License: BSD-3-clause + +Files: ./thirdparty/pvrtccompressor/ +Copyright: 2014, Jeffrey Lim. +License: BSD-3-clause + +Files: ./thirdparty/rg-etc1/ +Copyright: 2012, Rich Geldreich +License: Zlib + +Files: ./thirdparty/rtaudio/ +Copyright: 2001-2016, Gary P. Scavone +License: Expat + +Files: ./thirdparty/squish/ +Copyright: 2006, Simon Brown +License: Expat + +Files: ./thirdparty/zlib/ +Copyright: 1995-2017, Jean-loup Gailly and Mark Adler +License: Zlib + + + +License: Apache-2.0 + 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. + +License: BSD-2-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + . + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + . + Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. Neither the name of the author + nor the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + . + 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 COPYRIGHT HOLDER 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. + +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + . + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + . + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. + +License: CC-BY-3.0 + Creative Commons Attribution 3.0 Unported + . + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION + ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE + INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + ITS USE. + . + License + . + THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE + COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY + COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS + AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + . + BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE + TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY + BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS + CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND + CONDITIONS. + . + 1. Definitions + . + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, derivative + work, arrangement of music or other alterations of a literary or + artistic work, or phonogram or performance and includes cinematographic + adaptations or any other form in which the Work may be recast, + transformed, or adapted including in any form recognizably derived from + the original, except that a work that constitutes a Collection will not + be considered an Adaptation for the purpose of this License. For the + avoidance of doubt, where the Work is a musical work, performance or + phonogram, the synchronization of the Work in timed-relation with a + moving image ("synching") will be considered an Adaptation for the + purpose of this License. + . + b. "Collection" means a collection of literary or artistic works, such + as encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed in + Section 1(f) below, which, by reason of the selection and arrangement of + their contents, constitute intellectual creations, in which the Work is + included in its entirety in unmodified form along with one or more other + contributions, each constituting separate and independent works in + themselves, which together are assembled into a collective whole. A work + that constitutes a Collection will not be considered an Adaptation (as + defined above) for the purposes of this License. + . + c. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or other + transfer of ownership. + . + d. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + . + e. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work or + if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + . + f. "Work" means the literary and/or artistic work offered under the + terms of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, pamphlet + and other writing; a lecture, address, sermon or other work of the same + nature; a dramatic or dramatico-musical work; a choreographic work or + entertainment in dumb show; a musical composition with or without words; + a cinematographic work to which are assimilated works expressed by a + process analogous to cinematography; a work of drawing, painting, + architecture, sculpture, engraving or lithography; a photographic work + to which are assimilated works expressed by a process analogous to + photography; a work of applied art; an illustration, map, plan, sketch + or three-dimensional work relative to geography, topography, + architecture or science; a performance; a broadcast; a phonogram; a + compilation of data to the extent it is protected as a copyrightable + work; or a work performed by a variety or circus performer to the extent + it is not otherwise considered a literary or artistic work. + . + g. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + . + h. "Publicly Perform" means to perform public recitations of the Work + and to communicate to the public those public recitations, by any means + or process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a place + individually chosen by them; to perform the Work to the public by any + means or process and the communication to the public of the performances + of the Work, including by public digital performance; to broadcast and + rebroadcast the Work by any means including signs, sounds or images. + . + i. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + . + 2. Fair Dealing Rights. Nothing in this License is intended to reduce, + limit, or restrict any uses free from copyright or rights arising from + limitations or exceptions that are provided for in connection with the + copyright protection under copyright law or other applicable laws. + . + 3. License Grant. Subject to the terms and conditions of this License, + Licensor hereby grants You a worldwide, royalty-free, non-exclusive, + perpetual (for the duration of the applicable copyright) license to + exercise the rights in the Work as stated below: + . + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + . + b. to create and Reproduce Adaptations provided that any such + Adaptation, including any translation in any medium, takes reasonable + steps to clearly label, demarcate or otherwise identify that changes + were made to the original Work. For example, a translation could be + marked "The original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + . + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + . + d. to Distribute and Publicly Perform Adaptations. + . + e. For the avoidance of doubt: + . + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or compulsory + licensing scheme cannot be waived, the Licensor reserves the exclusive + right to collect such royalties for any exercise by You of the rights + granted under this License; + . + ii. Waivable Compulsory License Schemes. In those jurisdictions in which + the right to collect royalties through any statutory or compulsory + licensing scheme can be waived, the Licensor waives the exclusive right + to collect such royalties for any exercise by You of the rights granted + under this License; and, + . + iii. Voluntary License Schemes. The Licensor waives the right to collect + royalties, whether individually or, in the event that the Licensor is a + member of a collecting society that administers voluntary licensing + schemes, via that society, from any exercise by You of the rights + granted under this License. + . + The above rights may be exercised in all media and formats whether now + known or hereafter devised. The above rights include the right to make + such modifications as are technically necessary to exercise the rights + in other media and formats. Subject to Section 8(f), all rights not + expressly granted by Licensor are hereby reserved. + . + 4. Restrictions. The license granted in Section 3 above is expressly + made subject to and limited by the following restrictions: + . + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms on + the Work that restrict the terms of this License or the ability of the + recipient of the Work to exercise the rights granted to that recipient + under the terms of the License. You may not sublicense the Work. You + must keep intact all notices that refer to this License and to the + disclaimer of warranties with every copy of the Work You Distribute or + Publicly Perform. When You Distribute or Publicly Perform the Work, You + may not impose any effective technological measures on the Work that + restrict the ability of a recipient of the Work from You to exercise the + rights granted to that recipient under the terms of the License. This + Section 4(a) applies to the Work as incorporated in a Collection, but + this does not require the Collection apart from the Work itself to be + made subject to the terms of this License. If You create a Collection, + upon notice from any Licensor You must, to the extent practicable, + remove from the Collection any credit as required by Section 4(b), as + requested. If You create an Adaptation, upon notice from any Licensor + You must, to the extent practicable, remove from the Adaptation any + credit as required by Section 4(b), as requested. + . + b. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party or + parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party or + parties; (ii) the title of the Work if supplied; (iii) to the extent + reasonably practicable, the URI, if any, that Licensor specifies to be + associated with the Work, unless such URI does not refer to the + copyright notice or licensing information for the Work; and (iv) , + consistent with Section 3(b), in the case of an Adaptation, a credit + identifying the use of the Work in the Adaptation (e.g., "French + translation of the Work by Original Author," or "Screenplay based on + original Work by Original Author"). The credit required by this Section + 4 (b) may be implemented in any reasonable manner; provided, however, + that in the case of a Adaptation or Collection, at a minimum such credit + will appear, if a credit for all contributing authors of the Adaptation + or Collection appears, then as part of these credits and in a manner at + least as prominent as the credits for the other contributing authors. + For the avoidance of doubt, You may only use the credit required by this + Section for the purpose of attribution in the manner set out above and, + by exercising Your rights under this License, You may not implicitly or + explicitly assert or imply any connection with, sponsorship or + endorsement by the Original Author, Licensor and/or Attribution Parties, + as appropriate, of You or Your use of the Work, without the separate, + express prior written permission of the Original Author, Licensor and/or + Attribution Parties. + . + c. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any Adaptations + or Collections, You must not distort, mutilate, modify or take other + derogatory action in relation to the Work which would be prejudicial to + the Original Author's honor or reputation. Licensor agrees that in those + jurisdictions (e.g. Japan), in which any exercise of the right granted + in Section 3(b) of this License (the right to make Adaptations) would be + deemed to be a distortion, mutilation, modification or other derogatory + action prejudicial to the Original Author's honor and reputation, the + Licensor will waive or not assert, as appropriate, this Section, to the + fullest extent permitted by the applicable national law, to enable You + to reasonably exercise Your right under Section 3(b) of this License + (right to make Adaptations) but not otherwise. + . + 5. Representations, Warranties and Disclaimer + . + UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR + OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY + KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, + INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, + FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF + LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, + WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + . + 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE + LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR + ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES + ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS + BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + . + 7. Termination + . + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + . + b. Subject to the above terms and conditions, the license granted here + is perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + . + 8. Miscellaneous + . + a. Each time You Distribute or Publicly Perform the Work or a + Collection, the Licensor offers to the recipient a license to the Work + on the same terms and conditions as the license granted to You under + this License. + . + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same terms + and conditions as the license granted to You under this License. + . + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + . + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. This + License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that may + appear in any communication from You. + . + e. This License may not be modified without the mutual written agreement + of the Licensor and You. + . + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and + the Universal Copyright Convention (as revised on July 24, 1971). These + rights and subject matter take effect in the relevant jurisdiction in + which the License terms are sought to be enforced according to the + corresponding provisions of the implementation of those treaty + provisions in the applicable national law. If the standard suite of + rights granted under applicable copyright law includes additional rights + not granted under this License, such additional rights are deemed to be + included in the License; this License is not intended to restrict the + license of any rights under applicable law. + . + Creative Commons Notice + . + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + . + Except for the limited purpose of indicating to the public that the Work + is licensed under the CCPL, Creative Commons does not authorize the use + by either party of the trademark "Creative Commons" or any related + trademark or logo of Creative Commons without the prior written consent + of Creative Commons. Any permitted use will be in compliance with + Creative Commons' then-current trademark usage guidelines, as may be + published on its website or otherwise made available upon request from + time to time. For the avoidance of doubt, this trademark restriction + does not form part of this License. + . + Creative Commons may be contacted at http://creativecommons.org/. + +License: curl + All rights reserved. + . + Permission to use, copy, modify, and distribute this software for any purpose + with or without fee is hereby granted, provided that the above copyright + notice and this permission notice appear in all copies. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE + OR OTHER DEALINGS IN THE SOFTWARE. + . + Except as contained in this notice, the name of a copyright holder shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization of the copyright holder. + +License: Expat + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + . + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +License: FTL + The FreeType Project LICENSE + ---------------------------- + . + 2000-Feb-08 + . + Copyright 1996-2000 by + David Turner, Robert Wilhelm, and Werner Lemberg + . + . + . + Introduction + ============ + . + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + . + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + . + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + . + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + . + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + . + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + . + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + . + . + Legal Terms + =========== + . + 0. Definitions + -------------- + . + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + . + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + . + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + . + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + . + 1. No Warranty + -------------- + . + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + . + 2. Redistribution + ----------------- + . + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + . + o Redistribution of source code must retain this license file + (`LICENSE.TXT') unaltered; any additions, deletions or changes + to the original files must be clearly indicated in + accompanying documentation. The copyright notices of the + unaltered, original files must be preserved in all copies of + source files. + . + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + . + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + . + 3. Advertising + -------------- + . + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + . + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + . + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + . + 4. Contacts + ----------- + . + There are two mailing lists related to FreeType: + . + o freetype@freetype.org + . + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + . + o devel@freetype.org + . + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + . + o http://www.freetype.org + . + Holds the current FreeType web page, which will allow you to + download our latest development version and read online + documentation. + . + You can also contact us individually at: + . + David Turner <david.turner@freetype.org> + Robert Wilhelm <robert.wilhelm@freetype.org> + Werner Lemberg <werner.lemberg@freetype.org> + +License: ISC + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + . + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +License: OFL-1.1 + PREAMBLE + The goals of the Open Font License (OFL) are to stimulate worldwide + development of collaborative font projects, to support the font creation + efforts of academic and linguistic communities, and to provide a free and + open framework in which fonts may be shared and improved in partnership + with others. + . + The OFL allows the licensed fonts to be used, studied, modified and + redistributed freely as long as they are not sold by themselves. The + fonts, including any derivative works, can be bundled, embedded, + redistributed and/or sold with any software provided that any reserved + names are not used by derivative works. The fonts and derivatives, + however, cannot be released under any other type of license. The + requirement for fonts to remain under this license does not apply + to any document created using the fonts or their derivatives. + . + DEFINITIONS + "Font Software" refers to the set of files released by the Copyright + Holder(s) under this license and clearly marked as such. This may + include source files, build scripts and documentation. + . + "Reserved Font Name" refers to any names specified as such after the + copyright statement(s). + . + "Original Version" refers to the collection of Font Software components as + distributed by the Copyright Holder(s). + . + "Modified Version" refers to any derivative made by adding to, deleting, + or substituting -- in part or in whole -- any of the components of the + Original Version, by changing formats or by porting the Font Software to a + new environment. + . + "Author" refers to any designer, engineer, programmer, technical + writer or other person who contributed to the Font Software. + . + PERMISSION & CONDITIONS + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Font Software, to use, study, copy, merge, embed, modify, + redistribute, and sell modified and unmodified copies of the Font + Software, subject to the following conditions: + . + 1) Neither the Font Software nor any of its individual components, + in Original or Modified Versions, may be sold by itself. + . + 2) Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + . + 3) No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the corresponding + Copyright Holder. This restriction only applies to the primary font name as + presented to the users. + . + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + . + 5) The Font Software, modified or unmodified, in part or in whole, + must be distributed entirely under this license, and must not be + distributed under any other license. The requirement for fonts to + remain under this license does not apply to any document created + using the Font Software. + . + TERMINATION + This license becomes null and void if any of the above conditions are + not met. + . + DISCLAIMER + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE. + +License: OpenSSL + LICENSE ISSUES + ============== + . + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + . + OpenSSL License + --------------- + . + ==================================================================== + Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved. + . + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + . + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + . + 3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + . + 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + . + 5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + . + 6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + . + THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + EXPRESSED 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 OpenSSL PROJECT OR + ITS 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. + ==================================================================== + . + This product includes cryptographic software written by Eric Young + (eay@cryptsoft.com). This product includes software written by Tim + Hudson (tjh@cryptsoft.com). + . + Original SSLeay License + ----------------------- + . + Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + All rights reserved. + . + This package is an SSL implementation written + by Eric Young (eay@cryptsoft.com). + The implementation was written so as to conform with Netscapes SSL. + . + This library is free for commercial and non-commercial use as long as + the following conditions are aheared to. The following conditions + apply to all code found in this distribution, be it the RC4, RSA, + lhash, DES, etc., code; not just the SSL code. The SSL documentation + included with this distribution is covered by the same copyright terms + except that the holder is Tim Hudson (tjh@cryptsoft.com). + . + Copyright remains Eric Young's, and as such any Copyright notices in + the code are not to be removed. + If this package is used in a product, Eric Young should be given attribution + as the author of the parts of the library used. + This can be in the form of a textual message at program startup or + in documentation (online or textual) provided with the package. + . + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + "This product includes cryptographic software written by + Eric Young (eay@cryptsoft.com)" + The word 'cryptographic' can be left out if the rouines from the library + being used are not cryptographic related :-). + 4. If you include any Windows specific code (or a derivative thereof) from + the apps directory (application code) you must include an acknowledgement: + "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + . + THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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. + . + The licence and distribution terms for any publically available version or + derivative of this code cannot be changed. i.e. this code cannot simply be + copied and put under another distribution licence + [including the GNU Public Licence.] + +License: RSA-MD + License to copy and use this software is granted provided that it is + identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" + in all material mentioning or referencing this software or this function. + . + License is also granted to make and use derivative works provided that such + works are identified as "derived from the RSA Data Security, Inc. MD5 + Message-Digest Algorithm" in all material mentioning or referencing the + derived work. + . + RSA Data Security, Inc. makes no representations concerning either the + merchantability of this software or the suitability of this software for + any particular purpose. It is provided "as is" without express or implied + warranty of any kind. + . + These notices must be retained in any copies of any part of this + documentation and/or software. + +License: Zlib + 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. diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 83dc84e041..0000000000 --- a/LICENSE.md +++ /dev/null @@ -1,28 +0,0 @@ - GODOT ENGINE - http://www.godotengine.org - -************************************************************************ - - Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. - Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -************************************************************************ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000000..0b5b0c341f --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. +Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-- Godot Engine <https://godotengine.org> 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>. @@ -1,4 +1,4 @@ -[](https://godotengine.org) +[](https://godotengine.org) ## Godot Engine diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index 7a03ceb64c..2752391901 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -505,7 +505,7 @@ int _OS::get_dynamic_memory_usage() const { return OS::get_singleton()->get_dynamic_memory_usage(); } -void _OS::set_icon(const Image &p_icon) { +void _OS::set_icon(const Ref<Image> &p_icon) { OS::get_singleton()->set_icon(p_icon); } diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 222339bce1..e48b5c85ad 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -30,6 +30,7 @@ #ifndef CORE_BIND_H #define CORE_BIND_H +#include "image.h" #include "io/resource_loader.h" #include "io/resource_saver.h" #include "os/dir_access.h" @@ -226,7 +227,7 @@ public: void set_use_file_access_save_and_swap(bool p_enable); - void set_icon(const Image &p_icon); + void set_icon(const Ref<Image> &p_icon); int get_exit_code() const; void set_exit_code(int p_code); diff --git a/core/global_constants.cpp b/core/global_constants.cpp index 9bc98c5ad7..18f34b5d37 100644 --- a/core/global_constants.cpp +++ b/core/global_constants.cpp @@ -506,22 +506,21 @@ static _GlobalConstant _global_constants[] = { { "TYPE_TRANSFORM2D", Variant::TRANSFORM2D }, { "TYPE_PLANE", Variant::PLANE }, { "TYPE_QUAT", Variant::QUAT }, // 10 - { "TYPE_RECT3", Variant::RECT3 }, //sorry naming convention fail :( not like it's used often + { "TYPE_RECT3", Variant::RECT3 }, { "TYPE_BASIS", Variant::BASIS }, { "TYPE_TRANSFORM", Variant::TRANSFORM }, { "TYPE_COLOR", Variant::COLOR }, - { "TYPE_IMAGE", Variant::IMAGE }, // 15 - { "TYPE_NODE_PATH", Variant::NODE_PATH }, + { "TYPE_NODE_PATH", Variant::NODE_PATH }, // 15 { "TYPE_RID", Variant::_RID }, { "TYPE_OBJECT", Variant::OBJECT }, { "TYPE_INPUT_EVENT", Variant::INPUT_EVENT }, - { "TYPE_DICTIONARY", Variant::DICTIONARY }, // 20 - { "TYPE_ARRAY", Variant::ARRAY }, + { "TYPE_DICTIONARY", Variant::DICTIONARY }, + { "TYPE_ARRAY", Variant::ARRAY }, // 20 { "TYPE_RAW_ARRAY", Variant::POOL_BYTE_ARRAY }, { "TYPE_INT_ARRAY", Variant::POOL_INT_ARRAY }, { "TYPE_REAL_ARRAY", Variant::POOL_REAL_ARRAY }, - { "TYPE_STRING_ARRAY", Variant::POOL_STRING_ARRAY }, // 25 - { "TYPE_VECTOR2_ARRAY", Variant::POOL_VECTOR2_ARRAY }, + { "TYPE_STRING_ARRAY", Variant::POOL_STRING_ARRAY }, + { "TYPE_VECTOR2_ARRAY", Variant::POOL_VECTOR2_ARRAY }, // 25 { "TYPE_VECTOR3_ARRAY", Variant::POOL_VECTOR3_ARRAY }, { "TYPE_COLOR_ARRAY", Variant::POOL_COLOR_ARRAY }, { "TYPE_MAX", Variant::VARIANT_MAX }, diff --git a/core/image.cpp b/core/image.cpp index b81d92fa33..85ca63be5e 100644 --- a/core/image.cpp +++ b/core/image.cpp @@ -415,7 +415,7 @@ void Image::convert(Format p_new_format) { //mipmaps=false; - *this = new_img; + _copy_internals_from(new_img); if (gen_mipmaps) generate_mipmaps(); @@ -611,14 +611,6 @@ void Image::resize_to_po2(bool p_square) { resize(w, h); } -Image Image::resized(int p_width, int p_height, int p_interpolation) { - - Image ret = *this; - ret.resize(p_width, p_height, (Interpolation)p_interpolation); - - return ret; -}; - void Image::resize(int p_width, int p_height, Interpolation p_interpolation) { if (!_can_modify(format)) { @@ -681,7 +673,7 @@ void Image::resize(int p_width, int p_height, Interpolation p_interpolation) { if (mipmaps > 0) dst.generate_mipmaps(); - *this = dst; + _copy_internals_from(dst); } void Image::crop(int p_width, int p_height) { @@ -728,7 +720,7 @@ void Image::crop(int p_width, int p_height) { if (mipmaps > 0) dst.generate_mipmaps(); - *this = dst; + _copy_internals_from(dst); } void Image::flip_y() { @@ -1383,17 +1375,7 @@ Error Image::save_png(const String &p_path) { if (save_png_func == NULL) return ERR_UNAVAILABLE; - return save_png_func(p_path, *this); -} - -bool Image::operator==(const Image &p_image) const { - - if (data.size() == 0 && p_image.data.size() == 0) - return true; - PoolVector<uint8_t>::Read r = data.read(); - PoolVector<uint8_t>::Read pr = p_image.data.read(); - - return r.ptr() == pr.ptr(); + return save_png_func(p_path, Ref<Image>(this)); } int Image::get_image_data_size(int p_width, int p_height, Format p_format, int p_mipmaps) { @@ -1736,13 +1718,6 @@ bool Image::is_compressed() const { return format >= FORMAT_RGB565; } -Image Image::decompressed() const { - - Image img = *this; - img.decompress(); - return img; -} - Error Image::decompress() { if (format >= FORMAT_DXT1 && format <= FORMAT_ATI2) @@ -1797,14 +1772,6 @@ Error Image::compress(CompressMode p_mode) { return OK; } -Image Image::compressed(int p_mode) { - - Image ret = *this; - ret.compress((Image::CompressMode)p_mode); - - return ret; -} - Image::Image(const char **p_xpm) { width = 0; @@ -1875,21 +1842,21 @@ Rect2 Image::get_used_rect() const { return Rect2(minx, miny, maxx - minx + 1, maxy - miny + 1); } -Image Image::get_rect(const Rect2 &p_area) const { - - Image img(p_area.size.x, p_area.size.y, mipmaps, format); - img.blit_rect(*this, p_area, Point2(0, 0)); +Ref<Image> Image::get_rect(const Rect2 &p_area) const { + Ref<Image> img = memnew(Image(p_area.size.x, p_area.size.y, mipmaps, format)); + img->blit_rect(Ref<Image>(this), p_area, Point2(0, 0)); return img; } -void Image::blit_rect(const Image &p_src, const Rect2 &p_src_rect, const Point2 &p_dest) { +void Image::blit_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Point2 &p_dest) { + ERR_FAIL_COND(p_src.is_null()); int dsize = data.size(); - int srcdsize = p_src.data.size(); + int srcdsize = p_src->data.size(); ERR_FAIL_COND(dsize == 0); ERR_FAIL_COND(srcdsize == 0); - ERR_FAIL_COND(format != p_src.format); + ERR_FAIL_COND(format != p_src->format); Rect2i local_src_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest + p_src_rect.pos, p_src_rect.size)); @@ -1900,7 +1867,7 @@ void Image::blit_rect(const Image &p_src, const Rect2 &p_src_rect, const Point2 PoolVector<uint8_t>::Write wp = data.write(); uint8_t *dst_data_ptr = wp.ptr(); - PoolVector<uint8_t>::Read rp = p_src.data.read(); + PoolVector<uint8_t>::Read rp = p_src->data.read(); const uint8_t *src_data_ptr = rp.ptr(); int pixel_size = get_format_pixel_size(format); @@ -1915,7 +1882,7 @@ void Image::blit_rect(const Image &p_src, const Rect2 &p_src_rect, const Point2 int dst_x = local_src_rect.pos.x + j; int dst_y = local_src_rect.pos.y + i; - const uint8_t *src = &src_data_ptr[(src_y * p_src.width + src_x) * pixel_size]; + const uint8_t *src = &src_data_ptr[(src_y * p_src->width + src_x) * pixel_size]; uint8_t *dst = &dst_data_ptr[(dst_y * width + dst_x) * pixel_size]; for (int k = 0; k < pixel_size; k++) { @@ -1925,8 +1892,8 @@ void Image::blit_rect(const Image &p_src, const Rect2 &p_src_rect, const Point2 } } -Image (*Image::_png_mem_loader_func)(const uint8_t *, int) = NULL; -Image (*Image::_jpg_mem_loader_func)(const uint8_t *, int) = NULL; +Ref<Image> (*Image::_png_mem_loader_func)(const uint8_t *, int) = NULL; +Ref<Image> (*Image::_jpg_mem_loader_func)(const uint8_t *, int) = NULL; void (*Image::_image_compress_bc_func)(Image *) = NULL; void (*Image::_image_compress_pvrtc2_func)(Image *) = NULL; @@ -1938,10 +1905,157 @@ void (*Image::_image_decompress_bc)(Image *) = NULL; void (*Image::_image_decompress_etc)(Image *) = NULL; void (*Image::_image_decompress_etc2)(Image *) = NULL; -PoolVector<uint8_t> (*Image::lossy_packer)(const Image &, float) = NULL; -Image (*Image::lossy_unpacker)(const PoolVector<uint8_t> &) = NULL; -PoolVector<uint8_t> (*Image::lossless_packer)(const Image &) = NULL; -Image (*Image::lossless_unpacker)(const PoolVector<uint8_t> &) = NULL; +PoolVector<uint8_t> (*Image::lossy_packer)(const Ref<Image> &, float) = NULL; +Ref<Image> (*Image::lossy_unpacker)(const PoolVector<uint8_t> &) = NULL; +PoolVector<uint8_t> (*Image::lossless_packer)(const Ref<Image> &) = NULL; +Ref<Image> (*Image::lossless_unpacker)(const PoolVector<uint8_t> &) = NULL; + +void Image::_set_data(const Dictionary &p_data) { + + ERR_FAIL_COND(!p_data.has("width")); + ERR_FAIL_COND(!p_data.has("height")); + ERR_FAIL_COND(!p_data.has("format")); + ERR_FAIL_COND(!p_data.has("mipmaps")); + ERR_FAIL_COND(!p_data.has("data")); + + int dwidth = p_data["width"]; + int dheight = p_data["height"]; + String dformat = p_data["format"]; + bool dmipmaps = p_data["mipmaps"]; + PoolVector<uint8_t> ddata = p_data["data"]; + Format ddformat = FORMAT_MAX; + for (int i = 0; i < FORMAT_MAX; i++) { + if (dformat == get_format_name(Format(i))) { + ddformat = Format(i); + break; + } + } + + ERR_FAIL_COND(ddformat == FORMAT_MAX); + + create(dwidth, dheight, dmipmaps, ddformat, ddata); +} + +Dictionary Image::_get_data() const { + + Dictionary d; + d["width"] = width; + d["height"] = height; + d["format"] = get_format_name(format); + d["mipmaps"] = mipmaps; + d["data"] = data; + return d; +} + +void Image::_bind_methods() { + + ClassDB::bind_method(D_METHOD("get_width"), &Image::get_width); + ClassDB::bind_method(D_METHOD("get_height"), &Image::get_height); + ClassDB::bind_method(D_METHOD("has_mipmaps"), &Image::has_mipmaps); + ClassDB::bind_method(D_METHOD("get_format"), &Image::get_format); + ClassDB::bind_method(D_METHOD("get_data"), &Image::get_data); + + ClassDB::bind_method(D_METHOD("convert", "format"), &Image::convert); + + ClassDB::bind_method(D_METHOD("get_mipmap_offset", "mipmap"), &Image::get_mipmap_offset); + + ClassDB::bind_method(D_METHOD("resize_to_po2", "square"), &Image::resize_to_po2, DEFVAL("false")); + ClassDB::bind_method(D_METHOD("resize", "width", "height", "interpolation"), &Image::resize, DEFVAL(INTERPOLATE_BILINEAR)); + ClassDB::bind_method(D_METHOD("shrink_x2"), &Image::shrink_x2); + ClassDB::bind_method(D_METHOD("expand_x2_hq2x"), &Image::expand_x2_hq2x); + + ClassDB::bind_method(D_METHOD("crop", "width", "height"), &Image::crop); + ClassDB::bind_method(D_METHOD("flip_x"), &Image::flip_x); + ClassDB::bind_method(D_METHOD("flip_y"), &Image::flip_y); + ClassDB::bind_method(D_METHOD("generate_mipmaps"), &Image::generate_mipmaps); + ClassDB::bind_method(D_METHOD("clear_mipmaps"), &Image::clear_mipmaps); + + ClassDB::bind_method(D_METHOD("create", "width", "height", "use_mipmaps", "format"), &Image::_create_empty); + ClassDB::bind_method(D_METHOD("create_from_data", "width", "height", "use_mipmaps", "format", "data"), &Image::_create_from_data); + + ClassDB::bind_method(D_METHOD("is_empty"), &Image::empty); + + ClassDB::bind_method(D_METHOD("load", "path"), &Image::load); + ClassDB::bind_method(D_METHOD("save_png", "path"), &Image::save_png); + + ClassDB::bind_method(D_METHOD("detect_alpha"), &Image::detect_alpha); + ClassDB::bind_method(D_METHOD("is_invisible"), &Image::is_invisible); + + ClassDB::bind_method(D_METHOD("compress", "mode"), &Image::compress); + ClassDB::bind_method(D_METHOD("decompress"), &Image::decompress); + ClassDB::bind_method(D_METHOD("is_compressed"), &Image::is_compressed); + + ClassDB::bind_method(D_METHOD("fix_alpha_edges"), &Image::fix_alpha_edges); + ClassDB::bind_method(D_METHOD("premultiply_alpha"), &Image::premultiply_alpha); + ClassDB::bind_method(D_METHOD("srgb_to_linear"), &Image::srgb_to_linear); + ClassDB::bind_method(D_METHOD("normalmap_to_xy"), &Image::normalmap_to_xy); + + ClassDB::bind_method(D_METHOD("blit_rect", "src:Image", "src_rect", "dst"), &Image::blit_rect); + + ClassDB::bind_method(D_METHOD("get_used_rect"), &Image::get_used_rect); + ClassDB::bind_method(D_METHOD("get_rect:Image", "rect"), &Image::get_rect); + + ClassDB::bind_method(D_METHOD("copy_from", "src:Image"), &Image::copy_internals_from); + + ClassDB::bind_method(D_METHOD("_set_data", "data"), &Image::_set_data); + ClassDB::bind_method(D_METHOD("_get_data"), &Image::_get_data); + + ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "_set_data", "_get_data"); + + BIND_CONSTANT(FORMAT_L8); //luminance + BIND_CONSTANT(FORMAT_LA8); //luminance-alpha + BIND_CONSTANT(FORMAT_R8); + BIND_CONSTANT(FORMAT_RG8); + BIND_CONSTANT(FORMAT_RGB8); + BIND_CONSTANT(FORMAT_RGBA8); + BIND_CONSTANT(FORMAT_RGB565); //16 bit + BIND_CONSTANT(FORMAT_RGBA4444); + BIND_CONSTANT(FORMAT_RGBA5551); + BIND_CONSTANT(FORMAT_RF); //float + BIND_CONSTANT(FORMAT_RGF); + BIND_CONSTANT(FORMAT_RGBF); + BIND_CONSTANT(FORMAT_RGBAF); + BIND_CONSTANT(FORMAT_RH); //half float + BIND_CONSTANT(FORMAT_RGH); + BIND_CONSTANT(FORMAT_RGBH); + BIND_CONSTANT(FORMAT_RGBAH); + BIND_CONSTANT(FORMAT_DXT1); //s3tc bc1 + BIND_CONSTANT(FORMAT_DXT3); //bc2 + BIND_CONSTANT(FORMAT_DXT5); //bc3 + BIND_CONSTANT(FORMAT_ATI1); //bc4 + BIND_CONSTANT(FORMAT_ATI2); //bc5 + BIND_CONSTANT(FORMAT_BPTC_RGBA); //btpc bc6h + BIND_CONSTANT(FORMAT_BPTC_RGBF); //float / + BIND_CONSTANT(FORMAT_BPTC_RGBFU); //unsigned float + BIND_CONSTANT(FORMAT_PVRTC2); //pvrtc + BIND_CONSTANT(FORMAT_PVRTC2A); + BIND_CONSTANT(FORMAT_PVRTC4); + BIND_CONSTANT(FORMAT_PVRTC4A); + BIND_CONSTANT(FORMAT_ETC); //etc1 + BIND_CONSTANT(FORMAT_ETC2_R11); //etc2 + BIND_CONSTANT(FORMAT_ETC2_R11S); //signed ); NOT srgb. + BIND_CONSTANT(FORMAT_ETC2_RG11); + BIND_CONSTANT(FORMAT_ETC2_RG11S); + BIND_CONSTANT(FORMAT_ETC2_RGB8); + BIND_CONSTANT(FORMAT_ETC2_RGBA8); + BIND_CONSTANT(FORMAT_ETC2_RGB8A1); + BIND_CONSTANT(FORMAT_MAX); + + BIND_CONSTANT(INTERPOLATE_NEAREST); + BIND_CONSTANT(INTERPOLATE_BILINEAR); + BIND_CONSTANT(INTERPOLATE_CUBIC); + + BIND_CONSTANT(ALPHA_NONE); + BIND_CONSTANT(ALPHA_BIT); + BIND_CONSTANT(ALPHA_BLEND); + + BIND_CONSTANT(COMPRESS_16BIT); + BIND_CONSTANT(COMPRESS_S3TC); + BIND_CONSTANT(COMPRESS_PVRTC2); + BIND_CONSTANT(COMPRESS_PVRTC4); + BIND_CONSTANT(COMPRESS_ETC); + BIND_CONSTANT(COMPRESS_ETC2); +} void Image::set_compress_bc_func(void (*p_compress_func)(Image *)) { @@ -2108,14 +2222,22 @@ Image::Image(const uint8_t *p_mem_png_jpg, int p_len) { format = FORMAT_L8; if (_png_mem_loader_func) { - *this = _png_mem_loader_func(p_mem_png_jpg, p_len); + copy_internals_from(_png_mem_loader_func(p_mem_png_jpg, p_len)); } if (empty() && _jpg_mem_loader_func) { - *this = _jpg_mem_loader_func(p_mem_png_jpg, p_len); + copy_internals_from(_jpg_mem_loader_func(p_mem_png_jpg, p_len)); } } +Ref<Resource> Image::duplicate(bool p_subresources) const { + + Ref<Image> copy; + copy.instance(); + copy->_copy_internals_from(*this); + return copy; +} + Image::Image() { width = 0; diff --git a/core/image.h b/core/image.h index fc87ee8847..4decaa3436 100644 --- a/core/image.h +++ b/core/image.h @@ -33,6 +33,8 @@ #include "color.h" #include "dvector.h" #include "math_2d.h" +#include "resource.h" + /** * @author Juan Linietsky <reduzio@gmail.com> * @@ -43,9 +45,10 @@ class Image; -typedef Error (*SavePNGFunc)(const String &p_path, Image &p_img); +typedef Error (*SavePNGFunc)(const String &p_path, const Ref<Image> &p_img); -class Image { +class Image : public Resource { + GDCLASS(Image, Resource); enum { MAX_WIDTH = 16384, // force a limit somehow @@ -108,8 +111,8 @@ public: //some functions provided by something else - static Image (*_png_mem_loader_func)(const uint8_t *p_png, int p_size); - static Image (*_jpg_mem_loader_func)(const uint8_t *p_png, int p_size); + static Ref<Image> (*_png_mem_loader_func)(const uint8_t *p_png, int p_size); + static Ref<Image> (*_jpg_mem_loader_func)(const uint8_t *p_png, int p_size); static void (*_image_compress_bc_func)(Image *); static void (*_image_compress_pvrtc2_func)(Image *); @@ -124,17 +127,36 @@ public: Error _decompress_bc(); - static PoolVector<uint8_t> (*lossy_packer)(const Image &p_image, float p_quality); - static Image (*lossy_unpacker)(const PoolVector<uint8_t> &p_buffer); - static PoolVector<uint8_t> (*lossless_packer)(const Image &p_image); - static Image (*lossless_unpacker)(const PoolVector<uint8_t> &p_buffer); + static PoolVector<uint8_t> (*lossy_packer)(const Ref<Image> &p_image, float p_quality); + static Ref<Image> (*lossy_unpacker)(const PoolVector<uint8_t> &p_buffer); + static PoolVector<uint8_t> (*lossless_packer)(const Ref<Image> &p_image); + static Ref<Image> (*lossless_unpacker)(const PoolVector<uint8_t> &p_buffer); + +protected: + static void _bind_methods(); private: + void _create_empty(int p_width, int p_height, bool p_use_mipmaps, Format p_format) { + create(p_width, p_height, p_use_mipmaps, p_format); + } + + void _create_from_data(int p_width, int p_height, bool p_use_mipmaps, Format p_format, const PoolVector<uint8_t> &p_data) { + create(p_width, p_height, p_use_mipmaps, p_format, p_data); + } + Format format; PoolVector<uint8_t> data; int width, height; bool mipmaps; + void _copy_internals_from(const Image &p_image) { + format = p_image.format; + width = p_image.width; + height = p_image.height; + mipmaps = p_image.mipmaps; + data = p_image.data; + } + _FORCE_INLINE_ void _get_mipmap_offset_and_size(int p_mipmap, int &r_offset, int &r_width, int &r_height) const; //get where the mipmap begins in data static int _get_dst_image_size(int p_width, int p_height, Format p_format, int &r_mipmaps, int p_mipmaps = -1); @@ -143,6 +165,9 @@ private: _FORCE_INLINE_ void _put_pixelb(int p_x, int p_y, uint32_t p_pixelsize, uint8_t *p_dst, const uint8_t *p_src); _FORCE_INLINE_ void _get_pixelb(int p_x, int p_y, uint32_t p_pixelsize, const uint8_t *p_src, uint8_t *p_dst); + void _set_data(const Dictionary &p_data); + Dictionary _get_data() const; + public: int get_width() const; ///< Get image width int get_height() const; ///< Get image height @@ -154,14 +179,6 @@ public: */ void convert(Format p_new_format); - Image converted(int p_new_format) { - ERR_FAIL_INDEX_V(p_new_format, FORMAT_MAX, Image()); - - Image ret = *this; - ret.convert((Format)p_new_format); - return ret; - }; - /** * Get the current image format. */ @@ -178,7 +195,6 @@ public: void resize_to_po2(bool p_square = false); void resize(int p_width, int p_height, Interpolation p_interpolation = INTERPOLATE_BILINEAR); - Image resized(int p_width, int p_height, int p_interpolation = INTERPOLATE_BILINEAR); void shrink_x2(); void expand_x2_hq2x(); /** @@ -242,8 +258,6 @@ public: static int get_image_data_size(int p_width, int p_height, Format p_format, int p_mipmaps = 0); static int get_image_required_mipmaps(int p_width, int p_height, Format p_format); - bool operator==(const Image &p_image) const; - enum CompressMode { COMPRESS_16BIT, COMPRESS_S3TC, @@ -254,9 +268,7 @@ public: }; Error compress(CompressMode p_mode = COMPRESS_S3TC); - Image compressed(int p_mode); /* from the Image::CompressMode enum */ Error decompress(); - Image decompressed() const; bool is_compressed() const; void fix_alpha_edges(); @@ -264,17 +276,34 @@ public: void srgb_to_linear(); void normalmap_to_xy(); - void blit_rect(const Image &p_src, const Rect2 &p_src_rect, const Point2 &p_dest); + void blit_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Point2 &p_dest); Rect2 get_used_rect() const; - Image get_rect(const Rect2 &p_area) const; + Ref<Image> get_rect(const Rect2 &p_area) const; static void set_compress_bc_func(void (*p_compress_func)(Image *)); static String get_format_name(Format p_format); Image(const uint8_t *p_mem_png_jpg, int p_len = -1); Image(const char **p_xpm); + + virtual Ref<Resource> duplicate(bool p_subresources = false) const; + + void copy_internals_from(const Ref<Image> &p_image) { + ERR_FAIL_COND(p_image.is_null()); + format = p_image->format; + width = p_image->width; + height = p_image->height; + mipmaps = p_image->mipmaps; + data = p_image->data; + } + ~Image(); }; +VARIANT_ENUM_CAST(Image::Format) +VARIANT_ENUM_CAST(Image::Interpolation) +VARIANT_ENUM_CAST(Image::CompressMode) +VARIANT_ENUM_CAST(Image::AlphaMode) + #endif diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp index bb942b54d7..79aa39521f 100644 --- a/core/io/file_access_pack.cpp +++ b/core/io/file_access_pack.cpp @@ -440,13 +440,12 @@ Error DirAccessPack::change_dir(String p_dir) { String DirAccessPack::get_current_dir() { - String p; PackedData::PackedDir *pd = current; - while (pd->parent) { + String p = current->name; - if (pd != current) - p = "/" + p; - p = p + pd->name; + while (pd->parent) { + pd = pd->parent; + p = pd->name + "/" + p; } return "res://" + p; diff --git a/core/io/image_loader.cpp b/core/io/image_loader.cpp index 4864c18831..6ed20ac015 100644 --- a/core/io/image_loader.cpp +++ b/core/io/image_loader.cpp @@ -43,7 +43,8 @@ bool ImageFormatLoader::recognize(const String &p_extension) const { return false; } -Error ImageLoader::load_image(String p_file, Image *p_image, FileAccess *p_custom) { +Error ImageLoader::load_image(String p_file, Ref<Image> p_image, FileAccess *p_custom) { + ERR_FAIL_COND_V(p_image.is_null(), ERR_INVALID_PARAMETER); FileAccess *f = p_custom; if (!f) { diff --git a/core/io/image_loader.h b/core/io/image_loader.h index 37149dbe9d..7114cbf8ad 100644 --- a/core/io/image_loader.h +++ b/core/io/image_loader.h @@ -56,7 +56,7 @@ class ImageFormatLoader { friend class ImageLoader; protected: - virtual Error load_image(Image *p_image, FileAccess *p_fileaccess) = 0; + virtual Error load_image(Ref<Image> p_image, FileAccess *p_fileaccess) = 0; virtual void get_recognized_extensions(List<String> *p_extensions) const = 0; bool recognize(const String &p_extension) const; @@ -75,7 +75,7 @@ class ImageLoader { protected: public: - static Error load_image(String p_file, Image *p_image, FileAccess *p_custom = NULL); + static Error load_image(String p_file, Ref<Image> p_image, FileAccess *p_custom = NULL); static void get_recognized_extensions(List<String> *p_extensions); static bool recognize(const String &p_extension); diff --git a/core/io/ip.cpp b/core/io/ip.cpp index bf139eeacb..6c463b983c 100644 --- a/core/io/ip.cpp +++ b/core/io/ip.cpp @@ -68,6 +68,7 @@ struct _IP_ResolverPrivate { return IP::RESOLVER_INVALID_ID; } + Mutex *mutex; Semaphore *sem; Thread *thread; @@ -96,8 +97,10 @@ struct _IP_ResolverPrivate { while (!ipr->thread_abort) { ipr->sem->wait(); - GLOBAL_LOCK_FUNCTION; + + ipr->mutex->lock(); ipr->resolve_queues(); + ipr->mutex->unlock(); } } @@ -110,24 +113,30 @@ struct _IP_ResolverPrivate { IP_Address IP::resolve_hostname(const String &p_hostname, IP::Type p_type) { - GLOBAL_LOCK_FUNCTION; + resolver->mutex->lock(); String key = _IP_ResolverPrivate::get_cache_key(p_hostname, p_type); - if (resolver->cache.has(key)) - return resolver->cache[key]; + if (resolver->cache.has(key)) { + IP_Address res = resolver->cache[key]; + resolver->mutex->unlock(); + return res; + } IP_Address res = _resolve_hostname(p_hostname, p_type); resolver->cache[key] = res; + resolver->mutex->unlock(); return res; } + IP::ResolverID IP::resolve_hostname_queue_item(const String &p_hostname, IP::Type p_type) { - GLOBAL_LOCK_FUNCTION; + resolver->mutex->lock(); ResolverID id = resolver->find_empty_id(); if (id == RESOLVER_INVALID_ID) { WARN_PRINT("Out of resolver queries"); + resolver->mutex->unlock(); return id; } @@ -146,6 +155,7 @@ IP::ResolverID IP::resolve_hostname_queue_item(const String &p_hostname, IP::Typ resolver->resolve_queues(); } + resolver->mutex->unlock(); return id; } @@ -153,35 +163,51 @@ IP::ResolverStatus IP::get_resolve_item_status(ResolverID p_id) const { ERR_FAIL_INDEX_V(p_id, IP::RESOLVER_MAX_QUERIES, IP::RESOLVER_STATUS_NONE); - GLOBAL_LOCK_FUNCTION; - ERR_FAIL_COND_V(resolver->queue[p_id].status == IP::RESOLVER_STATUS_NONE, IP::RESOLVER_STATUS_NONE); + resolver->mutex->lock(); + if (resolver->queue[p_id].status == IP::RESOLVER_STATUS_NONE) { + ERR_PRINT("Condition status == IP::RESOLVER_STATUS_NONE"); + resolver->mutex->unlock(); + return IP::RESOLVER_STATUS_NONE; + } + IP::ResolverStatus res = resolver->queue[p_id].status; - return resolver->queue[p_id].status; + resolver->mutex->unlock(); + return res; } + IP_Address IP::get_resolve_item_address(ResolverID p_id) const { ERR_FAIL_INDEX_V(p_id, IP::RESOLVER_MAX_QUERIES, IP_Address()); - GLOBAL_LOCK_FUNCTION; + resolver->mutex->lock(); if (resolver->queue[p_id].status != IP::RESOLVER_STATUS_DONE) { - ERR_EXPLAIN("Resolve of '" + resolver->queue[p_id].hostname + "'' didn't complete yet."); - ERR_FAIL_COND_V(resolver->queue[p_id].status != IP::RESOLVER_STATUS_DONE, IP_Address()); + ERR_PRINTS("Resolve of '" + resolver->queue[p_id].hostname + "'' didn't complete yet."); + resolver->mutex->unlock(); + return IP_Address(); } - return resolver->queue[p_id].response; + IP_Address res = resolver->queue[p_id].response; + + resolver->mutex->unlock(); + return res; } + void IP::erase_resolve_item(ResolverID p_id) { ERR_FAIL_INDEX(p_id, IP::RESOLVER_MAX_QUERIES); - GLOBAL_LOCK_FUNCTION; + resolver->mutex->lock(); resolver->queue[p_id].status = IP::RESOLVER_STATUS_NONE; + + resolver->mutex->unlock(); } void IP::clear_cache(const String &p_hostname) { + resolver->mutex->lock(); + if (p_hostname.empty()) { resolver->cache.clear(); } else { @@ -190,7 +216,9 @@ void IP::clear_cache(const String &p_hostname) { resolver->cache.erase(_IP_ResolverPrivate::get_cache_key(p_hostname, IP::TYPE_IPV6)); resolver->cache.erase(_IP_ResolverPrivate::get_cache_key(p_hostname, IP::TYPE_ANY)); } -}; + + resolver->mutex->unlock(); +} Array IP::_get_local_addresses() const { @@ -249,12 +277,11 @@ IP::IP() { singleton = this; resolver = memnew(_IP_ResolverPrivate); resolver->sem = NULL; + resolver->mutex = Mutex::create(); #ifndef NO_THREADS - //resolver->sem = Semaphore::create(); - - resolver->sem = NULL; + resolver->sem = Semaphore::create(); if (resolver->sem) { resolver->thread_abort = false; @@ -281,7 +308,9 @@ IP::~IP() { memdelete(resolver->thread); memdelete(resolver->sem); } - memdelete(resolver); #endif + + memdelete(resolver->mutex); + memdelete(resolver); } diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp index 5e66b7f7f5..fd14011a81 100644 --- a/core/io/marshalls.cpp +++ b/core/io/marshalls.cpp @@ -276,38 +276,6 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int (*r_len) += 4 * 4; } break; - case Variant::IMAGE: { - - ERR_FAIL_COND_V(len < (int)5 * 4, ERR_INVALID_DATA); - Image::Format fmt = (Image::Format)decode_uint32(&buf[0]); - ERR_FAIL_INDEX_V(fmt, Image::FORMAT_MAX, ERR_INVALID_DATA); - uint32_t mipmaps = decode_uint32(&buf[4]); - uint32_t w = decode_uint32(&buf[8]); - uint32_t h = decode_uint32(&buf[12]); - uint32_t datalen = decode_uint32(&buf[16]); - - Image img; - if (datalen > 0) { - len -= 5 * 4; - ERR_FAIL_COND_V(len < datalen, ERR_INVALID_DATA); - PoolVector<uint8_t> data; - data.resize(datalen); - PoolVector<uint8_t>::Write wr = data.write(); - copymem(&wr[0], &buf[20], datalen); - wr = PoolVector<uint8_t>::Write(); - - img = Image(w, h, mipmaps, fmt, data); - } - - r_variant = img; - if (r_len) { - if (datalen % 4) - (*r_len) += 4 - datalen % 4; - - (*r_len) += 4 * 5 + datalen; - } - - } break; case Variant::NODE_PATH: { ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA); @@ -1078,30 +1046,6 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len) { r_len += 4 * 4; } break; - case Variant::IMAGE: { - - Image image = p_variant; - PoolVector<uint8_t> data = image.get_data(); - - if (buf) { - - encode_uint32(image.get_format(), &buf[0]); - encode_uint32(image.has_mipmaps(), &buf[4]); - encode_uint32(image.get_width(), &buf[8]); - encode_uint32(image.get_height(), &buf[12]); - int ds = data.size(); - encode_uint32(ds, &buf[16]); - PoolVector<uint8_t>::Read r = data.read(); - copymem(&buf[20], &r[0], ds); - } - - int pad = 0; - if (data.size() % 4) - pad = 4 - data.size() % 4; - - r_len += data.size() + 5 * 4 + pad; - - } break; /*case Variant::RESOURCE: { ERR_EXPLAIN("Can't marshallize resources"); diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index fc18a44ed3..4ad3d261b2 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -49,12 +49,12 @@ enum { VARIANT_VECTOR3 = 12, VARIANT_PLANE = 13, VARIANT_QUAT = 14, - VARIANT_AABB = 15, + VARIANT_RECT3 = 15, VARIANT_MATRIX3 = 16, VARIANT_TRANSFORM = 17, VARIANT_MATRIX32 = 18, VARIANT_COLOR = 20, - VARIANT_IMAGE = 21, + //VARIANT_IMAGE = 21, - no longer variant type VARIANT_NODE_PATH = 22, VARIANT_RID = 23, VARIANT_OBJECT = 24, @@ -71,11 +71,6 @@ enum { VARIANT_INT64 = 40, VARIANT_DOUBLE = 41, - IMAGE_ENCODING_EMPTY = 0, - IMAGE_ENCODING_RAW = 1, - IMAGE_ENCODING_LOSSLESS = 2, - IMAGE_ENCODING_LOSSY = 3, - OBJECT_EMPTY = 0, OBJECT_EXTERNAL_RESOURCE = 1, OBJECT_INTERNAL_RESOURCE = 2, @@ -193,7 +188,7 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) { r_v = v; } break; - case VARIANT_AABB: { + case VARIANT_RECT3: { Rect3 v; v.pos.x = f->get_real(); @@ -259,74 +254,7 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant &r_v) { r_v = v; } break; - case VARIANT_IMAGE: { - - uint32_t encoding = f->get_32(); - if (encoding == IMAGE_ENCODING_EMPTY) { - r_v = Variant(); - break; - } else if (encoding == IMAGE_ENCODING_RAW) { - uint32_t width = f->get_32(); - uint32_t height = f->get_32(); - uint32_t mipmaps = f->get_32(); - uint32_t format = f->get_32(); - const uint32_t format_version_shift = 24; - const uint32_t format_version_mask = format_version_shift - 1; - - uint32_t format_version = format >> format_version_shift; - - const uint32_t current_version = 0; - if (format_version > current_version) { - - ERR_PRINT("Format version for encoded binary image is too new"); - return ERR_PARSE_ERROR; - } - - Image::Format fmt = Image::Format(format & format_version_mask); //if format changes, we can add a compatibility bit on top - - uint32_t datalen = f->get_32(); - print_line("image format: " + String(Image::get_format_name(fmt)) + " datalen " + itos(datalen)); - - PoolVector<uint8_t> imgdata; - imgdata.resize(datalen); - PoolVector<uint8_t>::Write w = imgdata.write(); - f->get_buffer(w.ptr(), datalen); - _advance_padding(datalen); - w = PoolVector<uint8_t>::Write(); - -#ifdef TOOLS_ENABLED - //compatibility - int correct_size = Image::get_image_data_size(width, height, fmt, mipmaps ? -1 : 0); - if (correct_size < datalen) { - WARN_PRINT("Image data was too large, shrinking for compatibility") - imgdata.resize(correct_size); - } -#endif - r_v = Image(width, height, mipmaps, fmt, imgdata); - - } else { - //compressed - PoolVector<uint8_t> data; - data.resize(f->get_32()); - PoolVector<uint8_t>::Write w = data.write(); - f->get_buffer(w.ptr(), data.size()); - w = PoolVector<uint8_t>::Write(); - - Image img; - - if (encoding == IMAGE_ENCODING_LOSSY && Image::lossy_unpacker) { - - img = Image::lossy_unpacker(data); - } else if (encoding == IMAGE_ENCODING_LOSSLESS && Image::lossless_unpacker) { - - img = Image::lossless_unpacker(data); - } - _advance_padding(data.size()); - - r_v = img; - } - } break; case VARIANT_NODE_PATH: { Vector<StringName> names; @@ -1404,7 +1332,7 @@ void ResourceFormatSaverBinaryInstance::write_variant(const Variant &p_property, } break; case Variant::RECT3: { - f->store_32(VARIANT_AABB); + f->store_32(VARIANT_RECT3); Rect3 val = p_property; f->store_real(val.pos.x); f->store_real(val.pos.y); @@ -1469,67 +1397,7 @@ void ResourceFormatSaverBinaryInstance::write_variant(const Variant &p_property, f->store_real(val.a); } break; - case Variant::IMAGE: { - - f->store_32(VARIANT_IMAGE); - Image val = p_property; - if (val.empty()) { - f->store_32(IMAGE_ENCODING_EMPTY); - break; - } - - int encoding = IMAGE_ENCODING_RAW; - float quality = 0.7; - - if (!val.is_compressed()) { - //can only compress uncompressed stuff - - if (p_hint.hint == PROPERTY_HINT_IMAGE_COMPRESS_LOSSY && Image::lossy_packer) { - encoding = IMAGE_ENCODING_LOSSY; - float qs = p_hint.hint_string.to_double(); - if (qs != 0.0) - quality = qs; - - } else if (p_hint.hint == PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS && Image::lossless_packer) { - encoding = IMAGE_ENCODING_LOSSLESS; - } - } - - f->store_32(encoding); //raw encoding - - if (encoding == IMAGE_ENCODING_RAW) { - - f->store_32(val.get_width()); - f->store_32(val.get_height()); - f->store_32(val.has_mipmaps()); - f->store_32(val.get_format()); //if format changes we can add a compatibility version bit - int dlen = val.get_data().size(); - f->store_32(dlen); - PoolVector<uint8_t>::Read r = val.get_data().read(); - f->store_buffer(r.ptr(), dlen); - _pad_buffer(dlen); - } else { - - PoolVector<uint8_t> data; - if (encoding == IMAGE_ENCODING_LOSSY) { - data = Image::lossy_packer(val, quality); - - } else if (encoding == IMAGE_ENCODING_LOSSLESS) { - data = Image::lossless_packer(val); - } - - int ds = data.size(); - f->store_32(ds); - if (ds > 0) { - PoolVector<uint8_t>::Read r = data.read(); - f->store_buffer(r.ptr(), ds); - - _pad_buffer(ds); - } - } - - } break; case Variant::NODE_PATH: { f->store_32(VARIANT_NODE_PATH); NodePath np = p_property; 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/method_bind.h b/core/method_bind.h index 749d8b4fda..5b8a458736 100644 --- a/core/method_bind.h +++ b/core/method_bind.h @@ -146,7 +146,7 @@ struct VariantCaster<const T &> { // some helpers VARIANT_ENUM_CAST(Vector3::Axis); -VARIANT_ENUM_CAST(Image::Format); + VARIANT_ENUM_CAST(Error); VARIANT_ENUM_CAST(wchar_t); VARIANT_ENUM_CAST(Margin); diff --git a/core/method_ptrcall.h b/core/method_ptrcall.h index 8cb2903842..d3f6143638 100644 --- a/core/method_ptrcall.h +++ b/core/method_ptrcall.h @@ -103,7 +103,6 @@ MAKE_PTRARG(Rect3); MAKE_PTRARG(Basis); MAKE_PTRARG(Transform); MAKE_PTRARG(Color); -MAKE_PTRARG(Image); MAKE_PTRARG(NodePath); MAKE_PTRARG(RID); MAKE_PTRARG(InputEvent); 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/core/os/os.cpp b/core/os/os.cpp index e323e03829..8bee725813 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -389,7 +389,7 @@ void OS::_ensure_data_dir() { memdelete(da); } -void OS::set_icon(const Image &p_icon) { +void OS::set_icon(const Ref<Image> &p_icon) { } String OS::get_model_name() const { diff --git a/core/os/os.h b/core/os/os.h index ff2a24f40d..037ce436c1 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -31,6 +31,7 @@ #define OS_H #include "engine.h" +#include "image.h" #include "list.h" #include "os/main_loop.h" #include "power.h" @@ -357,7 +358,7 @@ public: virtual void make_rendering_thread(); virtual void swap_buffers(); - virtual void set_icon(const Image &p_icon); + virtual void set_icon(const Ref<Image> &p_icon); virtual int get_exit_code() const; virtual void set_exit_code(int p_code); diff --git a/core/packed_data_container.cpp b/core/packed_data_container.cpp index addb0841f4..836bcb7287 100644 --- a/core/packed_data_container.cpp +++ b/core/packed_data_container.cpp @@ -237,7 +237,6 @@ uint32_t PackedDataContainer::_pack(const Variant &p_data, Vector<uint8_t> &tmpd case Variant::RECT3: case Variant::BASIS: case Variant::TRANSFORM: - case Variant::IMAGE: case Variant::INPUT_EVENT: case Variant::POOL_BYTE_ARRAY: case Variant::POOL_INT_ARRAY: diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp index 4d12e42895..634751b0bb 100644 --- a/core/register_core_types.cpp +++ b/core/register_core_types.cpp @@ -108,6 +108,8 @@ void register_core_types() { ClassDB::register_class<Reference>(); ClassDB::register_class<WeakRef>(); ClassDB::register_class<Resource>(); + ClassDB::register_class<Image>(); + ClassDB::register_class<FuncRef>(); ClassDB::register_virtual_class<StreamPeer>(); ClassDB::register_class<StreamPeerBuffer>(); diff --git a/core/resource.cpp b/core/resource.cpp index aa070558f5..559d4c1201 100644 --- a/core/resource.cpp +++ b/core/resource.cpp @@ -185,7 +185,7 @@ Ref<Resource> Resource::duplicate_for_local_scene(Node *p_for_scene, Map<Ref<Res return Ref<Resource>(r); } -Ref<Resource> Resource::duplicate(bool p_subresources) { +Ref<Resource> Resource::duplicate(bool p_subresources) const { List<PropertyInfo> plist; get_property_list(&plist); diff --git a/core/resource.h b/core/resource.h index ab3404df8f..903edeff52 100644 --- a/core/resource.h +++ b/core/resource.h @@ -103,7 +103,7 @@ public: void set_subindex(int p_sub_index); int get_subindex() const; - Ref<Resource> duplicate(bool p_subresources = false); + virtual Ref<Resource> duplicate(bool p_subresources = false) const; Ref<Resource> duplicate_for_local_scene(Node *p_scene, Map<Ref<Resource>, Ref<Resource> > &remap_cache); void set_local_to_scene(bool p_enable); diff --git a/core/script_debugger_remote.cpp b/core/script_debugger_remote.cpp index bd0352b7a4..f230a4bc95 100644 --- a/core/script_debugger_remote.cpp +++ b/core/script_debugger_remote.cpp @@ -586,9 +586,7 @@ void ScriptDebuggerRemote::_send_object_id(ObjectID p_id) { packet_peer_stream->put_var(E->get().hint); packet_peer_stream->put_var(E->get().hint_string); //only send information that can be sent.. - if (var.get_type() == Variant::IMAGE) { - var = Image(); - } + if (var.get_type() >= Variant::DICTIONARY) { var = Array(); //send none for now, may be to big } diff --git a/core/ustring.cpp b/core/ustring.cpp index dcb6545bd1..7a5129962b 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -53,6 +53,8 @@ #define MAX_DIGITS 6 #define UPPERCASE(m_c) (((m_c) >= 'a' && (m_c) <= 'z') ? ((m_c) - ('a' - 'A')) : (m_c)) #define LOWERCASE(m_c) (((m_c) >= 'A' && (m_c) <= 'Z') ? ((m_c) + ('a' - 'A')) : (m_c)) +#define IS_DIGIT(m_d) ((m_d) >= '0' && (m_d) <= '9') +#define IS_HEX_DIGIT(m_d) (((m_d) >= '0' && (m_d) <= '9') || ((m_d) >= 'a' && (m_d) <= 'f') || ((m_d) >= 'A' && (m_d) <= 'F')) /** STRING **/ @@ -481,6 +483,56 @@ signed char String::casecmp_to(const String &p_str) const { return 0; //should never reach anyway } +signed char String::naturalnocasecmp_to(const String &p_str) const { + + const CharType *this_str = c_str(); + const CharType *that_str = p_str.c_str(); + + if (this_str && that_str) { + while (*this_str) { + + if (!*that_str) + return 1; + else if (IS_DIGIT(*this_str)) { + + int64_t this_int, that_int; + + if (!IS_DIGIT(*that_str)) + return -1; + + /* Compare the numbers */ + this_int = to_int(this_str); + that_int = to_int(that_str); + + if (this_int < that_int) + return -1; + else if (this_int > that_int) + return 1; + + /* Skip */ + while (IS_DIGIT(*this_str)) + this_str++; + while (IS_DIGIT(*that_str)) + that_str++; + } else if (IS_DIGIT(*that_str)) + return 1; + else { + if (_find_upper(*this_str) < _find_upper(*that_str)) //more than + return -1; + else if (_find_upper(*this_str) > _find_upper(*that_str)) //less than + return 1; + + this_str++; + that_str++; + } + } + if (*that_str) + return -1; + } + + return 0; +} + void String::erase(int p_pos, int p_chars) { *this = left(p_pos) + substr(p_pos + p_chars, length() - ((p_pos + p_chars))); @@ -1698,9 +1750,6 @@ bool String::is_numeric() const { return true; // TODO: Use the parser below for this instead }; -#define IS_DIGIT(m_d) ((m_d) >= '0' && (m_d) <= '9') -#define IS_HEX_DIGIT(m_d) (((m_d) >= '0' && (m_d) <= '9') || ((m_d) >= 'a' && (m_d) <= 'f') || ((m_d) >= 'A' && (m_d) <= 'F')) - template <class C> static double built_in_strtod(const C *string, /* A decimal ASCII floating-point number, * optionally preceded by white space. Must diff --git a/core/ustring.h b/core/ustring.h index 9ee3c2042c..d00bfa59b5 100644 --- a/core/ustring.h +++ b/core/ustring.h @@ -98,6 +98,7 @@ public: signed char casecmp_to(const String &p_str) const; signed char nocasecmp_to(const String &p_str) const; + signed char naturalnocasecmp_to(const String &p_str) const; const CharType *c_str() const; /* standard size stuff */ @@ -256,6 +257,14 @@ struct NoCaseComparator { } }; +struct NaturalNoCaseComparator { + + bool operator()(const String &p_a, const String &p_b) const { + + return p_a.naturalnocasecmp_to(p_b) < 0; + } +}; + /* end of namespace */ //tool translate diff --git a/core/variant.cpp b/core/variant.cpp index 67ce8af483..9c05dbaca0 100644 --- a/core/variant.cpp +++ b/core/variant.cpp @@ -120,11 +120,6 @@ String Variant::get_type_name(Variant::Type p_type) { return "Color"; } break; - case IMAGE: { - - return "Image"; - - } break; case _RID: { return "RID"; @@ -249,7 +244,6 @@ bool Variant::can_convert(Variant::Type p_type_from, Variant::Type p_type_to) { static const Type invalid[] = { OBJECT, - IMAGE, NIL }; @@ -791,11 +785,6 @@ bool Variant::is_zero() const { return *reinterpret_cast<const Color *>(_data._mem) == Color(); } break; - case IMAGE: { - - return _data._image->empty(); - - } break; case _RID: { return *reinterpret_cast<const RID *>(_data._mem) == RID(); @@ -1016,11 +1005,6 @@ void Variant::reference(const Variant &p_variant) { memnew_placement(_data._mem, Color(*reinterpret_cast<const Color *>(p_variant._data._mem))); } break; - case IMAGE: { - - _data._image = memnew(Image(*p_variant._data._image)); - - } break; case _RID: { memnew_placement(_data._mem, RID(*reinterpret_cast<const RID *>(p_variant._data._mem))); @@ -1141,11 +1125,6 @@ void Variant::clear() { } break; // misc types - case IMAGE: { - - memdelete(_data._image); - - } break; case NODE_PATH: { reinterpret_cast<NodePath *>(_data._mem)->~NodePath(); @@ -1760,13 +1739,6 @@ Variant::operator Color() const { else return Color(); } -Variant::operator Image() const { - - if (type == IMAGE) - return *_data._image; - else - return Image(); -} Variant::operator NodePath() const { @@ -2306,11 +2278,6 @@ Variant::Variant(const Color &p_color) { type = COLOR; memnew_placement(_data._mem, Color(p_color)); } -Variant::Variant(const Image &p_image) { - - type = IMAGE; - _data._image = memnew(Image(p_image)); -} Variant::Variant(const NodePath &p_node_path) { @@ -2711,11 +2678,6 @@ uint32_t Variant::hash() const { return hash_djb2_one_float(reinterpret_cast<const Color *>(_data._mem)->a, hash); } break; - case IMAGE: { - - return 0; - - } break; case _RID: { return hash_djb2_one_64(reinterpret_cast<const RID *>(_data._mem)->get_id()); diff --git a/core/variant.h b/core/variant.h index e1a2b89a07..76097dfbdd 100644 --- a/core/variant.h +++ b/core/variant.h @@ -39,7 +39,6 @@ #include "dictionary.h" #include "dvector.h" #include "face3.h" -#include "image.h" #include "io/ip_address.h" #include "math_2d.h" #include "matrix3.h" @@ -92,26 +91,25 @@ public: TRANSFORM2D, PLANE, QUAT, // 10 - RECT3, //sorry naming convention fail :( not like it's used often + RECT3, BASIS, TRANSFORM, // misc types COLOR, - IMAGE, // 15 - NODE_PATH, + NODE_PATH, // 15 _RID, OBJECT, INPUT_EVENT, - DICTIONARY, // 20 - ARRAY, + DICTIONARY, + ARRAY, // 20 // arrays POOL_BYTE_ARRAY, POOL_INT_ARRAY, POOL_REAL_ARRAY, - POOL_STRING_ARRAY, // 25 - POOL_VECTOR2_ARRAY, + POOL_STRING_ARRAY, + POOL_VECTOR2_ARRAY, // 25 POOL_VECTOR3_ARRAY, POOL_COLOR_ARRAY, @@ -146,7 +144,6 @@ private: Transform *_transform; RefPtr *_resource; InputEvent *_input_event; - Image *_image; void *_ptr; //generic pointer uint8_t _mem[sizeof(ObjData) > (sizeof(real_t) * 4) ? sizeof(ObjData) : (sizeof(real_t) * 4)]; } _data; @@ -207,7 +204,6 @@ public: operator Transform2D() const; operator Color() const; - operator Image() const; operator NodePath() const; operator RefPtr() const; operator RID() const; @@ -276,7 +272,6 @@ public: Variant(const Transform2D &p_transform); Variant(const Transform &p_transform); Variant(const Color &p_color); - Variant(const Image &p_image); Variant(const NodePath &p_path); Variant(const RefPtr &p_resource); Variant(const RID &p_rid); diff --git a/core/variant_call.cpp b/core/variant_call.cpp index beaee188eb..8bc9f085ad 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -37,9 +37,6 @@ typedef void (*VariantFunc)(Variant &r_ret, Variant &p_self, const Variant **p_args); typedef void (*VariantConstructFunc)(Variant &r_ret, const Variant **p_args); -VARIANT_ENUM_CAST(Image::CompressMode); -//VARIANT_ENUM_CAST(Image::Format); - struct _VariantCall { static void Vector3_dot(Variant &r_ret, Variant &p_self, const Variant **p_args) { @@ -614,22 +611,6 @@ struct _VariantCall { #define VCALL_PTR5R(m_type, m_method) \ static void _call_##m_type##_##m_method(Variant &r_ret, Variant &p_self, const Variant **p_args) { r_ret = reinterpret_cast<m_type *>(p_self._data._ptr)->m_method(*p_args[0], *p_args[1], *p_args[2], *p_args[3], *p_args[4]); } - VCALL_PTR0R(Image, get_format); - VCALL_PTR0R(Image, get_width); - VCALL_PTR0R(Image, get_height); - VCALL_PTR0R(Image, empty); - VCALL_PTR0R(Image, get_used_rect); - VCALL_PTR1R(Image, load); - VCALL_PTR1R(Image, save_png); - VCALL_PTR1R(Image, get_rect); - VCALL_PTR1R(Image, compressed); - VCALL_PTR0R(Image, decompressed); - VCALL_PTR3R(Image, resized); - VCALL_PTR0R(Image, get_data); - VCALL_PTR3(Image, blit_rect); - VCALL_PTR1R(Image, converted); - VCALL_PTR0(Image, fix_alpha_edges); - VCALL_PTR0R(Rect3, get_area); VCALL_PTR0R(Rect3, has_no_area); VCALL_PTR0R(Rect3, has_no_surface); @@ -901,11 +882,6 @@ struct _VariantCall { r_ret = Transform(p_args[0]->operator Basis(), p_args[1]->operator Vector3()); } - static void Image_init1(Variant &r_ret, const Variant **p_args) { - - r_ret = Image(*p_args[0], *p_args[1], *p_args[2], Image::Format(p_args[3]->operator int())); - } - static void add_constructor(VariantConstructFunc p_func, const Variant::Type p_type, const String &p_name1 = "", const Variant::Type p_type1 = Variant::NIL, const String &p_name2 = "", const Variant::Type p_type2 = Variant::NIL, @@ -1056,7 +1032,6 @@ Variant Variant::construct(const Variant::Type p_type, const Variant **p_args, i // misc types case COLOR: return Color(); - case IMAGE: return Image(); case NODE_PATH: return NodePath(); // 15 case _RID: return RID(); @@ -1138,7 +1113,6 @@ Variant Variant::construct(const Variant::Type p_type, const Variant **p_args, i // misc types case COLOR: return p_args[0]->type == Variant::STRING ? Color::html(*p_args[0]) : Color::hex(*p_args[0]); - case IMAGE: return (Image(*p_args[0])); case NODE_PATH: return (NodePath(p_args[0]->operator NodePath())); // 15 case _RID: return (RID(*p_args[0])); @@ -1527,22 +1501,6 @@ void register_variant_methods() { ADDFUNC1(COLOR, COLOR, Color, blend, COLOR, "over", varray()); ADDFUNC1(COLOR, STRING, Color, to_html, BOOL, "with_alpha", varray(true)); - ADDFUNC0(IMAGE, INT, Image, get_format, varray()); - ADDFUNC0(IMAGE, INT, Image, get_width, varray()); - ADDFUNC0(IMAGE, INT, Image, get_height, varray()); - ADDFUNC0(IMAGE, BOOL, Image, empty, varray()); - ADDFUNC1(IMAGE, INT, Image, load, STRING, "path", varray(0)); - ADDFUNC1(IMAGE, INT, Image, save_png, STRING, "path", varray(0)); - ADDFUNC0(IMAGE, RECT2, Image, get_used_rect, varray(0)); - ADDFUNC1(IMAGE, IMAGE, Image, get_rect, RECT2, "area", varray(0)); - ADDFUNC1(IMAGE, IMAGE, Image, compressed, INT, "format", varray(0)); - ADDFUNC0(IMAGE, IMAGE, Image, decompressed, varray(0)); - ADDFUNC3(IMAGE, IMAGE, Image, resized, INT, "x", INT, "y", INT, "interpolation", varray(((int)Image::INTERPOLATE_BILINEAR))); - ADDFUNC0(IMAGE, POOL_BYTE_ARRAY, Image, get_data, varray()); - ADDFUNC3(IMAGE, NIL, Image, blit_rect, IMAGE, "src", RECT2, "src_rect", VECTOR2, "dest", varray(0)); - ADDFUNC1(IMAGE, IMAGE, Image, converted, INT, "format", varray(0)); - ADDFUNC0(IMAGE, NIL, Image, fix_alpha_edges, varray()); - ADDFUNC0(_RID, INT, RID, get_id, varray()); ADDFUNC0(NODE_PATH, BOOL, NodePath, is_absolute, varray()); @@ -1771,8 +1729,6 @@ void register_variant_methods() { _VariantCall::add_constructor(_VariantCall::Transform_init1, Variant::TRANSFORM, "x_axis", Variant::VECTOR3, "y_axis", Variant::VECTOR3, "z_axis", Variant::VECTOR3, "origin", Variant::VECTOR3); _VariantCall::add_constructor(_VariantCall::Transform_init2, Variant::TRANSFORM, "basis", Variant::BASIS, "origin", Variant::VECTOR3); - _VariantCall::add_constructor(_VariantCall::Image_init1, Variant::IMAGE, "width", Variant::INT, "height", Variant::INT, "mipmaps", Variant::BOOL, "format", Variant::INT); - /* REGISTER CONSTANTS */ _VariantCall::add_constant(Variant::VECTOR3, "AXIS_X", Vector3::AXIS_X); @@ -1788,56 +1744,6 @@ void register_variant_methods() { _VariantCall::add_constant(Variant::INPUT_EVENT, "SCREEN_TOUCH", InputEvent::SCREEN_TOUCH); _VariantCall::add_constant(Variant::INPUT_EVENT, "SCREEN_DRAG", InputEvent::SCREEN_DRAG); _VariantCall::add_constant(Variant::INPUT_EVENT, "ACTION", InputEvent::ACTION); - - _VariantCall::add_constant(Variant::IMAGE, "COMPRESS_16BIT", Image::COMPRESS_16BIT); - _VariantCall::add_constant(Variant::IMAGE, "COMPRESS_S3TC", Image::COMPRESS_S3TC); - _VariantCall::add_constant(Variant::IMAGE, "COMPRESS_PVRTC2", Image::COMPRESS_PVRTC2); - _VariantCall::add_constant(Variant::IMAGE, "COMPRESS_PVRTC4", Image::COMPRESS_PVRTC4); - _VariantCall::add_constant(Variant::IMAGE, "COMPRESS_ETC", Image::COMPRESS_ETC); - _VariantCall::add_constant(Variant::IMAGE, "COMPRESS_ETC2", Image::COMPRESS_ETC2); - - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_L8", Image::FORMAT_L8); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_LA8", Image::FORMAT_LA8); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_R8", Image::FORMAT_R8); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RG8", Image::FORMAT_RG8); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGB8", Image::FORMAT_RGB8); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGBA8", Image::FORMAT_RGBA8); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGB565", Image::FORMAT_RGB565); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGBA4444", Image::FORMAT_RGBA4444); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGBA5551", Image::FORMAT_DXT1); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RF", Image::FORMAT_RF); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGF", Image::FORMAT_RGF); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGBF", Image::FORMAT_RGBF); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGBAF", Image::FORMAT_RGBAF); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RH", Image::FORMAT_RH); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGH", Image::FORMAT_RGH); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGBH", Image::FORMAT_RGBH); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_RGBAH", Image::FORMAT_RGBAH); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_DXT1", Image::FORMAT_DXT1); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_DXT3", Image::FORMAT_DXT3); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_DXT5", Image::FORMAT_DXT5); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ATI1", Image::FORMAT_ATI1); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ATI2", Image::FORMAT_ATI2); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_BPTC_RGBA", Image::FORMAT_BPTC_RGBA); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_BPTC_RGBF", Image::FORMAT_BPTC_RGBF); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_BPTC_RGBFU", Image::FORMAT_BPTC_RGBFU); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_PVRTC2", Image::FORMAT_PVRTC2); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_PVRTC2A", Image::FORMAT_PVRTC2A); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_PVRTC4", Image::FORMAT_PVRTC4); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_PVRTC4A", Image::FORMAT_PVRTC4A); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ETC", Image::FORMAT_ETC); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ETC2_R11", Image::FORMAT_ETC2_R11); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ETC2_R11S", Image::FORMAT_ETC2_R11S); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ETC2_RG11", Image::FORMAT_ETC2_RG11); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ETC2_RG11S", Image::FORMAT_ETC2_RG11S); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ETC2_RGB8", Image::FORMAT_ETC2_RGB8); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ETC2_RGBA8", Image::FORMAT_ETC2_RGBA8); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_ETC2_RGB8A1", Image::FORMAT_ETC2_RGB8A1); - _VariantCall::add_constant(Variant::IMAGE, "FORMAT_MAX", Image::FORMAT_MAX); - - _VariantCall::add_constant(Variant::IMAGE, "INTERPOLATE_NEAREST", Image::INTERPOLATE_NEAREST); - _VariantCall::add_constant(Variant::IMAGE, "INTERPOLATE_BILINEAR", Image::INTERPOLATE_BILINEAR); - _VariantCall::add_constant(Variant::IMAGE, "INTERPOLATE_CUBIC", Image::INTERPOLATE_CUBIC); } void unregister_variant_methods() { diff --git a/core/variant_op.cpp b/core/variant_op.cpp index e8274d10af..8bae6a168b 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -58,7 +58,6 @@ bool Variant::booleanize(bool &r_valid) const { case BASIS: case TRANSFORM: case COLOR: - case IMAGE: r_valid = false; return false; case _RID: return (*reinterpret_cast<const RID *>(_data._mem)).is_valid(); case OBJECT: return _get_obj().obj; case NODE_PATH: return (*reinterpret_cast<const NodePath *>(_data._mem)) != NodePath(); @@ -283,7 +282,6 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & DEFAULT_OP_PTRREF(==, TRANSFORM, _transform); DEFAULT_OP_LOCALMEM(==, COLOR, Color); - DEFAULT_OP_PTRREF(==, IMAGE, _image); DEFAULT_OP_STR(==, NODE_PATH, NodePath); DEFAULT_OP_LOCALMEM(==, _RID, RID); case OBJECT: { @@ -372,7 +370,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & DEFAULT_OP_FAIL(TRANSFORM); DEFAULT_OP_FAIL(COLOR); - DEFAULT_OP_FAIL(IMAGE); + DEFAULT_OP_FAIL(NODE_PATH); DEFAULT_OP_LOCALMEM(<, _RID, RID); case OBJECT: { @@ -437,7 +435,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & DEFAULT_OP_FAIL(TRANSFORM); DEFAULT_OP_FAIL(COLOR); - DEFAULT_OP_FAIL(IMAGE); + DEFAULT_OP_FAIL(NODE_PATH); DEFAULT_OP_LOCALMEM(<=, _RID, RID); case OBJECT: { @@ -500,7 +498,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & DEFAULT_OP_FAIL(TRANSFORM); DEFAULT_OP_FAIL(COLOR); - DEFAULT_OP_FAIL(IMAGE); + DEFAULT_OP_FAIL(NODE_PATH); DEFAULT_OP_FAIL(_RID); DEFAULT_OP_FAIL(OBJECT); @@ -557,7 +555,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & DEFAULT_OP_FAIL(TRANSFORM); DEFAULT_OP_FAIL(COLOR); - DEFAULT_OP_FAIL(IMAGE); + DEFAULT_OP_FAIL(NODE_PATH); DEFAULT_OP_FAIL(_RID); DEFAULT_OP_FAIL(OBJECT); @@ -654,7 +652,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & return; } break; DEFAULT_OP_FAIL(COLOR); - DEFAULT_OP_FAIL(IMAGE); + DEFAULT_OP_FAIL(NODE_PATH); DEFAULT_OP_FAIL(_RID); DEFAULT_OP_FAIL(OBJECT); @@ -727,7 +725,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & DEFAULT_OP_FAIL(TRANSFORM); DEFAULT_OP_FAIL(COLOR); - DEFAULT_OP_FAIL(IMAGE); + DEFAULT_OP_FAIL(NODE_PATH); DEFAULT_OP_FAIL(_RID); DEFAULT_OP_FAIL(OBJECT); @@ -769,7 +767,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & DEFAULT_OP_LOCALMEM_POS(VECTOR2, Vector2); DEFAULT_OP_FAIL(COLOR); - DEFAULT_OP_FAIL(IMAGE); + DEFAULT_OP_FAIL(NODE_PATH); DEFAULT_OP_FAIL(_RID); DEFAULT_OP_FAIL(OBJECT); @@ -809,7 +807,7 @@ void Variant::evaluate(const Operator &p_op, const Variant &p_a, const Variant & DEFAULT_OP_FAIL(TRANSFORM); DEFAULT_OP_FAIL(COLOR); - DEFAULT_OP_FAIL(IMAGE); + DEFAULT_OP_FAIL(NODE_PATH); DEFAULT_OP_FAIL(_RID); DEFAULT_OP_FAIL(OBJECT); @@ -1305,7 +1303,7 @@ void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid) } } - } break; + } break; // 10 case RECT3: { if (p_value.type != Variant::VECTOR3) @@ -1330,7 +1328,7 @@ void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid) return; } } - } break; //sorry naming convention fail :( not like it's used often // 10 + } break; case BASIS: { if (p_value.type != Variant::VECTOR3) @@ -1480,8 +1478,6 @@ void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid) } } break; - case IMAGE: { - } break; case NODE_PATH: { } break; // 15 case _RID: { @@ -1900,13 +1896,13 @@ void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid) dic->operator[](p_index) = p_value; valid = true; //always valid, i guess? should this really be ok? return; - } break; // 20 - DEFAULT_OP_ARRAY_CMD(ARRAY, Array, ;, (*arr)[index] = p_value; return ) + } break; + DEFAULT_OP_ARRAY_CMD(ARRAY, Array, ;, (*arr)[index] = p_value; return ) // 20 DEFAULT_OP_DVECTOR_SET(POOL_BYTE_ARRAY, uint8_t, p_value.type != Variant::REAL && p_value.type != Variant::INT) DEFAULT_OP_DVECTOR_SET(POOL_INT_ARRAY, int, p_value.type != Variant::REAL && p_value.type != Variant::INT) DEFAULT_OP_DVECTOR_SET(POOL_REAL_ARRAY, real_t, p_value.type != Variant::REAL && p_value.type != Variant::INT) - DEFAULT_OP_DVECTOR_SET(POOL_STRING_ARRAY, String, p_value.type != Variant::STRING) // 25 - DEFAULT_OP_DVECTOR_SET(POOL_VECTOR2_ARRAY, Vector2, p_value.type != Variant::VECTOR2) + DEFAULT_OP_DVECTOR_SET(POOL_STRING_ARRAY, String, p_value.type != Variant::STRING) + DEFAULT_OP_DVECTOR_SET(POOL_VECTOR2_ARRAY, Vector2, p_value.type != Variant::VECTOR2) // 25 DEFAULT_OP_DVECTOR_SET(POOL_VECTOR3_ARRAY, Vector3, p_value.type != Variant::VECTOR3) DEFAULT_OP_DVECTOR_SET(POOL_COLOR_ARRAY, Color, p_value.type != Variant::COLOR) default: return; @@ -2107,7 +2103,7 @@ Variant Variant::get(const Variant &p_index, bool *r_valid) const { } } - } break; + } break; // 10 case RECT3: { if (p_index.get_type() == Variant::STRING) { @@ -2126,7 +2122,7 @@ Variant Variant::get(const Variant &p_index, bool *r_valid) const { return v->size + v->pos; } } - } break; //sorry naming convention fail :( not like it's used often // 10 + } break; case BASIS: { if (p_index.get_type() == Variant::INT || p_index.get_type() == Variant::REAL) { @@ -2239,8 +2235,6 @@ Variant Variant::get(const Variant &p_index, bool *r_valid) const { } } break; - case IMAGE: { - } break; case NODE_PATH: { } break; // 15 case _RID: { @@ -2504,13 +2498,13 @@ Variant Variant::get(const Variant &p_index, bool *r_valid) const { valid = true; return *res; } - } break; // 20 - DEFAULT_OP_ARRAY_CMD(ARRAY, const Array, ;, return (*arr)[index]) + } break; + DEFAULT_OP_ARRAY_CMD(ARRAY, const Array, ;, return (*arr)[index]) // 20 DEFAULT_OP_DVECTOR_GET(POOL_BYTE_ARRAY, uint8_t) DEFAULT_OP_DVECTOR_GET(POOL_INT_ARRAY, int) DEFAULT_OP_DVECTOR_GET(POOL_REAL_ARRAY, real_t) DEFAULT_OP_DVECTOR_GET(POOL_STRING_ARRAY, String) - DEFAULT_OP_DVECTOR_GET(POOL_VECTOR2_ARRAY, Vector2) + DEFAULT_OP_DVECTOR_GET(POOL_VECTOR2_ARRAY, Vector2) // 25 DEFAULT_OP_DVECTOR_GET(POOL_VECTOR3_ARRAY, Vector3) DEFAULT_OP_DVECTOR_GET(POOL_COLOR_ARRAY, Color) default: return Variant(); @@ -2774,12 +2768,12 @@ void Variant::get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::REAL, "z")); p_list->push_back(PropertyInfo(Variant::REAL, "w")); - } break; + } break; // 10 case RECT3: { p_list->push_back(PropertyInfo(Variant::VECTOR3, "pos")); p_list->push_back(PropertyInfo(Variant::VECTOR3, "size")); p_list->push_back(PropertyInfo(Variant::VECTOR3, "end")); - } break; //sorry naming convention fail :( not like it's used often // 10 + } break; case BASIS: { p_list->push_back(PropertyInfo(Variant::VECTOR3, "x")); @@ -2807,8 +2801,6 @@ void Variant::get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::INT, "a8")); } break; - case IMAGE: { - } break; case NODE_PATH: { } break; // 15 case _RID: { @@ -2929,12 +2921,13 @@ void Variant::get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::STRING, E->get())); } } - } break; // 20 - case ARRAY: + } break; + case ARRAY: // 20 case POOL_BYTE_ARRAY: case POOL_INT_ARRAY: case POOL_REAL_ARRAY: case POOL_STRING_ARRAY: + case POOL_VECTOR2_ARRAY: // 25 case POOL_VECTOR3_ARRAY: case POOL_COLOR_ARRAY: { @@ -3631,10 +3624,6 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & r_dst = reinterpret_cast<const Color *>(a._data._mem)->linear_interpolate(*reinterpret_cast<const Color *>(b._data._mem), c); } return; - case IMAGE: { - r_dst = a; - } - return; case NODE_PATH: { r_dst = a; } diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp index 234156d39f..798a830dd0 100644 --- a/core/variant_parser.cpp +++ b/core/variant_parser.cpp @@ -504,39 +504,7 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream, return OK; } else if (token.type == TK_IDENTIFIER) { - /* - VECTOR2, // 5 - RECT2, - VECTOR3, - MATRIX32, - PLANE, - QUAT, // 10 - _AABB, //sorry naming convention fail :( not like it's used often - MATRIX3, - TRANSFORM, - // misc types - COLOR, - IMAGE, // 15 - NODE_PATH, - _RID, - OBJECT, - INPUT_EVENT, - DICTIONARY, // 20 - ARRAY, - - // arrays - RAW_ARRAY, - INT_ARRAY, - REAL_ARRAY, - STRING_ARRAY, // 25 - VECTOR2_ARRAY, - VECTOR3_ARRAY, - COLOR_ARRAY, - - VARIANT_MAX - -*/ String id = token.value; if (id == "true") value = true; @@ -681,126 +649,6 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream, value = Color(args[0], args[1], args[2], args[3]); return OK; - } else if (id == "Image") { - - //:| - - get_token(p_stream, token, line, r_err_str); - if (token.type != TK_PARENTHESIS_OPEN) { - r_err_str = "Expected '('"; - return ERR_PARSE_ERROR; - } - - get_token(p_stream, token, line, r_err_str); - if (token.type == TK_PARENTHESIS_CLOSE) { - value = Image(); // just an Image() - return OK; - } else if (token.type != TK_NUMBER) { - r_err_str = "Expected number (width)"; - return ERR_PARSE_ERROR; - } - - get_token(p_stream, token, line, r_err_str); - - int width = token.value; - if (token.type != TK_COMMA) { - r_err_str = "Expected ','"; - return ERR_PARSE_ERROR; - } - - get_token(p_stream, token, line, r_err_str); - if (token.type != TK_NUMBER) { - r_err_str = "Expected number (height)"; - return ERR_PARSE_ERROR; - } - - int height = token.value; - - get_token(p_stream, token, line, r_err_str); - if (token.type != TK_COMMA) { - r_err_str = "Expected ','"; - return ERR_PARSE_ERROR; - } - - get_token(p_stream, token, line, r_err_str); - - bool has_mipmaps = false; - - if (token.type == TK_NUMBER) { - has_mipmaps = bool(token.value); - } else if (token.type == TK_IDENTIFIER && String(token.value) == "true") { - has_mipmaps = true; - } else if (token.type == TK_IDENTIFIER && String(token.value) == "false") { - has_mipmaps = false; - } else { - r_err_str = "Expected number/true/false (mipmaps)"; - return ERR_PARSE_ERROR; - } - - int mipmaps = token.value; - - get_token(p_stream, token, line, r_err_str); - if (token.type != TK_COMMA) { - r_err_str = "Expected ','"; - return ERR_PARSE_ERROR; - } - - get_token(p_stream, token, line, r_err_str); - if (token.type != TK_IDENTIFIER) { - r_err_str = "Expected identifier (format)"; - return ERR_PARSE_ERROR; - } - - String sformat = token.value; - - Image::Format format = Image::FORMAT_MAX; - - for (int i = 0; i < Image::FORMAT_MAX; i++) { - if (Image::get_format_name(Image::Format(i)) == sformat) { - format = Image::Format(i); - } - } - - if (format == Image::FORMAT_MAX) { - r_err_str = "Unknown image format: " + String(sformat); - return ERR_PARSE_ERROR; - } - - int len = Image::get_image_data_size(width, height, format, mipmaps); - - PoolVector<uint8_t> buffer; - buffer.resize(len); - - if (buffer.size() != len) { - r_err_str = "Couldn't allocate image buffer of size: " + itos(len); - } - - { - PoolVector<uint8_t>::Write w = buffer.write(); - - for (int i = 0; i < len; i++) { - get_token(p_stream, token, line, r_err_str); - if (token.type != TK_COMMA) { - r_err_str = "Expected ','"; - return ERR_PARSE_ERROR; - } - - get_token(p_stream, token, line, r_err_str); - if (token.type != TK_NUMBER) { - r_err_str = "Expected number"; - return ERR_PARSE_ERROR; - } - - w[i] = int(token.value); - } - } - - Image img(width, height, mipmaps, format, buffer); - - value = img; - - return OK; - } else if (id == "NodePath") { get_token(p_stream, token, line, r_err_str); @@ -1357,68 +1205,12 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream, value = ie; return OK; - } else if (id == "img") { // compatibility with project.godot - - Token token; // FIXME: no need for this declaration? the first argument in line 509 is a Token& token. - get_token(p_stream, token, line, r_err_str); - if (token.type != TK_PARENTHESIS_OPEN) { - r_err_str = "Expected '(' in old-style project.godot construct"; - return ERR_PARSE_ERROR; - } - - while (true) { - CharType c = p_stream->get_char(); - if (p_stream->is_eof()) { - r_err_str = "Unexpected EOF in old style project.godot img()"; - return ERR_PARSE_ERROR; - } - if (c == ')') - break; - } - - value = Image(); - - return OK; } else { r_err_str = "Unexpected identifier: '" + id + "'."; return ERR_PARSE_ERROR; } - /* - VECTOR2, // 5 - RECT2, - VECTOR3, - MATRIX32, - PLANE, - QUAT, // 10 - _AABB, //sorry naming convention fail :( not like it's used often - MATRIX3, - TRANSFORM, - - // misc types - COLOR, - IMAGE, // 15 - NODE_PATH, - _RID, - OBJECT, - INPUT_EVENT, - DICTIONARY, // 20 - ARRAY, - - // arrays - RAW_ARRAY, - INT_ARRAY, - REAL_ARRAY, - STRING_ARRAY, // 25 - VECTOR2_ARRAY, - VECTOR3_ARRAY, - COLOR_ARRAY, - - VARIANT_MAX - - */ - return OK; } else if (token.type == TK_NUMBER) { @@ -1886,39 +1678,6 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str p_store_string_func(p_store_string_ud, "Color( " + rtosfix(c.r) + ", " + rtosfix(c.g) + ", " + rtosfix(c.b) + ", " + rtosfix(c.a) + " )"); } break; - case Variant::IMAGE: { - - Image img = p_variant; - - if (img.empty()) { - p_store_string_func(p_store_string_ud, "Image()"); - break; - } - - String imgstr = "Image( "; - imgstr += itos(img.get_width()); - imgstr += ", " + itos(img.get_height()); - imgstr += ", " + String(img.has_mipmaps() ? "true" : "false"); - imgstr += ", " + Image::get_format_name(img.get_format()); - - String s; - - PoolVector<uint8_t> data = img.get_data(); - int len = data.size(); - PoolVector<uint8_t>::Read r = data.read(); - const uint8_t *ptr = r.ptr(); - for (int i = 0; i < len; i++) { - - if (i > 0) - s += ", "; - s += itos(ptr[i]); - } - - imgstr += ", "; - p_store_string_func(p_store_string_ud, imgstr); - p_store_string_func(p_store_string_ud, s); - p_store_string_func(p_store_string_ud, " )"); - } break; case Variant::NODE_PATH: { String str = p_variant; diff --git a/doc/Makefile b/doc/Makefile index d59c77063b..4914c657d2 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -8,25 +8,11 @@ TOOLSDIR = $(BASEDIR)/tools clean: rm -rf $(OUTPUTDIR) -doku: - rm -rf $(OUTPUTDIR)/doku - mkdir -p $(OUTPUTDIR)/doku - pushd $(OUTPUTDIR)/doku - python2 $(TOOLSDIR)/makedoku.py $(CLASSES) - popd - doxygen: rm -rf $(OUTPUTDIR)/doxygen mkdir -p $(OUTPUTDIR)/doxygen doxygen Doxyfile -html: - rm -rf $(OUTPUTDIR)/html - mkdir -p $(OUTPUTDIR)/html - pushd $(OUTPUTDIR)/html - python2 $(TOOLSDIR)/makehtml.py -multipage $(CLASSES) - popd - markdown: rm -rf $(OUTPUTDIR)/markdown mkdir -p $(OUTPUTDIR)/markdown @@ -40,8 +26,3 @@ rst: pushd $(OUTPUTDIR)/rst python2 $(TOOLSDIR)/makerst.py $(CLASSES) popd - -textile: - rm -rf $(OUTPUTDIR)/textile - mkdir -p $(OUTPUTDIR)/textile - python3 $(TOOLSDIR)/makedocs.py --input $(CLASSES) --output $(OUTPUTDIR)/textile diff --git a/doc/base/classes.xml b/doc/base/classes.xml index 03dd151eb2..af0a494a84 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -15433,6 +15433,10 @@ <method name="is_valid" qualifiers="const"> <return type="bool"> </return> + <argument index="0" name="extended_check" type="bool" default="false"> + If true, also check if the associated script and object still exists. + The extended check is done in debug mode as part of [method GDFunctionState.resume], but you can use this if you know you may be trying to resume without knowing for sure the object and/or script have survived up to that point. + </argument> <description> Check whether the function call may be resumed. This is not the case if the function state was already resumed. </description> @@ -26264,7 +26268,7 @@ <return type="String"> </return> <description> - Return the name of the host OS. Possible values are: "Android", "BlackBerry 10", "Flash", "Haiku", "iOS", "HTML5", "OSX", "Server", "Windows", "UWP", "X11" + Return the name of the host OS. Possible values are: "Android", "Haiku", "iOS", "HTML5", "OSX", "Server", "Windows", "UWP", "X11". </description> </method> <method name="get_power_percent_left"> @@ -27184,7 +27188,7 @@ Persisting connections are saved when the object is serialized to file. </constant> <constant name="CONNECT_ONESHOT" value="4"> - One short connections disconnect themselves after emission. + One shot connections disconnect themselves after emission. </constant> </constants> </class> @@ -36778,7 +36782,7 @@ <return type="int"> </return> <description> - Poll the load. If OK is returned, this means poll will have to be called again. If ERR_EOF is returned, them the load has finished and the resource can be obtained by calling [method get_resource]. + Poll the load. If OK is returned, this means poll will have to be called again. If ERR_FILE_EOF is returned, them the load has finished and the resource can be obtained by calling [method get_resource]. </description> </method> <method name="wait"> 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/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index 60282fb3fa..3c543365f0 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -342,12 +342,12 @@ void RasterizerGLES2::_draw_primitive(int p_points, const Vector3 *p_vertices, c /* TEXTURE API */ -Image RasterizerGLES2::_get_gl_image_and_format(const Image &p_image, Image::Format p_format, uint32_t p_flags, GLenum &r_gl_format, GLenum &r_gl_internal_format, int &r_gl_components, bool &r_has_alpha_cache, bool &r_compressed) { +Ref<Image> RasterizerGLES2::_get_gl_image_and_format(const Ref<Image> &p_image, Image::Format p_format, uint32_t p_flags, GLenum &r_gl_format, GLenum &r_gl_internal_format, int &r_gl_components, bool &r_has_alpha_cache, bool &r_compressed) { r_has_alpha_cache = false; r_compressed = false; r_gl_format = 0; - Image image = p_image; + Ref<Image> image = p_image; switch (p_format) { diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index db814ec721..aa4150cbe4 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -271,9 +271,9 @@ void RasterizerGLES3::clear_render_target(const Color &p_color) { storage->frame.clear_request_color = p_color; } -void RasterizerGLES3::set_boot_image(const Image &p_image, const Color &p_color, bool p_scale) { +void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale) { - if (p_image.empty()) + if (p_image.is_null() || p_image->empty()) return; begin_frame(); @@ -290,10 +290,10 @@ void RasterizerGLES3::set_boot_image(const Image &p_image, const Color &p_color, canvas->canvas_begin(); RID texture = storage->texture_create(); - storage->texture_allocate(texture, p_image.get_width(), p_image.get_height(), p_image.get_format(), VS::TEXTURE_FLAG_FILTER); + storage->texture_allocate(texture, p_image->get_width(), p_image->get_height(), p_image->get_format(), VS::TEXTURE_FLAG_FILTER); storage->texture_set_data(texture, p_image); - Rect2 imgrect(0, 0, p_image.get_width(), p_image.get_height()); + Rect2 imgrect(0, 0, p_image->get_width(), p_image->get_height()); Rect2 screenrect; if (p_scale) { diff --git a/drivers/gles3/rasterizer_gles3.h b/drivers/gles3/rasterizer_gles3.h index 12014cd814..ce18d6b6c1 100644 --- a/drivers/gles3/rasterizer_gles3.h +++ b/drivers/gles3/rasterizer_gles3.h @@ -48,7 +48,7 @@ public: virtual RasterizerCanvas *get_canvas(); virtual RasterizerScene *get_scene(); - virtual void set_boot_image(const Image &p_image, const Color &p_color, bool p_scale); + virtual void set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale); virtual void initialize(); virtual void begin_frame(); diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index 1025acceb4..7db2f23d47 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -101,11 +101,11 @@ GLuint RasterizerStorageGLES3::system_fbo = 0; -Image RasterizerStorageGLES3::_get_gl_image_and_format(const Image &p_image, Image::Format p_format, uint32_t p_flags, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_gl_type, bool &r_compressed, bool &srgb) { +Ref<Image> RasterizerStorageGLES3::_get_gl_image_and_format(const Ref<Image> &p_image, Image::Format p_format, uint32_t p_flags, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_gl_type, bool &r_compressed, bool &srgb) { r_compressed = false; r_gl_format = 0; - Image image = p_image; + Ref<Image> image = p_image; srgb = false; bool need_decompress = false; @@ -538,16 +538,17 @@ Image RasterizerStorageGLES3::_get_gl_image_and_format(const Image &p_image, Ima } break; default: { - ERR_FAIL_V(Image()); + ERR_FAIL_V(Ref<Image>()); } } if (need_decompress) { - if (!image.empty()) { - image.decompress(); - ERR_FAIL_COND_V(image.is_compressed(), image); - image.convert(Image::FORMAT_RGBA8); + if (!image.is_null()) { + image = image->duplicate(); + image->decompress(); + ERR_FAIL_COND_V(image->is_compressed(), image); + image->convert(Image::FORMAT_RGBA8); } r_gl_format = GL_RGBA; @@ -607,7 +608,7 @@ void RasterizerStorageGLES3::texture_allocate(RID p_texture, int p_width, int p_ texture->stored_cube_sides = 0; texture->target = (p_flags & VS::TEXTURE_FLAG_CUBEMAP) ? GL_TEXTURE_CUBE_MAP : GL_TEXTURE_2D; - _get_gl_image_and_format(Image(), texture->format, texture->flags, format, internal_format, type, compressed, srgb); + _get_gl_image_and_format(Ref<Image>(), texture->format, texture->flags, format, internal_format, type, compressed, srgb); texture->alloc_width = texture->width; texture->alloc_height = texture->height; @@ -631,15 +632,15 @@ void RasterizerStorageGLES3::texture_allocate(RID p_texture, int p_width, int p_ texture->active = true; } -void RasterizerStorageGLES3::texture_set_data(RID p_texture, const Image &p_image, VS::CubeMapSide p_cube_side) { +void RasterizerStorageGLES3::texture_set_data(RID p_texture, const Ref<Image> &p_image, VS::CubeMapSide p_cube_side) { Texture *texture = texture_owner.get(p_texture); ERR_FAIL_COND(!texture); ERR_FAIL_COND(!texture->active); ERR_FAIL_COND(texture->render_target); - ERR_FAIL_COND(texture->format != p_image.get_format()); - ERR_FAIL_COND(p_image.empty()); + ERR_FAIL_COND(texture->format != p_image->get_format()); + ERR_FAIL_COND(p_image.is_null()); GLenum type; GLenum format; @@ -651,31 +652,31 @@ void RasterizerStorageGLES3::texture_set_data(RID p_texture, const Image &p_imag texture->images[p_cube_side] = p_image; } - Image img = _get_gl_image_and_format(p_image, p_image.get_format(), texture->flags, format, internal_format, type, compressed, srgb); + Ref<Image> img = _get_gl_image_and_format(p_image, p_image->get_format(), texture->flags, format, internal_format, type, compressed, srgb); - if (config.shrink_textures_x2 && (p_image.has_mipmaps() || !p_image.is_compressed()) && !(texture->flags & VS::TEXTURE_FLAG_USED_FOR_STREAMING)) { + if (config.shrink_textures_x2 && (p_image->has_mipmaps() || !p_image->is_compressed()) && !(texture->flags & VS::TEXTURE_FLAG_USED_FOR_STREAMING)) { texture->alloc_height = MAX(1, texture->alloc_height / 2); texture->alloc_width = MAX(1, texture->alloc_width / 2); - if (texture->alloc_width == img.get_width() / 2 && texture->alloc_height == img.get_height() / 2) { + if (texture->alloc_width == img->get_width() / 2 && texture->alloc_height == img->get_height() / 2) { - img.shrink_x2(); - } else if (img.get_format() <= Image::FORMAT_RGB565) { + img->shrink_x2(); + } else if (img->get_format() <= Image::FORMAT_RGB565) { - img.resize(texture->alloc_width, texture->alloc_height, Image::INTERPOLATE_BILINEAR); + img->resize(texture->alloc_width, texture->alloc_height, Image::INTERPOLATE_BILINEAR); } }; GLenum blit_target = (texture->target == GL_TEXTURE_CUBE_MAP) ? _cube_side_enum[p_cube_side] : GL_TEXTURE_2D; - texture->data_size = img.get_data().size(); - PoolVector<uint8_t>::Read read = img.get_data().read(); + texture->data_size = img->get_data().size(); + PoolVector<uint8_t>::Read read = img->get_data().read(); glActiveTexture(GL_TEXTURE0); glBindTexture(texture->target, texture->tex_id); - texture->ignore_mipmaps = compressed && !img.has_mipmaps(); + texture->ignore_mipmaps = compressed && !img->has_mipmaps(); if (texture->flags & VS::TEXTURE_FLAG_MIPMAPS && !texture->ignore_mipmaps) glTexParameteri(texture->target, GL_TEXTURE_MIN_FILTER, config.use_fast_texture_filter ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR_MIPMAP_LINEAR); @@ -761,16 +762,16 @@ void RasterizerStorageGLES3::texture_set_data(RID p_texture, const Image &p_imag } } - int mipmaps = (texture->flags & VS::TEXTURE_FLAG_MIPMAPS && img.has_mipmaps()) ? img.get_mipmap_count() + 1 : 1; + int mipmaps = (texture->flags & VS::TEXTURE_FLAG_MIPMAPS && img->has_mipmaps()) ? img->get_mipmap_count() + 1 : 1; - int w = img.get_width(); - int h = img.get_height(); + int w = img->get_width(); + int h = img->get_height(); int tsize = 0; for (int i = 0; i < mipmaps; i++) { int size, ofs; - img.get_mipmap_offset_and_size(i, ofs, size); + img->get_mipmap_offset_and_size(i, ofs, size); //print_line("mipmap: "+itos(i)+" size: "+itos(size)+" w: "+itos(mm_w)+", h: "+itos(mm_h)); @@ -813,16 +814,16 @@ void RasterizerStorageGLES3::texture_set_data(RID p_texture, const Image &p_imag //texture_set_flags(p_texture,texture->flags); } -Image RasterizerStorageGLES3::texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side) const { +Ref<Image> RasterizerStorageGLES3::texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side) const { Texture *texture = texture_owner.get(p_texture); - ERR_FAIL_COND_V(!texture, Image()); - ERR_FAIL_COND_V(!texture->active, Image()); - ERR_FAIL_COND_V(texture->data_size == 0, Image()); - ERR_FAIL_COND_V(texture->render_target, Image()); + ERR_FAIL_COND_V(!texture, Ref<Image>()); + ERR_FAIL_COND_V(!texture->active, Ref<Image>()); + ERR_FAIL_COND_V(texture->data_size == 0, Ref<Image>()); + ERR_FAIL_COND_V(texture->render_target, Ref<Image>()); - if (!texture->images[p_cube_side].empty()) { + if (!texture->images[p_cube_side].is_null()) { return texture->images[p_cube_side]; } @@ -867,13 +868,13 @@ Image RasterizerStorageGLES3::texture_get_data(RID p_texture, VS::CubeMapSide p_ data.resize(data_size); - Image img(texture->alloc_width, texture->alloc_height, texture->mipmaps > 1 ? true : false, texture->format, data); + Image *img = memnew(Image(texture->alloc_width, texture->alloc_height, texture->mipmaps > 1 ? true : false, texture->format, data)); - return img; + return Ref<Image>(img); #else ERR_EXPLAIN("Sorry, It's not posible to obtain images back in OpenGL ES"); - return Image(); + return Ref<Image>(); #endif } diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h index bb4a7e23a1..c700b7cb1c 100644 --- a/drivers/gles3/rasterizer_storage_gles3.h +++ b/drivers/gles3/rasterizer_storage_gles3.h @@ -240,7 +240,7 @@ public: RenderTarget *render_target; - Image images[6]; + Ref<Image> images[6]; VisualServer::TextureDetectCallback detect_3d; void *detect_3d_ud; @@ -280,12 +280,12 @@ public: mutable RID_Owner<Texture> texture_owner; - Image _get_gl_image_and_format(const Image &p_image, Image::Format p_format, uint32_t p_flags, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_type, bool &r_compressed, bool &srgb); + Ref<Image> _get_gl_image_and_format(const Ref<Image> &p_image, Image::Format p_format, uint32_t p_flags, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_type, bool &r_compressed, bool &srgb); virtual RID texture_create(); virtual void texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags = VS::TEXTURE_FLAGS_DEFAULT); - virtual void texture_set_data(RID p_texture, const Image &p_image, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT); - virtual Image texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) const; + virtual void texture_set_data(RID p_texture, const Ref<Image> &p_image, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT); + virtual Ref<Image> texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) const; virtual void texture_set_flags(RID p_texture, uint32_t p_flags); virtual uint32_t texture_get_flags(RID p_texture) const; virtual Image::Format texture_get_format(RID p_texture) const; diff --git a/drivers/png/image_loader_png.cpp b/drivers/png/image_loader_png.cpp index c9677bed11..fe2372e3af 100644 --- a/drivers/png/image_loader_png.cpp +++ b/drivers/png/image_loader_png.cpp @@ -68,7 +68,7 @@ static void _png_warn_function(png_structp, png_const_charp text) { typedef void(PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); -Error ImageLoaderPNG::_load_image(void *rf_up, png_rw_ptr p_func, Image *p_image) { +Error ImageLoaderPNG::_load_image(void *rf_up, png_rw_ptr p_func, Ref<Image> p_image) { png_structp png; png_infop info; @@ -201,7 +201,7 @@ Error ImageLoaderPNG::_load_image(void *rf_up, png_rw_ptr p_func, Image *p_image return OK; } -Error ImageLoaderPNG::load_image(Image *p_image, FileAccess *f) { +Error ImageLoaderPNG::load_image(Ref<Image> p_image, FileAccess *f) { Error err = _load_image(f, _read_png_data, p_image); f->close(); @@ -238,25 +238,26 @@ static void user_read_data(png_structp png_ptr, png_bytep data, png_size_t p_len } } -static Image _load_mem_png(const uint8_t *p_png, int p_size) { +static Ref<Image> _load_mem_png(const uint8_t *p_png, int p_size) { PNGReadStatus prs; prs.image = p_png; prs.offset = 0; prs.size = p_size; - Image img; - Error err = ImageLoaderPNG::_load_image(&prs, user_read_data, &img); - ERR_FAIL_COND_V(err, Image()); + Ref<Image> img; + img.instance(); + Error err = ImageLoaderPNG::_load_image(&prs, user_read_data, img); + ERR_FAIL_COND_V(err, Ref<Image>()); return img; } -static Image _lossless_unpack_png(const PoolVector<uint8_t> &p_data) { +static Ref<Image> _lossless_unpack_png(const PoolVector<uint8_t> &p_data) { int len = p_data.size(); PoolVector<uint8_t>::Read r = p_data.read(); - ERR_FAIL_COND_V(r[0] != 'P' || r[1] != 'N' || r[2] != 'G' || r[3] != ' ', Image()); + ERR_FAIL_COND_V(r[0] != 'P' || r[1] != 'N' || r[2] != 'G' || r[3] != ' ', Ref<Image>()); return _load_mem_png(&r[4], len - 4); } @@ -271,13 +272,14 @@ static void _write_png_data(png_structp png_ptr, png_bytep data, png_size_t p_le //print_line("png write: "+itos(p_length)); } -static PoolVector<uint8_t> _lossless_pack_png(const Image &p_image) { +static PoolVector<uint8_t> _lossless_pack_png(const Ref<Image> &p_image) { - Image img = p_image; - if (img.is_compressed()) - img.decompress(); + Ref<Image> img = p_image->duplicate(); - ERR_FAIL_COND_V(img.is_compressed(), PoolVector<uint8_t>()); + if (img->is_compressed()) + img->decompress(); + + ERR_FAIL_COND_V(img->is_compressed(), PoolVector<uint8_t>()); png_structp png_ptr; png_infop info_ptr; @@ -311,7 +313,7 @@ static PoolVector<uint8_t> _lossless_pack_png(const Image &p_image) { int pngf = 0; int cs = 0; - switch (img.get_format()) { + switch (img->get_format()) { case Image::FORMAT_L8: { @@ -335,22 +337,22 @@ static PoolVector<uint8_t> _lossless_pack_png(const Image &p_image) { } break; default: { - if (img.detect_alpha()) { + if (img->detect_alpha()) { - img.convert(Image::FORMAT_RGBA8); + img->convert(Image::FORMAT_RGBA8); pngf = PNG_COLOR_TYPE_RGB_ALPHA; cs = 4; } else { - img.convert(Image::FORMAT_RGB8); + img->convert(Image::FORMAT_RGB8); pngf = PNG_COLOR_TYPE_RGB; cs = 3; } } } - int w = img.get_width(); - int h = img.get_height(); + int w = img->get_width(); + int h = img->get_height(); png_set_IHDR(png_ptr, info_ptr, w, h, 8, pngf, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); @@ -362,7 +364,7 @@ static PoolVector<uint8_t> _lossless_pack_png(const Image &p_image) { ERR_FAIL_V(PoolVector<uint8_t>()); } - PoolVector<uint8_t>::Read r = img.get_data().read(); + PoolVector<uint8_t>::Read r = img->get_data().read(); row_pointers = (png_bytep *)memalloc(sizeof(png_bytep) * h); for (int i = 0; i < h; i++) { diff --git a/drivers/png/image_loader_png.h b/drivers/png/image_loader_png.h index 78e4252e26..f94b8bce6e 100644 --- a/drivers/png/image_loader_png.h +++ b/drivers/png/image_loader_png.h @@ -42,8 +42,8 @@ class ImageLoaderPNG : public ImageFormatLoader { static void _read_png_data(png_structp png_ptr, png_bytep data, png_size_t p_length); public: - static Error _load_image(void *rf_up, png_rw_ptr p_func, Image *p_image); - virtual Error load_image(Image *p_image, FileAccess *f); + static Error _load_image(void *rf_up, png_rw_ptr p_func, Ref<Image> p_image); + virtual Error load_image(Ref<Image> p_image, FileAccess *f); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderPNG(); }; diff --git a/drivers/png/resource_saver_png.cpp b/drivers/png/resource_saver_png.cpp index b754ef97b4..1700603489 100644 --- a/drivers/png/resource_saver_png.cpp +++ b/drivers/png/resource_saver_png.cpp @@ -50,7 +50,7 @@ Error ResourceSaverPNG::save(const String &p_path, const RES &p_resource, uint32 ERR_EXPLAIN("Can't save empty texture as PNG"); ERR_FAIL_COND_V(!texture->get_width() || !texture->get_height(), ERR_INVALID_PARAMETER); - Image img = texture->get_data(); + Ref<Image> img = texture->get_data(); Error err = save_image(p_path, img); @@ -95,12 +95,14 @@ Error ResourceSaverPNG::save(const String &p_path, const RES &p_resource, uint32 return err; }; -Error ResourceSaverPNG::save_image(const String &p_path, Image &p_img) { +Error ResourceSaverPNG::save_image(const String &p_path, const Ref<Image> &p_img) { - if (p_img.is_compressed()) - p_img.decompress(); + Ref<Image> img = p_img->duplicate(); - ERR_FAIL_COND_V(p_img.is_compressed(), ERR_INVALID_PARAMETER); + if (img->is_compressed()) + img->decompress(); + + ERR_FAIL_COND_V(img->is_compressed(), ERR_INVALID_PARAMETER); png_structp png_ptr; png_infop info_ptr; @@ -135,7 +137,7 @@ Error ResourceSaverPNG::save_image(const String &p_path, Image &p_img) { int pngf = 0; int cs = 0; - switch (p_img.get_format()) { + switch (img->get_format()) { case Image::FORMAT_L8: { @@ -159,22 +161,22 @@ Error ResourceSaverPNG::save_image(const String &p_path, Image &p_img) { } break; default: { - if (p_img.detect_alpha()) { + if (img->detect_alpha()) { - p_img.convert(Image::FORMAT_RGBA8); + img->convert(Image::FORMAT_RGBA8); pngf = PNG_COLOR_TYPE_RGB_ALPHA; cs = 4; } else { - p_img.convert(Image::FORMAT_RGB8); + img->convert(Image::FORMAT_RGB8); pngf = PNG_COLOR_TYPE_RGB; cs = 3; } } } - int w = p_img.get_width(); - int h = p_img.get_height(); + int w = img->get_width(); + int h = img->get_height(); png_set_IHDR(png_ptr, info_ptr, w, h, 8, pngf, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); @@ -187,7 +189,7 @@ Error ResourceSaverPNG::save_image(const String &p_path, Image &p_img) { ERR_FAIL_V(ERR_CANT_OPEN); } - PoolVector<uint8_t>::Read r = p_img.get_data().read(); + PoolVector<uint8_t>::Read r = img->get_data().read(); row_pointers = (png_bytep *)memalloc(sizeof(png_bytep) * h); for (int i = 0; i < h; i++) { diff --git a/drivers/png/resource_saver_png.h b/drivers/png/resource_saver_png.h index c25a01c1f6..31ec35c192 100644 --- a/drivers/png/resource_saver_png.h +++ b/drivers/png/resource_saver_png.h @@ -30,11 +30,12 @@ #ifndef RESOURCE_SAVER_PNG_H #define RESOURCE_SAVER_PNG_H +#include "image.h" #include "io/resource_saver.h" class ResourceSaverPNG : public ResourceFormatSaver { public: - static Error save_image(const String &p_path, Image &p_img); + static Error save_image(const String &p_path, const Ref<Image> &p_img); virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0); virtual bool recognize(const RES &p_resource) const; diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp index 1becf3accb..30d2377a04 100644 --- a/drivers/unix/ip_unix.cpp +++ b/drivers/unix/ip_unix.cpp @@ -77,7 +77,7 @@ static IP_Address _sockaddr2ip(struct sockaddr *p_addr) { if (p_addr->sa_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in *)p_addr; ip.set_ipv4((uint8_t *)&(addr->sin_addr)); - } else { + } else if (p_addr->sa_family == AF_INET6) { struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)p_addr; ip.set_ipv6(addr6->sin6_addr.s6_addr); }; @@ -180,15 +180,16 @@ void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const { SOCKADDR_IN *ipv4 = reinterpret_cast<SOCKADDR_IN *>(address->Address.lpSockaddr); ip.set_ipv4((uint8_t *)&(ipv4->sin_addr)); - } else { // ipv6 + r_addresses->push_back(ip); + + } else if (address->Address.lpSockaddr->sa_family == AF_INET6) { // ipv6 SOCKADDR_IN6 *ipv6 = reinterpret_cast<SOCKADDR_IN6 *>(address->Address.lpSockaddr); ip.set_ipv6(ipv6->sin6_addr.s6_addr); + r_addresses->push_back(ip); }; - r_addresses->push_back(ip); - address = address->Next; }; adapter = adapter->Next; @@ -205,6 +206,7 @@ void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const { struct ifaddrs *ifAddrStruct = NULL; struct ifaddrs *ifa = NULL; + int family; getifaddrs(&ifAddrStruct); @@ -212,6 +214,11 @@ void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const { if (!ifa->ifa_addr) continue; + family = ifa->ifa_addr->sa_family; + + if (family != AF_INET && family != AF_INET6) + continue; + IP_Address ip = _sockaddr2ip(ifa->ifa_addr); r_addresses->push_back(ip); } 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/drivers/unix/socket_helpers.h b/drivers/unix/socket_helpers.h index 8e54afcdba..5fa727a9b9 100644 --- a/drivers/unix/socket_helpers.h +++ b/drivers/unix/socket_helpers.h @@ -100,13 +100,21 @@ static size_t _set_listen_sockaddr(struct sockaddr_storage *p_addr, int p_port, }; }; -static int _socket_create(IP::Type p_type, int type, int protocol) { +static int _socket_create(IP::Type &p_type, int type, int protocol) { ERR_FAIL_COND_V(p_type > IP::TYPE_ANY || p_type < IP::TYPE_NONE, ERR_INVALID_PARAMETER); int family = p_type == IP::TYPE_IPV4 ? AF_INET : AF_INET6; int sockfd = socket(family, type, protocol); + if (sockfd == -1 && p_type == IP::TYPE_ANY) { + // Careful here, changing the referenced parameter so the caller knows that we are using an IPv4 socket + // in place of a dual stack one, and further calls to _set_sock_addr will work as expected. + p_type = IP::TYPE_IPV4; + family = AF_INET; + sockfd = socket(family, type, protocol); + } + ERR_FAIL_COND_V(sockfd == -1, -1); if (family == AF_INET6) { 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/asset_library_editor_plugin.cpp b/editor/asset_library_editor_plugin.cpp index 971adb14cf..fcb92e13b4 100644 --- a/editor/asset_library_editor_plugin.cpp +++ b/editor/asset_library_editor_plugin.cpp @@ -683,17 +683,18 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt int len = image_data.size(); PoolByteArray::Read r = image_data.read(); - Image image(r.ptr(), len); - if (!image.empty()) { + Ref<Image> image = Ref<Image>(memnew(Image(r.ptr(), len))); + + if (!image->empty()) { float max_height = 10000; switch (image_queue[p_queue_id].image_type) { case IMAGE_QUEUE_ICON: max_height = 80; break; case IMAGE_QUEUE_THUMBNAIL: max_height = 80; break; case IMAGE_QUEUE_SCREENSHOT: max_height = 345; break; } - float scale_ratio = max_height / image.get_height(); + float scale_ratio = max_height / image->get_height(); if (scale_ratio < 1) { - image.resize(image.get_width() * scale_ratio, image.get_height() * scale_ratio, Image::INTERPOLATE_CUBIC); + image->resize(image->get_width() * scale_ratio, image->get_height() * scale_ratio, Image::INTERPOLATE_CUBIC); } Ref<ImageTexture> tex; diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 93c2b7493c..e623d00cc9 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -239,7 +239,6 @@ void ConnectDialog::_add_bind() { case Variant::BASIS: value = Basis(); break; case Variant::TRANSFORM: value = Transform(); break; case Variant::COLOR: value = Color(); break; - case Variant::IMAGE: value = Image(); break; default: { ERR_FAIL(); } break; } @@ -327,7 +326,6 @@ ConnectDialog::ConnectDialog() { type_list->add_item("Transform", Variant::TRANSFORM); //type_list->add_separator(); type_list->add_item("Color", Variant::COLOR); - type_list->add_item("Image", Variant::IMAGE); type_list->select(0); Button *add_bind = memnew(Button); diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp index af95f8d919..75d8721756 100644 --- a/editor/doc/doc_data.cpp +++ b/editor/doc/doc_data.cpp @@ -295,8 +295,8 @@ void DocData::generate(bool p_basic_types) { case Variant::REAL: //keep it break; - case Variant::STRING: // 15 - case Variant::NODE_PATH: // 15 + case Variant::STRING: + case Variant::NODE_PATH: default_arg_text = "\"" + default_arg_text + "\""; break; case Variant::TRANSFORM: @@ -307,19 +307,19 @@ void DocData::generate(bool p_basic_types) { default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; - case Variant::RECT3: //sorry naming convention fail :( not like it's used often // 10 + case Variant::RECT3: case Variant::COLOR: case Variant::PLANE: case Variant::POOL_BYTE_ARRAY: case Variant::POOL_INT_ARRAY: case Variant::POOL_REAL_ARRAY: - case Variant::POOL_STRING_ARRAY: //25 + case Variant::POOL_STRING_ARRAY: case Variant::POOL_VECTOR2_ARRAY: case Variant::POOL_VECTOR3_ARRAY: case Variant::POOL_COLOR_ARRAY: default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; - case Variant::VECTOR2: // 5 + case Variant::VECTOR2: case Variant::RECT2: case Variant::VECTOR3: case Variant::QUAT: @@ -332,14 +332,10 @@ void DocData::generate(bool p_basic_types) { break; } case Variant::INPUT_EVENT: - case Variant::DICTIONARY: // 20 + case Variant::DICTIONARY: case Variant::ARRAY: case Variant::_RID: - case Variant::IMAGE: - //case Variant::RESOURCE: - default_arg_text = Variant::get_type_name(default_arg.get_type()) + "()"; - break; default: {} } diff --git a/editor/doc/doc_dump.cpp b/editor/doc/doc_dump.cpp index bda4d80f4d..10cd29b814 100644 --- a/editor/doc/doc_dump.cpp +++ b/editor/doc/doc_dump.cpp @@ -165,8 +165,8 @@ void DocDump::dump(const String &p_file) { case Variant::REAL: //keep it break; - case Variant::STRING: // 15 - case Variant::NODE_PATH: // 15 + case Variant::STRING: + case Variant::NODE_PATH: default_arg_text = "\"" + default_arg_text + "\""; break; case Variant::TRANSFORM: @@ -177,32 +177,28 @@ void DocDump::dump(const String &p_file) { default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; - case Variant::VECTOR2: // 5 + case Variant::VECTOR2: case Variant::RECT2: case Variant::VECTOR3: case Variant::PLANE: case Variant::QUAT: - case Variant::RECT3: //sorry naming convention fail :( not like it's used often // 10 + case Variant::RECT3: case Variant::BASIS: case Variant::COLOR: case Variant::POOL_BYTE_ARRAY: case Variant::POOL_INT_ARRAY: case Variant::POOL_REAL_ARRAY: - case Variant::POOL_STRING_ARRAY: //25 + case Variant::POOL_STRING_ARRAY: case Variant::POOL_VECTOR3_ARRAY: case Variant::POOL_COLOR_ARRAY: default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; case Variant::OBJECT: case Variant::INPUT_EVENT: - case Variant::DICTIONARY: // 20 + case Variant::DICTIONARY: case Variant::ARRAY: case Variant::_RID: - case Variant::IMAGE: - //case Variant::RESOURCE: - default_arg_text = Variant::get_type_name(default_arg.get_type()) + "()"; - break; default: {} } diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp index 5a54f9b46f..e3ed9fe1af 100644 --- a/editor/editor_asset_installer.cpp +++ b/editor/editor_asset_installer.cpp @@ -184,6 +184,7 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) { dir_map[path] = ti; ti->set_text(0, path.get_file() + "/"); ti->set_icon(0, get_icon("folder", "FileDialog")); + ti->set_metadata(0, String()); } else { String file = path.get_file(); String extension = file.get_extension().to_lower(); @@ -305,6 +306,7 @@ void EditorAssetInstaller::ok_pressed() { if (EditorNode::get_singleton() != NULL) EditorNode::get_singleton()->show_warning("Package Installed Successfully!", "Success!"); } + EditorFileSystem::get_singleton()->scan_changes(); } void EditorAssetInstaller::_bind_methods() { diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 4796640a3d..cb1b958cca 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -210,7 +210,7 @@ EditorExportPreset::EditorExportPreset() { void EditorExportPlatform::gen_debug_flags(Vector<String> &r_flags, int p_flags) { - String host = EditorSettings::get_singleton()->get("network/debug_host"); + String host = EditorSettings::get_singleton()->get("network/debug/remote_host"); if (p_flags & DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST) host = "localhost"; @@ -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() { @@ -609,7 +620,7 @@ Error EditorExportPlatform::save_zip(const Ref<EditorExportPreset> &p_preset, co void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags) { - String host = EditorSettings::get_singleton()->get("network/debug_host"); + String host = EditorSettings::get_singleton()->get("network/debug/remote_host"); if (p_flags & DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST) host = "localhost"; @@ -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)!=""; -} - /////////////////////////////////////// @@ -2103,7 +2108,7 @@ static int _get_pad(int p_alignment, int p_n) { void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags) { - String host = EditorSettings::get_singleton()->get("network/debug_host"); + String host = EditorSettings::get_singleton()->get("network/debug/remote_host"); if (p_flags&EXPORT_REMOTE_DEBUG_LOCALHOST) host="localhost"; @@ -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_file_dialog.cpp b/editor/editor_file_dialog.cpp index 1f97aba221..c47e3fc0de 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -488,8 +488,9 @@ void EditorFileDialog::update_file_list() { if (!has_icon("ResizedFolder", "EditorIcons")) { Ref<ImageTexture> folder = get_icon("FolderBig", "EditorIcons"); - Image img = folder->get_data(); - img.resize(thumbnail_size, thumbnail_size); + Ref<Image> img = folder->get_data(); + img = img->duplicate(); + img->resize(thumbnail_size, thumbnail_size); Ref<ImageTexture> resized_folder = Ref<ImageTexture>(memnew(ImageTexture)); resized_folder->create_from_image(img, 0); Theme::get_default()->set_icon("ResizedFolder", "EditorIcons", resized_folder); @@ -499,8 +500,9 @@ void EditorFileDialog::update_file_list() { if (!has_icon("ResizedFile", "EditorIcons")) { Ref<ImageTexture> file = get_icon("FileBig", "EditorIcons"); - Image img = file->get_data(); - img.resize(thumbnail_size, thumbnail_size); + Ref<Image> img = file->get_data(); + img = img->duplicate(); + img->resize(thumbnail_size, thumbnail_size); Ref<ImageTexture> resized_file = Ref<ImageTexture>(memnew(ImageTexture)); resized_file->create_from_image(img, 0); Theme::get_default()->set_icon("ResizedFile", "EditorIcons", resized_file); @@ -552,8 +554,8 @@ void EditorFileDialog::update_file_list() { dirs.push_back(".."); } - dirs.sort_custom<NoCaseComparator>(); - files.sort_custom<NoCaseComparator>(); + dirs.sort_custom<NaturalNoCaseComparator>(); + files.sort_custom<NaturalNoCaseComparator>(); while (!dirs.empty()) { const String &dir_name = dirs.front()->get(); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index b7070ab5f6..64a9d5df82 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -522,8 +522,8 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess da->list_dir_end(); - dirs.sort(); - files.sort(); + dirs.sort_custom<NaturalNoCaseComparator>(); + files.sort_custom<NaturalNoCaseComparator>(); int total = dirs.size() + files.size(); int idx = 0; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 6b23a02275..a9014ad97b 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) { @@ -3558,7 +3566,7 @@ bool EditorNode::is_scene_in_use(const String &p_path) { void EditorNode::register_editor_types() { ClassDB::register_class<EditorPlugin>(); - // ClassDB::register_class<EditorImportPlugin>(); + ClassDB::register_class<EditorImportPlugin>(); // ClassDB::register_class<EditorExportPlugin>(); // ClassDB::register_class<EditorScenePostImport>(); ClassDB::register_class<EditorScript>(); @@ -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) { @@ -4437,8 +4463,9 @@ Variant EditorNode::drag_resource(const Ref<Resource> &p_res, Control *p_from) { { //todo make proper previews Ref<ImageTexture> pic = gui_base->get_icon("FileBig", "EditorIcons"); - Image img = pic->get_data(); - img.resize(48, 48); //meh + Ref<Image> img = pic->get_data(); + img = img->duplicate(); + img->resize(48, 48); //meh Ref<ImageTexture> resized_pic = Ref<ImageTexture>(memnew(ImageTexture)); resized_pic->create_from_image(img); preview = resized_pic; @@ -4806,6 +4833,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_plugin.cpp b/editor/editor_plugin.cpp index 405784a7e2..5e5b31aac9 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -276,6 +276,11 @@ bool EditorPlugin::get_remove_list(List<Node *> *p_list) { void EditorPlugin::restore_global_state() {} void EditorPlugin::save_global_state() {} +void EditorPlugin::add_import_plugin(const Ref<EditorImportPlugin> &p_importer) { + ResourceFormatImporter::get_singleton()->add_importer(p_importer); + EditorFileSystem::get_singleton()->scan_changes(); +} + void EditorPlugin::set_window_layout(Ref<ConfigFile> p_layout) { if (get_script_instance() && get_script_instance()->has_method("set_window_layout")) { @@ -360,7 +365,7 @@ void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("get_editor_settings:EditorSettings"), &EditorPlugin::get_editor_settings); ClassDB::bind_method(D_METHOD("queue_save_layout"), &EditorPlugin::queue_save_layout); ClassDB::bind_method(D_METHOD("edit_resource"), &EditorPlugin::edit_resource); - + ClassDB::bind_method(D_METHOD("add_import_plugin"), &EditorPlugin::add_import_plugin); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_canvas_gui_input", PropertyInfo(Variant::TRANSFORM2D, "canvas_xform"), PropertyInfo(Variant::INPUT_EVENT, "event"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_draw_over_canvas", PropertyInfo(Variant::TRANSFORM2D, "canvas_xform"), PropertyInfo(Variant::OBJECT, "canvas:Control"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_spatial_gui_input", PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera"), PropertyInfo(Variant::INPUT_EVENT, "event"))); diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index 5df1f63fbe..5f4b47caee 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -30,6 +30,7 @@ #ifndef EDITOR_PLUGIN_H #define EDITOR_PLUGIN_H +#include "editor/import/editor_import_plugin.h" #include "io/config_file.h" #include "scene/gui/tool_button.h" #include "scene/main/node.h" @@ -146,6 +147,8 @@ public: virtual void restore_global_state(); virtual void save_global_state(); + void add_import_plugin(const Ref<EditorImportPlugin> &p_importer); + EditorPlugin(); virtual ~EditorPlugin(); }; diff --git a/editor/editor_profiler.cpp b/editor/editor_profiler.cpp index 8f4312111a..9d12ad687e 100644 --- a/editor/editor_profiler.cpp +++ b/editor/editor_profiler.cpp @@ -344,14 +344,16 @@ void EditorProfiler::_update_plot() { wr = PoolVector<uint8_t>::Write(); - Image img(w, h, 0, Image::FORMAT_RGBA8, graph_image); + Ref<Image> img; + img.instance(); + img->create(w, h, 0, Image::FORMAT_RGBA8, graph_image); if (reset_texture) { if (graph_texture.is_null()) { graph_texture.instance(); } - graph_texture->create(img.get_width(), img.get_height(), img.get_format(), Texture::FLAG_VIDEO_SURFACE); + graph_texture->create(img->get_width(), img->get_height(), img->get_format(), Texture::FLAG_VIDEO_SURFACE); } graph_texture->set_data(img); diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp index d36b8cece5..e0ebe985cd 100644 --- a/editor/editor_run.cpp +++ b/editor/editor_run.cpp @@ -41,6 +41,7 @@ Error EditorRun::run(const String &p_scene, const String p_custom_args, const Li List<String> args; String resource_path = GlobalConfig::get_singleton()->get_resource_path(); + String remote_host = EditorSettings::get_singleton()->get("network/debug/remote_host"); if (resource_path != "") { args.push_back("-path"); @@ -49,7 +50,7 @@ Error EditorRun::run(const String &p_scene, const String p_custom_args, const Li if (true) { args.push_back("-rdebug"); - args.push_back("localhost:" + String::num(GLOBAL_GET("network/debug/remote_port"))); + args.push_back(remote_host + ":" + String::num(GLOBAL_GET("network/debug/remote_port"))); } args.push_back("-epid"); diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp index 5a519a1dbd..4a767621ef 100644 --- a/editor/editor_run_native.cpp +++ b/editor/editor_run_native.cpp @@ -43,11 +43,12 @@ void EditorRunNative::_notification(int p_what) { continue; Ref<ImageTexture> icon = eep->get_logo(); if (!icon.is_null()) { - Image im = icon->get_data(); - im.clear_mipmaps(); - if (!im.empty()) { + Ref<Image> im = icon->get_data(); + im = im->duplicate(); + im->clear_mipmaps(); + if (!im->empty()) { - im.resize(16, 16); + im->resize(16, 16); Ref<ImageTexture> small_icon; small_icon.instance(); small_icon->create_from_image(im, 0); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 1b4f77419b..0a46acddb2 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -407,13 +407,12 @@ void EditorSettings::setup_network() { IP::get_singleton()->get_local_addresses(&local_ip); String lip; String hint; - String current = has("network/debug_host") ? get("network/debug_host") : ""; + String current = has("network/debug/remote_host") ? get("network/debug/remote_host") : ""; + int port = has("network/debug/remote_port") ? (int)get("network/debug/remote_port") : 6007; for (List<IP_Address>::Element *E = local_ip.front(); E; E = E->next()) { String ip = E->get(); - if (ip == "127.0.0.1") - continue; if (lip == "") lip = ip; @@ -424,8 +423,11 @@ void EditorSettings::setup_network() { hint += ip; } - set("network/debug_host", lip); - add_property_hint(PropertyInfo(Variant::STRING, "network/debug_host", PROPERTY_HINT_ENUM, hint)); + set("network/debug/remote_host", lip); + add_property_hint(PropertyInfo(Variant::STRING, "network/debug/remote_host", PROPERTY_HINT_ENUM, hint)); + + set("network/debug/remote_port", port); + add_property_hint(PropertyInfo(Variant::INT, "network/debug/remote_port", PROPERTY_HINT_RANGE, "1,65535,1")); } void EditorSettings::save() { @@ -509,6 +511,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 +593,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { set("editors/3d/emulate_3_button_mouse", false); set("editors/3d/warped_mouse_panning", true); + set("editors/3d/freelook_base_speed", 1); + set("editors/3d/freelook_modifier_speed_factor", 5.0); + set("editors/2d/bone_width", 5); set("editors/2d/bone_color1", Color(1.0, 1.0, 1.0, 0.9)); set("editors/2d/bone_color2", Color(0.75, 0.75, 0.75, 0.9)); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index c324f474bb..71e43216b3 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -416,8 +416,9 @@ void FileSystemDock::_update_files(bool p_keep_selection) { if (!has_icon("ResizedFolder", "EditorIcons")) { Ref<ImageTexture> folder = get_icon("FolderBig", "EditorIcons"); - Image img = folder->get_data(); - img.resize(thumbnail_size, thumbnail_size); + Ref<Image> img = folder->get_data(); + img = img->duplicate(); + img->resize(thumbnail_size, thumbnail_size); Ref<ImageTexture> resized_folder = Ref<ImageTexture>(memnew(ImageTexture)); resized_folder->create_from_image(img, 0); Theme::get_default()->set_icon("ResizedFolder", "EditorIcons", resized_folder); @@ -427,8 +428,8 @@ void FileSystemDock::_update_files(bool p_keep_selection) { if (!has_icon("ResizedFile", "EditorIcons")) { Ref<ImageTexture> file = get_icon("FileBig", "EditorIcons"); - Image img = file->get_data(); - img.resize(thumbnail_size, thumbnail_size); + Ref<Image> img = file->get_data(); + img->resize(thumbnail_size, thumbnail_size); Ref<ImageTexture> resized_file = Ref<ImageTexture>(memnew(ImageTexture)); resized_file->create_from_image(img, 0); Theme::get_default()->set_icon("ResizedFile", "EditorIcons", resized_file); diff --git a/editor/icons/2x/icon_godot.png b/editor/icons/2x/icon_godot.png Binary files differdeleted file mode 100644 index 94d87e23cc..0000000000 --- a/editor/icons/2x/icon_godot.png +++ /dev/null diff --git a/editor/icons/2x/icon_godot_docs.png b/editor/icons/2x/icon_godot_docs.png Binary files differnew file mode 100644 index 0000000000..be30f092ef --- /dev/null +++ b/editor/icons/2x/icon_godot_docs.png diff --git a/editor/icons/SCsub b/editor/icons/SCsub index 3fc8e5461f..20a381cc78 100644 --- a/editor/icons/SCsub +++ b/editor/icons/SCsub @@ -62,9 +62,9 @@ def make_editor_icons_action(target, source, env): s.write("static Ref<ImageTexture> make_icon(const uint8_t* p_png,const uint8_t* p_hidpi_png) {\n") s.write("\tRef<ImageTexture> texture( memnew( ImageTexture ) );\n") s.write("\tbool use_hidpi_image=(editor_get_scale()>1.0&&p_hidpi_png);\n") - s.write("\tImage img(use_hidpi_image?p_hidpi_png:p_png);\n") - s.write("\tif (editor_get_scale()>1.0 && !p_hidpi_png) { img.convert(Image::FORMAT_RGBA8); img.expand_x2_hq2x(); use_hidpi_image=true;}\n") - s.write("\timg.resize(img.get_width()*EDSCALE/(use_hidpi_image?2:1),img.get_height()*EDSCALE/(use_hidpi_image?2:1));\n") + s.write("\tRef<Image> img = memnew(Image(use_hidpi_image?p_hidpi_png:p_png));\n") + s.write("\tif (editor_get_scale()>1.0 && !p_hidpi_png) { img->convert(Image::FORMAT_RGBA8); img->expand_x2_hq2x(); use_hidpi_image=true;}\n") + s.write("\timg->resize(img->get_width()*EDSCALE/(use_hidpi_image?2:1),img->get_height()*EDSCALE/(use_hidpi_image?2:1));\n") s.write("\ttexture->create_from_image( img,ImageTexture::FLAG_FILTER );\n") s.write("\treturn texture;\n") s.write("}\n\n") diff --git a/editor/icons/icon_default_project_icon.png b/editor/icons/icon_default_project_icon.png Binary files differindex e87a49bd28..4c31fe5cb2 100644 --- a/editor/icons/icon_default_project_icon.png +++ b/editor/icons/icon_default_project_icon.png diff --git a/editor/icons/icon_godot.png b/editor/icons/icon_godot.png Binary files differdeleted file mode 100644 index 0b72e6ecc7..0000000000 --- a/editor/icons/icon_godot.png +++ /dev/null diff --git a/editor/icons/icon_godot_docs.png b/editor/icons/icon_godot_docs.png Binary files differnew file mode 100644 index 0000000000..554280c5b4 --- /dev/null +++ b/editor/icons/icon_godot_docs.png diff --git a/editor/icons/icon_logo.png b/editor/icons/icon_logo.png Binary files differindex 9bbd7dc619..aed94cb87a 100644 --- a/editor/icons/icon_logo.png +++ b/editor/icons/icon_logo.png diff --git a/editor/icons/icon_logo_small.png b/editor/icons/icon_logo_small.png Binary files differindex 9c7c7fe365..809cf18541 100644 --- a/editor/icons/icon_logo_small.png +++ b/editor/icons/icon_logo_small.png diff --git a/editor/icons/source/icon_godot.svg b/editor/icons/source/icon_godot.svg deleted file mode 100644 index 419f23125b..0000000000 --- a/editor/icons/source/icon_godot.svg +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="16" - height="16" - viewBox="0 0 16 16" - id="svg2" - version="1.1" - inkscape:version="0.91 r13725" - inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - sodipodi:docname="icon_godot.svg"> - <defs - id="defs4" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="32" - inkscape:cx="9.8470361" - inkscape:cy="9.8599985" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:snap-bbox="true" - inkscape:bbox-paths="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="true" - inkscape:snap-bbox-midpoints="true" - inkscape:snap-object-midpoints="true" - inkscape:snap-center="true" - inkscape:window-width="1920" - inkscape:window-height="1016" - inkscape:window-x="0" - inkscape:window-y="27" - inkscape:window-maximized="1"> - <inkscape:grid - type="xygrid" - id="grid3336" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-1036.3622)"> - <g - transform="matrix(0.01724138,0,0,0.01724138,-0.82758647,1035.0456)" - id="layer1-5" - inkscape:label="Layer 1"> - <g - transform="matrix(1.0688992,0,0,1.1334985,-45.061194,-81.689066)" - id="g4149"> - <path - style="fill:#ffffff;fill-opacity:1;stroke:none" - d="m 116.99388,715.36604 43.13957,-74.51381 75.99672,-171.42666 271.088,-13.63746 282.06373,14.1696 138.45065,255.56931 -25.0756,66.96734 -376.12685,53.39482 -367.70391,-40.32222 z" - id="path3239" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccccccccc" /> - <g - id="g3412" - transform="matrix(12.995388,0,0,-12.995388,898.37246,704.73082)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 0,-3.942 c 0,-0.39 -0.25,-0.734 -0.621,-0.852 L -6.835,-6.8 c -0.273,-0.091 -0.57,-0.042 -0.8,0.128 -0.232,0.168 -0.37,0.437 -0.37,0.721 l 0,4.305 -5.818,-1.108 0,-4.381 c 0,-0.447 -0.332,-0.824 -0.775,-0.885 l -8.41,-1.152 c -0.039,-0.003 -0.081,-0.008 -0.121,-0.008 -0.214,0 -0.424,0.078 -0.588,0.22 -0.195,0.172 -0.306,0.416 -0.306,0.676 l 0,4.638 -4.341,-0.018 0,-10e-4 -0.318,10e-4 -0.319,-10e-4 0,10e-4 -4.34,0.018 0,-4.638 c 0,-0.26 -0.112,-0.504 -0.307,-0.676 -0.164,-0.142 -0.374,-0.22 -0.587,-0.22 -0.041,0 -0.082,0.005 -0.123,0.008 l -8.41,1.152 c -0.442,0.061 -0.774,0.438 -0.774,0.885 l 0,4.381 -5.819,1.108 0,-4.305 c 0,-0.284 -0.137,-0.553 -0.368,-0.721 -0.232,-0.17 -0.529,-0.219 -0.802,-0.128 l -6.215,2.006 c -0.369,0.118 -0.619,0.462 -0.619,0.852 l 0,3.942 -3.837,1.29 c -0.19,-0.811 -0.295,-1.642 -0.295,-2.481 0,-10.301 14.512,-18.252 32.448,-18.309 l 0.022,0 0.023,0 c 17.936,0.057 32.448,8.008 32.448,18.309 0,0.766 -0.088,1.521 -0.247,2.266 L 0,0 Z" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3414" /> - </g> - <g - id="g3416" - transform="matrix(12.995388,0,0,-12.995388,140.10982,467.34929)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 0,-16.047 2.163,-0.729 c 0.364,-0.122 0.61,-0.462 0.61,-0.847 l 0,-3.936 4.426,-1.428 0,4.154 c 0,0.27 0.118,0.52 0.323,0.689 0.206,0.172 0.474,0.241 0.739,0.192 l 7.608,-1.452 c 0.422,-0.079 0.728,-0.448 0.728,-0.877 l 0,-4.338 6.62,-0.904 0,4.509 c 0,0.241 0.096,0.467 0.264,0.635 0.167,0.166 0.394,0.259 0.633,0.259 l 0.002,0 5.551,-0.022 5.549,0.022 c 0.245,-10e-4 0.468,-0.093 0.635,-0.259 0.169,-0.168 0.264,-0.394 0.264,-0.635 l 0,-4.509 6.621,0.904 0,4.338 c 0,0.429 0.304,0.798 0.726,0.877 l 7.609,1.452 c 0.262,0.049 0.533,-0.02 0.738,-0.192 0.205,-0.169 0.325,-0.419 0.325,-0.689 l 0,-4.154 4.425,1.428 0,3.936 c 0,0.385 0.245,0.725 0.609,0.847 l 1.475,0.497 0,16.279 0.04,0 c 1.437,1.834 2.767,3.767 4.042,5.828 -1.694,2.883 -3.768,5.459 -5.986,7.846 -2.057,-1.035 -4.055,-2.208 -5.942,-3.456 -0.944,0.938 -2.008,1.706 -3.052,2.509 -1.027,0.824 -2.183,1.428 -3.281,2.132 0.327,2.433 0.489,4.828 0.554,7.327 -2.831,1.424 -5.85,2.369 -8.903,3.047 -1.219,-2.048 -2.334,-4.267 -3.304,-6.436 -1.152,0.192 -2.309,0.264 -3.467,0.277 l 0,0.002 c -0.008,0 -0.015,-0.002 -0.022,-0.002 -0.008,0 -0.015,0.002 -0.022,0.002 l 0,-0.002 c -1.16,-0.013 -2.316,-0.085 -3.468,-0.277 -0.97,2.169 -2.084,4.388 -3.305,6.436 C 19.475,24.555 16.456,23.61 13.626,22.186 13.69,19.687 13.852,17.292 14.18,14.859 13.081,14.155 11.925,13.551 10.898,12.727 9.855,11.924 8.79,11.156 7.846,10.218 5.958,11.466 3.961,12.639 1.904,13.674 -0.314,11.287 -2.388,8.711 -4.082,5.828 -2.807,3.767 -1.477,1.834 -0.04,0 L 0,0 Z" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3418" /> - </g> - <g - id="g3420" - transform="matrix(12.995388,0,0,-12.995388,411.4457,567.42812)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c 0,-3.611 -2.926,-6.537 -6.537,-6.537 -3.608,0 -6.535,2.926 -6.535,6.537 0,3.609 2.927,6.533 6.535,6.533 C -2.926,6.533 0,3.609 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3422" /> - </g> - <g - id="g3424" - transform="matrix(12.995388,0,0,-12.995388,391.00655,572.46636)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c 0,-2.396 -1.941,-4.337 -4.339,-4.337 -2.396,0 -4.339,1.941 -4.339,4.337 0,2.396 1.943,4.339 4.339,4.339 C -1.941,4.339 0,2.396 0,0" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3426" /> - </g> - <g - id="g3428" - transform="matrix(12.995388,0,0,-12.995388,526.30933,660.10985)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c -1.162,0 -2.104,0.856 -2.104,1.912 l 0,6.018 c 0,1.054 0.942,1.912 2.104,1.912 1.162,0 2.106,-0.858 2.106,-1.912 l 0,-6.018 C 2.106,0.856 1.162,0 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3430" /> - </g> - <g - id="g3432" - transform="matrix(12.995388,0,0,-12.995388,641.18731,567.42812)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c 0,-3.611 2.926,-6.537 6.537,-6.537 3.609,0 6.535,2.926 6.535,6.537 0,3.609 -2.926,6.533 -6.535,6.533 C 2.926,6.533 0,3.609 0,0" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3434" /> - </g> - <g - id="g3436" - transform="matrix(12.995388,0,0,-12.995388,661.63165,572.46636)"> - <path - inkscape:connector-curvature="0" - d="m 0,0 c 0,-2.396 1.941,-4.337 4.336,-4.337 2.398,0 4.339,1.941 4.339,4.337 0,2.396 -1.941,4.339 -4.339,4.339 C 1.941,4.339 0,2.396 0,0" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path3438" /> - </g> - </g> - </g> - <path - style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" - d="m 4,1041.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,1 a 2.0000174,2.0000174 0 0 1 2,2 2.0000174,2.0000174 0 0 1 -2,2 2.0000174,2.0000174 0 0 1 -2,-2 2.0000174,2.0000174 0 0 1 2,-2 z" - id="path4151" - inkscape:connector-curvature="0" /> - <path - inkscape:connector-curvature="0" - id="path4156" - d="m 12,1041.3622 a 3,3 0 0 0 -3,3 3,3 0 0 0 3,3 3,3 0 0 0 3,-3 3,3 0 0 0 -3,-3 z m 0,1 a 2.0000174,2.0000174 0 0 1 2,2 2.0000174,2.0000174 0 0 1 -2,2 2.0000174,2.0000174 0 0 1 -2,-2 2.0000174,2.0000174 0 0 1 2,-2 z" - style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" /> - <rect - style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" - id="rect4160" - width="4" - height="1" - x="6" - y="1043.3622" - ry="0" /> - </g> -</svg> diff --git a/editor/icons/source/icon_godot_docs.svg b/editor/icons/source/icon_godot_docs.svg new file mode 100644 index 0000000000..77aa92b31f --- /dev/null +++ b/editor/icons/source/icon_godot_docs.svg @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + viewBox="0 0 15 15" + id="svg2" + version="1.1" + inkscape:version="0.92.1 r15371" + inkscape:export-filename="/home/djrm/Projects/godot/tools/editor/icons/icon_collision_shape_2d.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + sodipodi:docname="icon_godot_docs.svg"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="22.627417" + inkscape:cx="-14.305844" + inkscape:cy="5.1981046" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + units="px" + inkscape:snap-bbox="true" + inkscape:bbox-paths="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-bbox-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1"> + <inkscape:grid + type="xygrid" + id="grid3336" + originx="0" + originy="0" + spacingx="1" + spacingy="1" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-1037.3622)"> + <g + id="g78" + transform="matrix(0.06307836,0,0,-0.06307664,13.671143,1047.293)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,0 -0.325,1.994 -0.515,1.976 l -36.182,-3.491 c -2.879,-0.278 -5.115,-2.574 -5.317,-5.459 l -0.994,-14.247 -27.992,-1.997 -1.904,12.912 c -0.424,2.872 -2.932,5.037 -5.835,5.037 h -38.188 c -2.902,0 -5.41,-2.165 -5.834,-5.037 l -1.905,-12.912 -27.992,1.997 -0.994,14.247 c -0.202,2.886 -2.438,5.182 -5.317,5.46 l -36.2,3.49 c -0.187,0.018 -0.324,-1.978 -0.511,-1.978 l -0.049,-7.83 30.658,-4.944 1.004,-14.374 c 0.203,-2.91 2.551,-5.263 5.463,-5.472 l 38.551,-2.75 c 0.146,-0.01 0.29,-0.016 0.434,-0.016 2.897,0 5.401,2.166 5.825,5.038 l 1.959,13.286 h 28.005 l 1.959,-13.286 c 0.423,-2.871 2.93,-5.037 5.831,-5.037 0.142,0 0.284,0.005 0.423,0.015 l 38.556,2.75 c 2.911,0.209 5.26,2.562 5.463,5.472 l 1.003,14.374 30.645,4.966 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path80" + inkscape:connector-curvature="0" /> + </g> + <g + id="g82-3" + transform="matrix(0.06307836,0,0,-0.06307664,1.3279404,1043.5689)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 h 0.134 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 Z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path84-6" + inkscape:connector-curvature="0" /> + </g> + <g + id="g86-7" + transform="matrix(0.06307836,0,0,-0.06307664,11.62285,1047.9836)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path88-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g90-3" + transform="matrix(0.06307836,0,0,-0.06307664,5.6393685,1045.0806)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path92-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g94-6" + transform="matrix(0.06307836,0,0,-0.06307664,5.3082938,1045.1623)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path96-2" + inkscape:connector-curvature="0" /> + </g> + <g + id="g98-9" + transform="matrix(0.06307836,0,0,-0.06307664,7.4998997,1046.5818)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path100-1" + inkscape:connector-curvature="0" /> + </g> + <g + id="g102-2" + transform="matrix(0.06307836,0,0,-0.06307664,9.3606615,1045.0806)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path104-7" + inkscape:connector-curvature="0" /> + </g> + <g + id="g106-0" + transform="matrix(0.06307836,0,0,-0.06307664,9.6918191,1045.1623)" + style="stroke-width:19.8168869"> + <path + d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:19.8168869" + id="path108-9" + inkscape:connector-curvature="0" /> + </g> + <path + inkscape:connector-curvature="0" + id="path4392" + d="m 4.3227149,1042.5597 a 2.5297459,2.5296773 0 0 0 -2.5297461,2.5297 2.5297459,2.5296773 0 0 0 2.5297461,2.5297 2.5297459,2.5296773 0 0 0 2.5297463,-2.5297 2.5297459,2.5296773 0 0 0 -2.5297463,-2.5297 z m 0,0.5084 a 2.0213759,2.021321 0 0 1 2.0213758,2.0213 2.0213759,2.021321 0 0 1 -2.0213758,2.0213 2.0213759,2.021321 0 0 1 -2.0213757,-2.0213 2.0213759,2.021321 0 0 1 2.0213757,-2.0213 z" + style="opacity:1;fill:#414042;fill-opacity:1;stroke:none;stroke-width:1.94780529;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4200);enable-background:new" /> + <path + style="opacity:1;fill:#414042;fill-opacity:1;stroke:none;stroke-width:1.94780529;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4200);enable-background:new" + d="m 10.679126,1042.5597 a 2.5297459,2.5296773 0 0 0 -2.5297472,2.5297 2.5297459,2.5296773 0 0 0 2.5297472,2.5297 2.5297459,2.5296773 0 0 0 2.529744,-2.5297 2.5297459,2.5296773 0 0 0 -2.529744,-2.5297 z m 0,0.5084 a 2.0213759,2.021321 0 0 1 2.021373,2.0213 2.0213759,2.021321 0 0 1 -2.021373,2.0213 2.0213759,2.021321 0 0 1 -2.0213767,-2.0213 2.0213759,2.021321 0 0 1 2.0213767,-2.0213 z" + id="path4403" + inkscape:connector-curvature="0" /> + <rect + style="opacity:1;fill:#414042;fill-opacity:1;stroke:none;stroke-width:5.625;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44162436" + id="rect4160" + width="2.3136585" + height="0.53352129" + x="6.3440895" + y="1043.9767" /> + </g> +</svg> diff --git a/editor/import/editor_import_plugin.cpp b/editor/import/editor_import_plugin.cpp new file mode 100644 index 0000000000..6dee5da538 --- /dev/null +++ b/editor/import/editor_import_plugin.cpp @@ -0,0 +1,152 @@ +/*************************************************************************/ +/* editor_import_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "editor_import_plugin.h" +#include "core/script_language.h" + +EditorImportPlugin::EditorImportPlugin() { +} + +String EditorImportPlugin::get_importer_name() const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_importer_name")), ""); + return get_script_instance()->call("get_importer_name"); +} + +String EditorImportPlugin::get_visible_name() const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_visible_name")), ""); + return get_script_instance()->call("get_visible_name"); +} + +void EditorImportPlugin::get_recognized_extensions(List<String> *p_extensions) const { + ERR_FAIL_COND(!(get_script_instance() && get_script_instance()->has_method("get_recognized_extensions"))); + Array extensions = get_script_instance()->call("get_recognized_extensions"); + for (int i = 0; i < extensions.size(); i++) { + p_extensions->push_back(extensions[i]); + } +} + +String EditorImportPlugin::get_preset_name(int p_idx) const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_preset_name")), ""); + return get_script_instance()->call("get_preset_name", p_idx); +} + +int EditorImportPlugin::get_preset_count() { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_preset_count")), 0); + return get_script_instance()->call("get_preset_count"); +} + +String EditorImportPlugin::get_save_extension() const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_save_extension")), ""); + return get_script_instance()->call("get_save_extension"); +} + +String EditorImportPlugin::get_resource_type() const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_resource_type")), ""); + return get_script_instance()->call("get_resource_type"); +} + +void EditorImportPlugin::get_import_options(List<ResourceImporter::ImportOption> *r_options, int p_preset) const { + + ERR_FAIL_COND(!(get_script_instance() && get_script_instance()->has_method("get_import_options"))); + Array needed; + needed.push_back("name"); + needed.push_back("default_value"); + Array options = get_script_instance()->call("get_import_options", p_preset); + for (int i = 0; i < options.size(); i++) { + Dictionary d = options[i]; + ERR_FAIL_COND(!d.has_all(needed)); + String name = d["name"]; + Variant default_value = d["default_value"]; + + PropertyHint hint = PROPERTY_HINT_NONE; + if (d.has("property_hint")) { + hint = (PropertyHint)d["property_hint"].operator int64_t(); + } + + String hint_string; + if (d.has("hint_string")) { + hint_string = d["hint_string"]; + } + + uint32_t usage = PROPERTY_USAGE_DEFAULT; + if (d.has("usage")) { + usage = d["usage"]; + } + + ImportOption option(PropertyInfo(default_value.get_type(), name, hint, hint_string, usage), default_value); + r_options->push_back(option); + } +} + +bool EditorImportPlugin::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_option_visibility")), true); + Dictionary d; + Map<StringName, Variant>::Element *E = p_options.front(); + while (E) { + d[E->key()] = E->get(); + E = E->next(); + } + return get_script_instance()->call("get_option_visibility", p_option, d); +} + +Error EditorImportPlugin::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) { + + ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("import")), ERR_UNAVAILABLE); + Dictionary options; + Array platform_variants, gen_files; + + Map<StringName, Variant>::Element *E = p_options.front(); + while (E) { + options[E->key()] = E->get(); + E = E->next(); + } + Error err = (Error)get_script_instance()->call("import", p_source_file, p_save_path, options, platform_variants, gen_files).operator int64_t(); + + for (int i = 0; i < platform_variants.size(); i++) { + r_platform_variants->push_back(platform_variants[i]); + } + for (int i = 0; i < gen_files.size(); i++) { + r_gen_files->push_back(gen_files[i]); + } + return err; +} + +void EditorImportPlugin::_bind_methods() { + + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_importer_name")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_visible_name")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "get_preset_count")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_preset_name", PropertyInfo(Variant::INT, "preset"))); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_recognized_extensions")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::ARRAY, "get_import_options", PropertyInfo(Variant::INT, "preset"))); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_save_extension")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_resource_type")); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "get_option_visibility", PropertyInfo(Variant::STRING, "option"), PropertyInfo(Variant::DICTIONARY, "options"))); + ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "import", PropertyInfo(Variant::STRING, "source_file"), PropertyInfo(Variant::STRING, "save_path"), PropertyInfo(Variant::DICTIONARY, "options"), PropertyInfo(Variant::ARRAY, "r_platform_variants"), PropertyInfo(Variant::ARRAY, "r_gen_files"))); +} diff --git a/platform/bb10/payment_service.h b/editor/import/editor_import_plugin.h index 64dc982ab2..3c16b79713 100644 --- a/platform/bb10/payment_service.h +++ b/editor/import/editor_import_plugin.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* payment_service.h */ +/* editor_import_plugin.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -27,38 +27,28 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifdef PAYMENT_SERVICE_ENABLED +#ifndef EDITOR_IMPORT_PLUGIN_H +#define EDITOR_IMPORT_PLUGIN_H -#ifndef PAYMENT_SERVICE_H -#define PAYMENT_SERVICE_H - -#include <bps/bps.h> -#include <bps/event.h> -#include <bps/paymentservice.h> - -#include "core/object.h" - -class PaymentService : public Object { - - GDCLASS(PaymentService, Object); +#include "io/resource_import.h" +class EditorImportPlugin : public ResourceImporter { + GDCLASS(EditorImportPlugin, Reference) +protected: static void _bind_methods(); - List<Variant> pending_events; - public: - Error request_product_info(Variant p_params); - Error purchase(Variant p_params); - - int get_pending_event_count(); - Variant pop_pending_event(); - - bool handle_event(bps_event_t *p_event); - - PaymentService(); - ~PaymentService(); + EditorImportPlugin(); + virtual String get_importer_name() const; + virtual String get_visible_name() const; + virtual void get_recognized_extensions(List<String> *p_extensions) const; + virtual String get_preset_name(int p_idx) const; + virtual int get_preset_count(); + virtual String get_save_extension() const; + virtual String get_resource_type() const; + virtual void get_import_options(List<ImportOption> *r_options, int p_preset) const; + virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const; + virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files); }; -#endif - -#endif +#endif //EDITOR_IMPORT_PLUGIN_H 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/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index f0dcc4a298..c115f0014a 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -181,7 +181,7 @@ void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options, r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "detect_3d"), p_preset == PRESET_DETECT)); } -void ResourceImporterTexture::_save_stex(const Image &p_image, const String &p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb) { +void ResourceImporterTexture::_save_stex(const Ref<Image> &p_image, const String &p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb) { FileAccess *f = FileAccess::open(p_to_path, FileAccess::WRITE); f->store_8('G'); @@ -189,8 +189,8 @@ void ResourceImporterTexture::_save_stex(const Image &p_image, const String &p_t f->store_8('S'); f->store_8('T'); //godot streamable texture - f->store_32(p_image.get_width()); - f->store_32(p_image.get_height()); + f->store_32(p_image->get_width()); + f->store_32(p_image->get_height()); f->store_32(p_texture_flags); uint32_t format = 0; @@ -207,14 +207,14 @@ void ResourceImporterTexture::_save_stex(const Image &p_image, const String &p_t switch (p_compress_mode) { case COMPRESS_LOSSLESS: { - Image image = p_image; + Ref<Image> image = p_image->duplicate(); if (p_mipmaps) { - image.generate_mipmaps(); + image->generate_mipmaps(); } else { - image.clear_mipmaps(); + image->clear_mipmaps(); } - int mmc = image.get_mipmap_count() + 1; + int mmc = image->get_mipmap_count() + 1; format |= StreamTexture::FORMAT_BIT_LOSSLESS; f->store_32(format); @@ -223,7 +223,7 @@ void ResourceImporterTexture::_save_stex(const Image &p_image, const String &p_t for (int i = 0; i < mmc; i++) { if (i > 0) { - image.shrink_x2(); + image->shrink_x2(); } PoolVector<uint8_t> data = Image::lossless_packer(image); @@ -236,14 +236,14 @@ void ResourceImporterTexture::_save_stex(const Image &p_image, const String &p_t } break; case COMPRESS_LOSSY: { - Image image = p_image; + Ref<Image> image = p_image->duplicate(); if (p_mipmaps) { - image.generate_mipmaps(); + image->generate_mipmaps(); } else { - image.clear_mipmaps(); + image->clear_mipmaps(); } - int mmc = image.get_mipmap_count() + 1; + int mmc = image->get_mipmap_count() + 1; format |= StreamTexture::FORMAT_BIT_LOSSY; f->store_32(format); @@ -252,7 +252,7 @@ void ResourceImporterTexture::_save_stex(const Image &p_image, const String &p_t for (int i = 0; i < mmc; i++) { if (i > 0) { - image.shrink_x2(); + image->shrink_x2(); } PoolVector<uint8_t> data = Image::lossy_packer(image, p_lossy_quality); @@ -265,15 +265,15 @@ void ResourceImporterTexture::_save_stex(const Image &p_image, const String &p_t } break; case COMPRESS_VIDEO_RAM: { - Image image = p_image; - image.generate_mipmaps(); - image.compress(p_vram_compression); + Ref<Image> image = p_image->duplicate(); + image->generate_mipmaps(); + image->compress(p_vram_compression); - format |= image.get_format(); + format |= image->get_format(); f->store_32(format); - PoolVector<uint8_t> data = image.get_data(); + PoolVector<uint8_t> data = image->get_data(); int dl = data.size(); PoolVector<uint8_t>::Read r = data.read(); f->store_buffer(r.ptr(), dl); @@ -281,17 +281,17 @@ void ResourceImporterTexture::_save_stex(const Image &p_image, const String &p_t } break; case COMPRESS_UNCOMPRESSED: { - Image image = p_image; + Ref<Image> image = p_image->duplicate(); if (p_mipmaps) { - image.generate_mipmaps(); + image->generate_mipmaps(); } else { - image.clear_mipmaps(); + image->clear_mipmaps(); } - format |= image.get_format(); + format |= image->get_format(); f->store_32(format); - PoolVector<uint8_t> data = image.get_data(); + PoolVector<uint8_t> data = image->get_data(); int dl = data.size(); PoolVector<uint8_t>::Read r = data.read(); @@ -317,8 +317,9 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String bool stream = p_options["stream"]; int size_limit = p_options["size_limit"]; - Image image; - Error err = ImageLoader::load_image(p_source_file, &image); + Ref<Image> image; + image.instance(); + Error err = ImageLoader::load_image(p_source_file, image); if (err != OK) return err; @@ -336,28 +337,28 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String if (srgb == 1) tex_flags |= Texture::FLAG_CONVERT_TO_LINEAR; - if (size_limit > 0 && (image.get_width() > size_limit || image.get_height() > size_limit)) { + if (size_limit > 0 && (image->get_width() > size_limit || image->get_height() > size_limit)) { //limit size - if (image.get_width() >= image.get_height()) { + if (image->get_width() >= image->get_height()) { int new_width = size_limit; - int new_height = image.get_height() * new_width / image.get_width(); + int new_height = image->get_height() * new_width / image->get_width(); - image.resize(new_width, new_height, Image::INTERPOLATE_CUBIC); + image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); } else { int new_height = size_limit; - int new_width = image.get_width() * new_height / image.get_height(); + int new_width = image->get_width() * new_height / image->get_height(); - image.resize(new_width, new_height, Image::INTERPOLATE_CUBIC); + image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); } } if (fix_alpha_border) { - image.fix_alpha_edges(); + image->fix_alpha_edges(); } if (premult_alpha) { - image.premultiply_alpha(); + image->premultiply_alpha(); } bool detect_3d = p_options["detect_3d"]; diff --git a/editor/import/resource_importer_texture.h b/editor/import/resource_importer_texture.h index 196eb48469..e782fc2978 100644 --- a/editor/import/resource_importer_texture.h +++ b/editor/import/resource_importer_texture.h @@ -30,7 +30,9 @@ #ifndef RESOURCEIMPORTTEXTURE_H #define RESOURCEIMPORTTEXTURE_H +#include "image.h" #include "io/resource_import.h" + class StreamTexture; class ResourceImporterTexture : public ResourceImporter { @@ -78,7 +80,7 @@ public: virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const; virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const; - void _save_stex(const Image &p_image, const String &p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb); + void _save_stex(const Ref<Image> &p_image, const String &p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb); virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = NULL); diff --git a/editor/plugins/baked_light_baker.h b/editor/plugins/baked_light_baker.h index 5f32e236c0..123812fc07 100644 --- a/editor/plugins/baked_light_baker.h +++ b/editor/plugins/baked_light_baker.h @@ -31,7 +31,7 @@ #define BAKED_LIGHT_BAKER_H #include "os/thread.h" -#include "scene/3d/baked_light_instance.h" + #include "scene/3d/light.h" #include "scene/3d/mesh_instance.h" 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/gradient_texture_editor_plugin.cpp b/editor/plugins/gradient_texture_editor_plugin.cpp index 41dd64d931..005633a10e 100644 --- a/editor/plugins/gradient_texture_editor_plugin.cpp +++ b/editor/plugins/gradient_texture_editor_plugin.cpp @@ -48,7 +48,8 @@ GradientTextureEdit::GradientTextureEdit() { add_child(popup); checker = Ref<ImageTexture>(memnew(ImageTexture)); - checker->create_from_image(Image(checker_bg_png), ImageTexture::FLAG_REPEAT); + Ref<Image> checker_bg = memnew(Image(checker_bg_png)); + checker->create_from_image(checker_bg, ImageTexture::FLAG_REPEAT); } int GradientTextureEdit::_get_point_from_pos(int x) { diff --git a/editor/plugins/particles_2d_editor_plugin.cpp b/editor/plugins/particles_2d_editor_plugin.cpp index 35743ce0b3..c6c85d8be2 100644 --- a/editor/plugins/particles_2d_editor_plugin.cpp +++ b/editor/plugins/particles_2d_editor_plugin.cpp @@ -64,17 +64,18 @@ void Particles2DEditorPlugin::_file_selected(const String &p_file) { int epc = epoints->get_value(); - Image img; - Error err = ImageLoader::load_image(p_file, &img); + Ref<Image> img; + img.instance(); + Error err = ImageLoader::load_image(p_file, img); ERR_EXPLAIN(TTR("Error loading image:") + " " + p_file); ERR_FAIL_COND(err != OK); - img.convert(Image::FORMAT_LA8); - ERR_FAIL_COND(img.get_format() != Image::FORMAT_LA8); - Size2i s = Size2(img.get_width(), img.get_height()); + img->convert(Image::FORMAT_LA8); + ERR_FAIL_COND(img->get_format() != Image::FORMAT_LA8); + Size2i s = Size2(img->get_width(), img->get_height()); ERR_FAIL_COND(s.width == 0 || s.height == 0); - PoolVector<uint8_t> data = img.get_data(); + PoolVector<uint8_t> data = img->get_data(); PoolVector<uint8_t>::Read r = data.read(); Vector<Point2i> valid_positions; @@ -98,7 +99,7 @@ void Particles2DEditorPlugin::_file_selected(const String &p_file) { epoints.resize(epc); PoolVector<Point2>::Write w = epoints.write(); - Size2 extents = Size2(img.get_width() * 0.5, img.get_height() * 0.5); + Size2 extents = Size2(img->get_width() * 0.5, img->get_height() * 0.5); for (int i = 0; i < epc; i++) { diff --git a/editor/plugins/particles_editor_plugin.cpp b/editor/plugins/particles_editor_plugin.cpp index 4c84e831c1..dc2da80b06 100644 --- a/editor/plugins/particles_editor_plugin.cpp +++ b/editor/plugins/particles_editor_plugin.cpp @@ -329,7 +329,7 @@ void ParticlesEditor::_generate_emission_points() { copymem(iw.ptr(), r.ptr(), point_count * sizeof(float) * 3); } - Image image(w, h, false, Image::FORMAT_RGBF, point_img); + Ref<Image> image = memnew(Image(w, h, false, Image::FORMAT_RGBF, point_img)); Ref<ImageTexture> tex; tex.instance(); @@ -354,7 +354,7 @@ void ParticlesEditor::_generate_emission_points() { copymem(iw.ptr(), r.ptr(), point_count * sizeof(float) * 3); } - Image image2(w, h, false, Image::FORMAT_RGBF, point_img2); + Ref<Image> image2 = memnew(Image(w, h, false, Image::FORMAT_RGBF, point_img2)); Ref<ImageTexture> tex2; tex2.instance(); 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/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index a5414325d0..48e61a0967 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -1037,7 +1037,7 @@ void ScriptEditor::_notification(int p_what) { EditorSettings::get_singleton()->connect("settings_changed", this, "_editor_settings_changed"); help_search->set_icon(get_icon("Help", "EditorIcons")); - site_search->set_icon(get_icon("Godot", "EditorIcons")); + site_search->set_icon(get_icon("GodotDocs", "EditorIcons")); class_search->set_icon(get_icon("ClassList", "EditorIcons")); script_forward->set_icon(get_icon("Forward", "EditorIcons")); diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index d73349f773..0bd4d7d6d2 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -51,6 +51,12 @@ //#define GIZMO_SCALE_DEFAULT 0.28 #define GIZMO_SCALE_DEFAULT 0.15 +#define ZOOM_MIN_DISTANCE 0.001 +#define ZOOM_MULTIPLIER 1.08 +#define ZOOM_INDICATOR_DELAY_S 1.5 + +#define FREELOOK_MIN_SPEED 0.1 + void SpatialEditorViewport::_update_camera() { if (orthogonal) { //camera->set_orthogonal(size.width*cursor.distance,get_znear(),get_zfar()); @@ -58,20 +64,26 @@ void SpatialEditorViewport::_update_camera() { } else camera->set_perspective(get_fov(), get_znear(), get_zfar()); + Transform camera_transform = to_camera_transform(cursor); + + if (camera->get_global_transform() != camera_transform) { + camera->set_global_transform(camera_transform); + update_transform_gizmo_view(); + } +} + +Transform SpatialEditorViewport::to_camera_transform(const Cursor &p_cursor) const { Transform camera_transform; - camera_transform.translate(cursor.pos); - camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot); - camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot); + camera_transform.translate(p_cursor.pos); + camera_transform.basis.rotate(Vector3(1, 0, 0), -p_cursor.x_rot); + camera_transform.basis.rotate(Vector3(0, 1, 0), -p_cursor.y_rot); if (orthogonal) camera_transform.translate(0, 0, 4096); else - camera_transform.translate(0, 0, cursor.distance); + camera_transform.translate(0, 0, p_cursor.distance); - if (camera->get_global_transform() != camera_transform) { - camera->set_global_transform(camera_transform); - update_transform_gizmo_view(); - } + return camera_transform; } String SpatialEditorGizmo::get_handle_name(int p_idx) const { @@ -669,8 +681,7 @@ void SpatialEditorViewport::_list_select(InputEventMouseButton b) { selection_menu->add_item(spat->get_name()); selection_menu->set_item_icon(i, icon); selection_menu->set_item_metadata(i, node_path); - selection_menu->set_item_tooltip(i, String(spat->get_name()) + - "\nType: " + spat->get_class() + "\nPath: " + node_path); + selection_menu->set_item_tooltip(i, String(spat->get_name()) + "\nType: " + spat->get_class() + "\nPath: " + node_path); } selection_menu->set_global_position(Vector2(b.global_x, b.global_y)); @@ -704,19 +715,13 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { switch (b.button_index) { case BUTTON_WHEEL_UP: { - - cursor.distance /= 1.08; - if (cursor.distance < 0.001) - cursor.distance = 0.001; - + scale_cursor_distance(is_freelook_active() ? ZOOM_MULTIPLIER : 1.0 / ZOOM_MULTIPLIER); } break; - case BUTTON_WHEEL_DOWN: { - - if (cursor.distance < 0.001) - cursor.distance = 0.001; - cursor.distance *= 1.08; + case BUTTON_WHEEL_DOWN: { + scale_cursor_distance(is_freelook_active() ? 1.0 / ZOOM_MULTIPLIER : ZOOM_MULTIPLIER); } break; + case BUTTON_RIGHT: { NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation_scheme").operator int(); @@ -729,76 +734,6 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { if (_edit.mode == TRANSFORM_NONE && b.pressed) { - Plane cursor_plane(cursor.cursor_pos, _get_camera_normal()); - - Vector3 ray_origin = _get_ray_pos(Vector2(b.x, b.y)); - Vector3 ray_dir = _get_ray(Vector2(b.x, b.y)); - - //gizmo modify - - if (b.mod.control) { - - Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_ray(ray_origin, ray_dir, get_tree()->get_root()->get_world()->get_scenario()); - - Plane p(ray_origin, _get_camera_normal()); - - float min_d = 1e10; - bool found = false; - - for (int i = 0; i < instances.size(); i++) { - - Object *obj = ObjectDB::get_instance(instances[i]); - - if (!obj) - continue; - - VisualInstance *vi = obj->cast_to<VisualInstance>(); - if (!vi) - continue; - - //optimize by checking AABB (although should pre sort by distance) - Rect3 aabb = vi->get_global_transform().xform(vi->get_aabb()); - if (p.distance_to(aabb.get_support(-ray_dir)) > min_d) - continue; - - PoolVector<Face3> faces = vi->get_faces(VisualInstance::FACES_SOLID); - int c = faces.size(); - if (c > 0) { - PoolVector<Face3>::Read r = faces.read(); - - for (int j = 0; j < c; j++) { - - Vector3 inters; - if (r[j].intersects_ray(ray_origin, ray_dir, &inters)) { - - float d = p.distance_to(inters); - if (d < 0) - continue; - - if (d < min_d) { - min_d = d; - found = true; - } - } - } - } - } - - if (found) { - - //cursor.cursor_pos=ray_origin+ray_dir*min_d; - //VisualServer::get_singleton()->instance_set_transform(cursor_instance,Transform(Matrix3(),cursor.cursor_pos)); - } - - } else { - Vector3 new_pos; - if (cursor_plane.intersects_ray(ray_origin, ray_dir, &new_pos)) { - - //cursor.cursor_pos=new_pos; - //VisualServer::get_singleton()->instance_set_transform(cursor_instance,Transform(Matrix3(),cursor.cursor_pos)); - } - } - if (b.mod.alt) { if (nav_scheme == NAVIGATION_MAYA) @@ -832,6 +767,9 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { //VisualServer::get_singleton()->poly_clear(indicators); set_message(TTR("Transform Aborted."), 3); } + + freelook_active = b.pressed; + } break; case BUTTON_MIDDLE: { @@ -1043,6 +981,7 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { surface->update(); } + } break; } } break; @@ -1090,7 +1029,7 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle); set_message(n + ": " + String(v)); - } else if (m.button_mask & 1) { + } else if (m.button_mask & BUTTON_MASK_LEFT) { if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) { nav_mode = NAVIGATION_ORBIT; @@ -1340,13 +1279,15 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { } } - } else if (m.button_mask & 2) { + } else if (m.button_mask & BUTTON_MASK_RIGHT) { if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) { nav_mode = NAVIGATION_ZOOM; + } else { + nav_mode = NAVIGATION_LOOK; } - } else if (m.button_mask & 4) { + } else if (m.button_mask & BUTTON_MASK_MIDDLE) { if (nav_scheme == NAVIGATION_GODOT) { @@ -1402,12 +1343,7 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { if (nav_scheme == NAVIGATION_MAYA && m.mod.shift) pan_speed *= pan_speed_modifier; - Point2i relative; - if (bool(EditorSettings::get_singleton()->get("editors/3d/warped_mouse_panning"))) { - relative = Input::get_singleton()->warp_mouse_motion(m, surface->get_global_rect()); - } else { - relative = Point2i(m.relative_x, m.relative_y); - } + Point2i relative = _get_warped_mouse_motion(m); Transform camera_transform; @@ -1430,21 +1366,22 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { NavigationZoomStyle zoom_style = (NavigationZoomStyle)EditorSettings::get_singleton()->get("editors/3d/zoom_style").operator int(); if (zoom_style == NAVIGATION_ZOOM_HORIZONTAL) { if (m.relative_x > 0) - cursor.distance *= 1 - m.relative_x * zoom_speed; + scale_cursor_distance(1 - m.relative_x * zoom_speed); else if (m.relative_x < 0) - cursor.distance /= 1 + m.relative_x * zoom_speed; + scale_cursor_distance(1.0 / (1 + m.relative_x * zoom_speed)); } else { if (m.relative_y > 0) - cursor.distance *= 1 + m.relative_y * zoom_speed; + scale_cursor_distance(1 + m.relative_y * zoom_speed); else if (m.relative_y < 0) - cursor.distance /= 1 - m.relative_y * zoom_speed; + scale_cursor_distance(1.0 / (1 - m.relative_y * zoom_speed)); } } break; case NAVIGATION_ORBIT: { - cursor.x_rot += m.relative_y / 80.0; - cursor.y_rot += m.relative_x / 80.0; + Point2i relative = _get_warped_mouse_motion(m); + cursor.x_rot += relative.y / 80.0; + cursor.y_rot += relative.x / 80.0; if (cursor.x_rot > Math_PI / 2.0) cursor.x_rot = Math_PI / 2.0; if (cursor.x_rot < -Math_PI / 2.0) @@ -1453,6 +1390,30 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { _update_name(); } break; + case NAVIGATION_LOOK: { + // Freelook only works properly in perspective. + // It technically works too in ortho, but it's awful for a user due to fov being near zero + if (!orthogonal) { + Point2i relative = _get_warped_mouse_motion(m); + cursor.x_rot += relative.y / 120.0; + cursor.y_rot += relative.x / 120.0; + if (cursor.x_rot > Math_PI / 2.0) + cursor.x_rot = Math_PI / 2.0; + if (cursor.x_rot < -Math_PI / 2.0) + cursor.x_rot = -Math_PI / 2.0; + + // Look is like Orbit, except the cursor translates, not the camera + Transform camera_transform = to_camera_transform(cursor); + Vector3 pos = camera_transform.xform(Vector3(0, 0, 0)); + Vector3 diff = camera->get_translation() - pos; + cursor.pos += diff; + + name = ""; + _update_name(); + } + + } break; + default: {} } } break; @@ -1543,6 +1504,104 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { } } +void SpatialEditorViewport::scale_cursor_distance(real_t scale) { + + // Prevents zero distance which would short-circuit any scaling + if (cursor.distance < ZOOM_MIN_DISTANCE) + cursor.distance = ZOOM_MIN_DISTANCE; + + real_t prev_distance = cursor.distance; + cursor.distance *= scale; + + if (cursor.distance < ZOOM_MIN_DISTANCE) + cursor.distance = ZOOM_MIN_DISTANCE; + + if (is_freelook_active()) { + // In freelook mode, cursor reference is reversed so it needs to be adjusted + Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1)); + cursor.pos += (cursor.distance - prev_distance) * forward; + } + + zoom_indicator_delay = ZOOM_INDICATOR_DELAY_S; + surface->update(); +} + +Point2i SpatialEditorViewport::_get_warped_mouse_motion(const InputEventMouseMotion &p_ev_mouse_motion) const { + Point2i relative; + if (bool(EditorSettings::get_singleton()->get("editors/3d/warped_mouse_panning"))) { + relative = Input::get_singleton()->warp_mouse_motion(p_ev_mouse_motion, surface->get_global_rect()); + } else { + relative = Point2i(p_ev_mouse_motion.relative_x, p_ev_mouse_motion.relative_y); + } + return relative; +} + +void SpatialEditorViewport::_update_freelook(real_t delta) { + + if (!is_freelook_active()) + return; + + Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1)); + Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0)); + Vector3 up = camera->get_transform().basis.xform(Vector3(0, 1, 0)); + + int key_left = ED_SHORTCUT("spatial_editor/freelook_left", TTR("Freelook Left"), KEY_A)->get_shortcut().key.scancode; + int key_right = ED_SHORTCUT("spatial_editor/freelook_right", TTR("Freelook Right"), KEY_D)->get_shortcut().key.scancode; + int key_forward = ED_SHORTCUT("spatial_editor/freelook_forward", TTR("Freelook Forward"), KEY_W)->get_shortcut().key.scancode; + int key_backwards = ED_SHORTCUT("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), KEY_S)->get_shortcut().key.scancode; + int key_up = ED_SHORTCUT("spatial_editor/freelook_up", TTR("Freelook Up"), KEY_Q)->get_shortcut().key.scancode; + int key_down = ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), KEY_E)->get_shortcut().key.scancode; + int key_speed_modifier = ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), KEY_SHIFT)->get_shortcut().key.scancode; + + Vector3 velocity; + bool pressed = false; + bool speed_modifier = false; + + const Input &input = *Input::get_singleton(); + + if (input.is_key_pressed(key_left)) { + velocity -= right; + pressed = true; + } + if (input.is_key_pressed(key_right)) { + velocity += right; + pressed = true; + } + if (input.is_key_pressed(key_forward)) { + velocity += forward; + pressed = true; + } + if (input.is_key_pressed(key_backwards)) { + velocity -= forward; + pressed = true; + } + if (input.is_key_pressed(key_up)) { + velocity += up; + pressed = true; + } + if (input.is_key_pressed(key_down)) { + velocity -= up; + pressed = true; + } + if (input.is_key_pressed(key_speed_modifier)) { + speed_modifier = true; + } + + if (pressed) { + const EditorSettings &s = *EditorSettings::get_singleton(); + const real_t base_speed = s.get("editors/3d/freelook_base_speed"); + const real_t modifier_speed_factor = s.get("editors/3d/freelook_modifier_speed_factor"); + + real_t speed = base_speed * cursor.distance; + if (speed_modifier) + speed *= modifier_speed_factor; + + velocity.normalize(); + + cursor.pos += velocity * (speed * delta); + } +} + void SpatialEditorViewport::set_message(String p_message, float p_time) { message = p_message; @@ -1579,6 +1638,17 @@ void SpatialEditorViewport::_notification(int p_what) { } */ + real_t delta = get_tree()->get_idle_process_time(); + + if (zoom_indicator_delay > 0) { + zoom_indicator_delay -= delta; + if (zoom_indicator_delay <= 0) { + surface->update(); + } + } + + _update_freelook(delta); + _update_camera(); Map<Node *, Object *> &selection = editor_selection->get_selection(); @@ -1674,6 +1744,23 @@ void SpatialEditorViewport::_notification(int p_what) { } } +// TODO That should be part of the drawing API... +static void stroke_rect(CanvasItem *ci, Rect2 rect, Color color, real_t width = 1.0) { + + // a---b + // | | + // c---d + Vector2 a(rect.pos); + Vector2 b(rect.pos.x + rect.size.x, rect.pos.y); + Vector2 c(rect.pos.x, rect.pos.y + rect.size.y); + Vector2 d(rect.pos + rect.size); + + ci->draw_line(a, b, color, width); + ci->draw_line(b, d, color, width); + ci->draw_line(d, c, color, width); + ci->draw_line(c, a, color, width); +} + void SpatialEditorViewport::_draw() { if (surface->has_focus()) { @@ -1730,10 +1817,37 @@ void SpatialEditorViewport::_draw() { draw_rect = Rect2(Vector2(), s).clip(draw_rect); - surface->draw_line(draw_rect.pos, draw_rect.pos + Vector2(draw_rect.size.x, 0), Color(0.6, 0.6, 0.1, 0.5), 2.0); - surface->draw_line(draw_rect.pos + Vector2(draw_rect.size.x, 0), draw_rect.pos + draw_rect.size, Color(0.6, 0.6, 0.1, 0.5), 2.0); - surface->draw_line(draw_rect.pos + draw_rect.size, draw_rect.pos + Vector2(0, draw_rect.size.y), Color(0.6, 0.6, 0.1, 0.5), 2.0); - surface->draw_line(draw_rect.pos, draw_rect.pos + Vector2(0, draw_rect.size.y), Color(0.6, 0.6, 0.1, 0.5), 2.0); + stroke_rect(surface, draw_rect, Color(0.6, 0.6, 0.1, 0.5), 2.0); + + } else { + + if (zoom_indicator_delay > 0.0) { + // Show indicative zoom factor + + real_t min_distance = ZOOM_MIN_DISTANCE; // TODO Why not pick znear to limit zoom? + real_t max_distance = camera->get_zfar(); + real_t scale_length = (max_distance - min_distance); + + if (Math::abs(scale_length) > CMP_EPSILON) { + real_t logscale_t = 1.0 - Math::log(1 + cursor.distance - min_distance) / Math::log(1 + scale_length); + + // There is no real maximum distance so that factor can become negative, + // Let's make it look asymptotic instead (will decrease slower and slower). + if (logscale_t < 0.25) + logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0); + + Vector2 surface_size = surface->get_size(); + real_t h = surface_size.y / 2.0; + real_t y = (surface_size.y - h) / 2.0; + + Rect2 r(10, y, 6, h); + real_t sy = r.size.y * logscale_t; + + surface->draw_rect(r, Color(1, 1, 1, 0.2)); + surface->draw_rect(Rect2(r.pos.x, r.pos.y + r.size.y - sy, r.size.x, sy), Color(1, 1, 1, 0.6)); + stroke_rect(surface, r.grow(1), Color(0, 0, 0, 0.7)); + } + } } } @@ -2143,6 +2257,7 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed clicked_includes_current = false; orthogonal = false; message_time = 0; + zoom_indicator_delay = 0.0; spatial_editor = p_spatial_editor; ViewportContainer *c = memnew(ViewportContainer); @@ -2205,6 +2320,8 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed preview = NULL; gizmo_scale = 1.0; + freelook_active = false; + selection_menu = memnew(PopupMenu); add_child(selection_menu); selection_menu->set_custom_minimum_size(Vector2(100, 0)); @@ -2278,7 +2395,7 @@ void SpatialEditor::update_transform_gizmo() { gizmo.transform.origin = pcenter; gizmo.transform.basis = gizmo_basis; - for (int i = 0; i < 4; i++) { + for (int i = 0; i < VIEWPORTS_COUNT; i++) { viewports[i]->update_transform_gizmo_view(); } } @@ -2434,7 +2551,7 @@ void SpatialEditor::set_state(const Dictionary &p_state) { Array vp = d["viewports"]; ERR_FAIL_COND(vp.size() > 4); - for (int i = 0; i < 4; i++) { + for (int i = 0; i < VIEWPORTS_COUNT; i++) { viewports[i]->set_state(vp[i]); } } @@ -2726,7 +2843,7 @@ void SpatialEditor::_menu_item_pressed(int p_option) { } break; case MENU_VIEW_USE_3_VIEWPORTS: { - for (int i = 1; i < 4; i++) { + for (int i = 1; i < VIEWPORTS_COUNT; i++) { if (i == 1) viewports[i]->hide(); @@ -2752,7 +2869,7 @@ void SpatialEditor::_menu_item_pressed(int p_option) { } break; case MENU_VIEW_USE_3_VIEWPORTS_ALT: { - for (int i = 1; i < 4; i++) { + for (int i = 1; i < VIEWPORTS_COUNT; i++) { if (i == 1) viewports[i]->hide(); @@ -2778,7 +2895,7 @@ void SpatialEditor::_menu_item_pressed(int p_option) { } break; case MENU_VIEW_USE_4_VIEWPORTS: { - for (int i = 1; i < 4; i++) { + for (int i = 1; i < VIEWPORTS_COUNT; i++) { viewports[i]->show(); } @@ -3149,34 +3266,12 @@ void SpatialEditor::_finish_indicators() { VisualServer::get_singleton()->free(cursor_mesh); } -void SpatialEditor::_instance_scene() { -#if 0 - EditorNode *en = get_scene()->get_root_node()->cast_to<EditorNode>(); - ERR_FAIL_COND(!en); - String path = en->get_filesystem_dock()->get_selected_path(); - if (path=="") { - set_message(TTR("No scene selected to instance!")); - return; - } - - undo_redo->create_action(TTR("Instance at Cursor")); - - Node* scene = en->request_instance_scene(path); - - if (!scene) { - set_message(TTR("Could not instance scene!")); - undo_redo->commit_action(); //bleh - return; - } - - Spatial *s = scene->cast_to<Spatial>(); - if (s) { - - undo_redo->add_do_method(s,"set_global_transform",Transform(Matrix3(),cursor.cursor_pos)); +bool SpatialEditor::is_any_freelook_active() const { + for (unsigned int i = 0; i < VIEWPORTS_COUNT; ++i) { + if (viewports[i]->is_freelook_active()) + return true; } - - undo_redo->commit_action(); -#endif + return false; } void SpatialEditor::_unhandled_key_input(InputEvent p_event) { @@ -3203,19 +3298,27 @@ void SpatialEditor::_unhandled_key_input(InputEvent p_event) { case InputEvent::KEY: { - const InputEventKey &k = p_event.key; + // Note: need to check is_echo because first person movement keys might still be held + if (!is_any_freelook_active() && !p_event.is_echo()) { - if (!k.pressed) - break; + const InputEventKey &k = p_event.key; + + if (!k.pressed) + break; + + if (ED_IS_SHORTCUT("spatial_editor/tool_select", p_event)) + _menu_item_pressed(MENU_TOOL_SELECT); + + else if (ED_IS_SHORTCUT("spatial_editor/tool_move", p_event)) + _menu_item_pressed(MENU_TOOL_MOVE); - switch (k.scancode) { + else if (ED_IS_SHORTCUT("spatial_editor/tool_rotate", p_event)) + _menu_item_pressed(MENU_TOOL_ROTATE); - case KEY_Q: _menu_item_pressed(MENU_TOOL_SELECT); break; - case KEY_W: _menu_item_pressed(MENU_TOOL_MOVE); break; - case KEY_E: _menu_item_pressed(MENU_TOOL_ROTATE); break; - case KEY_R: _menu_item_pressed(MENU_TOOL_SCALE); break; + else if (ED_IS_SHORTCUT("spatial_editor/tool_scale", p_event)) + _menu_item_pressed(MENU_TOOL_SCALE); - case KEY_Z: { + else if (ED_IS_SHORTCUT("spatial_editor/display_wireframe", p_event)) { if (k.mod.shift || k.mod.control || k.mod.command) break; @@ -3224,10 +3327,7 @@ void SpatialEditor::_unhandled_key_input(InputEvent p_event) { } else { _menu_item_pressed(MENU_VIEW_DISPLAY_WIREFRAME); } - } break; - -#if 0 -#endif + } } } break; @@ -3242,8 +3342,6 @@ void SpatialEditor::_notification(int p_what) { tool_button[SpatialEditor::TOOL_MODE_ROTATE]->set_icon(get_icon("ToolRotate", "EditorIcons")); tool_button[SpatialEditor::TOOL_MODE_SCALE]->set_icon(get_icon("ToolScale", "EditorIcons")); tool_button[SpatialEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_icon("ListSelect", "EditorIcons")); - instance_button->set_icon(get_icon("SpatialAdd", "EditorIcons")); - instance_button->hide(); view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), get_icon("Panels1", "EditorIcons")); view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), get_icon("Panels2", "EditorIcons")); @@ -3344,7 +3442,7 @@ void SpatialEditor::_toggle_maximize_view(Object *p_viewport) { if (!maximized) { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < VIEWPORTS_COUNT; i++) { if (i == index) viewports[i]->set_area_as_parent_rect(); else @@ -3352,7 +3450,7 @@ void SpatialEditor::_toggle_maximize_view(Object *p_viewport) { } } else { - for (int i = 0; i < 4; i++) + for (int i = 0; i < VIEWPORTS_COUNT; i++) viewports[i]->show(); if (view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT))) @@ -3383,7 +3481,6 @@ void SpatialEditor::_bind_methods() { ClassDB::bind_method("_node_removed", &SpatialEditor::_node_removed); ClassDB::bind_method("_menu_item_pressed", &SpatialEditor::_menu_item_pressed); ClassDB::bind_method("_xform_dialog_action", &SpatialEditor::_xform_dialog_action); - ClassDB::bind_method("_instance_scene", &SpatialEditor::_instance_scene); ClassDB::bind_method("_get_editor_data", &SpatialEditor::_get_editor_data); ClassDB::bind_method("_request_gizmo", &SpatialEditor::_request_gizmo); ClassDB::bind_method("_default_light_angle_input", &SpatialEditor::_default_light_angle_input); @@ -3399,7 +3496,7 @@ void SpatialEditor::clear() { settings_znear->set_value(EDITOR_DEF("editors/3d/default_z_near", 0.1)); settings_zfar->set_value(EDITOR_DEF("editors/3d/default_z_far", 1500.0)); - for (int i = 0; i < 4; i++) { + for (int i = 0; i < VIEWPORTS_COUNT; i++) { viewports[i]->reset(); } @@ -3415,7 +3512,7 @@ void SpatialEditor::clear() { } } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < VIEWPORTS_COUNT; i++) { viewports[i]->view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(SpatialEditorViewport::VIEW_AUDIO_LISTENER), i == 0); viewports[i]->viewport->set_as_audio_listener(i == 0); @@ -3520,12 +3617,6 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { tool_button[TOOL_MODE_SCALE]->connect("pressed", this, "_menu_item_pressed", button_binds); tool_button[TOOL_MODE_SCALE]->set_tooltip(TTR("Scale Mode (R)")); - instance_button = memnew(Button); - hbc_menu->add_child(instance_button); - instance_button->set_flat(true); - instance_button->connect("pressed", this, "_instance_scene"); - instance_button->hide(); - VSeparator *vs = memnew(VSeparator); hbc_menu->add_child(vs); @@ -3553,6 +3644,13 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F); ED_SHORTCUT("spatial_editor/align_selection_with_view", TTR("Align Selection With View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F); + ED_SHORTCUT("spatial_editor/tool_select", TTR("Tool Select"), KEY_Q); + ED_SHORTCUT("spatial_editor/tool_move", TTR("Tool Move"), KEY_W); + ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Tool Rotate"), KEY_E); + ED_SHORTCUT("spatial_editor/tool_scale", TTR("Tool Scale"), KEY_R); + + ED_SHORTCUT("spatial_editor/display_wireframe", TTR("Display Wireframe"), KEY_Z); + PopupMenu *p; transform_menu = memnew(MenuButton); @@ -3618,7 +3716,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { viewport_base = memnew(Control); shader_split->add_child(viewport_base); viewport_base->set_v_size_flags(SIZE_EXPAND_FILL); - for (int i = 0; i < 4; i++) { + for (int i = 0; i < VIEWPORTS_COUNT; i++) { viewports[i] = memnew(SpatialEditorViewport(this, editor, i)); viewports[i]->connect("toggle_maximize_view", this, "_toggle_maximize_view"); diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 4302927426..3e46724efc 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -114,6 +114,8 @@ private: bool orthogonal; float gizmo_scale; + bool freelook_active; + struct _RayResult { Spatial *item; @@ -168,7 +170,8 @@ private: NAVIGATION_NONE, NAVIGATION_PAN, NAVIGATION_ZOOM, - NAVIGATION_ORBIT + NAVIGATION_ORBIT, + NAVIGATION_LOOK }; enum TransformMode { TRANSFORM_NONE, @@ -203,8 +206,6 @@ private: struct Cursor { - Vector3 cursor_pos; - Vector3 pos; float x_rot, y_rot, distance; bool region_select; @@ -217,6 +218,10 @@ private: } } cursor; + void scale_cursor_distance(real_t scale); + + real_t zoom_indicator_delay; + RID move_gizmo_instance[3], rotate_gizmo_instance[3]; String last_message; @@ -227,10 +232,12 @@ private: // void _update_camera(); + Transform to_camera_transform(const Cursor &p_cursor) const; void _draw(); void _smouseenter(); void _sinput(const InputEvent &p_ie); + void _update_freelook(real_t delta); SpatialEditor *spatial_editor; Camera *previewing; @@ -243,6 +250,7 @@ private: void _selection_result_pressed(int); void _selection_menu_hide(); void _list_select(InputEventMouseButton b); + Point2i _get_warped_mouse_motion(const InputEventMouseMotion &p_ev_mouse_motion) const; protected: void _notification(int p_what); @@ -255,6 +263,7 @@ public: void set_state(const Dictionary &p_state); Dictionary get_state() const; void reset(); + bool is_freelook_active() const { return freelook_active; } void focus_selection(); @@ -295,11 +304,13 @@ public: }; private: + static const unsigned int VIEWPORTS_COUNT = 4; + EditorNode *editor; EditorSelection *editor_selection; Control *viewport_base; - SpatialEditorViewport *viewports[4]; + SpatialEditorViewport *viewports[VIEWPORTS_COUNT]; VSplitContainer *shader_split; HSplitContainer *palette_split; @@ -385,7 +396,6 @@ private: }; Button *tool_button[TOOL_MAX]; - Button *instance_button; MenuButton *transform_menu; MenuButton *view_menu; @@ -418,7 +428,7 @@ private: ViewportContainer *settings_light_base; Viewport *settings_light_vp; ColorPickerButton *settings_ambient_color; - Image settings_light_dir_image; + Ref<Image> settings_light_dir_image; void _xform_dialog_action(); void _menu_item_pressed(int p_option); @@ -456,6 +466,8 @@ private: void _update_default_light_angle(); void _default_light_angle_input(const InputEvent &p_event); + bool is_any_freelook_active() const; + protected: void _notification(int p_what); //void _gui_input(InputEvent p_event); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 4c49b467d8..89995edf05 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -678,12 +678,13 @@ void TextureRegionEditor::_edit_region() { } autoslice_cache.clear(); - Image i; - if (i.load(texture->get_path()) == OK) { + Ref<Image> i; + i.instance(); + if (i->load(texture->get_path()) == OK) { BitMap bm; bm.create_from_image_alpha(i); - for (int y = 0; y < i.get_height(); y++) { - for (int x = 0; x < i.get_width(); x++) { + for (int y = 0; y < i->get_height(); y++) { + for (int x = 0; x < i->get_width(); x++) { if (bm.get_bit(Point2(x, y))) { bool found = false; for (List<Rect2>::Element *E = autoslice_cache.front(); E; E = E->next()) { 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/project_manager.cpp b/editor/project_manager.cpp index 289655e9da..2d3b3a2200 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -806,11 +806,12 @@ void ProjectManager::_load_recent_projects() { if (cf->has_section_key("application", "icon")) { String appicon = cf->get_value("application", "icon"); if (appicon != "") { - Image img; - Error err = img.load(appicon.replace_first("res://", path + "/")); + Ref<Image> img; + img.instance(); + Error err = img->load(appicon.replace_first("res://", path + "/")); if (err == OK) { - img.resize(64, 64); + img->resize(64, 64); Ref<ImageTexture> it = memnew(ImageTexture); it->create_from_image(img); icon = it; diff --git a/editor/project_settings.cpp b/editor/project_settings.cpp index 5795e41b92..152e72ca44 100644 --- a/editor/project_settings.cpp +++ b/editor/project_settings.cpp @@ -1264,7 +1264,6 @@ ProjectSettings::ProjectSettings(EditorData *p_data) { //globals_editor->hide_top_label(); globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); globals_editor->get_property_editor()->register_text_enter(search_box); - globals_editor->get_property_editor()->set_enable_capitalize_paths(false); globals_editor->get_property_editor()->get_scene_tree()->connect("cell_selected", this, "_item_selected"); globals_editor->get_property_editor()->connect("property_toggled", this, "_item_checked", varray(), CONNECT_DEFERRED); globals_editor->get_property_editor()->connect("property_edited", this, "_settings_prop_edited"); diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 5ff5e680f6..1bd00f3d1e 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -323,7 +323,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: c->show(); checks20gc->set_size(checks20gc->get_minimum_size()); - set_size(checks20gc->get_position() + checks20gc->get_size() + Vector2(4, 4) * EDSCALE); + set_size(checks20gc->get_position() + checks20gc->get_size() + c->get_size() + Vector2(4, 4) * EDSCALE); } break; case Variant::INT: @@ -861,15 +861,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: */ } break; - case Variant::IMAGE: { - List<String> names; - names.push_back(TTR("New")); - names.push_back(TTR("Load")); - names.push_back(TTR("Clear")); - config_action_buttons(names); - - } break; case Variant::NODE_PATH: { List<String> names; @@ -1061,16 +1053,6 @@ void CustomPropertyEditor::_file_selected(String p_file) { emit_signal("variant_changed"); hide(); } break; - case Variant::IMAGE: { - - Image image; - Error err = ImageLoader::load_image(p_file, &image); - ERR_EXPLAIN(TTR("Couldn't load image")); - ERR_FAIL_COND(err); - v = image; - emit_signal("variant_changed"); - hide(); - } break; default: {} } } @@ -1387,36 +1369,7 @@ void CustomPropertyEditor::_action_pressed(int p_which) { } } break; - case Variant::IMAGE: { - if (p_which == 0) { - //new image too difficult - ERR_PRINT("New Image Unimplemented"); - - } else if (p_which == 1) { - - file->set_access(EditorFileDialog::ACCESS_RESOURCES); - file->set_mode(EditorFileDialog::MODE_OPEN_FILE); - List<String> extensions; - ImageLoader::get_recognized_extensions(&extensions); - - file->clear_filters(); - - for (List<String>::Element *E = extensions.front(); E; E = E->next()) { - - file->add_filter("*." + E->get() + " ; " + E->get().to_upper()); - } - - file->popup_centered_ratio(); - - } else if (p_which == 2) { - - v = Image(); - emit_signal("variant_changed"); - hide(); - } - - } break; default: {}; } } @@ -1756,9 +1709,7 @@ void CustomPropertyEditor::_modified(String p_string) { emit_signal("variant_changed"); */ } break; - case Variant::IMAGE: { - } break; case Variant::NODE_PATH: { v = NodePath(value_editor[0]->get_text()); @@ -2357,15 +2308,6 @@ void PropertyEditor::set_item_text(TreeItem *p_item, int p_type, const String &p //p_item->set_text(1,obj->get(p_name)); } break; - case Variant::IMAGE: { - - Image img = obj->get(p_name); - if (img.empty()) - p_item->set_text(1, "[Image (empty)]"); - else - p_item->set_text(1, "[Image " + itos(img.get_width()) + "x" + itos(img.get_height()) + "-" + String(Image::get_format_name(img.get_format())) + "]"); - - } break; case Variant::NODE_PATH: { p_item->set_text(1, obj->get(p_name)); @@ -3588,19 +3530,7 @@ void PropertyEditor::update_tree() { item->set_icon(0, get_icon("Color", "EditorIcons")); } break; - case Variant::IMAGE: { - item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM); - item->set_editable(1, !read_only); - Image img = obj->get(p.name); - if (img.empty()) - item->set_text(1, "[Image (empty)]"); - else - item->set_text(1, "[Image " + itos(img.get_width()) + "x" + itos(img.get_height()) + "-" + String(Image::get_format_name(img.get_format())) + "]"); - if (show_type_icons) - item->set_icon(0, get_icon("Image", "EditorIcons")); - - } break; case Variant::NODE_PATH: { item->set_cell_mode(1, TreeItem::CELL_MODE_STRING); @@ -3922,9 +3852,7 @@ void PropertyEditor::_item_edited() { case Variant::COLOR: { //_edit_set(name,item->get_custom_bg_color(0)); } break; - case Variant::IMAGE: { - } break; case Variant::NODE_PATH: { _edit_set(name, NodePath(item->get_text(1)), refresh_all); diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp index 565d25e0e5..752965c806 100644 --- a/editor/property_selector.cpp +++ b/editor/property_selector.cpp @@ -136,7 +136,6 @@ void PropertySelector::_update_search() { Control::get_icon("MiniMatrix3", "EditorIcons"), Control::get_icon("MiniTransform", "EditorIcons"), Control::get_icon("MiniColor", "EditorIcons"), - Control::get_icon("MiniImage", "EditorIcons"), Control::get_icon("MiniPath", "EditorIcons"), Control::get_icon("MiniRid", "EditorIcons"), Control::get_icon("MiniObject", "EditorIcons"), diff --git a/editor/pvrtc_compress.cpp b/editor/pvrtc_compress.cpp index 6edcd60188..ef875bbead 100644 --- a/editor/pvrtc_compress.cpp +++ b/editor/pvrtc_compress.cpp @@ -89,7 +89,7 @@ static void _compress_image(Image::CompressMode p_mode, Image *p_image) { args.push_back("-m"); Ref<ImageTexture> t = memnew(ImageTexture); - t->create_from_image(*p_image, 0); + t->create_from_image(Ref<Image>(p_image), 0); ResourceSaver::save(src_img, t); Error err = OS::get_singleton()->execute(ttpath, args, true); @@ -101,7 +101,7 @@ static void _compress_image(Image::CompressMode p_mode, Image *p_image) { ERR_EXPLAIN(TTR("Can't load back converted image using PVRTC tool:") + " " + dst_img); ERR_FAIL_COND(t.is_null()); - *p_image = t->get_data(); + p_image->copy_internals_from(t->get_data()); } static void _compress_pvrtc2(Image *p_image) { diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 901b259960..835243e401 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -362,8 +362,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { else { String path = selected->get_filename(); script_create_dialog->config(selected->get_class(), path); - script_create_dialog->popup_centered(Size2(300, 290)); - //script_create_dialog->popup_centered_minsize(); + script_create_dialog->popup_centered(); } } break; diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index 15c540e132..1e86d8db4b 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -29,12 +29,23 @@ /*************************************************************************/ #include "script_create_dialog.h" +#include "editor/editor_scale.h" #include "editor_file_system.h" #include "global_config.h" #include "io/resource_saver.h" #include "os/file_access.h" #include "script_language.h" +void ScriptCreateDialog::_notification(int p_what) { + + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + path_button->set_icon(get_icon("Folder", "EditorIcons")); + parent_browse_button->set_icon(get_icon("Folder", "EditorIcons")); + } + } +} + void ScriptCreateDialog::config(const String &p_base_name, const String &p_base_path) { class_name->set_text(""); @@ -46,6 +57,8 @@ void ScriptCreateDialog::config(const String &p_base_name, const String &p_base_ initial_bp = ""; file_path->set_text(""); } + _lang_changed(current_language); + _parent_name_changed(parent_name->get_text()); _class_name_changed(""); _path_changed(file_path->get_text()); } @@ -85,54 +98,40 @@ bool ScriptCreateDialog::_validate(const String &p_string) { void ScriptCreateDialog::_class_name_changed(const String &p_name) { - if (!_validate(parent_name->get_text())) { - error_label->set_text(TTR("Invalid parent class name or path")); - error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8)); - } else if (class_name->is_editable()) { - if (class_name->get_text() == "") { - error_label->set_text(TTR("Valid chars:") + " a-z A-Z 0-9 _"); - error_label->add_color_override("font_color", Color(1, 1, 1, 0.6)); - } else if (!_validate(class_name->get_text())) { - error_label->set_text(TTR("Invalid class name")); - error_label->add_color_override("font_color", Color(1, 0.2, 0.2, 0.8)); - } else { - error_label->set_text(TTR("Valid name")); - error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8)); - } + if (_validate(class_name->get_text())) { + is_class_name_valid = true; } else { + is_class_name_valid = false; + } + _update_dialog(); +} - error_label->set_text(TTR("N/A")); - error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8)); +void ScriptCreateDialog::_parent_name_changed(const String &p_parent) { + + if (_validate(parent_name->get_text())) { + is_parent_name_valid = true; + } else { + is_parent_name_valid = false; } + _update_dialog(); } void ScriptCreateDialog::ok_pressed() { - if (create_new) { + if (is_new_script_created) { _create_new(); } else { _load_exist(); } - create_new = true; - _update_controls(); + is_new_script_created = true; + _update_dialog(); } void ScriptCreateDialog::_create_new() { - if (class_name->is_editable() && !_validate(class_name->get_text())) { - alert->set_text(TTR("Class name is invalid!")); - alert->popup_centered_minsize(); - return; - } - if (!_validate(parent_name->get_text())) { - alert->set_text(TTR("Parent class name is invalid!")); - alert->popup_centered_minsize(); - return; - } - String cname; - if (class_name->is_editable()) + if (has_named_classes) cname = class_name->get_text(); Ref<Script> scr = ScriptServer::get_language(language_menu->get_selected())->get_template(cname, parent_name->get_text()); @@ -143,18 +142,13 @@ void ScriptCreateDialog::_create_new() { if (cname != "") scr->set_name(cname); - if (!internal->is_pressed()) { + if (!is_built_in) { String lpath = GlobalConfig::get_singleton()->localize_path(file_path->get_text()); scr->set_path(lpath); - if (!path_valid) { - alert->set_text(TTR("Invalid path!")); - alert->popup_centered_minsize(); - return; - } Error err = ResourceSaver::save(lpath, scr, ResourceSaver::FLAG_CHANGE_PATH); if (err != OK) { - alert->set_text(TTR("Could not create script in filesystem.")); - alert->popup_centered_minsize(); + alert->set_text(TTR("Error - Could not create script in filesystem.")); + alert->popup_centered(); return; } } @@ -168,9 +162,9 @@ void ScriptCreateDialog::_load_exist() { String path = file_path->get_text(); RES p_script = ResourceLoader::load(path, "Script"); if (p_script.is_null()) { - alert->get_ok()->set_text(TTR("Ugh")); + alert->get_ok()->set_text(TTR("OK")); alert->set_text(vformat(TTR("Error loading script from %s"), path)); - alert->popup_centered_minsize(); + alert->popup_centered(); return; } @@ -182,55 +176,59 @@ void ScriptCreateDialog::_lang_changed(int l) { l = language_menu->get_selected(); if (ScriptServer::get_language(l)->has_named_classes()) { - class_name->set_editable(true); + has_named_classes = true; } else { - class_name->set_editable(false); + has_named_classes = false; } if (ScriptServer::get_language(l)->can_inherit_from_file()) { - parent_browse_button->show(); + can_inherit_from_file = true; } else { - parent_browse_button->hide(); + can_inherit_from_file = false; } String selected_ext = "." + ScriptServer::get_language(l)->get_extension(); String path = file_path->get_text(); String extension = ""; - if (path.find(".") >= 0) { - extension = path.get_extension(); - } - - if (extension.length() == 0) { - // add extension if none - path += selected_ext; - _path_changed(path); - } else { - // change extension by selected language - List<String> extensions; - // get all possible extensions for script - for (int l = 0; l < language_menu->get_item_count(); l++) { - ScriptServer::get_language(l)->get_recognized_extensions(&extensions); + if (path != "") { + if (path.find(".") >= 0) { + extension = path.get_extension(); } - for (List<String>::Element *E = extensions.front(); E; E = E->next()) { - if (E->get().nocasecmp_to(extension) == 0) { - path = path.get_basename() + selected_ext; - _path_changed(path); - break; + if (extension.length() == 0) { + // add extension if none + path += selected_ext; + _path_changed(path); + } else { + // change extension by selected language + List<String> extensions; + // get all possible extensions for script + for (int l = 0; l < language_menu->get_item_count(); l++) { + ScriptServer::get_language(l)->get_recognized_extensions(&extensions); + } + + for (List<String>::Element *E = extensions.front(); E; E = E->next()) { + if (E->get().nocasecmp_to(extension) == 0) { + path = path.get_basename() + selected_ext; + _path_changed(path); + break; + } } } + file_path->set_text(path); } - file_path->set_text(path); - _class_name_changed(class_name->get_text()); + + _update_dialog(); } void ScriptCreateDialog::_built_in_pressed() { if (internal->is_pressed()) { - path_vb->hide(); + is_built_in = true; } else { - path_vb->show(); + is_built_in = false; } + _update_dialog(); } void ScriptCreateDialog::_browse_path(bool browse_parent) { @@ -269,40 +267,45 @@ void ScriptCreateDialog::_file_selected(const String &p_file) { void ScriptCreateDialog::_path_changed(const String &p_path) { - path_valid = false; + is_path_valid = false; + is_new_script_created = true; String p = p_path; if (p == "") { - - path_error_label->set_text(TTR("Path is empty")); - path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8)); + _msg_path_valid(false, TTR("Path is empty")); + _update_dialog(); return; } p = GlobalConfig::get_singleton()->localize_path(p); if (!p.begins_with("res://")) { - - path_error_label->set_text(TTR("Path is not local")); - path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8)); + _msg_path_valid(false, TTR("Path is not local")); + _update_dialog(); return; } if (p.find("/") || p.find("\\")) { DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES); - if (d->change_dir(p.get_base_dir()) != OK) { - - path_error_label->set_text(TTR("Invalid base path")); - path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8)); + _msg_path_valid(false, TTR("Invalid base path")); memdelete(d); + _update_dialog(); return; } memdelete(d); } - FileAccess *f = FileAccess::create(FileAccess::ACCESS_RESOURCES); - create_new = !f->file_exists(p); + /* Does file already exist */ + + DirAccess *f = DirAccess::create(DirAccess::ACCESS_RESOURCES); + if (f->file_exists(p) && !(f->current_is_dir())) { + is_new_script_created = false; + is_path_valid = true; + } memdelete(f); + _update_dialog(); + + /* Check file extension */ String extension = p.get_extension(); List<String> extensions; @@ -313,45 +316,156 @@ void ScriptCreateDialog::_path_changed(const String &p_path) { } bool found = false; + bool match = false; int index = 0; for (List<String>::Element *E = extensions.front(); E; E = E->next()) { if (E->get().nocasecmp_to(extension) == 0) { - language_menu->select(index); // change Language option by extension + //FIXME (?) - changing language this way doesn't update controls, needs rework + //language_menu->select(index); // change Language option by extension found = true; + if (E->get() == ScriptServer::get_language(language_menu->get_selected())->get_extension()) { + match = true; + } break; } index++; } if (!found) { - path_error_label->set_text(TTR("Invalid extension")); - path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8)); + _msg_path_valid(false, TTR("Invalid extension")); + _update_dialog(); + return; + } + + if (!match) { + _msg_path_valid(false, TTR("Wrong extension chosen")); + _update_dialog(); return; } - _update_controls(); + /* All checks passed */ + + is_path_valid = true; + _update_dialog(); +} + +void ScriptCreateDialog::_msg_script_valid(bool valid, const String &p_msg) { + + error_label->set_text(TTR(p_msg)); + if (valid) { + error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8)); + } else { + error_label->add_color_override("font_color", Color(1, 0.2, 0.2, 0.8)); + } +} - path_error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8)); +void ScriptCreateDialog::_msg_path_valid(bool valid, const String &p_msg) { - path_valid = true; + path_error_label->set_text(TTR(p_msg)); + if (valid) { + path_error_label->add_color_override("font_color", Color(0, 1.0, 0.8, 0.8)); + } else { + path_error_label->add_color_override("font_color", Color(1, 0.4, 0.0, 0.8)); + } } -void ScriptCreateDialog::_update_controls() { +void ScriptCreateDialog::_update_dialog() { + + bool script_ok = true; + + /* "Add Script Dialog" gui logic and script checks */ + + // Is Script Valid (order from top to bottom) + get_ok()->set_disabled(true); + if (!is_built_in) { + if (!is_path_valid) { + _msg_script_valid(false, TTR("Invalid Path")); + script_ok = false; + } + } + if (has_named_classes && (!is_class_name_valid)) { + _msg_script_valid(false, TTR("Invalid class name")); + script_ok = false; + } + if (!is_parent_name_valid) { + _msg_script_valid(false, TTR("Invalid inherited parent name or path")); + script_ok = false; + } + if (script_ok) { + _msg_script_valid(true, TTR("Script valid")); + get_ok()->set_disabled(false); + } + + /* Does script have named classes */ - if (create_new) { - path_error_label->set_text(TTR("Create new script")); + if (has_named_classes) { + if (is_new_script_created) { + class_name->set_editable(true); + class_name->set_placeholder(TTR("Allowed: a-z, A-Z, 0-9 and _")); + class_name->set_placeholder_alpha(0.3); + } else { + class_name->set_editable(false); + } + } else { + class_name->set_editable(false); + class_name->set_placeholder(TTR("N/A")); + class_name->set_placeholder_alpha(1); + } + + /* Can script inherit from a file */ + + if (can_inherit_from_file) { + parent_browse_button->set_disabled(false); + } else { + parent_browse_button->set_disabled(true); + } + + /* Is script Built-in */ + + if (is_built_in) { + file_path->set_editable(false); + path_button->set_disabled(true); + re_check_path = true; + } else { + file_path->set_editable(true); + path_button->set_disabled(false); + if (re_check_path) { + re_check_path = false; + _path_changed(file_path->get_text()); + } + } + + /* Is Script created or loaded from existing file */ + + if (is_new_script_created) { + // New Script Created get_ok()->set_text(TTR("Create")); + parent_name->set_editable(true); + parent_browse_button->set_disabled(false); + internal->set_disabled(false); + if (is_built_in) { + _msg_path_valid(true, TTR("Built-in script (into scene file)")); + } else { + if (script_ok) { + _msg_path_valid(true, TTR("Create new script file")); + } + } } else { - path_error_label->set_text(TTR("Load existing script")); + // Script Loaded get_ok()->set_text(TTR("Load")); + parent_name->set_editable(false); + parent_browse_button->set_disabled(true); + internal->set_disabled(true); + if (script_ok) { + _msg_path_valid(true, TTR("Load existing script file")); + } } - parent_name->set_editable(create_new); - internal->set_disabled(!create_new); } void ScriptCreateDialog::_bind_methods() { ClassDB::bind_method("_class_name_changed", &ScriptCreateDialog::_class_name_changed); + ClassDB::bind_method("_parent_name_changed", &ScriptCreateDialog::_parent_name_changed); ClassDB::bind_method("_lang_changed", &ScriptCreateDialog::_lang_changed); ClassDB::bind_method("_built_in_pressed", &ScriptCreateDialog::_built_in_pressed); ClassDB::bind_method("_browse_path", &ScriptCreateDialog::_browse_path); @@ -362,37 +476,100 @@ void ScriptCreateDialog::_bind_methods() { ScriptCreateDialog::ScriptCreateDialog() { - /* SNAP DIALOG */ + editor_settings = EditorSettings::get_singleton(); + GridContainer *gc = memnew(GridContainer); VBoxContainer *vb = memnew(VBoxContainer); - add_child(vb); - //set_child_rect(vb); + HBoxContainer *hb = memnew(HBoxContainer); + Label *l = memnew(Label); + Control *empty = memnew(Control); + Control *empty_h = memnew(Control); + Control *empty_v = memnew(Control); + PanelContainer *pc = memnew(PanelContainer); - class_name = memnew(LineEdit); - VBoxContainer *vb2 = memnew(VBoxContainer); - vb2->add_child(class_name); - class_name->connect("text_changed", this, "_class_name_changed"); - error_label = memnew(Label); - error_label->set_text("valid chars: a-z A-Z 0-9 _"); - error_label->set_align(Label::ALIGN_CENTER); - vb2->add_child(error_label); - vb->add_margin_child(TTR("Class Name:"), vb2); + /* DIALOG */ - HBoxContainer *hb1 = memnew(HBoxContainer); - parent_name = memnew(LineEdit); - parent_name->connect("text_changed", this, "_class_name_changed"); - parent_name->set_h_size_flags(SIZE_EXPAND_FILL); - hb1->add_child(parent_name); - parent_browse_button = memnew(Button); - parent_browse_button->set_text(" .. "); - parent_browse_button->connect("pressed", this, "_browse_path", varray(true)); - hb1->add_child(parent_browse_button); - parent_browse_button->hide(); - vb->add_margin_child(TTR("Inherits:"), hb1); - is_browsing_parent = false; + /* Main Controls */ + + gc = memnew(GridContainer); + gc->set_columns(2); + + /* Error Stylebox Background */ + + StyleBoxFlat *sb = memnew(StyleBoxFlat); + sb->set_bg_color(Color(0, 0, 0, 0.05)); + sb->set_light_color(Color(1, 1, 1, 0.05)); + sb->set_dark_color(Color(1, 1, 1, 0.05)); + sb->set_border_blend(false); + sb->set_border_size(1); + sb->set_default_margin(MARGIN_TOP, 10.0 * EDSCALE); + sb->set_default_margin(MARGIN_BOTTOM, 10.0 * EDSCALE); + sb->set_default_margin(MARGIN_LEFT, 10.0 * EDSCALE); + sb->set_default_margin(MARGIN_RIGHT, 10.0 * EDSCALE); + + /* Error Messages Field */ + + vb = memnew(VBoxContainer); + + hb = memnew(HBoxContainer); + l = memnew(Label); + l->set_text(" - "); + hb->add_child(l); + error_label = memnew(Label); + error_label->set_text(TTR("Error!")); + error_label->set_align(Label::ALIGN_LEFT); + hb->add_child(error_label); + vb->add_child(hb); + + hb = memnew(HBoxContainer); + l = memnew(Label); + l->set_text(" - "); + hb->add_child(l); + path_error_label = memnew(Label); + path_error_label->set_text(TTR("Error!")); + path_error_label->set_align(Label::ALIGN_LEFT); + hb->add_child(path_error_label); + vb->add_child(hb); + + pc = memnew(PanelContainer); + pc->set_h_size_flags(Control::SIZE_FILL); + pc->add_style_override("panel", sb); + pc->add_child(vb); + + /* Margins */ + + empty_h = memnew(Control); + empty_h->set_h_size_flags(Control::SIZE_EXPAND_FILL); + empty_h->set_v_size_flags(Control::SIZE_EXPAND_FILL); + empty_h->set_custom_minimum_size(Size2(0, 10 * EDSCALE)); + empty_v = memnew(Control); + empty_v->set_h_size_flags(Control::SIZE_EXPAND_FILL); + empty_v->set_v_size_flags(Control::SIZE_EXPAND_FILL); + empty_v->set_custom_minimum_size(Size2(10, 0 * EDSCALE)); + + vb = memnew(VBoxContainer); + vb->add_child(empty_h->duplicate()); + vb->add_child(gc); + vb->add_child(empty_h->duplicate()); + vb->add_child(pc); + vb->add_child(empty_h->duplicate()); + hb = memnew(HBoxContainer); + hb->add_child(empty_v->duplicate()); + hb->add_child(vb); + hb->add_child(empty_v->duplicate()); + + add_child(hb); + + /* Language */ language_menu = memnew(OptionButton); - vb->add_margin_child(TTR("Language"), language_menu); + language_menu->set_custom_minimum_size(Size2(250, 0) * EDSCALE); + language_menu->set_h_size_flags(SIZE_EXPAND_FILL); + l = memnew(Label); + l->set_text(TTR("Language")); + l->set_align(Label::ALIGN_RIGHT); + gc->add_child(l); + gc->add_child(language_menu); int default_lang = 0; for (int i = 0; i < ScriptServer::get_language_count(); i++) { @@ -404,60 +581,108 @@ ScriptCreateDialog::ScriptCreateDialog() { } } - editor_settings = EditorSettings::get_singleton(); String last_selected_language = editor_settings->get_project_metadata("script_setup", "last_selected_language", ""); if (last_selected_language != "") { for (int i = 0; i < language_menu->get_item_count(); i++) { if (language_menu->get_item_text(i) == last_selected_language) { language_menu->select(i); + current_language = i; break; } } } else { language_menu->select(default_lang); + current_language = default_lang; } language_menu->connect("item_selected", this, "_lang_changed"); - //parent_name->set_text(); + /* Inherits */ - vb2 = memnew(VBoxContainer); - path_vb = memnew(VBoxContainer); - vb2->add_child(path_vb); + hb = memnew(HBoxContainer); + hb->set_h_size_flags(SIZE_EXPAND_FILL); + parent_name = memnew(LineEdit); + parent_name->connect("text_changed", this, "_parent_name_changed"); + parent_name->set_h_size_flags(SIZE_EXPAND_FILL); + hb->add_child(parent_name); + parent_browse_button = memnew(Button); + parent_browse_button->set_flat(true); + parent_browse_button->connect("pressed", this, "_browse_path", varray(true)); + hb->add_child(parent_browse_button); + l = memnew(Label); + l->set_text(TTR("Inherits")); + l->set_align(Label::ALIGN_RIGHT); + gc->add_child(l); + gc->add_child(hb); + is_browsing_parent = false; - HBoxContainer *hbc = memnew(HBoxContainer); - file_path = memnew(LineEdit); - file_path->connect("text_changed", this, "_path_changed"); - hbc->add_child(file_path); - file_path->set_h_size_flags(SIZE_EXPAND_FILL); - Button *b = memnew(Button); - b->set_text(" .. "); - b->connect("pressed", this, "_browse_path", varray(false)); - hbc->add_child(b); - path_vb->add_child(hbc); - path_error_label = memnew(Label); - path_vb->add_child(path_error_label); - path_error_label->set_text(TTR("Error!")); - path_error_label->set_align(Label::ALIGN_CENTER); + /* Class Name */ - internal = memnew(CheckButton); - internal->set_text(TTR("Built-In Script")); - vb2->add_child(internal); - internal->connect("pressed", this, "_built_in_pressed"); + class_name = memnew(LineEdit); + class_name->connect("text_changed", this, "_class_name_changed"); + class_name->set_h_size_flags(SIZE_EXPAND_FILL); + l = memnew(Label); + l->set_text(TTR("Class Name")); + l->set_align(Label::ALIGN_RIGHT); + gc->add_child(l); + gc->add_child(class_name); - vb->add_margin_child(TTR("Path:"), vb2); + /* Built-in Script */ - set_size(Size2(200, 150)); - set_hide_on_ok(false); - set_title(TTR("Attach Node Script")); + internal = memnew(CheckButton); + internal->connect("pressed", this, "_built_in_pressed"); + hb = memnew(HBoxContainer); + empty = memnew(Control); + hb->add_child(internal); + hb->add_child(empty); + l = memnew(Label); + l->set_text(TTR("Built-in Script")); + l->set_align(Label::ALIGN_RIGHT); + gc->add_child(l); + gc->add_child(hb); + + /* Path */ + + hb = memnew(HBoxContainer); + file_path = memnew(LineEdit); + file_path->connect("text_changed", this, "_path_changed"); + file_path->set_h_size_flags(SIZE_EXPAND_FILL); + hb->add_child(file_path); + path_button = memnew(Button); + path_button->set_flat(true); + path_button->connect("pressed", this, "_browse_path", varray(false)); + hb->add_child(path_button); + l = memnew(Label); + l->set_text(TTR("Path")); + l->set_align(Label::ALIGN_RIGHT); + gc->add_child(l); + gc->add_child(hb); + + /* Dialog Setup */ file_browse = memnew(EditorFileDialog); file_browse->connect("file_selected", this, "_file_selected"); add_child(file_browse); get_ok()->set_text(TTR("Create")); alert = memnew(AcceptDialog); + alert->set_as_minsize(); + alert->get_label()->set_autowrap(true); + alert->get_label()->set_align(Label::ALIGN_CENTER); + alert->get_label()->set_valign(Label::VALIGN_CENTER); + alert->get_label()->set_custom_minimum_size(Size2(325, 60) * EDSCALE); add_child(alert); - _lang_changed(0); - create_new = true; + set_as_minsize(); + set_hide_on_ok(false); + set_title(TTR("Attach Node Script")); + + is_parent_name_valid = false; + is_class_name_valid = false; + is_path_valid = false; + + has_named_classes = false; + can_inherit_from_file = false; + is_built_in = false; + + is_new_script_created = true; } diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h index 113d4a468c..862d4f88f2 100644 --- a/editor/script_create_dialog.h +++ b/editor/script_create_dialog.h @@ -34,8 +34,10 @@ #include "editor/editor_settings.h" #include "scene/gui/check_button.h" #include "scene/gui/dialogs.h" +#include "scene/gui/grid_container.h" #include "scene/gui/line_edit.h" #include "scene/gui/option_button.h" +#include "scene/gui/panel_container.h" class ScriptCreateDialog : public ConfirmationDialog { GDCLASS(ScriptCreateDialog, ConfirmationDialog); @@ -47,6 +49,7 @@ class ScriptCreateDialog : public ConfirmationDialog { Button *parent_browse_button; OptionButton *language_menu; LineEdit *file_path; + Button *path_button; EditorFileDialog *file_browse; CheckButton *internal; VBoxContainer *path_vb; @@ -56,20 +59,33 @@ class ScriptCreateDialog : public ConfirmationDialog { bool is_browsing_parent; String initial_bp; EditorSettings *editor_settings; + bool is_new_script_created; + bool is_path_valid; + bool has_named_classes; + bool can_inherit_from_file; + bool is_parent_name_valid; + bool is_class_name_valid; + bool is_built_in; + int current_language; + bool re_check_path; void _path_changed(const String &p_path = String()); void _lang_changed(int l = 0); void _built_in_pressed(); bool _validate(const String &p_strin); void _class_name_changed(const String &p_name); + void _parent_name_changed(const String &p_parent); void _browse_path(bool browse_parent); void _file_selected(const String &p_file); virtual void ok_pressed(); void _create_new(); void _load_exist(); - void _update_controls(); + void _msg_script_valid(bool valid, const String &p_msg = String()); + void _msg_path_valid(bool valid, const String &p_msg = String()); + void _update_dialog(); protected: + void _notification(int p_what); static void _bind_methods(); public: diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index 2bc00c62fb..ebf4b1cf3a 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -90,11 +90,13 @@ public: return ""; } - void add_property(const String &p_name, const Variant &p_value) { + void add_property(const String &p_name, const Variant &p_value, const PropertyHint &p_hint, const String p_hint_string) { PropertyInfo pinfo; pinfo.name = p_name; pinfo.type = p_value.get_type(); + pinfo.hint = p_hint; + pinfo.hint_string = p_hint_string; props.push_back(pinfo); values[p_name] = p_value; } @@ -437,7 +439,11 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da inspected_object->last_edited_id = id; - inspect_properties->edit(inspected_object); + if (tabs->get_current_tab() == 2) { + inspect_properties->edit(inspected_object); + } else { + editor->push_item(inspected_object); + } } else if (p_msg == "message:video_mem") { @@ -499,13 +505,20 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da String n = p_data[ofs + i * 2 + 0]; Variant v = p_data[ofs + i * 2 + 1]; + PropertyHint h = PROPERTY_HINT_NONE; + String hs = String(); if (n.begins_with("*")) { n = n.substr(1, n.length()); + h = PROPERTY_HINT_OBJECT_ID; + String s = v; + s = s.replace("[", ""); + hs = s.get_slice(":", 0); + v = s.get_slice(":", 1).to_int(); } - variables->add_property("members/" + n, v); + variables->add_property("members/" + n, v, h, hs); } ofs += mcount * 2; @@ -516,13 +529,20 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da String n = p_data[ofs + i * 2 + 0]; Variant v = p_data[ofs + i * 2 + 1]; + PropertyHint h = PROPERTY_HINT_NONE; + String hs = String(); if (n.begins_with("*")) { n = n.substr(1, n.length()); + h = PROPERTY_HINT_OBJECT_ID; + String s = v; + s = s.replace("[", ""); + hs = s.get_slice(":", 0); + v = s.get_slice(":", 1).to_int(); } - variables->add_property("locals/" + n, v); + variables->add_property("locals/" + n, v, h, hs); } variables->update(); @@ -1056,6 +1076,9 @@ void ScriptEditorDebugger::stop() { EditorNode::get_singleton()->get_pause_button()->set_pressed(false); EditorNode::get_singleton()->get_pause_button()->set_disabled(true); + //avoid confusion when stopped debugging but an object is still edited + EditorNode::get_singleton()->push_item(NULL); + if (hide_on_stop) { if (is_visible_in_tree()) EditorNode::get_singleton()->hide_bottom_panel(); @@ -1636,6 +1659,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { inspector->get_scene_tree()->set_column_title(0, TTR("Variable")); inspector->set_enable_capitalize_paths(false); inspector->set_read_only(true); + inspector->connect("object_id_selected", this, "_scene_tree_property_select_object"); sc->add_child(inspector); server = TCP_Server::create_ref(); diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 766d8f9676..867302b657 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -1,5 +1,6 @@ # Arabic translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # athomield <athomield@hotmail.com>, 2017. diff --git a/editor/translations/bg.po b/editor/translations/bg.po index b23fa3a8fb..f884b33773 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -1,5 +1,6 @@ # Bulgarian translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Bojidar Marinov <bojidar.marinov.bg@gmail.com>, 2016. diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 224c00cf5d..3e4dec7656 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -1,5 +1,6 @@ # Bengali translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Abu Md. Maruf Sarker <maruf.webdev@gmail.com>, 2016-2017. diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 581e862716..6d7b245e58 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -1,5 +1,6 @@ # Catalan translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Roger BR <drai_kin@hotmail.com>, 2016. diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 89d88a234f..4643a9ac21 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -1,5 +1,6 @@ # Czech translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Jan 'spl!te' Kondelík <j.kondelik@centrum.cz>, 2016. diff --git a/editor/translations/da.po b/editor/translations/da.po index b84be76247..ba9d018e5a 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -1,5 +1,6 @@ # Danish translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # David Lamhauge <davidlamhauge@gmail.com>, 2016. diff --git a/editor/translations/de.po b/editor/translations/de.po index ba6805d1f1..a10eaefa29 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -1,5 +1,6 @@ # German translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Alexander Mahr <alex.mahr@gmail.com>, 2016. diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po index aeae6a5537..183f09e9a6 100644 --- a/editor/translations/de_CH.po +++ b/editor/translations/de_CH.po @@ -1,5 +1,6 @@ # Swiss High German translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Christian Fisch <christian.fiesel@gmail.com>, 2016. diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 5b62f132fa..5f50c159b8 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -1,5 +1,6 @@ # LANGUAGE translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. diff --git a/editor/translations/el.po b/editor/translations/el.po index 292c5a6fd3..0879b693ff 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -1,5 +1,6 @@ # Greek translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # gtsiam <gtsiam@windowslive.com>, 2017. diff --git a/editor/translations/es.po b/editor/translations/es.po index a7b9553892..f01c84718b 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -1,5 +1,6 @@ # Spanish translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Alejandro Alvarez <eliluminado00@gmail.com>, 2017. diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 6c9579916f..f826517b27 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -1,5 +1,6 @@ # Spanish (Argentina) translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017. diff --git a/editor/translations/extract.py b/editor/translations/extract.py index 616fec17a0..5e6c894936 100755 --- a/editor/translations/extract.py +++ b/editor/translations/extract.py @@ -38,7 +38,8 @@ unique_str = [] unique_loc = {} main_po = """ # LANGUAGE translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 2ec9b18d78..e8402fcb25 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -1,5 +1,6 @@ # Persian translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # alabd14313 <alabd14313@yahoo.com>, 2016. diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 1418e6f493..8db0cf2555 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -1,5 +1,6 @@ # French translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Brice <bbric@free.fr>, 2016. diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 8cb6c2caf1..2d1b36d2ea 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -1,5 +1,6 @@ # Hungarian translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Varga Dániel <danikah.danikah@gmail.com>, 2016. diff --git a/editor/translations/id.po b/editor/translations/id.po index 2126d324dd..2abf4090c8 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -1,5 +1,6 @@ # Indonesian translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Abdul Aziz Muslim Alqudsy <abdul.aziz.muslim.alqudsy@gmail.com>, 2016. diff --git a/editor/translations/it.po b/editor/translations/it.po index e055c6996a..08d04d296b 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -1,5 +1,6 @@ # Italian translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Dario Bonfanti <bonfi.96@hotmail.it>, 2016-2017. diff --git a/editor/translations/ja.po b/editor/translations/ja.po index f34e0d118b..beeaf264a2 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -1,5 +1,6 @@ # Japanese translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # akirakido <achts.y@gmail.com>, 2016. diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 769089b860..08b10d2f7a 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -1,5 +1,6 @@ # Korean translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # 박한얼 (volzhs) <volzhs@gmail.com>, 2016-2017. diff --git a/editor/translations/nb.po b/editor/translations/nb.po index e7a64f501a..7ce577ebfa 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -1,5 +1,6 @@ # Norwegian Bokmål translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Anonymous <GentleSaucepan@protonmail.com>, 2017. diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 55407145d2..f0d54ebd9d 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -1,5 +1,6 @@ # Dutch translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Aram Nap <xyphex.aram@gmail.com>, 2017 diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 8eb2e9c884..ccee170c57 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -1,5 +1,6 @@ # Polish translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # 8-bit Pixel <dawdejw@gmail.com>, 2016. diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 4df9c04664..4629c24f45 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -1,5 +1,6 @@ # Pirate translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Zion Nimchuk <zionnimchuk@gmail.com>, 2016-2017. diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 75be59068c..25055a0b7b 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -1,5 +1,6 @@ # Portuguese (Brazil) translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Allyson Souza <allyson_as@outlook.com>, 2017. diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index 913455b999..fa4629c5c1 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -1,5 +1,6 @@ # Portuguese (Portugal) translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # António Sarmento <antonio.luis.sarmento@gmail.com>, 2016. diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 9f7aa6e26a..0c4a29fb63 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -1,5 +1,6 @@ # Russian translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # DimOkGamer <dimokgamer@gmail.com>, 2016-2017. diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 697def1043..b0bee6aa6f 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -1,5 +1,6 @@ # Slovak translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # J08nY <johnenter@gmail.com>, 2016. diff --git a/editor/translations/sl.po b/editor/translations/sl.po index fad12d7f13..ea634658ce 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -1,5 +1,6 @@ # Slovenian translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # matevž lapajne <sivar.lapajne@gmail.com>, 2016. diff --git a/editor/translations/th.po b/editor/translations/th.po index 79cdaf6b10..b31532f3bf 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -1,5 +1,6 @@ # Thai translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Poommetee Ketson <poommetee@protonmail.com>, 2017. diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 20a794b34a..b4d8975649 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -1,5 +1,6 @@ # Turkish translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Aprın Çor Tigin <kabusturk38@gmail.com>, 2016-2017. diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 651aa62001..ef3e3b30ca 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -1,5 +1,6 @@ # Urdu (Pakistan) translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Muhammad Ali <ali@codeonion.com>, 2016. diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 87ca113ce2..f3afcab79d 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -1,5 +1,6 @@ # Chinese (China) translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # 纯洁的坏蛋 <tqj.zyy@gmail.com>, 2016. diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index dfac75ecab..e49582e901 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -1,5 +1,6 @@ # Chinese (Honk Kong) translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # Wesley (zx-wt) <ZX_WT@ymail.com>, 2016. diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 48b76484e0..7836cd2f76 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -1,5 +1,6 @@ # Chinese (Taiwan) translation of the Godot Engine editor -# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur +# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # # popcade <popcade@gmail.com>, 2016. Binary files differ@@ -13,11 +13,11 @@ height="1024" id="svg3030" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.1 r15371" sodipodi:docname="icon.svg" inkscape:export-filename="/home/akien/Projects/godot/godot.git/icon.png" - inkscape:export-xdpi="22.5" - inkscape:export-ydpi="22.5"> + inkscape:export-xdpi="24" + inkscape:export-ydpi="24"> <defs id="defs3032" /> <sodipodi:namedview @@ -28,13 +28,13 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.35" - inkscape:cx="-560.15123" - inkscape:cy="190.62119" + inkscape:cx="707.24666" + inkscape:cy="14.063809" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="1920" - inkscape:window-height="1015" + inkscape:window-height="1011" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" /> @@ -54,79 +54,86 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-28.362183)"> + transform="translate(0,-98.519719)"> <g - id="g4149" - transform="matrix(1.0688992,0,0,1.1334985,-45.061194,-81.689066)"> + id="g78" + transform="matrix(4.162611,0,0,-4.162611,919.24059,771.67186)" + style="stroke-width:0.32031175"> <path - sodipodi:nodetypes="cccccccccc" - inkscape:connector-curvature="0" - id="path3239" - d="m 116.99388,715.36604 43.13957,-74.51381 75.99672,-171.42666 271.088,-13.63746 282.06373,14.1696 138.45065,255.56931 -25.0756,66.96734 -376.12685,53.39482 -367.70391,-40.32222 z" - style="fill:#ffffff;fill-opacity:1;stroke:none" /> - <g - transform="matrix(12.995388,0,0,-12.995388,898.37246,704.73082)" - id="g3412"> - <path - id="path3414" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0,-3.942 c 0,-0.39 -0.25,-0.734 -0.621,-0.852 L -6.835,-6.8 c -0.273,-0.091 -0.57,-0.042 -0.8,0.128 -0.232,0.168 -0.37,0.437 -0.37,0.721 l 0,4.305 -5.818,-1.108 0,-4.381 c 0,-0.447 -0.332,-0.824 -0.775,-0.885 l -8.41,-1.152 c -0.039,-0.003 -0.081,-0.008 -0.121,-0.008 -0.214,0 -0.424,0.078 -0.588,0.22 -0.195,0.172 -0.306,0.416 -0.306,0.676 l 0,4.638 -4.341,-0.018 0,-10e-4 -0.318,10e-4 -0.319,-10e-4 0,10e-4 -4.34,0.018 0,-4.638 c 0,-0.26 -0.112,-0.504 -0.307,-0.676 -0.164,-0.142 -0.374,-0.22 -0.587,-0.22 -0.041,0 -0.082,0.005 -0.123,0.008 l -8.41,1.152 c -0.442,0.061 -0.774,0.438 -0.774,0.885 l 0,4.381 -5.819,1.108 0,-4.305 c 0,-0.284 -0.137,-0.553 -0.368,-0.721 -0.232,-0.17 -0.529,-0.219 -0.802,-0.128 l -6.215,2.006 c -0.369,0.118 -0.619,0.462 -0.619,0.852 l 0,3.942 -3.837,1.29 c -0.19,-0.811 -0.295,-1.642 -0.295,-2.481 0,-10.301 14.512,-18.252 32.448,-18.309 l 0.022,0 0.023,0 c 17.936,0.057 32.448,8.008 32.448,18.309 0,0.766 -0.088,1.521 -0.247,2.266 L 0,0 Z" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,140.10982,467.34929)" - id="g3416"> - <path - id="path3418" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0,-16.047 2.163,-0.729 c 0.364,-0.122 0.61,-0.462 0.61,-0.847 l 0,-3.936 4.426,-1.428 0,4.154 c 0,0.27 0.118,0.52 0.323,0.689 0.206,0.172 0.474,0.241 0.739,0.192 l 7.608,-1.452 c 0.422,-0.079 0.728,-0.448 0.728,-0.877 l 0,-4.338 6.62,-0.904 0,4.509 c 0,0.241 0.096,0.467 0.264,0.635 0.167,0.166 0.394,0.259 0.633,0.259 l 0.002,0 5.551,-0.022 5.549,0.022 c 0.245,-10e-4 0.468,-0.093 0.635,-0.259 0.169,-0.168 0.264,-0.394 0.264,-0.635 l 0,-4.509 6.621,0.904 0,4.338 c 0,0.429 0.304,0.798 0.726,0.877 l 7.609,1.452 c 0.262,0.049 0.533,-0.02 0.738,-0.192 0.205,-0.169 0.325,-0.419 0.325,-0.689 l 0,-4.154 4.425,1.428 0,3.936 c 0,0.385 0.245,0.725 0.609,0.847 l 1.475,0.497 0,16.279 0.04,0 c 1.437,1.834 2.767,3.767 4.042,5.828 -1.694,2.883 -3.768,5.459 -5.986,7.846 -2.057,-1.035 -4.055,-2.208 -5.942,-3.456 -0.944,0.938 -2.008,1.706 -3.052,2.509 -1.027,0.824 -2.183,1.428 -3.281,2.132 0.327,2.433 0.489,4.828 0.554,7.327 -2.831,1.424 -5.85,2.369 -8.903,3.047 -1.219,-2.048 -2.334,-4.267 -3.304,-6.436 -1.152,0.192 -2.309,0.264 -3.467,0.277 l 0,0.002 c -0.008,0 -0.015,-0.002 -0.022,-0.002 -0.008,0 -0.015,0.002 -0.022,0.002 l 0,-0.002 c -1.16,-0.013 -2.316,-0.085 -3.468,-0.277 -0.97,2.169 -2.084,4.388 -3.305,6.436 C 19.475,24.555 16.456,23.61 13.626,22.186 13.69,19.687 13.852,17.292 14.18,14.859 13.081,14.155 11.925,13.551 10.898,12.727 9.855,11.924 8.79,11.156 7.846,10.218 5.958,11.466 3.961,12.639 1.904,13.674 -0.314,11.287 -2.388,8.711 -4.082,5.828 -2.807,3.767 -1.477,1.834 -0.04,0 L 0,0 Z" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,411.4457,567.42812)" - id="g3420"> - <path - id="path3422" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-3.611 -2.926,-6.537 -6.537,-6.537 -3.608,0 -6.535,2.926 -6.535,6.537 0,3.609 2.927,6.533 6.535,6.533 C -2.926,6.533 0,3.609 0,0" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,391.00655,572.46636)" - id="g3424"> - <path - id="path3426" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-2.396 -1.941,-4.337 -4.339,-4.337 -2.396,0 -4.339,1.941 -4.339,4.337 0,2.396 1.943,4.339 4.339,4.339 C -1.941,4.339 0,2.396 0,0" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,526.30933,660.10985)" - id="g3428"> - <path - id="path3430" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -1.162,0 -2.104,0.856 -2.104,1.912 l 0,6.018 c 0,1.054 0.942,1.912 2.104,1.912 1.162,0 2.106,-0.858 2.106,-1.912 l 0,-6.018 C 2.106,0.856 1.162,0 0,0" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,641.18731,567.42812)" - id="g3432"> - <path - id="path3434" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-3.611 2.926,-6.537 6.537,-6.537 3.609,0 6.535,2.926 6.535,6.537 0,3.609 -2.926,6.533 -6.535,6.533 C 2.926,6.533 0,3.609 0,0" - inkscape:connector-curvature="0" /> - </g> - <g - transform="matrix(12.995388,0,0,-12.995388,661.63165,572.46636)" - id="g3436"> - <path - id="path3438" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-2.396 1.941,-4.337 4.336,-4.337 2.398,0 4.339,1.941 4.339,4.337 0,2.396 -1.941,4.339 -4.339,4.339 C 1.941,4.339 0,2.396 0,0" - inkscape:connector-curvature="0" /> - </g> + d="m 0,0 c 0,0 -0.325,1.994 -0.515,1.976 l -36.182,-3.491 c -2.879,-0.278 -5.115,-2.574 -5.317,-5.459 l -0.994,-14.247 -27.992,-1.997 -1.904,12.912 c -0.424,2.872 -2.932,5.037 -5.835,5.037 h -38.188 c -2.902,0 -5.41,-2.165 -5.834,-5.037 l -1.905,-12.912 -27.992,1.997 -0.994,14.247 c -0.202,2.886 -2.438,5.182 -5.317,5.46 l -36.2,3.49 c -0.187,0.018 -0.324,-1.978 -0.511,-1.978 l -0.049,-7.83 30.658,-4.944 1.004,-14.374 c 0.203,-2.91 2.551,-5.263 5.463,-5.472 l 38.551,-2.75 c 0.146,-0.01 0.29,-0.016 0.434,-0.016 2.897,0 5.401,2.166 5.825,5.038 l 1.959,13.286 h 28.005 l 1.959,-13.286 c 0.423,-2.871 2.93,-5.037 5.831,-5.037 0.142,0 0.284,0.005 0.423,0.015 l 38.556,2.75 c 2.911,0.209 5.26,2.562 5.463,5.472 l 1.003,14.374 30.645,4.966 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path80" + inkscape:connector-curvature="0" /> + </g> + <g + id="g82-3" + transform="matrix(4.162611,0,0,-4.162611,104.69892,525.90697)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 h 0.134 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 Z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path84-6" + inkscape:connector-curvature="0" /> + </g> + <g + id="g86-7" + transform="matrix(4.162611,0,0,-4.162611,784.07144,817.24284)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path88-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g90-3" + transform="matrix(4.162611,0,0,-4.162611,389.21484,625.67104)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path92-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g94-6" + transform="matrix(4.162611,0,0,-4.162611,367.36686,631.05679)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path96-2" + inkscape:connector-curvature="0" /> + </g> + <g + id="g98-9" + transform="matrix(4.162611,0,0,-4.162611,511.99336,724.73954)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path100-1" + inkscape:connector-curvature="0" /> + </g> + <g + id="g102-2" + transform="matrix(4.162611,0,0,-4.162611,634.78706,625.67104)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path104-7" + inkscape:connector-curvature="0" /> + </g> + <g + id="g106-0" + transform="matrix(4.162611,0,0,-4.162611,656.64056,631.05679)" + style="stroke-width:0.32031175"> + <path + d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.32031175" + id="path108-9" + inkscape:connector-curvature="0" /> </g> </g> </svg> Binary files differ@@ -1,134 +1,219 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 236.27499 84.6875" - height="84.6875" - width="236.27499" - xml:space="preserve" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + id="svg2" version="1.1" - id="svg3336"><metadata - id="metadata3342"><rdf:RDF><cc:Work + inkscape:version="0.92.1 r15371" + xml:space="preserve" + width="1024" + height="414" + viewBox="0 0 959.99998 388.125" + sodipodi:docname="logo.svg" + inkscape:export-filename="/home/akien/Projects/godot/godot.git/logo.png" + inkscape:export-xdpi="48" + inkscape:export-ydpi="48"><metadata + id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs - id="defs3340"><clipPath - id="clipPath3350" - clipPathUnits="userSpaceOnUse"><path - id="path3352" - d="m 0,67.75 189.02,0 L 189.02,0 0,0 0,67.75 Z" /></clipPath></defs><g - transform="matrix(1.25,0,0,-1.25,0,84.6875)" - id="g3344"><g - id="g3346"><g - clip-path="url(#clipPath3350)" - id="g3348"><g - transform="translate(112.7847,43.5176)" - id="g3354"><path - id="path3356" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -1.082,0 -1.989,-0.497 -2.724,-1.488 -0.732,-0.992 -1.099,-2.385 -1.099,-4.177 0,-1.796 0.349,-3.171 1.05,-4.129 0.699,-0.961 1.617,-1.439 2.756,-1.439 1.139,0 2.064,0.484 2.775,1.457 0.71,0.968 1.066,2.355 1.066,4.161 0,1.803 -0.367,3.192 -1.1,4.162 C 1.992,-0.484 1.083,0 0,0 m -0.017,-17.828 c -3.168,0 -5.752,1.037 -7.749,3.11 -1.994,2.075 -2.991,5.104 -2.991,9.084 0,3.984 1.008,6.999 3.027,9.053 2.018,2.051 4.624,3.077 7.815,3.077 3.191,0 5.769,-1.008 7.73,-3.029 1.964,-2.018 2.945,-5.076 2.945,-9.167 0,-4.094 -1.004,-7.139 -3.012,-9.137 -2.008,-1.994 -4.595,-2.991 -7.765,-2.991" /></g><g - transform="translate(133.0269,43.2832)" - id="g3358"><path - id="path3360" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0,-10.119 c 0,-0.473 0.035,-0.771 0.103,-0.896 0.066,-0.124 0.27,-0.186 0.607,-0.186 1.242,0 2.183,0.464 2.826,1.388 0.645,0.924 0.964,2.462 0.964,4.617 0,2.155 -0.334,3.559 -0.997,4.212 C 2.837,-0.33 1.782,0 0.338,0 L 0,0 Z m -6.495,-15.7 0,20.298 c 0,0.564 0.14,1.009 0.423,1.34 0.281,0.325 0.648,0.49 1.1,0.49 l 5.65,0 c 3.586,0 6.309,-0.905 8.168,-2.709 1.862,-1.804 2.794,-4.645 2.794,-8.525 0,-8.3 -3.543,-12.45 -10.625,-12.45 l -5.785,0 c -1.149,0 -1.725,0.518 -1.725,1.556" /></g><g - transform="translate(157.6558,43.5176)" - id="g3362"><path - id="path3364" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -1.083,0 -1.991,-0.497 -2.726,-1.488 -0.731,-0.992 -1.097,-2.385 -1.097,-4.177 0,-1.796 0.35,-3.171 1.049,-4.129 0.698,-0.961 1.617,-1.439 2.756,-1.439 1.14,0 2.065,0.484 2.775,1.457 0.711,0.968 1.067,2.355 1.067,4.161 0,1.803 -0.367,3.192 -1.1,4.162 C 1.99,-0.484 1.083,0 0,0 m -0.018,-17.828 c -3.169,0 -5.751,1.037 -7.746,3.11 -1.997,2.075 -2.995,5.104 -2.995,9.084 0,3.984 1.009,6.999 3.027,9.053 2.02,2.051 4.624,3.077 7.817,3.077 3.192,0 5.768,-1.008 7.73,-3.029 1.963,-2.018 2.944,-5.076 2.944,-9.167 0,-4.094 -1.004,-7.139 -3.012,-9.137 -2.007,-1.994 -4.596,-2.991 -7.765,-2.991" /></g><g - transform="translate(181.0239,26.5664)" - id="g3366"><path - id="path3368" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-0.448 -1.115,-0.676 -3.349,-0.676 -2.232,0 -3.35,0.228 -3.35,0.676 l 0,16.985 -4.059,0 c -0.384,0 -0.655,0.518 -0.812,1.558 -0.068,0.495 -0.1,1.002 -0.1,1.521 0,0.517 0.032,1.026 0.1,1.522 0.157,1.037 0.428,1.559 0.812,1.559 l 14.717,0 c 0.383,0 0.653,-0.522 0.812,-1.559 0.067,-0.496 0.101,-1.005 0.101,-1.522 0,-0.519 -0.034,-1.026 -0.101,-1.521 C 4.612,17.503 4.342,16.985 3.959,16.985 L 0,16.985 0,0 Z" /></g><g - transform="translate(96.0444,38.5889)" - id="g3370"><path - id="path3372" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -1.821,0.028 -3.906,-0.352 -3.906,-0.352 l 0,-3.554 2.096,0 -0.023,-1.585 c 0,-0.587 -0.582,-0.882 -1.743,-0.882 -1.162,0 -2.188,0.492 -3.078,1.474 -0.893,0.982 -1.337,2.419 -1.337,4.311 0,1.897 0.434,3.295 1.303,4.197 0.866,0.902 2.002,1.354 3.399,1.354 0.587,0 1.195,-0.095 1.827,-0.288 0.632,-0.192 1.055,-0.371 1.27,-0.539 0.214,-0.173 0.417,-0.255 0.609,-0.255 0.191,0 0.501,0.223 0.929,0.676 0.429,0.451 0.813,1.134 1.152,2.046 0.337,0.916 0.506,1.618 0.506,2.116 0,0.494 -0.01,0.835 -0.032,1.014 -0.474,0.519 -1.348,0.93 -2.624,1.236 -1.273,0.304 -2.7,0.456 -4.279,0.456 -3.474,0 -6.191,-1.094 -8.153,-3.281 -1.963,-2.189 -2.943,-5.03 -2.943,-8.527 0,-4.105 1.003,-7.218 3.008,-9.338 2.01,-2.12 4.648,-3.178 7.919,-3.178 1.759,0 3.321,0.151 4.684,0.456 1.366,0.303 2.274,0.615 2.726,0.93 L 3.445,-0.926 C 3.445,-0.311 1.821,-0.031 0,0" /></g><g - transform="translate(88.9126,11.8398)" - id="g3374"><path - id="path3376" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -0.187,-0.384 -0.531,-0.735 -1.034,-1.054 -0.502,-0.32 -1.14,-0.479 -1.915,-0.479 -1.022,0 -1.844,0.322 -2.469,0.973 -0.622,0.647 -0.934,1.579 -0.934,2.794 l 0,3.032 c 0,1.189 0.294,2.101 0.883,2.738 0.588,0.632 1.376,0.952 2.359,0.952 0.962,0 1.707,-0.253 2.234,-0.753 C -0.35,7.701 -0.074,7 -0.05,6.104 l -0.013,-0.04 -0.785,0 C -0.876,6.751 -1.075,7.28 -1.45,7.654 -1.823,8.025 -2.377,8.213 -3.11,8.213 -3.851,8.213 -4.438,7.962 -4.868,7.459 -5.296,6.957 -5.51,6.229 -5.51,5.273 l 0,-3.048 c 0,-0.992 0.231,-1.747 0.693,-2.268 0.461,-0.517 1.083,-0.775 1.868,-0.775 0.574,0 1.034,0.101 1.379,0.309 0.346,0.205 0.587,0.455 0.722,0.752 l 0,2.655 -2.115,0 0,0.739 L 0,3.637 0,0 Z" /></g><g - transform="translate(92.7988,11.0645)" - id="g3378"><path - id="path3380" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0.465,0 0.88,0.132 1.242,0.4 0.362,0.27 0.616,0.611 0.767,1.026 l 0,1.638 -1.346,0 C 0.091,3.064 -0.368,2.902 -0.711,2.578 -1.055,2.256 -1.225,1.854 -1.225,1.375 -1.225,0.971 -1.119,0.639 -0.903,0.383 -0.688,0.126 -0.387,0 0,0 M 2.135,-0.611 C 2.093,-0.349 2.06,-0.136 2.04,0.031 2.02,0.201 2.009,0.37 2.009,0.542 1.779,0.166 1.483,-0.146 1.116,-0.39 0.75,-0.636 0.343,-0.758 -0.105,-0.758 c -0.627,0 -1.109,0.195 -1.45,0.583 -0.34,0.391 -0.511,0.917 -0.511,1.581 0,0.702 0.247,1.266 0.741,1.684 0.494,0.418 1.166,0.627 2.011,0.627 l 1.323,0 0,0.93 C 2.009,5.183 1.873,5.604 1.604,5.909 1.331,6.21 0.954,6.362 0.468,6.362 0.017,6.362 -0.356,6.219 -0.649,5.928 -0.94,5.639 -1.085,5.285 -1.085,4.864 l -0.786,0.007 -0.014,0.041 c -0.022,0.571 0.194,1.076 0.65,1.524 0.454,0.446 1.036,0.668 1.745,0.668 0.701,0 1.265,-0.213 1.696,-0.638 0.428,-0.429 0.643,-1.04 0.643,-1.835 l 0,-3.715 c 0,-0.27 0.012,-0.533 0.036,-0.784 0.024,-0.254 0.063,-0.499 0.125,-0.743 l -0.875,0 z" /></g><g - transform="translate(98.2871,18.0273)" - id="g3382"><path - id="path3384" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0.072,-1.176 c 0.199,0.421 0.466,0.745 0.796,0.976 0.332,0.227 0.722,0.341 1.171,0.341 0.457,0 0.843,-0.133 1.154,-0.403 0.311,-0.268 0.541,-0.675 0.687,-1.22 0.186,0.503 0.451,0.902 0.794,1.19 0.343,0.289 0.759,0.433 1.242,0.433 0.664,0 1.179,-0.269 1.544,-0.807 0.367,-0.539 0.55,-1.366 0.55,-2.483 l 0,-4.425 -0.846,0 0,4.439 c 0,0.929 -0.128,1.583 -0.378,1.959 -0.252,0.377 -0.612,0.567 -1.078,0.567 -0.491,0 -0.874,-0.207 -1.149,-0.628 C 4.285,-1.658 4.116,-2.185 4.054,-2.82 l 0,-0.197 0,-4.557 -0.842,0 0,4.434 c 0,0.908 -0.127,1.557 -0.387,1.945 -0.259,0.387 -0.619,0.58 -1.081,0.58 -0.442,0 -0.8,-0.135 -1.068,-0.403 C 0.407,-1.286 0.215,-1.654 0.099,-2.121 l 0,-5.453 -0.841,0 0,7.574 L 0,0 Z" /></g><g - transform="translate(110.499,17.4268)" - id="g3386"><path - id="path3388" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -0.527,0 -0.959,-0.24 -1.299,-0.72 -0.339,-0.481 -0.514,-1.074 -0.529,-1.781 l 3.495,0 0,0.324 c 0,0.625 -0.147,1.146 -0.441,1.559 C 0.931,-0.205 0.523,0 0,0 m 0.119,-7.12 c -0.817,0 -1.485,0.307 -2.003,0.921 -0.517,0.612 -0.777,1.395 -0.777,2.349 l 0,1.258 c 0,0.956 0.26,1.753 0.78,2.387 0.521,0.631 1.147,0.946 1.881,0.946 0.793,0 1.408,-0.281 1.847,-0.845 0.44,-0.566 0.66,-1.326 0.66,-2.279 l 0,-0.831 -4.335,0 0,-0.63 c 0,-0.733 0.176,-1.344 0.525,-1.831 0.35,-0.488 0.826,-0.73 1.422,-0.73 0.414,0 0.775,0.073 1.075,0.217 0.301,0.147 0.558,0.353 0.773,0.624 L 2.311,-6.16 C 2.083,-6.45 1.786,-6.685 1.424,-6.858 1.063,-7.031 0.627,-7.12 0.119,-7.12" /></g><g - transform="translate(119.8403,17.4268)" - id="g3390"><path - id="path3392" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -0.528,0 -0.962,-0.24 -1.301,-0.72 -0.337,-0.481 -0.513,-1.074 -0.528,-1.781 l 3.495,0 0,0.324 c 0,0.625 -0.146,1.146 -0.442,1.559 C 0.93,-0.205 0.522,0 0,0 m 0.118,-7.12 c -0.817,0 -1.484,0.307 -2.001,0.921 -0.52,0.612 -0.78,1.395 -0.78,2.349 l 0,1.258 c 0,0.956 0.262,1.753 0.78,2.387 C -1.36,0.426 -0.734,0.741 0,0.741 0.792,0.741 1.409,0.46 1.847,-0.104 2.286,-0.67 2.505,-1.43 2.505,-2.383 l 0,-0.831 -4.334,0 0,-0.63 c 0,-0.733 0.176,-1.344 0.527,-1.831 0.348,-0.488 0.822,-0.73 1.42,-0.73 0.416,0 0.775,0.073 1.074,0.217 0.302,0.147 0.559,0.353 0.776,0.624 L 2.31,-6.16 C 2.081,-6.45 1.786,-6.685 1.423,-6.858 1.063,-7.031 0.627,-7.12 0.118,-7.12" /></g><g - transform="translate(124.5659,18.0273)" - id="g3394"><path - id="path3396" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0.069,-1.252 c 0.202,0.444 0.469,0.789 0.804,1.029 0.332,0.242 0.723,0.364 1.172,0.364 0.677,0 1.196,-0.25 1.556,-0.753 0.363,-0.502 0.544,-1.283 0.544,-2.341 l 0,-4.621 -0.847,0 0,4.613 c 0,0.865 -0.127,1.47 -0.379,1.82 -0.251,0.351 -0.619,0.526 -1.098,0.526 -0.43,0 -0.791,-0.14 -1.08,-0.424 C 0.451,-1.32 0.234,-1.695 0.09,-2.168 l 0,-5.406 -0.84,0 L -0.75,0 0,0 Z" /></g><g - transform="translate(131.1768,13.5771)" - id="g3398"><path - id="path3400" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-0.769 0.146,-1.38 0.441,-1.835 0.292,-0.459 0.736,-0.686 1.33,-0.686 0.406,0 0.748,0.109 1.029,0.331 0.28,0.221 0.501,0.53 0.664,0.921 l 0,3.752 C 3.307,2.887 3.091,3.213 2.818,3.464 2.545,3.711 2.2,3.835 1.785,3.835 1.193,3.835 0.746,3.577 0.448,3.06 0.149,2.541 0,1.865 0,1.035 L 0,0 Z m -0.849,1.035 c 0,1.073 0.217,1.936 0.652,2.585 0.432,0.647 1.033,0.971 1.8,0.971 0.425,0 0.798,-0.104 1.117,-0.312 C 3.039,4.075 3.303,3.776 3.515,3.396 l 0.082,1.054 0.714,0 0,-7.581 c 0,-0.971 -0.226,-1.723 -0.678,-2.255 -0.452,-0.53 -1.095,-0.799 -1.926,-0.799 -0.298,0 -0.619,0.047 -0.962,0.138 -0.344,0.091 -0.648,0.21 -0.915,0.359 l 0.233,0.739 c 0.227,-0.148 0.481,-0.262 0.763,-0.342 0.279,-0.083 0.568,-0.123 0.867,-0.123 0.602,0 1.049,0.193 1.337,0.579 0.289,0.391 0.434,0.956 0.434,1.704 l 0,0.916 C 3.25,-2.556 2.986,-2.817 2.673,-2.998 2.362,-3.18 1.998,-3.271 1.588,-3.271 c -0.761,0 -1.358,0.298 -1.789,0.894 -0.431,0.595 -0.648,1.388 -0.648,2.377 l 0,1.035 z" /></g><path - id="path3402" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 138.318,10.453 -0.848,0 0,7.574 0.848,0 0,-7.574 z m 0,9.731 -0.848,0 0,1.193 0.848,0 0,-1.193 z" /><g - transform="translate(141.0552,18.0273)" - id="g3404"><path - id="path3406" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0.069,-1.252 c 0.202,0.444 0.468,0.789 0.803,1.029 0.334,0.242 0.725,0.364 1.173,0.364 0.677,0 1.197,-0.25 1.558,-0.753 0.363,-0.502 0.542,-1.283 0.542,-2.341 l 0,-4.621 -0.847,0 0,4.613 c 0,0.865 -0.127,1.47 -0.378,1.82 -0.253,0.351 -0.618,0.526 -1.099,0.526 -0.43,0 -0.79,-0.14 -1.079,-0.424 C 0.453,-1.32 0.235,-1.695 0.092,-2.168 l 0,-5.406 -0.842,0 L -0.75,0 0,0 Z" /></g><g - transform="translate(149.4155,17.4268)" - id="g3408"><path - id="path3410" - style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -0.528,0 -0.961,-0.24 -1.299,-0.72 -0.338,-0.481 -0.514,-1.074 -0.53,-1.781 l 3.495,0 0,0.324 c 0,0.625 -0.145,1.146 -0.44,1.559 C 0.932,-0.205 0.523,0 0,0 m 0.12,-7.12 c -0.819,0 -1.486,0.307 -2.002,0.921 -0.518,0.612 -0.778,1.395 -0.778,2.349 l 0,1.258 c 0,0.956 0.26,1.753 0.78,2.387 0.521,0.631 1.148,0.946 1.88,0.946 0.793,0 1.41,-0.281 1.85,-0.845 0.438,-0.566 0.657,-1.326 0.657,-2.279 l 0,-0.831 -4.336,0 0,-0.63 c 0,-0.733 0.177,-1.344 0.527,-1.831 0.349,-0.488 0.823,-0.73 1.422,-0.73 0.414,0 0.773,0.073 1.072,0.217 0.304,0.147 0.56,0.353 0.777,0.624 L 2.313,-6.16 C 2.082,-6.45 1.787,-6.685 1.425,-6.858 1.064,-7.031 0.628,-7.12 0.12,-7.12" /></g><g - transform="translate(64.312,21.7949)" - id="g3412"><path - id="path3414" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0,-3.942 c 0,-0.39 -0.25,-0.734 -0.621,-0.852 L -6.835,-6.8 c -0.273,-0.091 -0.57,-0.042 -0.8,0.128 -0.232,0.168 -0.37,0.437 -0.37,0.721 l 0,4.305 -5.818,-1.108 0,-4.381 c 0,-0.447 -0.332,-0.824 -0.775,-0.885 l -8.41,-1.152 c -0.039,-0.003 -0.081,-0.008 -0.121,-0.008 -0.214,0 -0.424,0.078 -0.588,0.22 -0.195,0.172 -0.306,0.416 -0.306,0.676 l 0,4.638 -4.341,-0.018 0,-10e-4 -0.318,10e-4 -0.319,-10e-4 0,10e-4 -4.34,0.018 0,-4.638 c 0,-0.26 -0.112,-0.504 -0.307,-0.676 -0.164,-0.142 -0.374,-0.22 -0.587,-0.22 -0.041,0 -0.082,0.005 -0.123,0.008 l -8.41,1.152 c -0.442,0.061 -0.774,0.438 -0.774,0.885 l 0,4.381 -5.819,1.108 0,-4.305 c 0,-0.284 -0.137,-0.553 -0.368,-0.721 -0.232,-0.17 -0.529,-0.219 -0.802,-0.128 l -6.215,2.006 c -0.369,0.118 -0.619,0.462 -0.619,0.852 l 0,3.942 -3.837,1.29 c -0.19,-0.811 -0.295,-1.642 -0.295,-2.481 0,-10.301 14.512,-18.252 32.448,-18.309 l 0.022,0 0.023,0 c 17.936,0.057 32.448,8.008 32.448,18.309 0,0.766 -0.088,1.521 -0.247,2.266 L 0,0 Z" /></g><g - transform="translate(5.9634,40.0615)" - id="g3416"><path - id="path3418" - style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 0,-16.047 2.163,-0.729 c 0.364,-0.122 0.61,-0.462 0.61,-0.847 l 0,-3.936 4.426,-1.428 0,4.154 c 0,0.27 0.118,0.52 0.323,0.689 0.206,0.172 0.474,0.241 0.739,0.192 l 7.608,-1.452 c 0.422,-0.079 0.728,-0.448 0.728,-0.877 l 0,-4.338 6.62,-0.904 0,4.509 c 0,0.241 0.096,0.467 0.264,0.635 0.167,0.166 0.394,0.259 0.633,0.259 l 0.002,0 5.551,-0.022 5.549,0.022 c 0.245,-10e-4 0.468,-0.093 0.635,-0.259 0.169,-0.168 0.264,-0.394 0.264,-0.635 l 0,-4.509 6.621,0.904 0,4.338 c 0,0.429 0.304,0.798 0.726,0.877 l 7.609,1.452 c 0.262,0.049 0.533,-0.02 0.738,-0.192 0.205,-0.169 0.325,-0.419 0.325,-0.689 l 0,-4.154 4.425,1.428 0,3.936 c 0,0.385 0.245,0.725 0.609,0.847 l 1.475,0.497 0,16.279 0.04,0 c 1.437,1.834 2.767,3.767 4.042,5.828 -1.694,2.883 -3.768,5.459 -5.986,7.846 -2.057,-1.035 -4.055,-2.208 -5.942,-3.456 -0.944,0.938 -2.008,1.706 -3.052,2.509 -1.027,0.824 -2.183,1.428 -3.281,2.132 0.327,2.433 0.489,4.828 0.554,7.327 -2.831,1.424 -5.85,2.369 -8.903,3.047 -1.219,-2.048 -2.334,-4.267 -3.304,-6.436 -1.152,0.192 -2.309,0.264 -3.467,0.277 l 0,0.002 c -0.008,0 -0.015,-0.002 -0.022,-0.002 -0.008,0 -0.015,0.002 -0.022,0.002 l 0,-0.002 c -1.16,-0.013 -2.316,-0.085 -3.468,-0.277 -0.97,2.169 -2.084,4.388 -3.305,6.436 C 19.475,24.555 16.456,23.61 13.626,22.186 13.69,19.687 13.852,17.292 14.18,14.859 13.081,14.155 11.925,13.551 10.898,12.727 9.855,11.924 8.79,11.156 7.846,10.218 5.958,11.466 3.961,12.639 1.904,13.674 -0.314,11.287 -2.388,8.711 -4.082,5.828 -2.807,3.767 -1.477,1.834 -0.04,0 L 0,0 Z" /></g><g - transform="translate(26.8428,32.3604)" - id="g3420"><path - id="path3422" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-3.611 -2.926,-6.537 -6.537,-6.537 -3.608,0 -6.535,2.926 -6.535,6.537 0,3.609 2.927,6.533 6.535,6.533 C -2.926,6.533 0,3.609 0,0" /></g><g - transform="translate(25.27,31.9727)" - id="g3424"><path - id="path3426" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-2.396 -1.941,-4.337 -4.339,-4.337 -2.396,0 -4.339,1.941 -4.339,4.337 0,2.396 1.943,4.339 4.339,4.339 C -1.941,4.339 0,2.396 0,0" /></g><g - transform="translate(35.6816,25.2285)" - id="g3428"><path - id="path3430" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c -1.162,0 -2.104,0.856 -2.104,1.912 l 0,6.018 c 0,1.054 0.942,1.912 2.104,1.912 1.162,0 2.106,-0.858 2.106,-1.912 l 0,-6.018 C 2.106,0.856 1.162,0 0,0" /></g><g - transform="translate(44.5215,32.3604)" - id="g3432"><path - id="path3434" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-3.611 2.926,-6.537 6.537,-6.537 3.609,0 6.535,2.926 6.535,6.537 0,3.609 -2.926,6.533 -6.535,6.533 C 2.926,6.533 0,3.609 0,0" /></g><g - transform="translate(46.0947,31.9727)" - id="g3436"><path - id="path3438" - style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 0,0 c 0,-2.396 1.941,-4.337 4.336,-4.337 2.398,0 4.339,1.941 4.339,4.337 0,2.396 -1.941,4.339 -4.339,4.339 C 1.941,4.339 0,2.396 0,0" /></g></g></g></g></svg>
\ No newline at end of file + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs6"><clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath16"><path + d="M 0,595.276 H 841.89 V 0 H 0 Z" + id="path18" + inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1011" + id="namedview4" + showgrid="false" + inkscape:zoom="0.63432763" + inkscape:cx="166.44059" + inkscape:cy="101.14582" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="g14" + fit-margin-top="48" + fit-margin-left="48" + fit-margin-right="48" + fit-margin-bottom="48" /><g + id="g10" + inkscape:groupmode="layer" + inkscape:label="godot_engine_logo_2017_curves-01" + transform="matrix(1.25,0,0,-1.25,-94.249997,597.49874)"><g + id="g12"><g + id="g14" + clip-path="url(#clipPath16)"><g + id="g20" + transform="matrix(1.1310535,0,0,1.1310535,531.44953,355.31567)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -3.611,0 -6.636,-1.659 -9.09,-4.967 -2.441,-3.311 -3.668,-7.958 -3.668,-13.938 0,-5.993 1.166,-10.581 3.503,-13.778 2.333,-3.207 5.398,-4.804 9.2,-4.804 3.8,0 6.887,1.617 9.258,4.862 2.371,3.233 3.559,7.861 3.559,13.886 0,6.02 -1.227,10.654 -3.673,13.89 C 6.646,-1.617 3.616,0 0,0 m -0.055,-59.493 c -10.573,0 -19.195,3.46 -25.859,10.379 -6.655,6.925 -9.984,17.03 -9.984,30.314 0,13.292 3.367,23.356 10.101,30.209 6.736,6.844 15.431,10.269 26.082,10.269 10.649,0 19.251,-3.363 25.794,-10.109 6.555,-6.733 9.827,-16.94 9.827,-30.591 0,-13.661 -3.348,-23.822 -10.05,-30.49 -6.702,-6.654 -15.333,-9.981 -25.911,-9.981" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path22" + inkscape:connector-curvature="0" /></g><g + id="g24" + transform="matrix(1.1310535,0,0,1.1310535,607.8515,354.43097)" + style="stroke-width:0.88413143"><path + d="m 0,0 v -33.768 c 0,-1.577 0.116,-2.571 0.342,-2.988 0.224,-0.415 0.903,-0.623 2.029,-0.623 4.144,0 7.283,1.548 9.429,4.634 2.151,3.083 3.215,8.216 3.215,15.405 0,7.192 -1.113,11.878 -3.325,14.055 C 9.467,-1.102 5.946,0 1.129,0 Z m -21.675,-52.392 v 67.735 c 0,1.883 0.468,3.369 1.413,4.471 0.939,1.085 2.161,1.636 3.671,1.636 H 2.263 c 11.965,0 21.053,-3.018 27.257,-9.04 6.215,-6.02 9.322,-15.499 9.322,-28.447 0,-27.7 -11.821,-41.547 -35.456,-41.547 h -19.302 c -3.836,0 -5.759,1.727 -5.759,5.192" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path26" + inkscape:connector-curvature="0" /></g><g + id="g28" + transform="matrix(1.1310535,0,0,1.1310535,700.81066,355.31567)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -3.612,0 -6.645,-1.659 -9.095,-4.967 -2.44,-3.311 -3.662,-7.958 -3.662,-13.938 0,-5.993 1.169,-10.581 3.499,-13.778 2.33,-3.207 5.398,-4.804 9.2,-4.804 3.801,0 6.89,1.617 9.258,4.862 2.372,3.233 3.56,7.861 3.56,13.886 0,6.02 -1.225,10.654 -3.671,13.89 C 6.642,-1.617 3.616,0 0,0 m -0.058,-59.493 c -10.577,0 -19.193,3.46 -25.851,10.379 -6.663,6.925 -9.993,17.03 -9.993,30.314 0,13.292 3.367,23.356 10.1,30.209 6.741,6.844 15.431,10.269 26.086,10.269 10.651,0 19.246,-3.363 25.797,-10.109 6.55,-6.733 9.822,-16.94 9.822,-30.591 0,-13.661 -3.349,-23.822 -10.05,-30.49 -6.699,-6.654 -15.338,-9.981 -25.911,-9.981" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path30" + inkscape:connector-curvature="0" /></g><g + id="g32" + transform="matrix(1.1310535,0,0,1.1310535,789.01132,291.33514)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,-1.496 -3.721,-2.255 -11.176,-2.255 -7.448,0 -11.18,0.759 -11.18,2.255 v 56.681 h -13.545 c -1.281,0 -2.185,1.727 -2.71,5.198 -0.226,1.652 -0.334,3.343 -0.334,5.077 0,1.724 0.108,3.422 0.334,5.077 0.525,3.462 1.429,5.202 2.71,5.202 h 49.112 c 1.279,0 2.179,-1.74 2.712,-5.202 0.221,-1.655 0.335,-3.353 0.335,-5.077 0,-1.734 -0.114,-3.425 -0.335,-5.077 C 15.39,58.408 14.49,56.681 13.211,56.681 H 0 Z" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path34" + inkscape:connector-curvature="0" /></g><g + id="g36" + transform="matrix(1.1310535,0,0,1.1310535,468.26549,336.71278)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -6.078,0.094 -13.034,-1.173 -13.034,-1.173 v -11.863 h 6.995 l -0.078,-5.288 c 0,-1.959 -1.942,-2.943 -5.815,-2.943 -3.878,0 -7.303,1.642 -10.274,4.917 -2.978,3.279 -4.459,8.072 -4.459,14.388 0,6.329 1.447,10.995 4.345,14.006 2.892,3.008 6.683,4.517 11.346,4.517 1.959,0 3.987,-0.316 6.096,-0.961 2.11,-0.639 3.519,-1.238 4.238,-1.799 0.713,-0.577 1.391,-0.85 2.032,-0.85 0.638,0 1.671,0.746 3.1,2.255 1.431,1.505 2.713,3.786 3.844,6.827 1.126,3.057 1.69,5.4 1.69,7.062 0,1.649 -0.036,2.786 -0.109,3.386 -1.581,1.73 -4.499,3.102 -8.755,4.122 -4.248,1.017 -9.011,1.522 -14.28,1.522 -11.594,0 -20.66,-3.65 -27.207,-10.95 -6.552,-7.303 -9.822,-16.783 -9.822,-28.452 0,-13.701 3.347,-24.087 10.041,-31.162 6.706,-7.074 15.51,-10.607 26.425,-10.607 5.87,0 11.08,0.505 15.632,1.522 4.557,1.013 7.586,2.053 9.093,3.105 l 0.452,35.33 C 11.496,-1.036 6.078,-0.104 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path38" + inkscape:connector-curvature="0" /></g><g + id="g40" + transform="matrix(1.1310535,0,0,1.1310535,441.34721,235.75121)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -0.624,-1.28 -1.771,-2.454 -3.449,-3.516 -1.676,-1.069 -3.805,-1.6 -6.391,-1.6 -3.412,0 -6.156,1.075 -8.24,3.249 -2.076,2.157 -3.116,5.266 -3.116,9.323 v 10.116 c 0,3.969 0.98,7.013 2.946,9.138 1.962,2.108 4.59,3.177 7.872,3.177 3.208,0 5.695,-0.844 7.455,-2.513 1.755,-1.675 2.677,-4.015 2.757,-7.003 L -0.21,20.238 h -2.619 c -0.094,2.29 -0.759,4.057 -2.01,5.305 -1.244,1.238 -3.095,1.864 -5.539,1.864 -2.473,0 -4.432,-0.837 -5.866,-2.516 -1.43,-1.675 -2.143,-4.103 -2.143,-7.293 V 7.424 c 0,-3.308 0.771,-5.83 2.311,-7.567 1.54,-1.724 3.616,-2.588 6.236,-2.588 1.913,0 3.451,0.339 4.602,1.033 1.155,0.684 1.956,1.519 2.409,2.51 v 8.861 h -7.06 v 2.463 H 0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path42" + inkscape:connector-curvature="0" /></g><g + id="g44" + transform="matrix(1.1310535,0,0,1.1310535,456.01527,232.82495)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 1.553,0 2.936,0.44 4.144,1.336 1.21,0.9 2.058,2.037 2.561,3.422 v 5.468 H 2.213 c -1.91,0 -3.44,-0.541 -4.585,-1.623 C -3.52,7.528 -4.088,6.185 -4.088,4.588 -4.088,3.239 -3.733,2.131 -3.014,1.277 -2.296,0.42 -1.292,0 0,0 M 7.124,-2.04 C 6.984,-1.164 6.875,-0.453 6.806,0.104 6.739,0.671 6.705,1.235 6.705,1.808 5.938,0.554 4.948,-0.486 3.725,-1.301 2.504,-2.122 1.146,-2.529 -0.35,-2.529 c -2.092,0 -3.701,0.648 -4.84,1.946 -1.132,1.303 -1.704,3.059 -1.704,5.276 0,2.343 0.823,4.223 2.473,5.618 1.649,1.395 3.89,2.092 6.709,2.092 h 4.417 v 3.106 c 0,1.786 -0.456,3.193 -1.351,4.21 -0.914,1.004 -2.17,1.512 -3.791,1.512 -1.508,0 -2.752,-0.479 -3.728,-1.45 -0.973,-0.965 -1.456,-2.144 -1.456,-3.549 l -2.623,0.023 -0.046,0.137 c -0.074,1.906 0.647,3.591 2.168,5.084 1.515,1.489 3.459,2.229 5.825,2.229 2.338,0 4.22,-0.711 5.657,-2.128 1.429,-1.431 2.146,-3.471 2.146,-6.124 V 3.057 c 0,-0.903 0.042,-1.78 0.121,-2.617 0.081,-0.848 0.212,-1.665 0.417,-2.48 z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path46" + inkscape:connector-curvature="0" /></g><g + id="g48" + transform="matrix(1.1310535,0,0,1.1310535,476.7303,259.10521)" + style="stroke-width:0.88413143"><path + d="m 0,0 0.24,-3.923 c 0.664,1.404 1.554,2.486 2.657,3.255 1.107,0.759 2.41,1.138 3.906,1.138 1.527,0 2.814,-0.444 3.852,-1.343 1.039,-0.896 1.805,-2.252 2.292,-4.074 0.623,1.682 1.505,3.011 2.65,3.973 1.145,0.964 2.534,1.444 4.143,1.444 2.217,0 3.937,-0.897 5.156,-2.692 1.224,-1.799 1.834,-4.559 1.834,-8.288 v -14.765 h -2.823 v 14.814 c 0,3.1 -0.429,5.283 -1.263,6.538 -0.839,1.257 -2.042,1.89 -3.598,1.89 -1.637,0 -2.915,-0.691 -3.834,-2.096 -0.914,-1.405 -1.478,-3.161 -1.683,-5.282 v -0.655 -15.209 H 10.72 v 14.798 c 0,3.027 -0.424,5.194 -1.292,6.488 -0.864,1.294 -2.066,1.936 -3.609,1.936 -1.475,0 -2.668,-0.45 -3.562,-1.342 -0.9,-0.897 -1.54,-2.125 -1.928,-3.683 V -25.275 H -2.477 V 0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path50" + inkscape:connector-curvature="0" /></g><g + id="g52" + transform="matrix(1.1310535,0,0,1.1310535,522.82277,256.83868)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -1.758,0 -3.202,-0.802 -4.334,-2.402 -1.133,-1.606 -1.718,-3.585 -1.765,-5.944 h 11.66 v 1.082 c 0,2.086 -0.489,3.823 -1.469,5.201 C 3.106,-0.684 1.745,0 0,0 m 0.397,-23.76 c -2.725,0 -4.954,1.026 -6.685,3.073 -1.726,2.043 -2.591,4.657 -2.591,7.841 v 4.197 c 0,3.19 0.867,5.85 2.602,7.965 1.739,2.105 3.828,3.158 6.277,3.158 2.648,0 4.699,-0.939 6.164,-2.823 1.468,-1.887 2.201,-4.422 2.201,-7.603 v -2.773 H -6.099 v -2.102 c 0,-2.447 0.586,-4.484 1.752,-6.11 1.168,-1.63 2.755,-2.438 4.744,-2.438 1.382,0 2.585,0.244 3.588,0.724 1.003,0.491 1.863,1.179 2.578,2.082 l 1.149,-1.988 C 6.949,-21.525 5.96,-22.307 4.753,-22.887 3.549,-23.464 2.094,-23.76 0.397,-23.76" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path54" + inkscape:connector-curvature="0" /></g><g + id="g56" + transform="matrix(1.1310535,0,0,1.1310535,558.0805,256.83868)" + style="stroke-width:0.88413143"><path + d="M 0,0 C -1.763,0 -3.21,-0.802 -4.341,-2.402 -5.467,-4.008 -6.053,-5.987 -6.104,-8.346 H 5.559 v 1.082 c 0,2.086 -0.488,3.823 -1.474,5.201 C 3.104,-0.684 1.744,0 0,0 m 0.394,-23.76 c -2.726,0 -4.951,1.026 -6.679,3.073 -1.733,2.043 -2.6,4.657 -2.6,7.841 v 4.197 c 0,3.19 0.871,5.85 2.602,7.965 1.744,2.105 3.834,3.158 6.283,3.158 2.643,0 4.703,-0.939 6.164,-2.823 1.463,-1.887 2.197,-4.422 2.197,-7.603 v -2.773 H -6.104 v -2.102 c 0,-2.447 0.587,-4.484 1.76,-6.11 1.162,-1.63 2.742,-2.438 4.738,-2.438 1.387,0 2.585,0.244 3.585,0.724 1.007,0.491 1.866,1.179 2.589,2.082 l 1.141,-1.988 c -0.764,-0.968 -1.75,-1.75 -2.959,-2.33 -1.204,-0.577 -2.658,-0.873 -4.356,-0.873" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path58" + inkscape:connector-curvature="0" /></g><g + id="g60" + transform="matrix(1.1310535,0,0,1.1310535,575.91679,259.10521)" + style="stroke-width:0.88413143"><path + d="m 0,0 0.23,-4.178 c 0.674,1.483 1.564,2.634 2.682,3.435 1.108,0.805 2.413,1.213 3.914,1.213 2.258,0 3.988,-0.835 5.189,-2.513 1.214,-1.675 1.815,-4.279 1.815,-7.812 v -15.42 h -2.825 v 15.394 c 0,2.888 -0.423,4.905 -1.264,6.075 -0.836,1.17 -2.065,1.753 -3.665,1.753 -1.435,0 -2.638,-0.466 -3.603,-1.414 C 1.504,-4.406 0.782,-5.657 0.301,-7.234 V -25.275 H -2.504 V 0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path62" + inkscape:connector-curvature="0" /></g><g + id="g64" + transform="matrix(1.1310535,0,0,1.1310535,600.8685,242.30884)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,-2.565 0.486,-4.605 1.472,-6.123 0.974,-1.532 2.457,-2.288 4.436,-2.288 1.356,0 2.498,0.361 3.435,1.101 0.934,0.74 1.672,1.77 2.218,3.077 v 12.52 c -0.525,1.346 -1.246,2.434 -2.157,3.272 -0.91,0.824 -2.062,1.238 -3.448,1.238 -1.975,0 -3.468,-0.86 -4.46,-2.587 C 0.497,8.48 0,6.224 0,3.454 Z m -2.833,3.454 c 0,3.582 0.723,6.459 2.177,8.627 1.442,2.157 3.448,3.239 6.004,3.239 1.419,0 2.664,-0.346 3.728,-1.04 1.066,-0.681 1.947,-1.678 2.654,-2.946 l 0.274,3.516 h 2.381 v -25.298 c 0,-3.239 -0.751,-5.749 -2.26,-7.525 -1.511,-1.769 -3.657,-2.665 -6.428,-2.665 -0.996,0 -2.067,0.156 -3.212,0.459 -1.147,0.303 -2.162,0.701 -3.052,1.2 l 0.776,2.463 c 0.759,-0.492 1.608,-0.873 2.548,-1.141 0.932,-0.277 1.895,-0.41 2.894,-0.41 2.009,0 3.498,0.645 4.46,1.932 0.966,1.304 1.45,3.19 1.45,5.687 v 3.057 c -0.717,-1.138 -1.597,-2.011 -2.64,-2.614 -1.039,-0.606 -2.253,-0.909 -3.622,-0.909 -2.539,0 -4.53,0.994 -5.968,2.982 C -2.11,-5.948 -2.833,-3.301 -2.833,0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path66" + inkscape:connector-curvature="0" /></g><path + d="m 627.82321,230.5176 h -3.20089 v 28.58738 h 3.20089 z m 0,36.72644 h -3.20089 v 4.50385 h 3.20089 z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994" + id="path68" + inkscape:connector-curvature="0" /><g + id="g70" + transform="matrix(1.1310535,0,0,1.1310535,638.15379,259.10521)" + style="stroke-width:0.88413143"><path + d="m 0,0 0.23,-4.178 c 0.676,1.483 1.562,2.634 2.678,3.435 1.115,0.805 2.422,1.213 3.916,1.213 2.258,0 3.995,-0.835 5.199,-2.513 1.211,-1.675 1.807,-4.279 1.807,-7.812 v -15.42 h -2.825 v 15.394 c 0,2.888 -0.422,4.905 -1.261,6.075 -0.843,1.17 -2.063,1.753 -3.668,1.753 -1.434,0 -2.635,-0.466 -3.599,-1.414 C 1.51,-4.406 0.785,-5.657 0.306,-7.234 V -25.275 H -2.503 V 0 Z" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path72" + inkscape:connector-curvature="0" /></g><g + id="g74" + transform="matrix(1.1310535,0,0,1.1310535,669.70883,256.83868)" + style="stroke-width:0.88413143"><path + d="M 0,0 C -1.763,0 -3.208,-0.802 -4.334,-2.402 -5.463,-4.008 -6.052,-5.987 -6.102,-8.346 H 5.56 v 1.082 c 0,2.086 -0.486,3.823 -1.47,5.201 C 3.109,-0.684 1.747,0 0,0 m 0.401,-23.76 c -2.733,0 -4.958,1.026 -6.681,3.073 -1.73,2.043 -2.595,4.657 -2.595,7.841 v 4.197 c 0,3.19 0.865,5.85 2.6,7.965 1.739,2.105 3.831,3.158 6.275,3.158 2.646,0 4.706,-0.939 6.172,-2.823 1.462,-1.887 2.195,-4.422 2.195,-7.603 v -2.773 H -6.102 v -2.102 c 0,-2.447 0.59,-4.484 1.757,-6.11 1.166,-1.63 2.748,-2.438 4.746,-2.438 1.382,0 2.579,0.244 3.578,0.724 1.012,0.491 1.869,1.179 2.591,2.082 l 1.147,-1.988 c -0.769,-0.968 -1.755,-1.75 -2.962,-2.33 -1.203,-0.577 -2.658,-0.873 -4.354,-0.873" + style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path76" + inkscape:connector-curvature="0" /></g><g + id="g78" + transform="matrix(1.1310535,0,0,1.1310535,348.13109,279.2668)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,0 -0.325,1.994 -0.515,1.976 l -36.182,-3.491 c -2.879,-0.278 -5.115,-2.574 -5.317,-5.459 l -0.994,-14.247 -27.992,-1.997 -1.904,12.912 c -0.424,2.872 -2.932,5.037 -5.835,5.037 h -38.188 c -2.902,0 -5.41,-2.165 -5.834,-5.037 l -1.905,-12.912 -27.992,1.997 -0.994,14.247 c -0.202,2.886 -2.438,5.182 -5.317,5.46 l -36.2,3.49 c -0.187,0.018 -0.324,-1.978 -0.511,-1.978 l -0.049,-7.83 30.658,-4.944 1.004,-14.374 c 0.203,-2.91 2.551,-5.263 5.463,-5.472 l 38.551,-2.75 c 0.146,-0.01 0.29,-0.016 0.434,-0.016 2.897,0 5.401,2.166 5.825,5.038 l 1.959,13.286 h 28.005 l 1.959,-13.286 c 0.423,-2.871 2.93,-5.037 5.831,-5.037 0.142,0 0.284,0.005 0.423,0.015 l 38.556,2.75 c 2.911,0.209 5.26,2.562 5.463,5.472 l 1.003,14.374 30.645,4.966 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path80" + inkscape:connector-curvature="0" /></g><g + id="g82" + transform="matrix(1.1310535,0,0,1.1310535,126.80608,346.04533)" + style="stroke-width:0.88413143"><path + d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 h 0.134 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 Z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path84" + inkscape:connector-curvature="0" /></g><g + id="g86" + transform="matrix(1.1310535,0,0,1.1310535,311.40329,266.88437)" + style="stroke-width:0.88413143"><path + d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path88" + inkscape:connector-curvature="0" /></g><g + id="g90" + transform="matrix(1.1310535,0,0,1.1310535,204.11393,318.93771)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path92" + inkscape:connector-curvature="0" /></g><g + id="g94" + transform="matrix(1.1310535,0,0,1.1310535,198.17748,317.47435)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path96" + inkscape:connector-curvature="0" /></g><g + id="g98" + transform="matrix(1.1310535,0,0,1.1310535,237.47503,292.01909)" + style="stroke-width:0.88413143"><path + d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path100" + inkscape:connector-curvature="0" /></g><g + id="g102" + transform="matrix(1.1310535,0,0,1.1310535,270.84021,318.93771)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path104" + inkscape:connector-curvature="0" /></g><g + id="g106" + transform="matrix(1.1310535,0,0,1.1310535,276.77813,317.47435)" + style="stroke-width:0.88413143"><path + d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.88413143" + id="path108" + inkscape:connector-curvature="0" /></g></g></g></g></svg>
\ No newline at end of file diff --git a/main/app_icon.png b/main/app_icon.png Binary files differindex eafae08d59..1d75cdc710 100644 --- a/main/app_icon.png +++ b/main/app_icon.png diff --git a/main/main.cpp b/main/main.cpp index 33095e8599..e13fb8d3db 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -588,8 +588,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph ScriptDebuggerRemote *sdr = memnew(ScriptDebuggerRemote); uint16_t debug_port = GLOBAL_GET("network/debug/remote_port"); if (debug_host.find(":") != -1) { - debug_port = debug_host.get_slicec(':', 1).to_int(); - debug_host = debug_host.get_slicec(':', 0); + int sep_pos = debug_host.find_last(":"); + debug_port = debug_host.substr(sep_pos + 1, debug_host.length()).to_int(); + debug_host = debug_host.substr(0, sep_pos); } Error derr = sdr->connect_to_host(debug_host, debug_port); @@ -916,18 +917,19 @@ Error Main::setup2() { bool boot_logo_scale = GLOBAL_DEF("application/boot_splash_fullsize", true); GlobalConfig::get_singleton()->set_custom_property_info("application/boot_splash", PropertyInfo(Variant::STRING, "application/boot_splash", PROPERTY_HINT_FILE, "*.png")); - Image boot_logo; + Ref<Image> boot_logo; boot_logo_path = boot_logo_path.strip_edges(); if (boot_logo_path != String() /*&& FileAccess::exists(boot_logo_path)*/) { print_line("Boot splash path: " + boot_logo_path); - Error err = boot_logo.load(boot_logo_path); + boot_logo.instance(); + Error err = boot_logo->load(boot_logo_path); if (err) ERR_PRINTS("Non-existing or invalid boot splash at: " + boot_logo_path + ". Loading default splash."); } - if (!boot_logo.empty()) { + if (boot_logo.is_valid()) { OS::get_singleton()->_msec_splash = OS::get_singleton()->get_ticks_msec(); Color boot_bg = GLOBAL_DEF("application/boot_bg_color", clear); VisualServer::get_singleton()->set_boot_image(boot_logo, boot_bg, boot_logo_scale); @@ -940,7 +942,7 @@ Error Main::setup2() { #ifndef NO_DEFAULT_BOOT_LOGO MAIN_PRINT("Main: Create bootsplash"); - Image splash(boot_splash_png); + Ref<Image> splash = memnew(Image(boot_splash_png)); MAIN_PRINT("Main: ClearColor"); VisualServer::get_singleton()->set_default_clear_color(boot_splash_bg_color); @@ -949,7 +951,7 @@ Error Main::setup2() { #endif } - Image icon(app_icon_png); + Ref<Image> icon = memnew(Image(app_icon_png)); OS::get_singleton()->set_icon(icon); } @@ -1463,8 +1465,8 @@ bool Main::start() { String iconpath = GLOBAL_DEF("application/icon", "Variant()"); if (iconpath != "") { - Image icon; - if (icon.load(iconpath) == OK) + Ref<Image> icon; + if (icon->load(iconpath) == OK) OS::get_singleton()->set_icon(icon); } } diff --git a/main/splash.png b/main/splash.png Binary files differindex 01ca2152ce..894a7d7aba 100644 --- a/main/splash.png +++ b/main/splash.png diff --git a/main/tests/test_containers.cpp b/main/tests/test_containers.cpp index 890599385a..956be5d169 100644 --- a/main/tests/test_containers.cpp +++ b/main/tests/test_containers.cpp @@ -55,18 +55,6 @@ MainLoop *test() { { - Image img; - img.create(default_mouse_cursor_xpm); - - { - for (int i = 0; i < 8; i++) { - - Image mipmap; - //img.make_mipmap(mipmap); - img = mipmap; - if (img.get_width() <= 4) break; - }; - }; }; #if 0 diff --git a/main/tests/test_image.cpp b/main/tests/test_image.cpp index aff3bae417..c2c742e75d 100644 --- a/main/tests/test_image.cpp +++ b/main/tests/test_image.cpp @@ -63,11 +63,6 @@ public: MainLoop *test() { - Image img; - ImageLoader::load_image("as1.png", &img); - - img.resize(512, 512); - return memnew(TestMainLoop); } } diff --git a/main/tests/test_physics_2d.cpp b/main/tests/test_physics_2d.cpp index 1476e45fcc..d8a00a589a 100644 --- a/main/tests/test_physics_2d.cpp +++ b/main/tests/test_physics_2d.cpp @@ -82,7 +82,7 @@ class TestPhysics2DMainLoop : public MainLoop { } } - Image image(32, 2, 0, Image::FORMAT_LA8, pixels); + Ref<Image> image = memnew(Image(32, 2, 0, Image::FORMAT_LA8, pixels)); body_shape_data[Physics2DServer::SHAPE_SEGMENT].image = vs->texture_create_from_image(image); @@ -109,7 +109,7 @@ class TestPhysics2DMainLoop : public MainLoop { } } - Image image(32, 32, 0, Image::FORMAT_LA8, pixels); + Ref<Image> image = memnew(Image(32, 32, 0, Image::FORMAT_LA8, pixels)); body_shape_data[Physics2DServer::SHAPE_CIRCLE].image = vs->texture_create_from_image(image); @@ -136,7 +136,7 @@ class TestPhysics2DMainLoop : public MainLoop { } } - Image image(32, 32, 0, Image::FORMAT_LA8, pixels); + Ref<Image> image = memnew(Image(32, 32, 0, Image::FORMAT_LA8, pixels)); body_shape_data[Physics2DServer::SHAPE_RECTANGLE].image = vs->texture_create_from_image(image); @@ -164,7 +164,7 @@ class TestPhysics2DMainLoop : public MainLoop { } } - Image image(32, 64, 0, Image::FORMAT_LA8, pixels); + Ref<Image> image = memnew(Image(32, 64, 0, Image::FORMAT_LA8, pixels)); body_shape_data[Physics2DServer::SHAPE_CAPSULE].image = vs->texture_create_from_image(image); @@ -178,7 +178,7 @@ class TestPhysics2DMainLoop : public MainLoop { { - Image image(convex_png); + Ref<Image> image = memnew(Image(convex_png)); body_shape_data[Physics2DServer::SHAPE_CONVEX_POLYGON].image = vs->texture_create_from_image(image); diff --git a/misc/dist/project_icon.svg b/misc/dist/project_icon.svg new file mode 100644 index 0000000000..650c71fd12 --- /dev/null +++ b/misc/dist/project_icon.svg @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1024" + height="1024" + id="svg3030" + version="1.1" + inkscape:version="0.92.1 r15371" + sodipodi:docname="icon_default_project_icon.svg" + inkscape:export-filename="/home/akien/Projects/godot/godot.git/icon3.png" + inkscape:export-xdpi="6" + inkscape:export-ydpi="6"> + <defs + id="defs3032" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.5" + inkscape:cx="601.35476" + inkscape:cy="346.09731" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" /> + <metadata + id="metadata3035"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-98.519719)"> + <rect + style="fill:#1e1a21;fill-opacity:1;stroke:#2e2832;stroke-width:16;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect33" + width="1008" + height="1008" + x="8" + y="106.51972" + rx="176.28572" + ry="176.28572" /> + <g + id="g82-3" + transform="matrix(4.2343801,0,0,-4.2343764,97.676491,522.86238)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 h 0.134 c 4.795,6.12 9.232,12.569 13.487,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.368,12.569 -4.928,6.12 -0.134,0 Z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path84-6" + inkscape:connector-curvature="0" /> + </g> + <g + id="g86-7" + transform="matrix(4.2343801,0,0,-4.2343764,788.7623,819.22103)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z" + style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path88-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g90-3" + transform="matrix(4.2343801,0,0,-4.2343764,387.09785,624.34645)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path92-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g94-6" + transform="matrix(4.2343801,0,0,-4.2343764,364.87318,629.82505)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path96-2" + inkscape:connector-curvature="0" /> + </g> + <g + id="g98-9" + transform="matrix(4.2343801,0,0,-4.2343764,511.99324,725.12292)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path100-1" + inkscape:connector-curvature="0" /> + </g> + <g + id="g102-2" + transform="matrix(4.2343801,0,0,-4.2343764,636.90407,624.34645)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path104-7" + inkscape:connector-curvature="0" /> + </g> + <g + id="g106-0" + transform="matrix(4.2343801,0,0,-4.2343764,659.13434,629.82505)" + style="stroke-width:0.31488276"> + <path + d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0" + style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.31488276" + id="path108-9" + inkscape:connector-curvature="0" /> + </g> + </g> +</svg> diff --git a/modules/dds/texture_loader_dds.cpp b/modules/dds/texture_loader_dds.cpp index d79b7685d1..4448c80387 100644 --- a/modules/dds/texture_loader_dds.cpp +++ b/modules/dds/texture_loader_dds.cpp @@ -441,7 +441,7 @@ RES ResourceFormatDDS::load(const String &p_path, const String &p_original_path, wb = PoolVector<uint8_t>::Write(); } - Image img(width, height, mipmaps - 1, info.format, src_data); + Ref<Image> img = memnew(Image(width, height, mipmaps - 1, info.format, src_data)); Ref<ImageTexture> texture = memnew(ImageTexture); texture->create_from_image(img); diff --git a/modules/etc1/image_etc.cpp b/modules/etc1/image_etc.cpp index 60544594f6..121f50684d 100644 --- a/modules/etc1/image_etc.cpp +++ b/modules/etc1/image_etc.cpp @@ -88,25 +88,26 @@ static void _decompress_etc(Image *p_img) { r = PoolVector<uint8_t>::Read(); //print_line("Re Creating ETC into regular image: w "+itos(p_img->get_width())+" h "+itos(p_img->get_height())+" mm "+itos(p_img->get_mipmaps())); - *p_img = Image(p_img->get_width(), p_img->get_height(), p_img->has_mipmaps(), Image::FORMAT_RGB8, dst); - if (p_img->has_mipmaps()) + bool needs_mipmaps = p_img->has_mipmaps(); + p_img->create(p_img->get_width(), p_img->get_height(), p_img->has_mipmaps(), Image::FORMAT_RGB8, dst); + if (needs_mipmaps) p_img->generate_mipmaps(); } static void _compress_etc(Image *p_img) { - Image img = *p_img; + Ref<Image> img = p_img->duplicate(); - int imgw = img.get_width(), imgh = img.get_height(); + int imgw = img->get_width(), imgh = img->get_height(); ERR_FAIL_COND(nearest_power_of_2(imgw) != imgw || nearest_power_of_2(imgh) != imgh); - if (img.get_format() != Image::FORMAT_RGB8) - img.convert(Image::FORMAT_RGB8); + if (img->get_format() != Image::FORMAT_RGB8) + img->convert(Image::FORMAT_RGB8); PoolVector<uint8_t> res_data; PoolVector<uint8_t> dst_data; - PoolVector<uint8_t>::Read r = img.get_data().read(); + PoolVector<uint8_t>::Read r = img->get_data().read(); int target_size = Image::get_image_data_size(p_img->get_width(), p_img->get_height(), Image::FORMAT_ETC, p_img->has_mipmaps() ? -1 : 0); int mmc = p_img->has_mipmaps() ? Image::get_image_required_mipmaps(p_img->get_width(), p_img->get_height(), Image::FORMAT_ETC) : 0; @@ -122,7 +123,7 @@ static void _compress_etc(Image *p_img) { int bw = MAX(imgw / 4, 1); int bh = MAX(imgh / 4, 1); - const uint8_t *src = &r[img.get_mipmap_offset(i)]; + const uint8_t *src = &r[img->get_mipmap_offset(i)]; int mmsize = MAX(bw, 1) * MAX(bh, 1) * 8; uint8_t *dst = &w[ofs]; @@ -171,7 +172,7 @@ static void _compress_etc(Image *p_img) { mc++; } - *p_img = Image(p_img->get_width(), p_img->get_height(), (mc - 1) ? true : false, Image::FORMAT_ETC, dst_data); + p_img->create(p_img->get_width(), p_img->get_height(), (mc - 1) ? true : false, Image::FORMAT_ETC, dst_data); } void _register_etc1_compress_func() { diff --git a/modules/etc1/texture_loader_pkm.cpp b/modules/etc1/texture_loader_pkm.cpp index 9817de3a0f..c04528d2a0 100644 --- a/modules/etc1/texture_loader_pkm.cpp +++ b/modules/etc1/texture_loader_pkm.cpp @@ -85,7 +85,7 @@ RES ResourceFormatPKM::load(const String &p_path, const String &p_original_path, int width = h.origWidth; int height = h.origHeight; - Image img(width, height, mipmaps, Image::FORMAT_ETC, src_data); + Ref<Image> img = memnew(Image(width, height, mipmaps, Image::FORMAT_ETC, src_data)); Ref<ImageTexture> texture = memnew(ImageTexture); texture->create_from_image(img); diff --git a/modules/gdnative/config.py b/modules/gdnative/config.py index 9f57b9bb74..4f89ca0d4c 100644 --- a/modules/gdnative/config.py +++ b/modules/gdnative/config.py @@ -1,7 +1,7 @@ def can_build(platform): - return True + return False def configure(env): diff --git a/modules/gdnative/gdnative.cpp b/modules/gdnative/gdnative.cpp index 09859d95bd..9c8625c1e0 100644 --- a/modules/gdnative/gdnative.cpp +++ b/modules/gdnative/gdnative.cpp @@ -99,15 +99,15 @@ Error NativeLibrary::terminate(NativeLibrary *&p_native_lib) { Error error = OK; void *library_terminate; error = OS::get_singleton()->get_dynamic_library_symbol_handle(p_native_lib->handle, GDNativeScriptLanguage::get_terminate_symbol_name(), library_terminate); - if (error) - return OK; // no terminate? okay, not that important lol + if (!error) { - void (*library_terminate_pointer)(godot_native_terminate_options *) = (void (*)(godot_native_terminate_options *))library_terminate; + void (*library_terminate_pointer)(godot_native_terminate_options *) = (void (*)(godot_native_terminate_options *))library_terminate; - godot_native_terminate_options options; - options.in_editor = SceneTree::get_singleton()->is_editor_hint(); + godot_native_terminate_options options; + options.in_editor = SceneTree::get_singleton()->is_editor_hint(); - library_terminate_pointer(&options); + library_terminate_pointer(&options); + } GDNativeScriptLanguage::get_singleton()->initialized_libraries.erase(p_native_lib->path); @@ -515,7 +515,6 @@ static const char *_dl_platforms_info[] = { "unix|x11|so|X11", "unix|server|so|Server", "unix|android|so|Android", - "unix|blackberry|so|Blackberry 10", "unix|haiku|so|Haiku", // Right? "|mac|dynlib|Mac", "mac|ios|dynlib|iOS", @@ -615,7 +614,6 @@ Error GDNativeLibrary::_terminate() { } Error ret = NativeLibrary::terminate(native_library); - native_library->scripts.clear(); return ret; @@ -1218,6 +1216,7 @@ void GDNativeReloadNode::_notification(int p_what) { Set<GDNativeScript *> scripts; for (Set<GDNativeScript *>::Element *S = GDNativeScriptLanguage::get_singleton()->script_list.front(); S; S = S->next()) { + if (lib->native_library->scripts.has(S->get()->get_script_name())) { GDNativeScript *script = S->get(); script->script_data = lib->get_script_data(script->get_script_name()); diff --git a/modules/gdnative/godot.cpp b/modules/gdnative/godot.cpp index 7477a28db6..bc53eb93f4 100644 --- a/modules/gdnative/godot.cpp +++ b/modules/gdnative/godot.cpp @@ -30,6 +30,7 @@ #include "godot.h" #include "class_db.h" +#include "error_macros.h" #include "gdnative.h" #include "global_config.h" #include "global_constants.h" @@ -115,6 +116,28 @@ void GDAPI godot_method_bind_ptrcall(godot_method_bind *p_method_bind, godot_obj mb->ptrcall(o, p_args, p_ret); } +godot_variant GDAPI godot_method_bind_call(godot_method_bind *p_method_bind, godot_object *p_instance, const godot_variant **p_args, const int p_arg_count, godot_variant_call_error *p_call_error) { + MethodBind *mb = (MethodBind *)p_method_bind; + Object *o = (Object *)p_instance; + const Variant **args = (const Variant **)p_args; + + godot_variant ret; + godot_variant_new_nil(&ret); + + Variant *ret_val = (Variant *)&ret; + + Variant::CallError r_error; + *ret_val = mb->call(o, args, p_arg_count, r_error); + + if (p_call_error) { + p_call_error->error = (godot_variant_call_error_error)r_error.error; + p_call_error->argument = r_error.argument; + p_call_error->expected = (godot_variant_type)r_error.expected; + } + + return ret; +} + // @Todo /* void GDAPI godot_method_bind_varcall(godot_method_bind *p_method_bind) @@ -215,6 +238,18 @@ void GDAPI godot_free(void *p_ptr) { memfree(p_ptr); } +void GDAPI godot_print_error(const char *p_description, const char *p_function, const char *p_file, int p_line) { + _err_print_error(p_function, p_file, p_line, p_description, ERR_HANDLER_ERROR); +} + +void GDAPI godot_print_warning(const char *p_description, const char *p_function, const char *p_file, int p_line) { + _err_print_error(p_function, p_file, p_line, p_description, ERR_HANDLER_WARNING); +} + +void GDAPI godot_print(const godot_string *p_message) { + print_line(*(String *)p_message); +} + #ifdef __cplusplus } #endif diff --git a/modules/gdnative/godot.h b/modules/gdnative/godot.h index b05cafbe50..7214ce62df 100644 --- a/modules/gdnative/godot.h +++ b/modules/gdnative/godot.h @@ -228,7 +228,7 @@ typedef struct godot_method_bind { godot_method_bind GDAPI *godot_method_bind_get_method(const char *p_classname, const char *p_methodname); void GDAPI godot_method_bind_ptrcall(godot_method_bind *p_method_bind, godot_object *p_instance, const void **p_args, void *p_ret); - +godot_variant GDAPI godot_method_bind_call(godot_method_bind *p_method_bind, godot_object *p_instance, const godot_variant **p_args, const int p_arg_count, godot_variant_call_error *p_call_error); ////// Script API typedef struct godot_native_init_options { @@ -404,6 +404,11 @@ void GDAPI *godot_alloc(int p_bytes); void GDAPI *godot_realloc(void *p_ptr, int p_bytes); void GDAPI godot_free(void *p_ptr); +//print using Godot's error handler list +void GDAPI godot_print_error(const char *p_description, const char *p_function, const char *p_file, int p_line); +void GDAPI godot_print_warning(const char *p_description, const char *p_function, const char *p_file, int p_line); +void GDAPI godot_print(const godot_string *p_message); + #ifdef __cplusplus } #endif diff --git a/modules/gdnative/godot/godot_variant.cpp b/modules/gdnative/godot/godot_variant.cpp index 2214f85056..e9fa4eb8c6 100644 --- a/modules/gdnative/godot/godot_variant.cpp +++ b/modules/gdnative/godot/godot_variant.cpp @@ -457,12 +457,22 @@ godot_pool_color_array GDAPI godot_variant_as_pool_color_array(const godot_varia return pba; } -godot_variant GDAPI godot_variant_call(godot_variant *p_v, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount /*, godot_variant_call_error *r_error */) { +godot_variant GDAPI godot_variant_call(godot_variant *p_v, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount, godot_variant_call_error *p_error) { Variant *v = (Variant *)p_v; String *method = (String *)p_method; - Variant **args = (Variant **)p_args; + const Variant **args = (const Variant **)p_args; godot_variant res; - memnew_placement_custom((Variant *)&res, Variant, Variant(v->call(*method, args, p_argcount))); + godot_variant_new_nil(&res); + + Variant *ret_val = (Variant *)&res; + + Variant::CallError r_error; + *ret_val = v->call(StringName(*method), args, p_argcount, r_error); + if (p_error) { + p_error->error = (godot_variant_call_error_error)r_error.error; + p_error->argument = r_error.argument; + p_error->expected = (godot_variant_type)r_error.expected; + } return res; } diff --git a/modules/gdnative/godot/godot_variant.h b/modules/gdnative/godot/godot_variant.h index 6f98b32363..bf0e2bf64e 100644 --- a/modules/gdnative/godot/godot_variant.h +++ b/modules/gdnative/godot/godot_variant.h @@ -45,13 +45,6 @@ typedef struct godot_variant { struct godot_transform2d; typedef struct godot_transform2d godot_transform2d; -#include "godot_array.h" -#include "godot_dictionary.h" -#include "godot_input_event.h" -#include "godot_node_path.h" -#include "godot_rid.h" -#include "godot_transform2d.h" - typedef enum godot_variant_type { GODOT_VARIANT_TYPE_NIL, @@ -69,7 +62,7 @@ typedef enum godot_variant_type { GODOT_VARIANT_TYPE_TRANSFORM2D, GODOT_VARIANT_TYPE_PLANE, GODOT_VARIANT_TYPE_QUAT, // 10 - GODOT_VARIANT_TYPE_RECT3, //sorry naming convention fail :( not like it's used often + GODOT_VARIANT_TYPE_RECT3, GODOT_VARIANT_TYPE_BASIS, GODOT_VARIANT_TYPE_TRANSFORM, @@ -93,6 +86,28 @@ typedef enum godot_variant_type { GODOT_VARIANT_TYPE_POOL_COLOR_ARRAY, } godot_variant_type; +typedef enum godot_variant_call_error_error { + GODOT_CALL_ERROR_CALL_OK, + GODOT_CALL_ERROR_CALL_ERROR_INVALID_METHOD, + GODOT_CALL_ERROR_CALL_ERROR_INVALID_ARGUMENT, + GODOT_CALL_ERROR_CALL_ERROR_TOO_MANY_ARGUMENTS, + GODOT_CALL_ERROR_CALL_ERROR_TOO_FEW_ARGUMENTS, + GODOT_CALL_ERROR_CALL_ERROR_INSTANCE_IS_NULL, +} godot_variant_call_error_error; + +typedef struct godot_variant_call_error { + godot_variant_call_error_error error; + int argument; + godot_variant_type expected; +} godot_variant_call_error; + +#include "godot_array.h" +#include "godot_dictionary.h" +#include "godot_input_event.h" +#include "godot_node_path.h" +#include "godot_rid.h" +#include "godot_transform2d.h" + godot_variant_type GDAPI godot_variant_get_type(const godot_variant *p_v); void GDAPI godot_variant_copy(godot_variant *p_dest, const godot_variant *p_src); @@ -159,7 +174,7 @@ godot_pool_vector2_array GDAPI godot_variant_as_pool_vector2_array(const godot_v godot_pool_vector3_array GDAPI godot_variant_as_pool_vector3_array(const godot_variant *p_v); godot_pool_color_array GDAPI godot_variant_as_pool_color_array(const godot_variant *p_v); -godot_variant GDAPI godot_variant_call(godot_variant *p_v, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount /*, godot_variant_call_error *r_error */); +godot_variant GDAPI godot_variant_call(godot_variant *p_v, const godot_string *p_method, const godot_variant **p_args, const godot_int p_argcount, godot_variant_call_error *p_error); godot_bool GDAPI godot_variant_has_method(godot_variant *p_v, const godot_string *p_method); diff --git a/modules/gdscript/gd_editor.cpp b/modules/gdscript/gd_editor.cpp index 4667e541dd..7d5ba08d6c 100644 --- a/modules/gdscript/gd_editor.cpp +++ b/modules/gdscript/gd_editor.cpp @@ -1321,7 +1321,7 @@ static void _find_identifiers(GDCompletionContext &context, int p_line, bool p_o static const char *_type_names[Variant::VARIANT_MAX] = { "null", "bool", "int", "float", "String", "Vector2", "Rect2", "Vector3", "Transform2D", "Plane", "Quat", "AABB", "Basis", "Transform", - "Color", "Image", "NodePath", "RID", "Object", "InputEvent", "Dictionary", "Array", "RawArray", "IntArray", "FloatArray", "StringArray", + "Color", "NodePath", "RID", "Object", "InputEvent", "Dictionary", "Array", "RawArray", "IntArray", "FloatArray", "StringArray", "Vector2Array", "Vector3Array", "ColorArray" }; @@ -2395,7 +2395,7 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_base } } break; - case GDParser::COMPLETION_PRELOAD: { + case GDParser::COMPLETION_RESOURCE_PATH: { if (EditorSettings::get_singleton()->get("text_editor/completion/complete_file_paths")) get_directory_contents(EditorFileSystem::get_singleton()->get_filesystem(), options); diff --git a/modules/gdscript/gd_function.cpp b/modules/gdscript/gd_function.cpp index 608256c88a..fb32d23ad5 100644 --- a/modules/gdscript/gd_function.cpp +++ b/modules/gdscript/gd_function.cpp @@ -1433,9 +1433,21 @@ Variant GDFunctionState::_signal_callback(const Variant **p_args, int p_argcount return ret; } -bool GDFunctionState::is_valid() const { +bool GDFunctionState::is_valid(bool p_extended_check) const { + + if (function == NULL) + return false; + + if (p_extended_check) { + //class instance gone? + if (state.instance_id && !ObjectDB::get_instance(state.instance_id)) + return false; + //script gone? + if (state.script_id && !ObjectDB::get_instance(state.script_id)) + return false; + } - return function != NULL; + return true; } Variant GDFunctionState::resume(const Variant &p_arg) { @@ -1464,7 +1476,7 @@ Variant GDFunctionState::resume(const Variant &p_arg) { void GDFunctionState::_bind_methods() { ClassDB::bind_method(D_METHOD("resume:Variant", "arg"), &GDFunctionState::resume, DEFVAL(Variant())); - ClassDB::bind_method(D_METHOD("is_valid"), &GDFunctionState::is_valid); + ClassDB::bind_method(D_METHOD("is_valid", "extended_check"), &GDFunctionState::is_valid, DEFVAL(false)); ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "_signal_callback", &GDFunctionState::_signal_callback, MethodInfo("_signal_callback")); } diff --git a/modules/gdscript/gd_function.h b/modules/gdscript/gd_function.h index f0bf33147b..6d20b19777 100644 --- a/modules/gdscript/gd_function.h +++ b/modules/gdscript/gd_function.h @@ -237,7 +237,7 @@ protected: static void _bind_methods(); public: - bool is_valid() const; + bool is_valid(bool p_extended_check = false) const; Variant resume(const Variant &p_arg = Variant()); GDFunctionState(); ~GDFunctionState(); diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp index b02d7f713b..4ae62eb1d0 100644 --- a/modules/gdscript/gd_parser.cpp +++ b/modules/gdscript/gd_parser.cpp @@ -387,15 +387,21 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool _set_error("Expected '(' after 'preload'"); return NULL; } - completion_cursor = StringName(); - completion_type = COMPLETION_PRELOAD; - completion_class = current_class; - completion_function = current_function; - completion_line = tokenizer->get_token_line(); - completion_block = current_block; - completion_found = true; tokenizer->advance(); + if (tokenizer->get_token() == GDTokenizer::TK_CURSOR) { + completion_cursor = StringName(); + completion_node = p_parent; + completion_type = COMPLETION_RESOURCE_PATH; + completion_class = current_class; + completion_function = current_function; + completion_line = tokenizer->get_token_line(); + completion_block = current_block; + completion_argument = 0; + completion_found = true; + tokenizer->advance(); + } + String path; bool found_constant = false; bool valid = false; @@ -467,10 +473,10 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool _set_error("Expected ')' after 'preload' path"); return NULL; } + tokenizer->advance(); ConstantNode *constant = alloc_node<ConstantNode>(); constant->value = res; - tokenizer->advance(); expr = constant; } else if (tokenizer->get_token() == GDTokenizer::TK_PR_YIELD) { diff --git a/modules/gdscript/gd_parser.h b/modules/gdscript/gd_parser.h index 4f3ca0dc5f..7e7e19de1b 100644 --- a/modules/gdscript/gd_parser.h +++ b/modules/gdscript/gd_parser.h @@ -437,7 +437,7 @@ public: COMPLETION_PARENT_FUNCTION, COMPLETION_METHOD, COMPLETION_CALL_ARGUMENTS, - COMPLETION_PRELOAD, + COMPLETION_RESOURCE_PATH, COMPLETION_INDEX, COMPLETION_VIRTUAL_FUNC, COMPLETION_YIELD, diff --git a/modules/gdscript/gd_tokenizer.cpp b/modules/gdscript/gd_tokenizer.cpp index 13674f1f9a..c26ba03a64 100644 --- a/modules/gdscript/gd_tokenizer.cpp +++ b/modules/gdscript/gd_tokenizer.cpp @@ -800,7 +800,6 @@ void GDTokenizerText::_advance() { { Variant::BASIS, "Basis" }, { Variant::TRANSFORM, "Transform" }, { Variant::COLOR, "Color" }, - { Variant::IMAGE, "Image" }, { Variant::_RID, "RID" }, { Variant::OBJECT, "Object" }, { Variant::INPUT_EVENT, "InputEvent" }, diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp index 39fe0a1675..d8993710a4 100644 --- a/modules/gridmap/grid_map_editor_plugin.cpp +++ b/modules/gridmap/grid_map_editor_plugin.cpp @@ -519,12 +519,12 @@ bool GridMapEditor::forward_spatial_input_event(Camera *p_camera, const InputEve if (p_event.mouse_button.button_index == BUTTON_WHEEL_UP && (p_event.mouse_button.mod.command || p_event.mouse_button.mod.shift)) { if (p_event.mouse_button.pressed) - floor->set_value(floor->get_value() + 1); + floor->set_value(floor->get_value() + p_event.mouse_button.factor); return true; //eaten } else if (p_event.mouse_button.button_index == BUTTON_WHEEL_DOWN && (p_event.mouse_button.mod.command || p_event.mouse_button.mod.shift)) { if (p_event.mouse_button.pressed) - floor->set_value(floor->get_value() - 1); + floor->set_value(floor->get_value() - p_event.mouse_button.factor); return true; } diff --git a/modules/jpg/image_loader_jpegd.cpp b/modules/jpg/image_loader_jpegd.cpp index 83685d6446..0741dd198a 100644 --- a/modules/jpg/image_loader_jpegd.cpp +++ b/modules/jpg/image_loader_jpegd.cpp @@ -89,7 +89,7 @@ Error jpeg_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p return OK; } -Error ImageLoaderJPG::load_image(Image *p_image, FileAccess *f) { +Error ImageLoaderJPG::load_image(Ref<Image> p_image, FileAccess *f) { PoolVector<uint8_t> src_image; int src_image_len = f->get_len(); @@ -102,7 +102,7 @@ Error ImageLoaderJPG::load_image(Image *p_image, FileAccess *f) { f->close(); - Error err = jpeg_load_image_from_buffer(p_image, w.ptr(), src_image_len); + Error err = jpeg_load_image_from_buffer(p_image.ptr(), w.ptr(), src_image_len); w = PoolVector<uint8_t>::Write(); @@ -115,10 +115,11 @@ void ImageLoaderJPG::get_recognized_extensions(List<String> *p_extensions) const p_extensions->push_back("jpeg"); } -static Image _jpegd_mem_loader_func(const uint8_t *p_png, int p_size) { +static Ref<Image> _jpegd_mem_loader_func(const uint8_t *p_png, int p_size) { - Image img; - Error err = jpeg_load_image_from_buffer(&img, p_png, p_size); + Ref<Image> img; + img.instance(); + Error err = jpeg_load_image_from_buffer(img.ptr(), p_png, p_size); if (err) ERR_PRINT("Couldn't initialize ImageLoaderJPG with the given resource."); diff --git a/modules/jpg/image_loader_jpegd.h b/modules/jpg/image_loader_jpegd.h index d23e8a7d48..57d7a2bb1c 100644 --- a/modules/jpg/image_loader_jpegd.h +++ b/modules/jpg/image_loader_jpegd.h @@ -38,7 +38,7 @@ class ImageLoaderJPG : public ImageFormatLoader { public: - virtual Error load_image(Image *p_image, FileAccess *f); + virtual Error load_image(Ref<Image> p_image, FileAccess *f); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderJPG(); }; diff --git a/modules/multiscript/SCsub b/modules/multiscript/SCsub deleted file mode 100644 index 0882406761..0000000000 --- a/modules/multiscript/SCsub +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python - -Import('env') - -env.add_source_files(env.modules_sources, "*.cpp") - -Export('env') diff --git a/modules/multiscript/config.py b/modules/multiscript/config.py deleted file mode 100644 index 5698a37295..0000000000 --- a/modules/multiscript/config.py +++ /dev/null @@ -1,8 +0,0 @@ - - -def can_build(platform): - return True - - -def configure(env): - pass diff --git a/modules/multiscript/multiscript.cpp b/modules/multiscript/multiscript.cpp deleted file mode 100644 index b2633b7207..0000000000 --- a/modules/multiscript/multiscript.cpp +++ /dev/null @@ -1,750 +0,0 @@ -/*************************************************************************/ -/* multiscript.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "multiscript.h" - -bool MultiScriptInstance::set(const StringName &p_name, const Variant &p_value) { - - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - bool found = sarr[i]->set(p_name, p_value); - if (found) - return true; - } - - if (String(p_name).begins_with("script_")) { - bool valid; - owner->set(p_name, p_value, &valid); - return valid; - } - return false; -} - -bool MultiScriptInstance::get(const StringName &p_name, Variant &r_ret) const { - - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - bool found = sarr[i]->get(p_name, r_ret); - if (found) - return true; - } - if (String(p_name).begins_with("script_")) { - bool valid; - r_ret = owner->get(p_name, &valid); - return valid; - } - return false; -} -void MultiScriptInstance::get_property_list(List<PropertyInfo> *p_properties) const { - - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - Set<String> existing; - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - List<PropertyInfo> pl; - sarr[i]->get_property_list(&pl); - - for (List<PropertyInfo>::Element *E = pl.front(); E; E = E->next()) { - - if (existing.has(E->get().name)) - continue; - - p_properties->push_back(E->get()); - existing.insert(E->get().name); - } - } - - p_properties->push_back(PropertyInfo(Variant::NIL, "Scripts", PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); - - for (int i = 0; i < owner->scripts.size(); i++) { - - p_properties->push_back(PropertyInfo(Variant::OBJECT, "script_" + String::chr('a' + i), PROPERTY_HINT_RESOURCE_TYPE, "Script", PROPERTY_USAGE_EDITOR)); - } - - if (owner->scripts.size() < 25) { - - p_properties->push_back(PropertyInfo(Variant::OBJECT, "script_" + String::chr('a' + (owner->scripts.size())), PROPERTY_HINT_RESOURCE_TYPE, "Script", PROPERTY_USAGE_EDITOR)); - } -} - -void MultiScriptInstance::get_method_list(List<MethodInfo> *p_list) const { - - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - Set<StringName> existing; - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - List<MethodInfo> ml; - sarr[i]->get_method_list(&ml); - - for (List<MethodInfo>::Element *E = ml.front(); E; E = E->next()) { - - if (existing.has(E->get().name)) - continue; - - p_list->push_back(E->get()); - existing.insert(E->get().name); - } - } -} -bool MultiScriptInstance::has_method(const StringName &p_method) const { - - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - if (sarr[i]->has_method(p_method)) - return true; - } - - return false; -} - -Variant MultiScriptInstance::call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) { - - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - Variant r = sarr[i]->call(p_method, p_args, p_argcount, r_error); - if (r_error.error == Variant::CallError::CALL_OK) - return r; - else if (r_error.error != Variant::CallError::CALL_ERROR_INVALID_METHOD) - return r; - } - - r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; - return Variant(); -} - -void MultiScriptInstance::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) { - - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - sarr[i]->call_multilevel(p_method, p_args, p_argcount); - } -} -void MultiScriptInstance::notification(int p_notification) { - - // ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - ScriptInstance *instance = instances[i]; - - if (!instance) - continue; - - instance->notification(p_notification); - } -} - -Ref<Script> MultiScriptInstance::get_script() const { - - return owner; -} - -ScriptLanguage *MultiScriptInstance::get_language() { - - return MultiScriptLanguage::get_singleton(); -} - -MultiScriptInstance::~MultiScriptInstance() { - - owner->remove_instance(object); -} - -Variant::Type MultiScriptInstance::get_property_type(const StringName &p_name, bool *r_is_valid) const { - bool valid = false; - Variant::Type type; - - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - type = sarr[i]->get_property_type(p_name, &valid); - if (valid) { - *r_is_valid = valid; - return type; - } - } - *r_is_valid = false; - return Variant::NIL; -} - -ScriptInstance::RPCMode MultiScriptInstance::get_rpc_mode(const StringName &p_method) const { - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - if (sarr[i]->has_method(p_method)) - return sarr[i]->get_rpc_mode(p_method); - } - return RPC_MODE_DISABLED; -} - -ScriptInstance::RPCMode MultiScriptInstance::get_rset_mode(const StringName &p_variable) const { - ScriptInstance **sarr = instances.ptr(); - int sc = instances.size(); - - for (int i = 0; i < sc; i++) { - - if (!sarr[i]) - continue; - - List<PropertyInfo> properties; - sarr[i]->get_property_list(&properties); - - for (List<PropertyInfo>::Element *P = properties.front(); P; P = P->next()) { - if (P->get().name == p_variable) { - return sarr[i]->get_rset_mode(p_variable); - } - } - } - return RPC_MODE_DISABLED; -} - -/////////////////// - -bool MultiScript::is_tool() const { - - for (int i = 0; i < scripts.size(); i++) { - - if (scripts[i]->is_tool()) - return true; - } - - return false; -} - -bool MultiScript::_set(const StringName &p_name, const Variant &p_value) { - - _THREAD_SAFE_METHOD_ - - String s = String(p_name); - if (s.begins_with("script_")) { - - int idx = s[7]; - if (idx == 0) - return false; - idx -= 'a'; - - ERR_FAIL_COND_V(idx < 0, false); - - Ref<Script> s = p_value; - - if (idx < scripts.size()) { - - if (s.is_null()) - remove_script(idx); - else - set_script(idx, s); - } else if (idx == scripts.size()) { - if (s.is_null()) - return false; - add_script(s); - } else - return false; - - return true; - } - - return false; -} - -bool MultiScript::_get(const StringName &p_name, Variant &r_ret) const { - - _THREAD_SAFE_METHOD_ - - String s = String(p_name); - if (s.begins_with("script_")) { - - int idx = s[7]; - if (idx == 0) - return false; - idx -= 'a'; - - ERR_FAIL_COND_V(idx < 0, false); - - if (idx < scripts.size()) { - - r_ret = get_script(idx); - return true; - } else if (idx == scripts.size()) { - r_ret = Ref<Script>(); - return true; - } - } - - return false; -} -void MultiScript::_get_property_list(List<PropertyInfo> *p_list) const { - - _THREAD_SAFE_METHOD_ - - for (int i = 0; i < scripts.size(); i++) { - - p_list->push_back(PropertyInfo(Variant::OBJECT, "script_" + String::chr('a' + i), PROPERTY_HINT_RESOURCE_TYPE, "Script")); - } - - if (scripts.size() < 25) { - - p_list->push_back(PropertyInfo(Variant::OBJECT, "script_" + String::chr('a' + (scripts.size())), PROPERTY_HINT_RESOURCE_TYPE, "Script")); - } -} - -void MultiScript::set_script(int p_idx, const Ref<Script> &p_script) { - - _THREAD_SAFE_METHOD_ - - ERR_FAIL_INDEX(p_idx, scripts.size()); - ERR_FAIL_COND(p_script.is_null()); - - scripts[p_idx] = p_script; - Ref<Script> s = p_script; - - for (Map<Object *, MultiScriptInstance *>::Element *E = instances.front(); E; E = E->next()) { - - MultiScriptInstance *msi = E->get(); - ScriptInstance *si = msi->instances[p_idx]; - if (si) { - msi->instances[p_idx] = NULL; - memdelete(si); - } - - if (p_script->can_instance()) - msi->instances[p_idx] = s->instance_create(msi->object); - } -} - -Ref<Script> MultiScript::get_script(int p_idx) const { - - _THREAD_SAFE_METHOD_ - - ERR_FAIL_INDEX_V(p_idx, scripts.size(), Ref<Script>()); - - return scripts[p_idx]; -} -void MultiScript::add_script(const Ref<Script> &p_script) { - - _THREAD_SAFE_METHOD_ - ERR_FAIL_COND(p_script.is_null()); - Multi *script_owner = memnew(Multi); - script_instances.push_back(script_owner); - scripts.push_back(p_script); - Ref<Script> s = p_script; - - for (Map<Object *, MultiScriptInstance *>::Element *E = instances.front(); E; E = E->next()) { - - MultiScriptInstance *msi = E->get(); - - if (p_script->can_instance()) { - script_owner->real_owner = msi->object; - msi->instances.push_back(s->instance_create(script_owner)); - } else { - msi->instances.push_back(NULL); - } - - msi->object->_change_notify(); - } - - _change_notify(); -} - -void MultiScript::remove_script(int p_idx) { - - _THREAD_SAFE_METHOD_ - - ERR_FAIL_INDEX(p_idx, scripts.size()); - - scripts.remove(p_idx); - script_instances.remove(p_idx); - - for (Map<Object *, MultiScriptInstance *>::Element *E = instances.front(); E; E = E->next()) { - - MultiScriptInstance *msi = E->get(); - ScriptInstance *si = msi->instances[p_idx]; - msi->instances.remove(p_idx); - if (si) { - memdelete(si); - } - - msi->object->_change_notify(); - } -} - -void MultiScript::remove_instance(Object *p_object) { - - _THREAD_SAFE_METHOD_ - instances.erase(p_object); -} - -bool MultiScript::can_instance() const { - - return true; -} - -StringName MultiScript::get_instance_base_type() const { - - return StringName(); -} -ScriptInstance *MultiScript::instance_create(Object *p_this) { - - _THREAD_SAFE_METHOD_ - MultiScriptInstance *msi = memnew(MultiScriptInstance); - msi->object = p_this; - msi->owner = this; - - for (int i = 0; i < scripts.size(); i++) { - - ScriptInstance *si; - - if (scripts[i]->can_instance()) { - script_instances[i]->real_owner = p_this; - si = scripts[i]->instance_create(script_instances[i]); - } else { - si = NULL; - } - - msi->instances.push_back(si); - } - - instances[p_this] = msi; - p_this->_change_notify(); - return msi; -} -bool MultiScript::instance_has(const Object *p_this) const { - - _THREAD_SAFE_METHOD_ - return instances.has((Object *)p_this); -} - -bool MultiScript::has_source_code() const { - - return false; -} -String MultiScript::get_source_code() const { - - return ""; -} -void MultiScript::set_source_code(const String &p_code) { -} -Error MultiScript::reload(bool p_keep_state) { - - for (int i = 0; i < scripts.size(); i++) - scripts[i]->reload(p_keep_state); - - return OK; -} - -String MultiScript::get_node_type() const { - - return ""; -} - -void MultiScript::_bind_methods() { -} - -ScriptLanguage *MultiScript::get_language() const { - - return MultiScriptLanguage::get_singleton(); -} - -/////////////// - -MultiScript::MultiScript() { -} - -MultiScript::~MultiScript() { - for (int i = 0; i < script_instances.size(); i++) { - memdelete(script_instances[i]); - } - - script_instances.resize(0); -} - -Ref<Script> MultiScript::get_base_script() const { - Ref<MultiScript> base_script; - return base_script; -} - -bool MultiScript::has_method(const StringName &p_method) const { - for (int i = 0; i < scripts.size(); i++) { - if (scripts[i]->has_method(p_method)) { - return true; - } - } - return false; -} - -MethodInfo MultiScript::get_method_info(const StringName &p_method) const { - for (int i = 0; i < scripts.size(); i++) { - if (scripts[i]->has_method(p_method)) { - return scripts[i]->get_method_info(p_method); - } - } - return MethodInfo(); -} - -bool MultiScript::has_script_signal(const StringName &p_signal) const { - for (int i = 0; i < scripts.size(); i++) { - if (scripts[i]->has_script_signal(p_signal)) { - return true; - } - } - return false; -} - -void MultiScript::get_script_signal_list(List<MethodInfo> *r_signals) const { - for (int i = 0; i < scripts.size(); i++) { - scripts[i]->get_script_signal_list(r_signals); - } -} - -bool MultiScript::get_property_default_value(const StringName &p_property, Variant &r_value) const { - for (int i = 0; i < scripts.size(); i++) { - - if (scripts[i]->get_property_default_value(p_property, r_value)) { - return true; - } - } - return false; -} - -void MultiScript::get_script_method_list(List<MethodInfo> *p_list) const { - for (int i = 0; i < scripts.size(); i++) { - scripts[i]->get_script_method_list(p_list); - } -} - -void MultiScript::get_script_property_list(List<PropertyInfo> *p_list) const { - for (int i = 0; i < scripts.size(); i++) { - scripts[i]->get_script_property_list(p_list); - } -} - -void MultiScript::update_exports() { - for (int i = 0; i < scripts.size(); i++) { - scripts[i]->update_exports(); - } -} - -MultiScriptLanguage *MultiScriptLanguage::singleton = NULL; - -MultiScriptLanguage *MultiScriptLanguage::get_singleton() { - return singleton; -} - -String MultiScriptLanguage::get_name() const { - return "MultiScript"; -} - -void MultiScriptLanguage::init() {} - -String MultiScriptLanguage::get_type() const { - return "MultiScript"; -} - -String MultiScriptLanguage::get_extension() const { - return ""; -} - -Error MultiScriptLanguage::execute_file(const String &p_path) { - return OK; -} - -void MultiScriptLanguage::finish() {} - -void MultiScriptLanguage::get_reserved_words(List<String> *p_words) const {} - -void MultiScriptLanguage::get_comment_delimiters(List<String> *p_delimiters) const {} - -void MultiScriptLanguage::get_string_delimiters(List<String> *p_delimiters) const {} - -Ref<Script> MultiScriptLanguage::get_template(const String &p_class_name, const String &p_base_class_name) const { - MultiScript *s = memnew(MultiScript); - s->base_class_name = p_base_class_name; - return Ref<MultiScript>(s); -} - -bool MultiScriptLanguage::validate(const String &p_script, int &r_line_error, int &r_col_error, String &r_test_error, const String &p_path, List<String> *r_fn) const { - return true; -} - -Script *MultiScriptLanguage::create_script() const { - return memnew(MultiScript); -} - -bool MultiScriptLanguage::has_named_classes() const { - return false; -} - -int MultiScriptLanguage::find_function(const String &p_function, const String &p_code) const { - return -1; -} - -String MultiScriptLanguage::make_function(const String &p_class, const String &p_name, const PoolStringArray &p_args) const { - return ""; -} - -String MultiScriptLanguage::debug_get_error() const { - return ""; -} - -int MultiScriptLanguage::debug_get_stack_level_count() const { - return 0; -} - -int MultiScriptLanguage::debug_get_stack_level_line(int p_level) const { - return 0; -} - -String MultiScriptLanguage::debug_get_stack_level_function(int p_level) const { - return ""; -} - -String MultiScriptLanguage::debug_get_stack_level_source(int p_level) const { - return ""; -} - -void MultiScriptLanguage::debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {} - -void MultiScriptLanguage::debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {} - -void MultiScriptLanguage::debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {} - -String MultiScriptLanguage::debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems, int p_max_depth) { - return ""; -} - -void MultiScriptLanguage::get_recognized_extensions(List<String> *p_extensions) const {} - -void MultiScriptLanguage::get_public_functions(List<MethodInfo> *p_functions) const {} - -MultiScriptLanguage::MultiScriptLanguage() { - singleton = this; -} - -MultiScriptLanguage::~MultiScriptLanguage() {} - -void MultiScriptLanguage::auto_indent_code(String &p_code, int p_from_line, int p_to_line) const { -} - -void MultiScriptLanguage::add_global_constant(const StringName &p_variable, const Variant &p_value) { -} - -void MultiScriptLanguage::reload_all_scripts() { -} - -void MultiScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload) { -} - -void MultiScriptLanguage::get_public_constants(List<Pair<String, Variant> > *p_constants) const { -} - -void MultiScriptLanguage::profiling_start() { -} - -void MultiScriptLanguage::profiling_stop() { -} - -int MultiScriptLanguage::profiling_get_accumulated_data(ScriptLanguage::ProfilingInfo *p_info_arr, int p_info_max) { - return 0; -} - -int MultiScriptLanguage::profiling_get_frame_data(ScriptLanguage::ProfilingInfo *p_info_arr, int p_info_max) { - return 0; -} - -void Multi::_bind_methods() { - // ClassDB::bind_method("call", &Multi::call); - // ClassDB::bind_method("call_multilevel", &Multi::call_multilevel); - // ClassDB::bind_method("call_multilevel_reversed", &Multi::call_multilevel_reversed); -} - -Variant Multi::call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) { - if (real_owner) - return real_owner->call(p_method, p_args, p_argcount, r_error); - return Variant(); -} - -void Multi::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) { - if (real_owner) - real_owner->call_multilevel(p_method, p_args, p_argcount); -} - -void Multi::call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) { - if (real_owner) - real_owner->call_multilevel_reversed(p_method, p_args, p_argcount); -} diff --git a/modules/multiscript/multiscript.h b/modules/multiscript/multiscript.h deleted file mode 100644 index 7ec1d5402f..0000000000 --- a/modules/multiscript/multiscript.h +++ /dev/null @@ -1,200 +0,0 @@ -/*************************************************************************/ -/* multiscript.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef MULTISCRIPT_H -#define MULTISCRIPT_H - -#include "os/thread_safe.h" -#include "script_language.h" - -class MultiScript; - -class Multi : public Object { - GDCLASS(Multi, Object) - - friend class MultiScript; - - Object *real_owner; - -public: - static void _bind_methods(); - - virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error); - virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount); - virtual void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount); -}; - -class MultiScriptInstance : public ScriptInstance { - friend class MultiScript; - mutable Vector<ScriptInstance *> instances; - Object *object; - mutable MultiScript *owner; - -public: - virtual bool set(const StringName &p_name, const Variant &p_value); - virtual bool get(const StringName &p_name, Variant &r_ret) const; - virtual void get_property_list(List<PropertyInfo> *p_properties) const; - - virtual void get_method_list(List<MethodInfo> *p_list) const; - virtual bool has_method(const StringName &p_method) const; - virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error); - virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount); - virtual void notification(int p_notification); - - virtual Ref<Script> get_script() const; - - virtual ScriptLanguage *get_language(); - virtual ~MultiScriptInstance(); - - // ScriptInstance interface -public: - Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid) const; - RPCMode get_rpc_mode(const StringName &p_method) const; - RPCMode get_rset_mode(const StringName &p_variable) const; -}; - -class MultiScript : public Script { - - _THREAD_SAFE_CLASS_ - friend class MultiScriptInstance; - friend class MultiScriptLanguage; - GDCLASS(MultiScript, Script) - - StringName base_class_name; - - Vector<Ref<Script> > scripts; - Vector<Multi *> script_instances; - - Map<Object *, MultiScriptInstance *> instances; - -protected: - bool _set(const StringName &p_name, const Variant &p_value); - bool _get(const StringName &p_name, Variant &r_ret) const; - void _get_property_list(List<PropertyInfo> *p_list) const; - - static void _bind_methods(); - -public: - void remove_instance(Object *p_object); - virtual bool can_instance() const; - - virtual StringName get_instance_base_type() const; - virtual ScriptInstance *instance_create(Object *p_this); - virtual bool instance_has(const Object *p_this) const; - - virtual bool has_source_code() const; - virtual String get_source_code() const; - virtual void set_source_code(const String &p_code); - virtual Error reload(bool p_keep_state = false); - - virtual bool is_tool() const; - - virtual String get_node_type() const; - - void set_script(int p_idx, const Ref<Script> &p_script); - Ref<Script> get_script(int p_idx) const; - void remove_script(int p_idx); - void add_script(const Ref<Script> &p_script); - - virtual ScriptLanguage *get_language() const; - - MultiScript(); - ~MultiScript(); - - virtual Ref<Script> get_base_script() const; - virtual bool has_method(const StringName &p_method) const; - virtual MethodInfo get_method_info(const StringName &p_method) const; - virtual bool has_script_signal(const StringName &p_signal) const; - virtual void get_script_signal_list(List<MethodInfo> *r_signals) const; - virtual bool get_property_default_value(const StringName &p_property, Variant &r_value) const; - virtual void get_script_method_list(List<MethodInfo> *p_list) const; - virtual void get_script_property_list(List<PropertyInfo> *p_list) const; - virtual void update_exports(); -}; - -class MultiScriptLanguage : public ScriptLanguage { - - static MultiScriptLanguage *singleton; - -public: - static _FORCE_INLINE_ MultiScriptLanguage *get_singleton(); - virtual String get_name() const; - - /* LANGUAGE FUNCTIONS */ - virtual void init(); - virtual String get_type() const; - virtual String get_extension() const; - virtual Error execute_file(const String &p_path); - virtual void finish(); - - /* EDITOR FUNCTIONS */ - virtual void get_reserved_words(List<String> *p_words) const; - virtual void get_comment_delimiters(List<String> *p_delimiters) const; - virtual void get_string_delimiters(List<String> *p_delimiters) const; - virtual Ref<Script> get_template(const String &p_class_name, const String &p_base_class_name) const; - virtual bool validate(const String &p_script, int &r_line_error, int &r_col_error, String &r_test_error, const String &p_path = "", List<String> *r_fn = NULL) const; - virtual Script *create_script() const; - virtual bool has_named_classes() const; - virtual int find_function(const String &p_function, const String &p_code) const; - virtual String make_function(const String &p_class, const String &p_name, const PoolStringArray &p_args) const; - - /* DEBUGGER FUNCTIONS */ - - virtual String debug_get_error() const; - virtual int debug_get_stack_level_count() const; - virtual int debug_get_stack_level_line(int p_level) const; - virtual String debug_get_stack_level_function(int p_level) const; - virtual String debug_get_stack_level_source(int p_level) const; - virtual void debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1); - virtual void debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1); - virtual void debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1); - virtual String debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems = -1, int p_max_depth = -1); - - /* LOADER FUNCTIONS */ - - virtual void get_recognized_extensions(List<String> *p_extensions) const; - virtual void get_public_functions(List<MethodInfo> *p_functions) const; - - MultiScriptLanguage(); - virtual ~MultiScriptLanguage(); - - // ScriptLanguage interface -public: - void auto_indent_code(String &p_code, int p_from_line, int p_to_line) const; - void add_global_constant(const StringName &p_variable, const Variant &p_value); - void reload_all_scripts(); - void reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload); - void get_public_constants(List<Pair<String, Variant> > *p_constants) const; - void profiling_start(); - void profiling_stop(); - int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max); - int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max); -}; - -#endif // MULTISCRIPT_H diff --git a/modules/multiscript/register_types.cpp b/modules/multiscript/register_types.cpp deleted file mode 100644 index 8170a2d9c1..0000000000 --- a/modules/multiscript/register_types.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/*************************************************************************/ -/* register_types.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "register_types.h" - -#include "multiscript.h" - -#include "core/script_language.h" - -static MultiScriptLanguage *script_multi_script = NULL; - -void register_multiscript_types() { - script_multi_script = memnew(MultiScriptLanguage); - ScriptServer::register_language(script_multi_script); - ClassDB::register_class<MultiScript>(); - - // ClassDB::register_class<Multi>(); -} - -void unregister_multiscript_types() { - if (script_multi_script) { - ScriptServer::unregister_language(script_multi_script); - memdelete(script_multi_script); - } -} diff --git a/modules/multiscript/register_types.h b/modules/multiscript/register_types.h deleted file mode 100644 index b18d1adff2..0000000000 --- a/modules/multiscript/register_types.h +++ /dev/null @@ -1,31 +0,0 @@ -/*************************************************************************/ -/* register_types.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -void register_multiscript_types(); -void unregister_multiscript_types(); diff --git a/modules/pvr/texture_loader_pvr.cpp b/modules/pvr/texture_loader_pvr.cpp index 62cbd9cd8d..bdd4779e28 100644 --- a/modules/pvr/texture_loader_pvr.cpp +++ b/modules/pvr/texture_loader_pvr.cpp @@ -164,8 +164,8 @@ RES ResourceFormatPVR::load(const String &p_path, const String &p_original_path, print_line("flip: " + itos(flags & PVR_VFLIP)); - Image image(width, height, mipmaps, format, data); - ERR_FAIL_COND_V(image.empty(), RES()); + Ref<Image> image = memnew(Image(width, height, mipmaps, format, data)); + ERR_FAIL_COND_V(image->empty(), RES()); Ref<ImageTexture> texture = memnew(ImageTexture); texture->create_from_image(image, tex_flags); @@ -193,30 +193,32 @@ String ResourceFormatPVR::get_resource_type(const String &p_path) const { static void _compress_pvrtc4(Image *p_img) { - Image img = *p_img; + Ref<Image> img = p_img->duplicate(); bool make_mipmaps = false; - if (img.get_width() % 8 || img.get_height() % 8) { - make_mipmaps = img.has_mipmaps(); - img.resize(img.get_width() + (8 - (img.get_width() % 8)), img.get_height() + (8 - (img.get_height() % 8))); + if (img->get_width() % 8 || img->get_height() % 8) { + make_mipmaps = img->has_mipmaps(); + img->resize(img->get_width() + (8 - (img->get_width() % 8)), img->get_height() + (8 - (img->get_height() % 8))); } - img.convert(Image::FORMAT_RGBA8); - if (!img.has_mipmaps() && make_mipmaps) - img.generate_mipmaps(); + img->convert(Image::FORMAT_RGBA8); + if (!img->has_mipmaps() && make_mipmaps) + img->generate_mipmaps(); - bool use_alpha = img.detect_alpha(); + bool use_alpha = img->detect_alpha(); - Image new_img; - new_img.create(img.get_width(), img.get_height(), true, use_alpha ? Image::FORMAT_PVRTC4A : Image::FORMAT_PVRTC4); - PoolVector<uint8_t> data = new_img.get_data(); + Ref<Image> new_img; + new_img.instance(); + new_img->create(img->get_width(), img->get_height(), true, use_alpha ? Image::FORMAT_PVRTC4A : Image::FORMAT_PVRTC4); + + PoolVector<uint8_t> data = new_img->get_data(); { PoolVector<uint8_t>::Write wr = data.write(); - PoolVector<uint8_t>::Read r = img.get_data().read(); + PoolVector<uint8_t>::Read r = img->get_data().read(); - for (int i = 0; i <= new_img.get_mipmap_count(); i++) { + for (int i = 0; i <= new_img->get_mipmap_count(); i++) { int ofs, size, w, h; - img.get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h); + img->get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h); Javelin::RgbaBitmap bm(w, h); copymem(bm.GetData(), &r[ofs], size); { @@ -226,12 +228,12 @@ static void _compress_pvrtc4(Image *p_img) { } } - new_img.get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h); + new_img->get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h); Javelin::PvrTcEncoder::EncodeRgba4Bpp(&wr[ofs], bm); } } - *p_img = Image(new_img.get_width(), new_img.get_height(), new_img.has_mipmaps(), new_img.get_format(), data); + p_img->create(new_img->get_width(), new_img->get_height(), new_img->has_mipmaps(), new_img->get_format(), data); } ResourceFormatPVR::ResourceFormatPVR() { @@ -676,8 +678,7 @@ static void _pvrtc_decompress(Image *p_img) { r = PoolVector<uint8_t>::Read(); bool make_mipmaps = p_img->has_mipmaps(); - Image newimg(p_img->get_width(), p_img->get_height(), false, Image::FORMAT_RGBA8, newdata); + p_img->create(p_img->get_width(), p_img->get_height(), false, Image::FORMAT_RGBA8, newdata); if (make_mipmaps) - newimg.generate_mipmaps(); - *p_img = newimg; + p_img->generate_mipmaps(); } diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp index 61112f20b4..d895f60280 100644 --- a/modules/theora/video_stream_theora.cpp +++ b/modules/theora/video_stream_theora.cpp @@ -138,7 +138,7 @@ void VideoStreamPlaybackTheora::video_write(void) { format = Image::FORMAT_RGBA8; } - Image img(size.x, size.y, 0, Image::FORMAT_RGBA8, frame_data); //zero copy image creation + Ref<Image> img = memnew(Image(size.x, size.y, 0, Image::FORMAT_RGBA8, frame_data)); //zero copy image creation texture->set_data(img); //zero copy send to visual server diff --git a/modules/visual_script/visual_script_editor.cpp b/modules/visual_script/visual_script_editor.cpp index d515f301ce..340e2fe637 100644 --- a/modules/visual_script/visual_script_editor.cpp +++ b/modules/visual_script/visual_script_editor.cpp @@ -346,7 +346,6 @@ static Color _color_from_type(Variant::Type p_type) { case Variant::TRANSFORM: color = Color::html("f6a86e"); break; case Variant::COLOR: color = Color::html("9dff70"); break; - case Variant::IMAGE: color = Color::html("93f1b9"); break; case Variant::NODE_PATH: color = Color::html("6993ec"); break; case Variant::_RID: color = Color::html("69ec9a"); break; case Variant::OBJECT: color = Color::html("79f3e8"); break; @@ -451,7 +450,6 @@ void VisualScriptEditor::_update_graph(int p_only_id) { Control::get_icon("MiniBasis", "EditorIcons"), Control::get_icon("MiniTransform", "EditorIcons"), Control::get_icon("MiniColor", "EditorIcons"), - Control::get_icon("MiniImage", "EditorIcons"), Control::get_icon("MiniPath", "EditorIcons"), Control::get_icon("MiniRid", "EditorIcons"), Control::get_icon("MiniObject", "EditorIcons"), @@ -735,7 +733,6 @@ void VisualScriptEditor::_update_members() { Control::get_icon("MiniMatrix3", "EditorIcons"), Control::get_icon("MiniTransform", "EditorIcons"), Control::get_icon("MiniColor", "EditorIcons"), - Control::get_icon("MiniImage", "EditorIcons"), Control::get_icon("MiniPath", "EditorIcons"), Control::get_icon("MiniRid", "EditorIcons"), Control::get_icon("MiniObject", "EditorIcons"), diff --git a/modules/webm/libvpx/SCsub b/modules/webm/libvpx/SCsub index 241d6e30cd..0ee2ed45b8 100644 --- a/modules/webm/libvpx/SCsub +++ b/modules/webm/libvpx/SCsub @@ -273,7 +273,7 @@ else: webm_cpu_x86 = True else: webm_cpu_x86 = not is_x11_or_server_arm and (cpu_bits == '32' or cpu_bits == '64') and (env["platform"] == 'windows' or env["platform"] == 'x11' or env["platform"] == 'osx' or env["platform"] == 'haiku' or is_android_x86 or is_ios_x86) - webm_cpu_arm = is_x11_or_server_arm or (not is_ios_x86 and env["platform"] == 'iphone') or env["platform"] == 'bb10' or (not is_android_x86 and env["platform"] == 'android') + webm_cpu_arm = is_x11_or_server_arm or (not is_ios_x86 and env["platform"] == 'iphone') or (not is_android_x86 and env["platform"] == 'android') if webm_cpu_x86: import subprocess diff --git a/modules/webp/image_loader_webp.cpp b/modules/webp/image_loader_webp.cpp index 889eac71a7..7313cb6c7c 100644 --- a/modules/webp/image_loader_webp.cpp +++ b/modules/webp/image_loader_webp.cpp @@ -37,23 +37,23 @@ #include <webp/decode.h> #include <webp/encode.h> -static PoolVector<uint8_t> _webp_lossy_pack(const Image &p_image, float p_quality) { +static PoolVector<uint8_t> _webp_lossy_pack(const Ref<Image> &p_image, float p_quality) { - ERR_FAIL_COND_V(p_image.empty(), PoolVector<uint8_t>()); + ERR_FAIL_COND_V(p_image.is_null() || p_image->empty(), PoolVector<uint8_t>()); - Image img = p_image; - if (img.detect_alpha()) - img.convert(Image::FORMAT_RGBA8); + Ref<Image> img = p_image->duplicate(); + if (img->detect_alpha()) + img->convert(Image::FORMAT_RGBA8); else - img.convert(Image::FORMAT_RGB8); + img->convert(Image::FORMAT_RGB8); - Size2 s(img.get_width(), img.get_height()); - PoolVector<uint8_t> data = img.get_data(); + Size2 s(img->get_width(), img->get_height()); + PoolVector<uint8_t> data = img->get_data(); PoolVector<uint8_t>::Read r = data.read(); uint8_t *dst_buff = NULL; size_t dst_size = 0; - if (img.get_format() == Image::FORMAT_RGB8) { + if (img->get_format() == Image::FORMAT_RGB8) { dst_size = WebPEncodeRGB(r.ptr(), s.width, s.height, 3 * s.width, CLAMP(p_quality * 100.0, 0, 100.0), &dst_buff); } else { @@ -74,17 +74,17 @@ static PoolVector<uint8_t> _webp_lossy_pack(const Image &p_image, float p_qualit return dst; } -static Image _webp_lossy_unpack(const PoolVector<uint8_t> &p_buffer) { +static Ref<Image> _webp_lossy_unpack(const PoolVector<uint8_t> &p_buffer) { int size = p_buffer.size() - 4; - ERR_FAIL_COND_V(size <= 0, Image()); + ERR_FAIL_COND_V(size <= 0, Ref<Image>()); PoolVector<uint8_t>::Read r = p_buffer.read(); - ERR_FAIL_COND_V(r[0] != 'W' || r[1] != 'E' || r[2] != 'B' || r[3] != 'P', Image()); + ERR_FAIL_COND_V(r[0] != 'W' || r[1] != 'E' || r[2] != 'B' || r[3] != 'P', Ref<Image>()); WebPBitstreamFeatures features; if (WebPGetFeatures(&r[4], size, &features) != VP8_STATUS_OK) { ERR_EXPLAIN("Error unpacking WEBP image:"); - ERR_FAIL_V(Image()); + ERR_FAIL_V(Ref<Image>()); } /* @@ -107,14 +107,15 @@ static Image _webp_lossy_unpack(const PoolVector<uint8_t> &p_buffer) { } //ERR_EXPLAIN("Error decoding webp! - "+p_file); - ERR_FAIL_COND_V(errdec, Image()); + ERR_FAIL_COND_V(errdec, Ref<Image>()); dst_w = PoolVector<uint8_t>::Write(); - return Image(features.width, features.height, 0, features.has_alpha ? Image::FORMAT_RGBA8 : Image::FORMAT_RGB8, dst_image); + Ref<Image> img = memnew(Image(features.width, features.height, 0, features.has_alpha ? Image::FORMAT_RGBA8 : Image::FORMAT_RGB8, dst_image)); + return img; } -Error ImageLoaderWEBP::load_image(Image *p_image, FileAccess *f) { +Error ImageLoaderWEBP::load_image(Ref<Image> p_image, FileAccess *f) { uint32_t size = f->get_len(); PoolVector<uint8_t> src_image; @@ -160,7 +161,7 @@ Error ImageLoaderWEBP::load_image(Image *p_image, FileAccess *f) { src_r = PoolVector<uint8_t>::Read(); dst_w = PoolVector<uint8_t>::Write(); - *p_image = Image(features.width, features.height, 0, features.has_alpha ? Image::FORMAT_RGBA8 : Image::FORMAT_RGB8, dst_image); + p_image->create(features.width, features.height, 0, features.has_alpha ? Image::FORMAT_RGBA8 : Image::FORMAT_RGB8, dst_image); return OK; } diff --git a/modules/webp/image_loader_webp.h b/modules/webp/image_loader_webp.h index 2d0ac796d3..ba817e0ecd 100644 --- a/modules/webp/image_loader_webp.h +++ b/modules/webp/image_loader_webp.h @@ -38,7 +38,7 @@ class ImageLoaderWEBP : public ImageFormatLoader { public: - virtual Error load_image(Image *p_image, FileAccess *f); + virtual Error load_image(Ref<Image> p_image, FileAccess *f); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderWEBP(); }; diff --git a/platform/android/build.gradle.template b/platform/android/build.gradle.template index 8dfb006c00..2732fc3c29 100644 --- a/platform/android/build.gradle.template +++ b/platform/android/build.gradle.template @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.3.1' $$GRADLE_CLASSPATH$$ } } @@ -31,7 +31,7 @@ android { } compileSdkVersion 23 - buildToolsVersion "23.0.3" + buildToolsVersion "25.0.3" useLibrary 'org.apache.http.legacy' packagingOptions { @@ -66,6 +66,7 @@ android { $$GRADLE_ASSET_DIRS$$ ] jniLibs.srcDirs = [ + 'libs' $$GRADLE_JNI_DIRS$$ ] } diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 72d665329e..84fc4f10bf 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -3523,7 +3523,7 @@ public: EditorExportAndroid() { - Image img(_android_logo); + Ref<Image> img = memnew(Image(_android_logo)); logo = Ref<ImageTexture>(memnew(ImageTexture)); logo->create_from_image(img); diff --git a/platform/android/java/gradle/wrapper/gradle-wrapper.properties b/platform/android/java/gradle/wrapper/gradle-wrapper.properties index d57051703e..a11cc1b825 100644 --- a/platform/android/java/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/java/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Wed Apr 10 15:27:10 PDT 2013 +#Fri May 12 08:50:03 KST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip +org.gradle.jvmargs=-Xmx1536M diff --git a/platform/android/java/res/drawable/icon.png b/platform/android/java/res/drawable/icon.png Binary files differindex a0a0f4af25..29c4a7b8fc 100644 --- a/platform/android/java/res/drawable/icon.png +++ b/platform/android/java/res/drawable/icon.png 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/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java index 627bf3eedd..e83faa2756 100644 --- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java +++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java @@ -569,10 +569,10 @@ public abstract class DownloaderService extends CustomIntentService implements I */ void pollNetworkState() { if (null == mConnectivityManager) { - mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + mConnectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); } if (null == mWifiManager) { - mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); + mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); } if (mConnectivityManager == null) { Log.w(Constants.TAG, diff --git a/platform/android/power_android.cpp b/platform/android/power_android.cpp index 57977dd4b9..bb5a1db250 100644 --- a/platform/android/power_android.cpp +++ b/platform/android/power_android.cpp @@ -28,10 +28,35 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "core/error_macros.h" +/* +Adapted from corresponding SDL 2.0 code. +*/ + +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org> + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ #include "power_android.h" +#include "core/error_macros.h" + static void LocalReferenceHolder_Cleanup(struct LocalReferenceHolder *refholder) { if (refholder->m_env) { JNIEnv *env = refholder->m_env; diff --git a/platform/bb10/SCsub b/platform/bb10/SCsub deleted file mode 100644 index c19f46d579..0000000000 --- a/platform/bb10/SCsub +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env python - -Import('env') - -bb10_lib = [ - - 'bbutil.c', - 'os_bb10.cpp', - 'audio_driver_bb10.cpp', - 'godot_bb10.cpp', - 'payment_service.cpp', -] - -env_bps = env.Clone() -if env['bb10_payment_service'] == "yes": - env_bps.Append(CPPFLAGS=['-DPAYMENT_SERVICE_ENABLED']) - -if env['bb10_lgles_override'] == "yes": - env_bps.Append(CPPFLAGS=['-DBB10_LGLES_OVERRIDE']) - - -prog = None -prog = env_bps.Program('#bin/godot', bb10_lib) diff --git a/platform/bb10/audio_driver_bb10.cpp b/platform/bb10/audio_driver_bb10.cpp deleted file mode 100644 index 5658dc5334..0000000000 --- a/platform/bb10/audio_driver_bb10.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/*************************************************************************/ -/* audio_driver_bb10.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "audio_driver_bb10.h" - -#include <errno.h> - -Error AudioDriverBB10::init() { - return init(NULL); -}; - -Error AudioDriverBB10::init(const char *p_name) { - - active = false; - thread_exited = false; - exit_thread = false; - pcm_open = false; - samples_in = NULL; - samples_out = NULL; - - mix_rate = 44100; - speaker_mode = SPEAKER_MODE_STEREO; - - char *dev_name; - if (p_name == NULL) { - dev_name = "pcmPreferred"; - } else { - dev_name = (char *)p_name; - } - printf("******** reconnecting to device %s\n", dev_name); - int ret = snd_pcm_open_name(&pcm_handle, dev_name, SND_PCM_OPEN_PLAYBACK); - ERR_FAIL_COND_V(ret < 0, FAILED); - pcm_open = true; - - snd_pcm_channel_info_t cinfo; - zeromem(&cinfo, sizeof(cinfo)); - cinfo.channel = SND_PCM_CHANNEL_PLAYBACK; - snd_pcm_plugin_info(pcm_handle, &cinfo); - - printf("rates %i, %i, %i, %i, %i\n", cinfo.rates, cinfo.rates & SND_PCM_RATE_44100, cinfo.rates & SND_PCM_RATE_32000, cinfo.rates & SND_PCM_RATE_22050, cinfo.max_rate); - - mix_rate = cinfo.max_rate; - - printf("formats %i, %i, %i\n", cinfo.formats, cinfo.formats & SND_PCM_FMT_S16_BE, cinfo.formats & SND_PCM_FMT_S16_LE); - ERR_FAIL_COND_V(!(cinfo.formats & SND_PCM_FMT_S16_LE), FAILED); - - printf("voices %i\n", cinfo.max_voices); - speaker_mode = SPEAKER_MODE_STEREO; - - snd_pcm_channel_params_t cp; - zeromem(&cp, sizeof(cp)); - cp.mode = SND_PCM_MODE_BLOCK; - cp.channel = SND_PCM_CHANNEL_PLAYBACK; - cp.start_mode = SND_PCM_START_DATA; - cp.stop_mode = SND_PCM_STOP_STOP; - //cp.buf.block.frag_size = cinfo.max_fragment_size; - cp.buf.block.frag_size = 512; - cp.buf.block.frags_max = 1; - cp.buf.block.frags_min = 1; - cp.format.interleave = 1; - cp.format.rate = mix_rate; - cp.format.voices = speaker_mode; - cp.format.format = SND_PCM_SFMT_S16_LE; - - ret = snd_pcm_plugin_params(pcm_handle, &cp); - printf("ret is %i, %i\n", ret, cp.why_failed); - ERR_FAIL_COND_V(ret < 0, FAILED); - - ret = snd_pcm_plugin_prepare(pcm_handle, SND_PCM_CHANNEL_PLAYBACK); - ERR_FAIL_COND_V(ret < 0, FAILED); - - snd_mixer_group_t group; - zeromem(&group, sizeof(group)); - snd_pcm_channel_setup_t setup; - zeromem(&setup, sizeof(setup)); - setup.channel = SND_PCM_CHANNEL_PLAYBACK; - setup.mode = SND_PCM_MODE_BLOCK; - setup.mixer_gid = &group.gid; - ret = snd_pcm_plugin_setup(pcm_handle, &setup); - ERR_FAIL_COND_V(ret < 0, FAILED); - - pcm_frag_size = setup.buf.block.frag_size; - pcm_max_frags = 1; - - sample_buf_count = pcm_frag_size * pcm_max_frags / 2; - printf("sample count %i, %i, %i\n", sample_buf_count, pcm_frag_size, pcm_max_frags); - samples_in = memnew_arr(int32_t, sample_buf_count); - samples_out = memnew_arr(int16_t, sample_buf_count); - - thread = Thread::create(AudioDriverBB10::thread_func, this); - - return OK; -}; - -void AudioDriverBB10::thread_func(void *p_udata) { - - AudioDriverBB10 *ad = (AudioDriverBB10 *)p_udata; - - int channels = speaker_mode; - int frame_count = ad->sample_buf_count / channels; - int bytes_out = frame_count * channels * 2; - - while (!ad->exit_thread) { - - if (!ad->active) { - - for (int i = 0; i < ad->sample_buf_count; i++) { - - ad->samples_out[i] = 0; - }; - } else { - - ad->lock(); - - ad->audio_server_process(frame_count, ad->samples_in); - - ad->unlock(); - - for (int i = 0; i < frame_count * channels; i++) { - - ad->samples_out[i] = ad->samples_in[i] >> 16; - } - }; - - int todo = bytes_out; - int total = 0; - - while (todo) { - - uint8_t *src = (uint8_t *)ad->samples_out; - int wrote = snd_pcm_plugin_write(ad->pcm_handle, (void *)(src + total), todo); - if (wrote < 0) { - // error? - break; - }; - total += wrote; - todo -= wrote; - if (wrote < todo) { - if (ad->thread_exited) { - break; - }; - printf("pcm_write underrun %i, errno %i\n", (int)ad->thread_exited, errno); - snd_pcm_channel_status_t status; - zeromem(&status, sizeof(status)); - // put in non-blocking mode - snd_pcm_nonblock_mode(ad->pcm_handle, 1); - status.channel = SND_PCM_CHANNEL_PLAYBACK; - int ret = snd_pcm_plugin_status(ad->pcm_handle, &status); - //printf("status return %i, %i, %i, %i, %i\n", ret, errno, status.status, SND_PCM_STATUS_READY, SND_PCM_STATUS_UNDERRUN); - snd_pcm_nonblock_mode(ad->pcm_handle, 0); - if (ret < 0) { - break; - }; - if (status.status == SND_PCM_STATUS_READY || - status.status == SND_PCM_STATUS_UNDERRUN) { - snd_pcm_plugin_prepare(ad->pcm_handle, SND_PCM_CHANNEL_PLAYBACK); - } else { - break; - }; - }; - }; - }; - - snd_pcm_plugin_flush(ad->pcm_handle, SND_PCM_CHANNEL_PLAYBACK); - - ad->thread_exited = true; - printf("**************** audio thread exit\n"); -}; - -void AudioDriverBB10::start() { - - active = true; -}; - -int AudioDriverBB10::get_mix_rate() const { - - return mix_rate; -}; - -AudioDriver::SpeakerMode AudioDriverBB10::get_speaker_mode() const { - - return speaker_mode; -}; - -void AudioDriverBB10::lock() { - - if (!thread) - return; - mutex->lock(); -}; - -void AudioDriverBB10::unlock() { - - if (!thread) - return; - mutex->unlock(); -}; - -void AudioDriverBB10::finish() { - - if (!thread) - return; - - exit_thread = true; - Thread::wait_to_finish(thread); - - if (pcm_open) - snd_pcm_close(pcm_handle); - - if (samples_in) { - memdelete_arr(samples_in); - memdelete_arr(samples_out); - }; - - memdelete(thread); - thread = NULL; -}; - -AudioDriverBB10::AudioDriverBB10() { - - mutex = Mutex::create(); -}; - -AudioDriverBB10::~AudioDriverBB10() { - - memdelete(mutex); - mutex = NULL; -}; diff --git a/platform/bb10/audio_driver_bb10.h b/platform/bb10/audio_driver_bb10.h deleted file mode 100644 index c5d64236b8..0000000000 --- a/platform/bb10/audio_driver_bb10.h +++ /dev/null @@ -1,77 +0,0 @@ -/*************************************************************************/ -/* audio_driver_bb10.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "servers/audio_server.h" - -#include "core/os/mutex.h" -#include "core/os/thread.h" - -#include <sys/asoundlib.h> - -class AudioDriverBB10 : public AudioDriver { - - Thread *thread; - Mutex *mutex; - - snd_pcm_t *pcm_handle; - - int32_t *samples_in; - int16_t *samples_out; - int sample_buf_count; - - static void thread_func(void *p_udata); - - int mix_rate; - SpeakerMode speaker_mode; - - int pcm_frag_size; - int pcm_max_frags; - - bool active; - bool thread_exited; - mutable bool exit_thread; - bool pcm_open; - -public: - const char *get_name() const { - return "BB10"; - }; - - virtual Error init(); - virtual Error init(const char *p_name); - virtual void start(); - virtual int get_mix_rate() const; - virtual SpeakerMode get_speaker_mode() const; - virtual void lock(); - virtual void unlock(); - virtual void finish(); - - AudioDriverBB10(); - ~AudioDriverBB10(); -}; diff --git a/platform/bb10/bar/bar-descriptor.xml b/platform/bb10/bar/bar-descriptor.xml deleted file mode 100644 index 0ba70b7180..0000000000 --- a/platform/bb10/bar/bar-descriptor.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version='1.0' encoding='utf-8' standalone='no'?> -<qnx xmlns="http://www.qnx.com/schemas/application/1.0"> - <!-- BlackBerry® 10 application descriptor file. - - Specifies parameters for identifying, installing, and launching native applications on BlackBerry® 10 OS. ---> - <!-- A universally unique application identifier. Must be unique across all BlackBerry applications. - Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. --> - <id>com.godot.game</id> - <!-- The name that is displayed in the BlackBerry application installer. - May have multiple values for each language. See samples or xsd schema file. Optional. --> - <name>Godot Game</name> - <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade. - Values can also be 1-part or 2-part. It is not necessary to have a 3-part value. - An updated version of application must have a versionNumber value higher than the previous version. Required. --> - <versionNumber>0.0.1</versionNumber> - <!-- Fourth digit segment of the package version. First three segments are taken from the - <versionNumber> element. Must be an integer from 0 to 2^16-1 --> - <buildId>0</buildId> - <!-- Description, displayed in the BlackBerry application installer. - May have multiple values for each language. See samples or xsd schema file. Optional. --> - <description>Game made with Godot Engine</description> - <!-- Name of author which is used for signing. Must match the developer name of your development certificate. --> - <author>You Name or Company</author> - <authorId>authorIDherePlease</authorId> - <!-- Unique author ID assigned by signing authority. Required if using debug tokens. --> - <!-- <authorId>ABC1234YjsnUk235h</authorId> --> - <initialWindow> - <aspectRatio>landscape</aspectRatio> - <autoOrients>false</autoOrients> - <systemChrome>none</systemChrome> - <transparent>false</transparent> - </initialWindow> - <!-- The category where the application appears. Either core.games or core.media. --> - <category>core.games</category> - <permission>read_device_identifying_information</permission> - <permission>access_internet</permission> - <asset path="data.pck">data.pck</asset> - <configuration name="Device-Debug"> - <platformArchitecture>armle-v7</platformArchitecture> - <asset type="Qnx/Elf" path="godot.bb10.debug.qnx.armle" entry="true">godot.bb10.debug.qnx.armle</asset> - </configuration> - <configuration name="Device-Release"> - <platformArchitecture>armle-v7</platformArchitecture> - <asset type="Qnx/Elf" path="godot.bb10.opt.qnx.armle" entry="true">godot.bb10.opt.qnx.armle</asset> - </configuration> - <!-- The icon for the application. --> - <icon> - <image>icon.png</image> - </icon> - <!-- Ensure that shared libraries in the package are found at run-time. --> - <env value="app/native/lib:/usr/lib/qt4/lib" var="LD_LIBRARY_PATH"/> -</qnx> diff --git a/platform/bb10/bar/icon.png b/platform/bb10/bar/icon.png Binary files differdeleted file mode 100644 index 2161402438..0000000000 --- a/platform/bb10/bar/icon.png +++ /dev/null diff --git a/platform/bb10/bbutil.c b/platform/bb10/bbutil.c deleted file mode 100644 index ab3dcf69b2..0000000000 --- a/platform/bb10/bbutil.c +++ /dev/null @@ -1,513 +0,0 @@ -#include <assert.h> -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/keycodes.h> -#include <time.h> - -#include "bbutil.h" - -EGLDisplay egl_disp; -EGLSurface egl_surf; - -static EGLConfig egl_conf; -static EGLContext egl_ctx; - -static screen_context_t screen_ctx; -static screen_window_t screen_win; -static screen_display_t screen_disp; - - -static void -bbutil_egl_perror(const char *msg) { - static const char *errmsg[] = { - "function succeeded", - "EGL is not initialized, or could not be initialized, for the specified display", - "cannot access a requested resource", - "failed to allocate resources for the requested operation", - "an unrecognized attribute or attribute value was passed in an attribute list", - "an EGLConfig argument does not name a valid EGLConfig", - "an EGLContext argument does not name a valid EGLContext", - "the current surface of the calling thread is no longer valid", - "an EGLDisplay argument does not name a valid EGLDisplay", - "arguments are inconsistent", - "an EGLNativePixmapType argument does not refer to a valid native pixmap", - "an EGLNativeWindowType argument does not refer to a valid native window", - "one or more argument values are invalid", - "an EGLSurface argument does not name a valid surface configured for rendering", - "a power management event has occurred", - }; - - fprintf(stderr, "%s: %s\n", msg, errmsg[eglGetError() - EGL_SUCCESS]); -} -EGLConfig bbutil_choose_config(EGLDisplay egl_disp, enum RENDERING_API api) { - EGLConfig egl_conf = (EGLConfig)0; - EGLConfig *egl_configs; - EGLint egl_num_configs; - EGLint val; - EGLBoolean rc; - EGLint i; - - rc = eglGetConfigs(egl_disp, NULL, 0, &egl_num_configs); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglGetConfigs"); - return egl_conf; - } - if (egl_num_configs == 0) { - fprintf(stderr, "eglGetConfigs: could not find a configuration\n"); - return egl_conf; - } - - egl_configs = malloc(egl_num_configs * sizeof(*egl_configs)); - if (egl_configs == NULL) { - fprintf(stderr, "could not allocate memory for %d EGL configs\n", egl_num_configs); - return egl_conf; - } - - rc = eglGetConfigs(egl_disp, egl_configs, - egl_num_configs, &egl_num_configs); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglGetConfigs"); - free(egl_configs); - return egl_conf; - } - - for (i = 0; i < egl_num_configs; i++) { - eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_SURFACE_TYPE, &val); - if (!(val & EGL_WINDOW_BIT)) { - continue; - } - - eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_RENDERABLE_TYPE, &val); - if (!(val & api)) { - continue; - } - - eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_DEPTH_SIZE, &val); - if ((api & (GL_ES_1|GL_ES_2)) && (val == 0)) { - continue; - } - - eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_RED_SIZE, &val); - if (val != 8) { - continue; - } - eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_GREEN_SIZE, &val); - if (val != 8) { - continue; - } - - eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_BLUE_SIZE, &val); - if (val != 8) { - continue; - } - - eglGetConfigAttrib(egl_disp, egl_configs[i], EGL_BUFFER_SIZE, &val); - if (val != 32) { - continue; - } - - egl_conf = egl_configs[i]; - break; - } - - free(egl_configs); - - if (egl_conf == (EGLConfig)0) { - fprintf(stderr, "bbutil_choose_config: could not find a matching configuration\n"); - } - - return egl_conf; -} - -int -bbutil_init_egl(screen_context_t ctx, enum RENDERING_API api) { - int usage; - int format = SCREEN_FORMAT_RGBX8888; - int nbuffers = 2; - EGLint interval = 1; - int rc; - EGLint attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; - - if (api == GL_ES_1) { - usage = SCREEN_USAGE_OPENGL_ES1 | SCREEN_USAGE_ROTATION; - } else if (api == GL_ES_2) { - usage = SCREEN_USAGE_OPENGL_ES2 | SCREEN_USAGE_ROTATION; - } else if (api == VG) { - usage = SCREEN_USAGE_OPENVG | SCREEN_USAGE_ROTATION; - } else { - fprintf(stderr, "invalid api setting\n"); - return EXIT_FAILURE; - } - - //Simple egl initialization - screen_ctx = ctx; - - egl_disp = eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (egl_disp == EGL_NO_DISPLAY) { - bbutil_egl_perror("eglGetDisplay"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = eglInitialize(egl_disp, NULL, NULL); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglInitialize"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - if ((api == GL_ES_1) || (api == GL_ES_2)) { - rc = eglBindAPI(EGL_OPENGL_ES_API); - } else if (api == VG) { - rc = eglBindAPI(EGL_OPENVG_API); - } - - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglBindApi"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - egl_conf = bbutil_choose_config(egl_disp, api); - if (egl_conf == (EGLConfig)0) { - bbutil_terminate(); - return EXIT_FAILURE; - } - - if (api == GL_ES_2) { - egl_ctx = eglCreateContext(egl_disp, egl_conf, EGL_NO_CONTEXT, attributes); - } else { - egl_ctx = eglCreateContext(egl_disp, egl_conf, EGL_NO_CONTEXT, NULL); - } - - if (egl_ctx == EGL_NO_CONTEXT) { - bbutil_egl_perror("eglCreateContext"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = screen_create_window(&screen_win, screen_ctx); - if (rc) { - perror("screen_create_window"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_FORMAT, &format); - if (rc) { - perror("screen_set_window_property_iv(SCREEN_PROPERTY_FORMAT)"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_USAGE, &usage); - if (rc) { - perror("screen_set_window_property_iv(SCREEN_PROPERTY_USAGE)"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = screen_get_window_property_pv(screen_win, SCREEN_PROPERTY_DISPLAY, (void **)&screen_disp); - if (rc) { - perror("screen_get_window_property_pv"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - int screen_resolution[2]; - - rc = screen_get_display_property_iv(screen_disp, SCREEN_PROPERTY_SIZE, screen_resolution); - if (rc) { - perror("screen_get_display_property_iv"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - int angle = atoi(getenv("ORIENTATION")); - - screen_display_mode_t screen_mode; - rc = screen_get_display_property_pv(screen_disp, SCREEN_PROPERTY_MODE, (void**)&screen_mode); - if (rc) { - perror("screen_get_display_property_pv"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - int size[2]; - rc = screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size); - if (rc) { - perror("screen_get_window_property_iv"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - int buffer_size[2] = {size[0], size[1]}; - - if ((angle == 0) || (angle == 180)) { - if (((screen_mode.width > screen_mode.height) && (size[0] < size[1])) || - ((screen_mode.width < screen_mode.height) && (size[0] > size[1]))) { - buffer_size[1] = size[0]; - buffer_size[0] = size[1]; - } - } else if ((angle == 90) || (angle == 270)){ - if (((screen_mode.width > screen_mode.height) && (size[0] > size[1])) || - ((screen_mode.width < screen_mode.height && size[0] < size[1]))) { - buffer_size[1] = size[0]; - buffer_size[0] = size[1]; - } - } else { - fprintf(stderr, "Navigator returned an unexpected orientation angle.\n"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, buffer_size); - if (rc) { - perror("screen_set_window_property_iv"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &angle); - if (rc) { - perror("screen_set_window_property_iv"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = screen_create_window_buffers(screen_win, nbuffers); - if (rc) { - perror("screen_create_window_buffers"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = screen_create_window_group(screen_win, get_window_group_id()); - if (rc) { - perror("screen_create_window_group"); - bbutil_terminate(); - return EXIT_FAILURE; - } - /* if (screen_create_window_group(screen_win, get_window_group_id()) != 0) goto fail; */ - - int idle_mode = SCREEN_IDLE_MODE_KEEP_AWAKE; - screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_IDLE_MODE, &idle_mode); - - egl_surf = eglCreateWindowSurface(egl_disp, egl_conf, screen_win, NULL); - if (egl_surf == EGL_NO_SURFACE) { - bbutil_egl_perror("eglCreateWindowSurface"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = eglMakeCurrent(egl_disp, egl_surf, egl_surf, egl_ctx); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglMakeCurrent"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - rc = eglSwapInterval(egl_disp, interval); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglSwapInterval"); - bbutil_terminate(); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} - -int -bbutil_init_gl2d() { -#if 0 - EGLint surface_width, surface_height; - - if ((egl_disp == EGL_NO_DISPLAY) || (egl_surf == EGL_NO_SURFACE) ){ - return EXIT_FAILURE; - } - - eglQuerySurface(egl_disp, egl_surf, EGL_WIDTH, &surface_width); - eglQuerySurface(egl_disp, egl_surf, EGL_HEIGHT, &surface_height); - - glShadeModel(GL_SMOOTH); - - glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - - glViewport(0, 0, surface_width, surface_height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glOrthof(0.0f, (float)(surface_width) / (float)(surface_height), 0.0f, 1.0f, -1.0f, 1.0f); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -#endif - - return EXIT_SUCCESS; -} - -int -bbutil_init(screen_context_t ctx, enum RENDERING_API api) { - if (EXIT_SUCCESS != bbutil_init_egl(ctx, api)) { - return EXIT_FAILURE; - } - - if ((GL_ES_1 == api) && (EXIT_SUCCESS != bbutil_init_gl2d())) { - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} - -int bbutil_is_flipped() { - - int ret; - screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_FLIP, &ret); - return ret; -}; - -int bbutil_get_rotation() { - - int ret; - screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &ret); - return ret; -}; - - -void -bbutil_terminate() { - //Typical EGL cleanup - if (egl_disp != EGL_NO_DISPLAY) { - eglMakeCurrent(egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - if (egl_surf != EGL_NO_SURFACE) { - eglDestroySurface(egl_disp, egl_surf); - egl_surf = EGL_NO_SURFACE; - } - if (egl_ctx != EGL_NO_CONTEXT) { - eglDestroyContext(egl_disp, egl_ctx); - egl_ctx = EGL_NO_CONTEXT; - } - if (screen_win != NULL) { - screen_destroy_window(screen_win); - screen_win = NULL; - } - eglTerminate(egl_disp); - egl_disp = EGL_NO_DISPLAY; - } - eglReleaseThread(); -} - -void -bbutil_swap() { - int rc = eglSwapBuffers(egl_disp, egl_surf); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglSwapBuffers"); - } -} - -void -bbutil_clear() { - glClear(GL_COLOR_BUFFER_BIT); -} - -char * -get_window_group_id() -{ - static char s_window_group_id[16] = ""; - - if (s_window_group_id[0] == '\0') { - snprintf(s_window_group_id, sizeof(s_window_group_id), "%d", getpid()); - } - - return s_window_group_id; -} - - -int bbutil_rotate_screen_surface(int angle) { - int rc, rotation, skip = 1, temp; - EGLint interval = 1; - int size[2]; - - if ((angle != 0) && (angle != 90) && (angle != 180) && (angle != 270)) { - fprintf(stderr, "Invalid angle\n"); - return EXIT_FAILURE; - } - - rc = screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &rotation); - if (rc) { - perror("screen_set_window_property_iv"); - return EXIT_FAILURE; - } - - rc = screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size); - if (rc) { - perror("screen_set_window_property_iv"); - return EXIT_FAILURE; - } - - switch (angle - rotation) { - case -270: - case -90: - case 90: - case 270: - temp = size[0]; - size[0] = size[1]; - size[1] = temp; - skip = 0; - break; - } - - if (!skip) { - rc = eglMakeCurrent(egl_disp, NULL, NULL, NULL); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglMakeCurrent"); - return EXIT_FAILURE; - } - - rc = eglDestroySurface(egl_disp, egl_surf); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglMakeCurrent"); - return EXIT_FAILURE; - } - - rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_SOURCE_SIZE, size); - if (rc) { - perror("screen_set_window_property_iv"); - return EXIT_FAILURE; - } - - rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size); - if (rc) { - perror("screen_set_window_property_iv"); - return EXIT_FAILURE; - } - egl_surf = eglCreateWindowSurface(egl_disp, egl_conf, screen_win, NULL); - if (egl_surf == EGL_NO_SURFACE) { - bbutil_egl_perror("eglCreateWindowSurface"); - return EXIT_FAILURE; - } - - rc = eglMakeCurrent(egl_disp, egl_surf, egl_surf, egl_ctx); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglMakeCurrent"); - return EXIT_FAILURE; - } - - rc = eglSwapInterval(egl_disp, interval); - if (rc != EGL_TRUE) { - bbutil_egl_perror("eglSwapInterval"); - return EXIT_FAILURE; - } - } - - rc = screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_ROTATION, &angle); - if (rc) { - perror("screen_set_window_property_iv"); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} - diff --git a/platform/bb10/bbutil.h b/platform/bb10/bbutil.h deleted file mode 100644 index 77f4402fbd..0000000000 --- a/platform/bb10/bbutil.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef _UTILITY_H_INCLUDED -#define _UTILITY_H_INCLUDED - -#include <EGL/egl.h> -#include <GLES2/gl2.h> -#include <screen/screen.h> -#include <sys/platform.h> - -#ifdef __cplusplus -extern "C" { -#endif - -extern EGLDisplay egl_disp; -extern EGLSurface egl_surf; - -enum RENDERING_API { - GL_ES_1 = EGL_OPENGL_ES_BIT, - GL_ES_2 = EGL_OPENGL_ES2_BIT, - VG = EGL_OPENVG_BIT -}; - -/** - * Initializes EGL, GL and loads a default font - * - * \param libscreen context that will be used for EGL setup - * \return EXIT_SUCCESS if initialization succeeded otherwise EXIT_FAILURE - */ -int bbutil_init(screen_context_t ctx, enum RENDERING_API api); - -/** - * Initializes EGL - * - * \param libscreen context that will be used for EGL setup - * \return EXIT_SUCCESS if initialization succeeded otherwise EXIT_FAILURE - */ -int bbutil_init_egl(screen_context_t ctx, enum RENDERING_API api); - -/** - * Initializes GL 1.1 for simple 2D rendering. GL2 initialization will be added at a later point. - * - * \return EXIT_SUCCESS if initialization succeeded otherwise EXIT_FAILURE - */ -int bbutil_init_gl2d(); - -int bbutil_is_flipped(); -int bbutil_get_rotation(); - -char *get_window_group_id(); - -int bbutil_rotate_screen_surface(int angle); - -/** - * Terminates EGL - */ -void bbutil_terminate(); - -/** - * Swaps default bbutil window surface to the screen - */ -void bbutil_swap(); - -/** - * Clears the screen of any existing text. - * NOTE: must be called after a successful return from bbutil_init() or bbutil_init_egl() call - */ -void bbutil_clear(); - -#ifdef __cplusplus -}; -#endif - -#endif diff --git a/platform/bb10/detect.py b/platform/bb10/detect.py deleted file mode 100644 index d3ee9f0124..0000000000 --- a/platform/bb10/detect.py +++ /dev/null @@ -1,92 +0,0 @@ -import os -import sys -import string -import methods - - -def is_active(): - return True - - -def get_name(): - return "BlackBerry 10" - - -def can_build(): - - import os - if (not os.environ.has_key("QNX_TARGET")): - return False - return True - - -def get_opts(): - - return [ - ('QNX_HOST', 'path to qnx host', os.environ.get("QNX_HOST", 0)), - ('QNX_TARGET', 'path to qnx target', os.environ.get("QNX_TARGET", 0)), - ('QNX_CONFIGURATION', 'path to qnx configuration', os.environ.get("QNX_CONFIGURATION", 0)), - ('qnx_target', 'Qnx target (armle or x86', 'armle'), - ('bb10_payment_service', 'Enable Payment Service for BlackBerry10', 'yes'), - ('bb10_lgles_override', 'Force legacy GLES (1.1) on iOS', 'no'), - ('bb10_exceptions', 'Use exceptions when compiling on bb10', 'no'), - ] - - -def get_flags(): - - return [ - ('tools', 'no'), - ('module_theora_enabled', 'no'), - ] - - -def configure(env): - - if env['PLATFORM'] == 'win32': - env.Tool('mingw') - env['SPAWN'] = methods.win32_spawn - - env['qnx_target_ver'] = env['qnx_target'] - if env['qnx_target'] == "armle": - env['qnx_prefix'] = 'ntoarmv7' - env['qnx_target_ver'] = 'armle-v7' - else: - env['qnx_prefix'] = 'ntox86' - - env['OBJSUFFIX'] = ".qnx.${qnx_target}.o" - env['LIBSUFFIX'] = ".qnx.${qnx_target}.a" - env['PROGSUFFIX'] = ".qnx.${qnx_target}" - print("PROGSUFFIX: " + env['PROGSUFFIX'] + " target: " + env['qnx_target']) - - env.PrependENVPath('PATH', env['QNX_CONFIGURATION'] + '/bin') - env.PrependENVPath('PATH', env['QNX_CONFIGURATION'] + '/usr/bin') - env['ENV']['QNX_HOST'] = env['QNX_HOST'] - env['ENV']['QNX_TARGET'] = env['QNX_TARGET'] - env['ENV']['QNX_CONFIGURATION'] = env['QNX_CONFIGURATION'] - - env['CC'] = '$qnx_prefix-gcc' - env['CXX'] = '$qnx_prefix-g++' - env['AR'] = '$qnx_prefix-ar' - env['RANLIB'] = '$qnx_prefix-ranlib' - - env.Append(CPPPATH=['#platform/bb10']) - env.Append(LIBPATH=['#platform/bb10/lib/$qnx_target', '#platform/bb10/lib/$qnx_target_ver']) - env.Append(CCFLAGS=string.split('-DBB10_ENABLED -DUNIX_ENABLED -DGLES2_ENABLED -DGLES1_ENABLED -D_LITTLE_ENDIAN -DNO_THREADS -DNO_FCNTL')) - if env['bb10_exceptions'] == "yes": - env.Append(CCFLAGS=['-fexceptions']) - else: - env.Append(CCFLAGS=['-fno-exceptions']) - - # env.Append(LINKFLAGS = string.split() - - if (env["target"] == "release"): - - env.Append(CCFLAGS=['-O3', '-DRELEASE_BUILD']) - - elif (env["target"] == "debug"): - - env.Append(CCFLAGS=['-g', '-O0', '-DDEBUG_ENABLED', '-D_DEBUG']) - env.Append(LINKFLAGS=['-g']) - - env.Append(LIBS=['bps', 'pps', 'screen', 'socket', 'EGL', 'GLESv2', 'GLESv1_CM', 'm', 'asound']) diff --git a/platform/bb10/export/export.cpp b/platform/bb10/export/export.cpp deleted file mode 100644 index b620cea230..0000000000 --- a/platform/bb10/export/export.cpp +++ /dev/null @@ -1,829 +0,0 @@ -/*************************************************************************/ -/* export.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "export.h" -#include "editor/editor_export.h" -#include "editor/editor_node.h" -#include "editor/editor_settings.h" -#include "global_config.h" -#include "io/marshalls.h" -#include "io/xml_parser.h" -#include "io/zip_io.h" -#include "os/file_access.h" -#include "os/os.h" -#include "platform/bb10/logo.h" -#include "version.h" - -#define MAX_DEVICES 5 -#if 0 -class EditorExportPlatformBB10 : public EditorExportPlatform { - - GDCLASS( EditorExportPlatformBB10,EditorExportPlatform ); - - String custom_package; - - int version_code; - String version_name; - String package; - String name; - String category; - String description; - String author_name; - String author_id; - String icon; - - - - struct Device { - - int index; - String name; - String description; - }; - - Vector<Device> devices; - bool devices_changed; - Mutex *device_lock; - Thread *device_thread; - Ref<ImageTexture> logo; - - volatile bool quit_request; - - - static void _device_poll_thread(void *ud); - - void _fix_descriptor(Vector<uint8_t>& p_manifest); -protected: - - bool _set(const StringName& p_name, const Variant& p_value); - bool _get(const StringName& p_name,Variant &r_ret) const; - void _get_property_list( List<PropertyInfo> *p_list) const; - -public: - - virtual String get_name() const { return "BlackBerry 10"; } - virtual ImageCompression get_image_compression() const { return IMAGE_COMPRESSION_ETC1; } - virtual Ref<Texture> get_logo() const { return logo; } - - - virtual bool poll_devices(); - virtual int get_device_count() const; - virtual String get_device_name(int p_device) const; - virtual String get_device_info(int p_device) const; - virtual Error run(int p_device,int p_flags=0); - - virtual bool requires_password(bool p_debug) const { return !p_debug; } - virtual String get_binary_extension() const { return "bar"; } - virtual Error export_project(const String& p_path,bool p_debug,int p_flags=0); - - virtual bool can_export(String *r_error=NULL) const; - - EditorExportPlatformBB10(); - ~EditorExportPlatformBB10(); -}; - -bool EditorExportPlatformBB10::_set(const StringName& p_name, const Variant& p_value) { - - String n=p_name; - - if (n=="version/code") - version_code=p_value; - else if (n=="version/name") - version_name=p_value; - else if (n=="package/unique_name") - package=p_value; - else if (n=="package/category") - category=p_value; - else if (n=="package/name") - name=p_value; - else if (n=="package/description") - description=p_value; - else if (n=="package/icon") - icon=p_value; - else if (n=="package/custom_template") - custom_package=p_value; - else if (n=="release/author") - author_name=p_value; - else if (n=="release/author_id") - author_id=p_value; - else - return false; - - return true; -} - -bool EditorExportPlatformBB10::_get(const StringName& p_name,Variant &r_ret) const{ - - String n=p_name; - - if (n=="version/code") - r_ret=version_code; - else if (n=="version/name") - r_ret=version_name; - else if (n=="package/unique_name") - r_ret=package; - else if (n=="package/category") - r_ret=category; - else if (n=="package/name") - r_ret=name; - else if (n=="package/description") - r_ret=description; - else if (n=="package/icon") - r_ret=icon; - else if (n=="package/custom_template") - r_ret=custom_package; - else if (n=="release/author") - r_ret=author_name; - else if (n=="release/author_id") - r_ret=author_id; - else - return false; - - return true; -} -void EditorExportPlatformBB10::_get_property_list( List<PropertyInfo> *p_list) const{ - - p_list->push_back( PropertyInfo( Variant::INT, "version/code", PROPERTY_HINT_RANGE,"1,65535,1")); - p_list->push_back( PropertyInfo( Variant::STRING, "version/name") ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/unique_name") ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/category") ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/name") ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/description",PROPERTY_HINT_MULTILINE_TEXT) ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/icon",PROPERTY_HINT_FILE,"png") ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/custom_template", PROPERTY_HINT_GLOBAL_FILE,"zip")); - p_list->push_back( PropertyInfo( Variant::STRING, "release/author") ); - p_list->push_back( PropertyInfo( Variant::STRING, "release/author_id") ); - - //p_list->push_back( PropertyInfo( Variant::INT, "resources/pack_mode", PROPERTY_HINT_ENUM,"Copy,Single Exec.,Pack (.pck),Bundles (Optical)")); - -} - -void EditorExportPlatformBB10::_fix_descriptor(Vector<uint8_t>& p_descriptor) { - - String fpath = EditorSettings::get_singleton()->get_settings_path().plus_file("tmp_bar-settings.xml"); - { - FileAccessRef f = FileAccess::open(fpath,FileAccess::WRITE); - f->store_buffer(p_descriptor.ptr(),p_descriptor.size()); - } - - Ref<XMLParser> parser = memnew( XMLParser ); - Error err = parser->open(fpath); - ERR_FAIL_COND(err!=OK); - - String txt; - err = parser->read(); - Vector<String> depth; - - while(err!=ERR_FILE_EOF) { - - ERR_FAIL_COND(err!=OK); - - switch(parser->get_node_type()) { - - case XMLParser::NODE_NONE: { - print_line("???"); - } break; - case XMLParser::NODE_ELEMENT: { - String e="<"; - e+=parser->get_node_name(); - for(int i=0;i<parser->get_attribute_count();i++) { - e+=" "; - e+=parser->get_attribute_name(i)+"=\""; - e+=parser->get_attribute_value(i)+"\" "; - } - - - - if (parser->is_empty()) { - e+="/"; - } else { - depth.push_back(parser->get_node_name()); - } - - e+=">"; - txt+=e; - - } break; - case XMLParser::NODE_ELEMENT_END: { - - txt+="</"+parser->get_node_name()+">"; - if (depth.size() && depth[depth.size()-1]==parser->get_node_name()) { - depth.resize(depth.size()-1); - } - - - } break; - case XMLParser::NODE_TEXT: { - if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="id") { - - txt+=package; - } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="name") { - - String aname; - if (this->name!="") { - aname=this->name; - } else { - aname = GlobalConfig::get_singleton()->get("application/name"); - - } - - if (aname=="") { - aname=_MKSTR(VERSION_NAME); - } - - txt+=aname; - - } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="versionNumber") { - txt+=itos(version_code); - } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="description") { - txt+=description; - } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="author") { - txt+=author_name; - } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="authorId") { - txt+=author_id; - } else if (depth.size()==2 && depth[0]=="qnx" && depth[1]=="category") { - txt+=category; - } else { - txt+=parser->get_node_data(); - } - } break; - case XMLParser::NODE_COMMENT: { - txt+="<!--"+parser->get_node_name()+"-->"; - } break; - case XMLParser::NODE_CDATA: { - //ignore - //print_line("cdata"); - } break; - case XMLParser::NODE_UNKNOWN: { - //ignore - txt+="<"+parser->get_node_name()+">"; - } break; - } - - err = parser->read(); - } - - - CharString cs = txt.utf8(); - p_descriptor.resize(cs.length()); - for(int i=0;i<cs.length();i++) - p_descriptor[i]=cs[i]; - -} - - - -Error EditorExportPlatformBB10::export_project(const String& p_path, bool p_debug, int p_flags) { - - - EditorProgress ep("export","Exporting for BlackBerry 10",104); - - String src_template=custom_package; - - if (src_template=="") { - String err; - src_template = find_export_template("bb10.zip", &err); - if (src_template=="") { - EditorNode::add_io_error(err); - return ERR_FILE_NOT_FOUND; - } - } - - FileAccess *src_f=NULL; - zlib_filefunc_def io = zipio_create_io_from_file(&src_f); - - ep.step("Creating FileSystem for BAR",0); - - unzFile pkg = unzOpen2(src_template.utf8().get_data(), &io); - if (!pkg) { - - EditorNode::add_io_error("Could not find template zip to export:\n"+src_template); - return ERR_FILE_NOT_FOUND; - } - - DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - da->change_dir(EditorSettings::get_singleton()->get_settings_path()); - - - if (da->change_dir("tmp")!=OK) { - da->make_dir("tmp"); - if (da->change_dir("tmp")!=OK) - return ERR_CANT_CREATE; - } - - if (da->change_dir("bb10_export")!=OK) { - da->make_dir("bb10_export"); - if (da->change_dir("bb10_export")!=OK) { - return ERR_CANT_CREATE; - } - } - - - String bar_dir = da->get_current_dir(); - if (bar_dir.ends_with("/")) { - bar_dir=bar_dir.substr(0,bar_dir.length()-1); - } - - //THIS IS SUPER, SUPER DANGEROUS!!!! - //CAREFUL WITH THIS CODE, MIGHT DELETE USERS HARD DRIVE OR HOME DIR - //EXTRA CHECKS ARE IN PLACE EVERYWERE TO MAKE SURE NOTHING BAD HAPPENS BUT STILL.... - //BE SUPER CAREFUL WITH THIS PLEASE!!! - //BLACKBERRY THIS IS YOUR FAULT FOR NOT MAKING A BETTER WAY!! - - bool berr = bar_dir.ends_with("bb10_export"); - if (berr) { - if (da->list_dir_begin()) { - EditorNode::add_io_error("Can't ensure that dir is empty:\n"+bar_dir); - ERR_FAIL_COND_V(berr,FAILED); - }; - - String f = da->get_next(); - while (f != "") { - - if (f == "." || f == "..") { - f = da->get_next(); - continue; - }; - Error err = da->remove(bar_dir + "/" + f); - if (err != OK) { - EditorNode::add_io_error("Can't ensure that dir is empty:\n"+bar_dir); - ERR_FAIL_COND_V(err!=OK,err); - }; - f = da->get_next(); - }; - - da->list_dir_end(); - - } else { - print_line("ARE YOU CRAZY??? THIS IS A SERIOUS BUG HERE!!!"); - ERR_FAIL_V(ERR_OMFG_THIS_IS_VERY_VERY_BAD); - } - - - ERR_FAIL_COND_V(!pkg, ERR_CANT_OPEN); - int ret = unzGoToFirstFile(pkg); - - - - while(ret==UNZ_OK) { - - //get filename - unz_file_info info; - char fname[16384]; - ret = unzGetCurrentFileInfo(pkg,&info,fname,16384,NULL,0,NULL,0); - - String file=fname; - - Vector<uint8_t> data; - data.resize(info.uncompressed_size); - - //read - unzOpenCurrentFile(pkg); - unzReadCurrentFile(pkg,data.ptr(),data.size()); - unzCloseCurrentFile(pkg); - - //write - - if (file=="bar-descriptor.xml") { - - _fix_descriptor(data); - } - - if (file=="icon.png") { - bool found=false; - - if (this->icon!="" && this->icon.ends_with(".png")) { - - FileAccess *f = FileAccess::open(this->icon,FileAccess::READ); - if (f) { - - data.resize(f->get_len()); - f->get_buffer(data.ptr(),data.size()); - memdelete(f); - found=true; - } - - } - - if (!found) { - - String appicon = GlobalConfig::get_singleton()->get("application/icon"); - if (appicon!="" && appicon.ends_with(".png")) { - FileAccess*f = FileAccess::open(appicon,FileAccess::READ); - if (f) { - data.resize(f->get_len()); - f->get_buffer(data.ptr(),data.size()); - memdelete(f); - } - } - } - } - - - if (file.find("/")) { - - da->make_dir_recursive(file.get_base_dir()); - } - - FileAccessRef wf = FileAccess::open(bar_dir.plus_file(file),FileAccess::WRITE); - wf->store_buffer(data.ptr(),data.size()); - - ret = unzGoToNextFile(pkg); - } - - ep.step("Adding Files..",2); - - FileAccess* dst = FileAccess::open(bar_dir+"/data.pck", FileAccess::WRITE); - if (!dst) { - EditorNode::add_io_error("Can't copy executable file to:\n "+p_path); - return ERR_FILE_CANT_WRITE; - } - save_pack(dst, false, 1024); - dst->close(); - memdelete(dst); - - ep.step("Creating BAR Package..",104); - - String bb_packager=EditorSettings::get_singleton()->get("export/blackberry/host_tools"); - bb_packager=bb_packager.plus_file("blackberry-nativepackager"); - if (OS::get_singleton()->get_name()=="Windows") - bb_packager+=".bat"; - - - if (!FileAccess::exists(bb_packager)) { - EditorNode::add_io_error("Can't find packager:\n"+bb_packager); - return ERR_CANT_OPEN; - } - - List<String> args; - args.push_back("-package"); - args.push_back(p_path); - if (p_debug) { - - String debug_token=EditorSettings::get_singleton()->get("export/blackberry/debug_token"); - if (!FileAccess::exists(debug_token)) { - EditorNode::add_io_error("Debug token not found!"); - } else { - args.push_back("-debugToken"); - args.push_back(debug_token); - } - args.push_back("-devMode"); - args.push_back("-configuration"); - args.push_back("Device-Debug"); - } else { - - args.push_back("-configuration"); - args.push_back("Device-Release"); - } - args.push_back(bar_dir.plus_file("bar-descriptor.xml")); - - int ec; - - Error err = OS::get_singleton()->execute(bb_packager,args,true,NULL,NULL,&ec); - - if (err!=OK) - return err; - if (ec!=0) - return ERR_CANT_CREATE; - - return OK; - -} - -bool EditorExportPlatformBB10::poll_devices() { - - bool dc=devices_changed; - devices_changed=false; - return dc; -} - -int EditorExportPlatformBB10::get_device_count() const { - - device_lock->lock(); - int dc=devices.size(); - device_lock->unlock(); - - return dc; - -} -String EditorExportPlatformBB10::get_device_name(int p_device) const { - - ERR_FAIL_INDEX_V(p_device,devices.size(),""); - device_lock->lock(); - String s=devices[p_device].name; - device_lock->unlock(); - return s; -} -String EditorExportPlatformBB10::get_device_info(int p_device) const { - - ERR_FAIL_INDEX_V(p_device,devices.size(),""); - device_lock->lock(); - String s=devices[p_device].description; - device_lock->unlock(); - return s; -} - -void EditorExportPlatformBB10::_device_poll_thread(void *ud) { - - EditorExportPlatformBB10 *ea=(EditorExportPlatformBB10 *)ud; - - while(!ea->quit_request) { - - String bb_deploy=EditorSettings::get_singleton()->get("export/blackberry/host_tools"); - bb_deploy=bb_deploy.plus_file("blackberry-deploy"); - bool windows = OS::get_singleton()->get_name()=="Windows"; - if (windows) - bb_deploy+=".bat"; - - if (FileAccess::exists(bb_deploy)) { - - Vector<Device> devices; - - - for (int i=0;i<MAX_DEVICES;i++) { - - String host = EditorSettings::get_singleton()->get("export/blackberry/device_"+itos(i+1)+"/host"); - if (host==String()) - continue; - String pass = EditorSettings::get_singleton()->get("export/blackberry/device_"+itos(i+1)+"/password"); - if (pass==String()) - continue; - - List<String> args; - args.push_back("-listDeviceInfo"); - args.push_back(host); - args.push_back("-password"); - args.push_back(pass); - - - int ec; - String dp; - - Error err = OS::get_singleton()->execute(bb_deploy,args,true,NULL,&dp,&ec); - - if (err==OK && ec==0) { - - Device dev; - dev.index=i; - String descr; - Vector<String> ls=dp.split("\n"); - - for(int i=0;i<ls.size();i++) { - - String l = ls[i].strip_edges(); - if (l.begins_with("modelfullname::")) { - dev.name=l.get_slice("::",1); - descr+="Model: "+dev.name+"\n"; - } - if (l.begins_with("modelnumber::")) { - String s = l.get_slice("::",1); - dev.name+=" ("+s+")"; - descr+="Model Number: "+s+"\n"; - } - if (l.begins_with("scmbundle::")) - descr+="OS Version: "+l.get_slice("::",1)+"\n"; - if (l.begins_with("[n]debug_token_expiration::")) - descr+="Debug Token Expires:: "+l.get_slice("::",1)+"\n"; - - } - - dev.description=descr; - devices.push_back(dev); - } - - } - - bool changed=false; - - - ea->device_lock->lock(); - - if (ea->devices.size()!=devices.size()) { - changed=true; - } else { - - for(int i=0;i<ea->devices.size();i++) { - - if (ea->devices[i].index!=devices[i].index) { - changed=true; - break; - } - } - } - - if (changed) { - - ea->devices=devices; - ea->devices_changed=true; - } - - ea->device_lock->unlock(); - } - - - uint64_t wait = 3000000; - uint64_t time = OS::get_singleton()->get_ticks_usec(); - while(OS::get_singleton()->get_ticks_usec() - time < wait ) { - OS::get_singleton()->delay_usec(1000); - if (ea->quit_request) - break; - } - } - -} - -Error EditorExportPlatformBB10::run(int p_device, int p_flags) { - - ERR_FAIL_INDEX_V(p_device,devices.size(),ERR_INVALID_PARAMETER); - - String bb_deploy=EditorSettings::get_singleton()->get("export/blackberry/host_tools"); - bb_deploy=bb_deploy.plus_file("blackberry-deploy"); - if (OS::get_singleton()->get_name()=="Windows") - bb_deploy+=".bat"; - - if (!FileAccess::exists(bb_deploy)) { - EditorNode::add_io_error("Blackberry Deploy not found:\n"+bb_deploy); - return ERR_FILE_NOT_FOUND; - } - - - device_lock->lock(); - - - EditorProgress ep("run","Running on "+devices[p_device].name,3); - - //export_temp - ep.step("Exporting APK",0); - - String export_to=EditorSettings::get_singleton()->get_settings_path().plus_file("/tmp/tmpexport.bar"); - Error err = export_project(export_to,true,p_flags); - if (err) { - device_lock->unlock(); - return err; - } -#if 0 - ep.step("Uninstalling..",1); - - print_line("Uninstalling previous version: "+devices[p_device].name); - List<String> args; - args.push_back("-s"); - args.push_back(devices[p_device].id); - args.push_back("uninstall"); - args.push_back(package); - int rv; - err = OS::get_singleton()->execute(adb,args,true,NULL,NULL,&rv); - - if (err || rv!=0) { - EditorNode::add_io_error("Could not install to device."); - device_lock->unlock(); - return ERR_CANT_CREATE; - } - - print_line("Installing into device (please wait..): "+devices[p_device].name); - -#endif - ep.step("Installing to Device (please wait..)..",2); - - List<String> args; - args.clear(); - args.push_back("-installApp"); - args.push_back("-launchApp"); - args.push_back("-device"); - String host = EditorSettings::get_singleton()->get("export/blackberry/device_"+itos(p_device+1)+"/host"); - String pass = EditorSettings::get_singleton()->get("export/blackberry/device_"+itos(p_device+1)+"/password"); - args.push_back(host); - args.push_back("-password"); - args.push_back(pass); - args.push_back(export_to); - - int rv; - err = OS::get_singleton()->execute(bb_deploy,args,true,NULL,NULL,&rv); - if (err || rv!=0) { - EditorNode::add_io_error("Could not install to device."); - device_lock->unlock(); - return ERR_CANT_CREATE; - } - - device_lock->unlock(); - return OK; - - -} - - -EditorExportPlatformBB10::EditorExportPlatformBB10() { - - version_code=1; - version_name="1.0"; - package="com.godot.noname"; - category="core.games"; - name=""; - author_name="Cert. Name"; - author_id="Cert. ID"; - description="Game made with Godot Engine"; - - device_lock = Mutex::create(); - quit_request=false; - - device_thread=Thread::create(_device_poll_thread,this); - devices_changed=true; - - Image img( _bb10_logo ); - logo = Ref<ImageTexture>( memnew( ImageTexture )); - logo->create_from_image(img); -} - -bool EditorExportPlatformBB10::can_export(String *r_error) const { - - bool valid=true; - String bb_deploy=EditorSettings::get_singleton()->get("export/blackberry/host_tools"); - String err; - - if (!FileAccess::exists(bb_deploy.plus_file("blackberry-deploy"))) { - - valid=false; - err+="Blackberry host tools not configured in editor settings.\n"; - } - - if (!exists_export_template("bb10.zip")) { - valid=false; - err+="No export template found.\nDownload and install export templates.\n"; - } - - String debug_token=EditorSettings::get_singleton()->get("export/blackberry/debug_token"); - - if (!FileAccess::exists(debug_token)) { - valid=false; - err+="No debug token set, will not be able to test on device.\n"; - } - - - if (custom_package!="" && !FileAccess::exists(custom_package)) { - valid=false; - err+="Custom release package not found.\n"; - } - - if (r_error) - *r_error=err; - - return valid; -} - - -EditorExportPlatformBB10::~EditorExportPlatformBB10() { - - quit_request=true; - Thread::wait_to_finish(device_thread); - memdelete(device_lock); - memdelete(device_thread); -} - -#endif -void register_bb10_exporter() { -#if 0 - EDITOR_DEF("export/blackberry/host_tools",""); - EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"export/blackberry/host_tools",PROPERTY_HINT_GLOBAL_DIR)); - EDITOR_DEF("export/blackberry/debug_token",""); - EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"export/blackberry/debug_token",PROPERTY_HINT_GLOBAL_FILE,"bar")); - EDITOR_DEF("export/blackberry/device_1/host",""); - EDITOR_DEF("export/blackberry/device_1/password",""); - EDITOR_DEF("export/blackberry/device_2/host",""); - EDITOR_DEF("export/blackberry/device_2/password",""); - EDITOR_DEF("export/blackberry/device_3/host",""); - EDITOR_DEF("export/blackberry/device_3/password",""); - EDITOR_DEF("export/blackberry/device_4/host",""); - EDITOR_DEF("export/blackberry/device_4/password",""); - EDITOR_DEF("export/blackberry/device_5/host",""); - EDITOR_DEF("export/blackberry/device_5/password",""); - - Ref<EditorExportPlatformBB10> exporter = Ref<EditorExportPlatformBB10>( memnew(EditorExportPlatformBB10) ); - EditorImportExport::get_singleton()->add_export_platform(exporter); - -#endif -} diff --git a/platform/bb10/export/export.h b/platform/bb10/export/export.h deleted file mode 100644 index 7939754bfa..0000000000 --- a/platform/bb10/export/export.h +++ /dev/null @@ -1,30 +0,0 @@ -/*************************************************************************/ -/* export.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -void register_bb10_exporter(); diff --git a/platform/bb10/godot_bb10.cpp b/platform/bb10/godot_bb10.cpp deleted file mode 100644 index 4d382ddd15..0000000000 --- a/platform/bb10/godot_bb10.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/*************************************************************************/ -/* godot_bb10.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "main/main.h" -#include "os_bb10.h" - -#include <unistd.h> - -int main(int argc, char *argv[]) { - - OSBB10 os; - - Error err = Main::setup(argv[0], argc - 1, &argv[1]); - if (err != OK) - return 255; - - if (Main::start()) - os.run(); // it is actually the OS that decides how to run - Main::cleanup(); - - return os.get_exit_code(); -} diff --git a/platform/bb10/logo.png b/platform/bb10/logo.png Binary files differdeleted file mode 100644 index abf0d2cc69..0000000000 --- a/platform/bb10/logo.png +++ /dev/null diff --git a/platform/bb10/os_bb10.cpp b/platform/bb10/os_bb10.cpp deleted file mode 100644 index b571d1640c..0000000000 --- a/platform/bb10/os_bb10.cpp +++ /dev/null @@ -1,608 +0,0 @@ -/*************************************************************************/ -/* os_bb10.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "os_bb10.h" - -#include "bbutil.h" -#include "core/global_config.h" -#include "core/os/dir_access.h" -#include "core/os/keyboard.h" -#include "drivers/gles2/rasterizer_gles2.h" -#include "main/main.h" -#include "servers/visual/visual_server_raster.h" - -#include <assert.h> -#include <bps/accelerometer.h> -#include <bps/audiodevice.h> -#include <bps/bps.h> -#include <bps/navigator.h> -#include <bps/orientation.h> -#include <bps/screen.h> -#include <bps/virtualkeyboard.h> -#include <stdbool.h> -#include <stdlib.h> - -#ifdef BB10_SCORELOOP_ENABLED -#include "modules/scoreloop/scoreloop_bb10.h" -#endif - -static char launch_dir[512]; -char *launch_dir_ptr; - -int OSBB10::get_video_driver_count() const { - - return 1; -} -const char *OSBB10::get_video_driver_name(int p_driver) const { - - return "GLES2"; -} - -OS::VideoMode OSBB10::get_default_video_mode() const { - - return OS::VideoMode(); -} - -int OSBB10::get_audio_driver_count() const { - - return 1; -} -const char *OSBB10::get_audio_driver_name(int p_driver) const { - - return "BB10"; -} - -void OSBB10::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) { - - data_dir = getenv("HOME"); - - //Create a screen context that will be used to create an EGL surface to to receive libscreen events - screen_create_context(&screen_cxt, 0); - - //Initialize BPS library - bps_initialize(); - - //Use utility code to initialize EGL for 2D rendering with GL ES 1.1 - enum RENDERING_API api = GL_ES_2; -#ifdef BB10_LGLES_OVERRIDE - api = GL_ES_1; -#endif - if (EXIT_SUCCESS != bbutil_init(screen_cxt, api)) { - bbutil_terminate(); - screen_destroy_context(screen_cxt); - return; - }; - - EGLint surface_width, surface_height; - - eglQuerySurface(egl_disp, egl_surf, EGL_WIDTH, &surface_width); - eglQuerySurface(egl_disp, egl_surf, EGL_HEIGHT, &surface_height); - printf("screen size: %ix%i\n", surface_width, surface_height); - VideoMode mode; - mode.width = surface_width; - mode.height = surface_height; - mode.fullscreen = true; - mode.resizable = false; - set_video_mode(mode); - - //Signal BPS library that navigator and screen events will be requested - screen_request_events(screen_cxt); - navigator_request_events(0); - virtualkeyboard_request_events(0); - audiodevice_request_events(0); - -#ifdef DEBUG_ENABLED - bps_set_verbosity(3); -#endif - - accel_supported = accelerometer_is_supported(); - if (accel_supported) - accelerometer_set_update_frequency(FREQ_40_HZ); - pitch = 0; - roll = 0; - -#ifdef BB10_LGLES_OVERRIDE - rasterizer = memnew(RasterizerGLES1(false)); -#else - rasterizer = memnew(RasterizerGLES2(false, false)); -#endif - - visual_server = memnew(VisualServerRaster(rasterizer)); - visual_server->init(); - visual_server->cursor_set_visible(false, 0); - - audio_driver = memnew(AudioDriverBB10); - audio_driver->set_singleton(); - audio_driver->init(NULL); - - physics_server = memnew(PhysicsServerSW); - physics_server->init(); - physics_2d_server = memnew(Physics2DServerSW); - physics_2d_server->init(); - - input = memnew(InputDefault); - - power_manager = memnew(PowerBB10); - -#ifdef PAYMENT_SERVICE_ENABLED - payment_service = memnew(PaymentService); - Globals::get_singleton()->add_singleton(Globals::Singleton("InAppStore", payment_service)); -#endif -} - -void OSBB10::set_main_loop(MainLoop *p_main_loop) { - - input->set_main_loop(p_main_loop); - main_loop = p_main_loop; -} - -void OSBB10::delete_main_loop() { - - memdelete(main_loop); - main_loop = NULL; -} - -void OSBB10::finalize() { - - if (main_loop) - memdelete(main_loop); - main_loop = NULL; - - /* - if (debugger_connection_console) { - memdelete(debugger_connection_console); - } - */ - - visual_server->finish(); - memdelete(visual_server); - memdelete(rasterizer); - - physics_server->finish(); - memdelete(physics_server); - - physics_2d_server->finish(); - memdelete(physics_2d_server); - -#ifdef PAYMENT_SERVICE_ENABLED - memdelete(payment_service); -#endif - - memdelete(input); - - bbutil_terminate(); - screen_destroy_context(screen_cxt); - - bps_shutdown(); -} - -void OSBB10::set_mouse_show(bool p_show) { - - //android has no mouse... -} - -void OSBB10::set_mouse_grab(bool p_grab) { - - //it really has no mouse...! -} - -bool OSBB10::is_mouse_grab_enabled() const { - - //*sigh* technology has evolved so much since i was a kid.. - return false; -} -Point2 OSBB10::get_mouse_position() const { - - return Point2(); -} -int OSBB10::get_mouse_button_state() const { - - return 0; -} -void OSBB10::set_window_title(const String &p_title) { -} - -//interesting byt not yet -//void set_clipboard(const String& p_text); -//String get_clipboard() const; - -void OSBB10::set_video_mode(const VideoMode &p_video_mode, int p_screen) { - - default_videomode = p_video_mode; -} - -OS::VideoMode OSBB10::get_video_mode(int p_screen) const { - - return default_videomode; -} -void OSBB10::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) const { - - p_list->push_back(default_videomode); -} - -String OSBB10::get_name() { - - return "BlackBerry 10"; -} - -MainLoop *OSBB10::get_main_loop() const { - - return main_loop; -} - -bool OSBB10::can_draw() const { - - return !minimized; -} - -void OSBB10::set_cursor_shape(CursorShape p_shape) { - - //android really really really has no mouse.. how amazing.. -} - -void OSBB10::handle_screen_event(bps_event_t *event) { - - screen_event_t screen_event = screen_event_get_event(event); - - int screen_val; - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TYPE, &screen_val); - - int pos[2]; - - switch (screen_val) { - case SCREEN_EVENT_MTOUCH_TOUCH: - case SCREEN_EVENT_MTOUCH_RELEASE: { - - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_POSITION, pos); - - InputEvent ievent; - ievent.type = InputEvent::SCREEN_TOUCH; - ievent.device = 0; - ievent.screen_touch.pressed = (screen_val == SCREEN_EVENT_MTOUCH_TOUCH); - ievent.screen_touch.x = pos[0]; - ievent.screen_touch.y = pos[1]; - Point2 mpos(ievent.screen_touch.x, ievent.screen_touch.y); - - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TOUCH_ID, &pos[0]); - ievent.screen_touch.index = pos[0]; - - last_touch_x[pos[0]] = ievent.screen_touch.x; - last_touch_y[pos[0]] = ievent.screen_touch.y; - - input->parse_input_event(ievent); - - if (ievent.screen_touch.index == 0) { - - InputEvent ievent; - ievent.type = InputEvent::MOUSE_BUTTON; - ievent.device = 0; - ievent.mouse_button.pressed = (screen_val == SCREEN_EVENT_MTOUCH_TOUCH); - ievent.mouse_button.button_index = BUTTON_LEFT; - ievent.mouse_button.doubleclick = 0; - ievent.mouse_button.x = ievent.mouse_button.global_x = mpos.x; - ievent.mouse_button.y = ievent.mouse_button.global_y = mpos.y; - input->parse_input_event(ievent); - }; - - } break; - case SCREEN_EVENT_MTOUCH_MOVE: { - - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_POSITION, pos); - - InputEvent ievent; - ievent.type = InputEvent::SCREEN_DRAG; - ievent.device = 0; - ievent.screen_drag.x = pos[0]; - ievent.screen_drag.y = pos[1]; - - /* - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_SOURCE_POSITION, pos); - ievent.screen_drag.relative_x = ievent.screen_drag.x - pos[0]; - ievent.screen_drag.relative_y = ievent.screen_drag.y - pos[1]; - */ - - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_TOUCH_ID, &pos[0]); - ievent.screen_drag.index = pos[0]; - - ievent.screen_drag.relative_x = ievent.screen_drag.x - last_touch_x[ievent.screen_drag.index]; - ievent.screen_drag.relative_y = ievent.screen_drag.y - last_touch_y[ievent.screen_drag.index]; - - last_touch_x[ievent.screen_drag.index] = ievent.screen_drag.x; - last_touch_y[ievent.screen_drag.index] = ievent.screen_drag.y; - - Point2 mpos(ievent.screen_drag.x, ievent.screen_drag.y); - Point2 mrel(ievent.screen_drag.relative_x, ievent.screen_drag.relative_y); - - input->parse_input_event(ievent); - - if (ievent.screen_touch.index == 0) { - - InputEvent ievent; - ievent.type = InputEvent::MOUSE_MOTION; - ievent.device = 0; - ievent.mouse_motion.x = ievent.mouse_motion.global_x = mpos.x; - ievent.mouse_motion.y = ievent.mouse_motion.global_y = mpos.y; - input->set_mouse_position(Point2(ievent.mouse_motion.x, ievent.mouse_motion.y)); - ievent.mouse_motion.speed_x = input->get_last_mouse_speed().x; - ievent.mouse_motion.speed_y = input->get_last_mouse_speed().y; - ievent.mouse_motion.relative_x = mrel.x; - ievent.mouse_motion.relative_y = mrel.y; - ievent.mouse_motion.button_mask = 1; // pressed - - input->parse_input_event(ievent); - }; - } break; - - case SCREEN_EVENT_KEYBOARD: { - - InputEvent ievent; - ievent.type = InputEvent::KEY; - ievent.device = 0; - int val = 0; - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_SCAN, &val); - ievent.key.scancode = val; - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_SYM, &val); - ievent.key.unicode = val; - if (val == 61448) { - ievent.key.scancode = KEY_BACKSPACE; - ievent.key.unicode = KEY_BACKSPACE; - }; - if (val == 61453) { - ievent.key.scancode = KEY_ENTER; - ievent.key.unicode = KEY_ENTER; - }; - - int flags; - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_FLAGS, &flags); - ievent.key.pressed = flags & 1; // bit 1 is pressed apparently - - int mod; - screen_get_event_property_iv(screen_event, SCREEN_PROPERTY_KEY_MODIFIERS, &mod); - - input->parse_input_event(ievent); - } break; - - default: - break; - } -}; - -void OSBB10::handle_accelerometer() { - - if (!accel_supported) - return; - - if (!fullscreen) - return; - - double force_x, force_y, force_z; - accelerometer_read_forces(&force_x, &force_y, &force_z); - Vector3 accel = Vector3(force_x, flip_accelerometer ? force_y : -force_y, force_z); - input->set_accelerometer(accel); - // rotate 90 degrees - //input->set_accelerometer(Vector3(force_y, flip_accelerometer?force_x:(-force_x), force_z)); -}; - -void OSBB10::_resize(bps_event_t *event) { - - int angle = navigator_event_get_orientation_angle(event); - bbutil_rotate_screen_surface(angle); - - EGLint surface_width, surface_height; - eglQuerySurface(egl_disp, egl_surf, EGL_WIDTH, &surface_width); - eglQuerySurface(egl_disp, egl_surf, EGL_HEIGHT, &surface_height); - - VideoMode mode; - mode.width = surface_width; - mode.height = surface_height; - mode.fullscreen = true; - mode.resizable = false; - set_video_mode(mode); -}; - -void OSBB10::process_events() { - - handle_accelerometer(); - - bps_event_t *event = NULL; - - do { - int rc = bps_get_event(&event, 0); - assert(rc == BPS_SUCCESS); - - if (!event) break; - -#ifdef BB10_SCORELOOP_ENABLED - ScoreloopBB10 *sc = Globals::get_singleton()->get_singleton_object("Scoreloop")->cast_to<ScoreloopBB10>(); - if (sc->handle_event(event)) - continue; -#endif - -#ifdef PAYMENT_SERVICE_ENABLED - if (payment_service->handle_event(event)) - continue; -#endif - - int domain = bps_event_get_domain(event); - if (domain == screen_get_domain()) { - - handle_screen_event(event); - - } else if (domain == navigator_get_domain()) { - - if (NAVIGATOR_EXIT == bps_event_get_code(event)) { - if (main_loop) - main_loop->notification(MainLoop::NOTIFICATION_WM_QUIT_REQUEST); - bps_event_destroy(event); - exit(0); - return; - /* - } else if (bps_event_get_code(event) == NAVIGATOR_ORIENTATION_CHECK) { - - int angle = navigator_event_get_orientation_angle(event); - navigator_orientation_check_response(event, false); - - } else if (bps_event_get_code(event) == NAVIGATOR_ORIENTATION) { - - _resize(event); - */ - } else if (bps_event_get_code(event) == NAVIGATOR_WINDOW_STATE) { - - int state = navigator_event_get_window_state(event); - bool was_fullscreen = fullscreen; - minimized = state == NAVIGATOR_WINDOW_INVISIBLE; - fullscreen = state == NAVIGATOR_WINDOW_FULLSCREEN; - set_low_processor_usage_mode(!fullscreen); - if (fullscreen != was_fullscreen) { - if (fullscreen) { - audio_server->set_fx_global_volume_scale(fullscreen_mixer_volume); - audio_server->set_stream_global_volume_scale(fullscreen_stream_volume); - } else { - fullscreen_mixer_volume = audio_server->get_fx_global_volume_scale(); - fullscreen_stream_volume = audio_server->get_stream_global_volume_scale(); - audio_server->set_fx_global_volume_scale(0); - audio_server->set_stream_global_volume_scale(0); - }; - }; - }; - } else if (domain == audiodevice_get_domain()) { - - const char *audiodevice_path = audiodevice_event_get_path(event); - printf("************* got audiodevice event, path %s\n", audiodevice_path); - audio_driver->finish(); - audio_driver->init(audiodevice_path); - audio_driver->start(); - }; - - //bps_event_destroy(event); - } while (event); -}; - -bool OSBB10::has_virtual_keyboard() const { - - return true; -}; - -void OSBB10::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect) { - - virtualkeyboard_show(); -}; - -void OSBB10::hide_virtual_keyboard() { - - virtualkeyboard_hide(); -}; - -void OSBB10::run() { - - if (!main_loop) - return; - - main_loop->init(); - - int flip = bbutil_is_flipped(); - int rot = bbutil_get_rotation(); - flip_accelerometer = rot == 90; - printf("**************** rot is %i, flip %i\n", rot, (int)flip_accelerometer); - /* - orientation_direction_t orientation; - int angle; - orientation_get(&orientation, &angle); - printf("******************** orientation %i, %i, %i\n", orientation, ORIENTATION_BOTTOM_UP, ORIENTATION_TOP_UP); - if (orientation == ORIENTATION_BOTTOM_UP) { - flip_accelerometer = true; - }; - */ - - while (true) { - - process_events(); // get rid of pending events - if (Main::iteration() == true) - break; - bbutil_swap(); - //#ifdef DEBUG_ENABLED - fflush(stdout); - //#endif - }; - - main_loop->finish(); -}; - -bool OSBB10::has_touchscreen_ui_hint() const { - - return true; -} - -Error OSBB10::shell_open(String p_uri) { - - char *msg = NULL; - int ret = navigator_invoke(p_uri.utf8().get_data(), &msg); - - return ret == BPS_SUCCESS ? OK : FAILED; -}; - -String OSBB10::get_data_dir() const { - - return data_dir; -}; - -Size2 OSBB10::get_window_size() const { - return Vector2(default_videomode.width, default_videomode.height); -} - -PowerState OSBB10::get_power_state() { - return power_manager->get_power_state(); -} - -int OSBB10::get_power_seconds_left() { - return power_manager->get_power_seconds_left(); -} - -int OSBB10::get_power_percent_left() { - return power_manager->get_power_percent_left(); -} - -OSBB10::OSBB10() { - - main_loop = NULL; - minimized = false; - fullscreen = true; - flip_accelerometer = true; - fullscreen_mixer_volume = 1; - fullscreen_stream_volume = 1; - - printf("godot bb10!\n"); - getcwd(launch_dir, sizeof(launch_dir)); - printf("launch dir %s\n", launch_dir); - chdir("app/native"); - launch_dir_ptr = launch_dir; -} - -OSBB10::~OSBB10() { -} diff --git a/platform/bb10/os_bb10.h b/platform/bb10/os_bb10.h deleted file mode 100644 index 91149b6f68..0000000000 --- a/platform/bb10/os_bb10.h +++ /dev/null @@ -1,153 +0,0 @@ -/*************************************************************************/ -/* os_bb10.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef OS_BB10_H -#define OS_BB10_H - -#include "audio_driver_bb10.h" -#include "drivers/unix/os_unix.h" -#include "main/input_default.h" -#include "os/input.h" -#include "os/main_loop.h" -#include "payment_service.h" -#include "power_bb10.h" -#include "servers/audio_server.h" -#include "servers/physics/physics_server_sw.h" -#include "servers/physics_2d/physics_2d_server_sw.h" -#include "servers/visual/rasterizer.h" - -#include <bps/event.h> -#include <screen/screen.h> -#include <stdint.h> -#include <sys/platform.h> - -class OSBB10 : public OS_Unix { - - screen_context_t screen_cxt; - float fullscreen_mixer_volume; - float fullscreen_stream_volume; - - Rasterizer *rasterizer; - VisualServer *visual_server; - PhysicsServer *physics_server; - Physics2DServer *physics_2d_server; - AudioDriverBB10 *audio_driver; - PowerBB10 *power_manager; - -#ifdef PAYMENT_SERVICE_ENABLED - PaymentService *payment_service; -#endif - - VideoMode default_videomode; - MainLoop *main_loop; - - void process_events(); - - void _resize(bps_event_t *event); - void handle_screen_event(bps_event_t *event); - void handle_accelerometer(); - - int last_touch_x[16]; - int last_touch_y[16]; - - bool accel_supported; - float pitch; - float roll; - - bool minimized; - bool fullscreen; - bool flip_accelerometer; - String data_dir; - - InputDefault *input; - -public: - // functions used by main to initialize/deintialize the OS - virtual int get_video_driver_count() const; - virtual const char *get_video_driver_name(int p_driver) const; - - virtual VideoMode get_default_video_mode() const; - - virtual String get_data_dir() const; - - virtual int get_audio_driver_count() const; - virtual const char *get_audio_driver_name(int p_driver) const; - - virtual void initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver); - - virtual void set_main_loop(MainLoop *p_main_loop); - virtual void delete_main_loop(); - - virtual void finalize(); - - typedef int64_t ProcessID; - - static OS *get_singleton(); - - virtual void set_mouse_show(bool p_show); - virtual void set_mouse_grab(bool p_grab); - virtual bool is_mouse_grab_enabled() const; - virtual Point2 get_mouse_position() const; - virtual int get_mouse_button_state() const; - virtual void set_window_title(const String &p_title); - - //virtual void set_clipboard(const String& p_text); - //virtual String get_clipboard() const; - - virtual bool has_virtual_keyboard() const; - virtual void show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect); - virtual void hide_virtual_keyboard(); - - virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0); - virtual VideoMode get_video_mode(int p_screen = 0) const; - virtual void get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen = 0) const; - - virtual Size2 get_window_size() const; - virtual String get_name(); - virtual MainLoop *get_main_loop() const; - - virtual bool can_draw() const; - - virtual void set_cursor_shape(CursorShape p_shape); - - virtual bool has_touchscreen_ui_hint() const; - - virtual Error shell_open(String p_uri); - - void run(); - - virtual PowerState get_power_state(); - virtual int get_power_seconds_left(); - virtual int get_power_percent_left(); - - OSBB10(); - ~OSBB10(); -}; - -#endif diff --git a/platform/bb10/payment_service.cpp b/platform/bb10/payment_service.cpp deleted file mode 100644 index 353845583f..0000000000 --- a/platform/bb10/payment_service.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/*************************************************************************/ -/* payment_service.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifdef PAYMENT_SERVICE_ENABLED - -#include "payment_service.h" - -#include "bbutil.h" -#include <errno.h> -#include <string.h> -#include <unistd.h> -extern char *launch_dir_ptr; - -void PaymentService::_bind_methods() { - - ClassDB::bind_method(D_METHOD("request_product_info"), &PaymentService::request_product_info); - ClassDB::bind_method(D_METHOD("purchase"), &PaymentService::purchase); - - ClassDB::bind_method(D_METHOD("get_pending_event_count"), &PaymentService::get_pending_event_count); - ClassDB::bind_method(D_METHOD("pop_pending_event"), &PaymentService::pop_pending_event); -}; - -Error PaymentService::request_product_info(Variant p_params) { - - return ERR_UNAVAILABLE; -}; - -Error PaymentService::purchase(Variant p_params) { - - Dictionary params = p_params; - ERR_FAIL_COND_V((!params.has("product_id")) && (!params.has("product_sku")), ERR_INVALID_PARAMETER); - - char *id = NULL; - char *sku = NULL; - - CharString p_id = params.has("product_id") ? String(params["product_id"]).ascii() : CharString(); - CharString p_sku = params.has("product_sku") ? String(params["product_sku"]).ascii() : CharString(); - unsigned int request_id; - chdir(launch_dir_ptr); - int ret = paymentservice_purchase_request(params.has("product_sku") ? NULL : p_id.get_data(), - params.has("product_sku") ? p_sku.get_data() : NULL, - NULL, NULL, NULL, NULL, get_window_group_id(), &request_id); - chdir("app/native"); - - if (ret != BPS_SUCCESS) { - int eret = errno; - printf("purchase error %i, %x, %i, %x\n", ret, ret, eret, eret); - ERR_FAIL_V((Error)eret); - return (Error)eret; - }; - return OK; -}; - -bool PaymentService::handle_event(bps_event_t *p_event) { - - if (bps_event_get_domain(p_event) != paymentservice_get_domain()) { - return false; - }; - - Dictionary dict; - int res = paymentservice_event_get_response_code(p_event); - if (res == SUCCESS_RESPONSE) { - dict["result"] = "ok"; - - res = bps_event_get_code(p_event); - if (res == PURCHASE_RESPONSE) { - dict["type"] = "purchase"; - const char *pid = paymentservice_event_get_digital_good_id(p_event, 0); - dict["product_id"] = String(pid ? pid : ""); - }; - - } else { - const char *desc = paymentservice_event_get_error_text(p_event); - if (strcmp(desc, "alreadyPurchased") == 0) { - dict["result"] = "ok"; - } else { - dict["result"] = "error"; - dict["error_description"] = paymentservice_event_get_error_text(p_event); - dict["error_code"] = paymentservice_event_get_error_id(p_event); - printf("error code is %i\n", paymentservice_event_get_error_id(p_event)); - printf("error description is %s\n", paymentservice_event_get_error_text(p_event)); - }; - dict["product_id"] = ""; - }; - - res = bps_event_get_code(p_event); - if (res == PURCHASE_RESPONSE) { - dict["type"] = "purchase"; - }; - - printf("********** adding event with result %ls\n", String(dict["result"]).c_str()); - pending_events.push_back(dict); - - return true; -}; - -int PaymentService::get_pending_event_count() { - return pending_events.size(); -}; - -Variant PaymentService::pop_pending_event() { - - Variant front = pending_events.front()->get(); - pending_events.pop_front(); - - return front; -}; - -PaymentService::PaymentService() { - - paymentservice_request_events(0); -#ifdef DEBUG_ENABLED - paymentservice_set_connection_mode(true); -#else - paymentservice_set_connection_mode(false); -#endif -}; - -PaymentService::~PaymentService(){ - -}; - -#endif diff --git a/platform/bb10/platform_config.h b/platform/bb10/platform_config.h deleted file mode 100644 index 48bcadcc29..0000000000 --- a/platform/bb10/platform_config.h +++ /dev/null @@ -1,30 +0,0 @@ -/*************************************************************************/ -/* platform_config.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include <alloca.h> diff --git a/platform/bb10/power_bb10.cpp b/platform/bb10/power_bb10.cpp deleted file mode 100644 index a683b61376..0000000000 --- a/platform/bb10/power_bb10.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/*************************************************************************/ -/* power_bb10.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "power_bb10.h" - -#include "core/error_macros.h" - -bool PowerBB10::UpdatePowerInfo() { - - return false; -} - -PowerState PowerBB10::get_power_state() { - if (UpdatePowerInfo()) { - return power_state; - } else { - WARN_PRINT("Power management is not implemented on this platform, defaulting to POWERSTATE_UNKNOWN"); - return POWERSTATE_UNKNOWN; - } -} - -int PowerBB10::get_power_seconds_left() { - if (UpdatePowerInfo()) { - return nsecs_left; - } else { - WARN_PRINT("Power management is not implemented on this platform, defaulting to -1"); - return -1; - } -} - -int PowerBB10::get_power_percent_left() { - if (UpdatePowerInfo()) { - return percent_left; - } else { - WARN_PRINT("Power management is not implemented on this platform, defaulting to -1"); - return -1; - } -} - -PowerBB10::PowerBB10() - : nsecs_left(-1), percent_left(-1), power_state(POWERSTATE_UNKNOWN) { -} - -PowerBB10::~PowerBB10() { -} diff --git a/platform/bb10/power_bb10.h b/platform/bb10/power_bb10.h deleted file mode 100644 index c5c18d5f69..0000000000 --- a/platform/bb10/power_bb10.h +++ /dev/null @@ -1,51 +0,0 @@ -/*************************************************************************/ -/* power_bb10.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef PLATFORM_BB10_POWER_BB10_H_ -#define PLATFORM_BB10_POWER_BB10_H_ - -class PowerBB10 { -private: - int nsecs_left; - int percent_left; - PowerState power_state; - - bool UpdatePowerInfo(); - -public: - PowerBB10(); - virtual ~PowerBB10(); - - PowerState get_power_state(); - int get_power_seconds_left(); - int get_power_percent_left(); -}; - -#endif /* PLATFORM_BB10_POWER_BB10_H_ */ diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm index e075941d36..5dc0fb08b1 100644 --- a/platform/iphone/app_delegate.mm +++ b/platform/iphone/app_delegate.mm @@ -49,6 +49,8 @@ #import <Parse/Parse.h> #endif +#import "GameController/GameController.h" + #define kFilteringFactor 0.1 #define kRenderingFrequency 60 #define kAccelerometerFrequency 100.0 // Hz @@ -89,6 +91,282 @@ static ViewController *mainViewController = nil; return mainViewController; } +NSMutableDictionary *ios_joysticks = nil; + +- (GCControllerPlayerIndex)getFreePlayerIndex { + bool have_player_1 = false; + bool have_player_2 = false; + bool have_player_3 = false; + bool have_player_4 = false; + + if (ios_joysticks == nil) { + NSArray *keys = [ios_joysticks allKeys]; + for (NSNumber *key in keys) { + GCController *controller = [ios_joysticks objectForKey:key]; + if (controller.playerIndex == GCControllerPlayerIndex1) { + have_player_1 = true; + } else if (controller.playerIndex == GCControllerPlayerIndex2) { + have_player_2 = true; + } else if (controller.playerIndex == GCControllerPlayerIndex3) { + have_player_3 = true; + } else if (controller.playerIndex == GCControllerPlayerIndex4) { + have_player_4 = true; + }; + }; + }; + + if (!have_player_1) { + return GCControllerPlayerIndex1; + } else if (!have_player_2) { + return GCControllerPlayerIndex2; + } else if (!have_player_3) { + return GCControllerPlayerIndex3; + } else if (!have_player_4) { + return GCControllerPlayerIndex4; + } else { + return GCControllerPlayerIndexUnset; + }; +}; + +- (void)controllerWasConnected:(NSNotification *)notification { + // create our dictionary if we don't have one yet + if (ios_joysticks == nil) { + ios_joysticks = [[NSMutableDictionary alloc] init]; + }; + + // get our controller + GCController *controller = (GCController *)notification.object; + if (controller == nil) { + printf("Couldn't retrieve new controller\n"); + } else if ([[ios_joysticks allKeysForObject:controller] count] != 0) { + printf("Controller is already registered\n"); + } else { + // get a new id for our controller + int joy_id = OSIPhone::get_singleton()->get_unused_joy_id(); + if (joy_id != -1) { + // assign our player index + if (controller.playerIndex == GCControllerPlayerIndexUnset) { + controller.playerIndex = [self getFreePlayerIndex]; + }; + + // tell Godot about our new controller + OSIPhone::get_singleton()->joy_connection_changed( + joy_id, true, [controller.vendorName UTF8String]); + + // add it to our dictionary, this will retain our controllers + [ios_joysticks setObject:controller + forKey:[NSNumber numberWithInt:joy_id]]; + + // set our input handler + [self setControllerInputHandler:controller]; + } else { + printf("Couldn't retrieve new joy id\n"); + }; + }; +}; + +- (void)controllerWasDisconnected:(NSNotification *)notification { + if (ios_joysticks != nil) { + // find our joystick, there should be only one in our dictionary + GCController *controller = (GCController *)notification.object; + NSArray *keys = [ios_joysticks allKeysForObject:controller]; + for (NSNumber *key in keys) { + // tell Godot this joystick is no longer there + int joy_id = [key intValue]; + OSIPhone::get_singleton()->joy_connection_changed(joy_id, false, ""); + + // and remove it from our dictionary + [ios_joysticks removeObjectForKey:key]; + }; + }; +}; + +- (int)getJoyIdForController:(GCController *)controller { + if (ios_joysticks != nil) { + // find our joystick, there should be only one in our dictionary + NSArray *keys = [ios_joysticks allKeysForObject:controller]; + for (NSNumber *key in keys) { + int joy_id = [key intValue]; + return joy_id; + }; + }; + + return -1; +}; + +- (void)setControllerInputHandler:(GCController *)controller { + // Hook in the callback handler for the correct gamepad profile. + // This is a bit of a weird design choice on Apples part. + // You need to select the most capable gamepad profile for the + // gamepad attached. + if (controller.extendedGamepad != nil) { + // The extended gamepad profile has all the input you could possibly find on + // a gamepad but will only be active if your gamepad actually has all of + // these... + controller.extendedGamepad.valueChangedHandler = ^( + GCExtendedGamepad *gamepad, GCControllerElement *element) { + int joy_id = [self getJoyIdForController:controller]; + + if (element == gamepad.buttonA) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0, + gamepad.buttonA.isPressed); + } else if (element == gamepad.buttonB) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_1, + gamepad.buttonB.isPressed); + } else if (element == gamepad.buttonX) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2, + gamepad.buttonX.isPressed); + } else if (element == gamepad.buttonY) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_3, + gamepad.buttonY.isPressed); + } else if (element == gamepad.leftShoulder) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_L, + gamepad.leftShoulder.isPressed); + } else if (element == gamepad.rightShoulder) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_R, + gamepad.rightShoulder.isPressed); + } else if (element == gamepad.leftTrigger) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_L2, + gamepad.leftTrigger.isPressed); + } else if (element == gamepad.rightTrigger) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_R2, + gamepad.rightTrigger.isPressed); + } else if (element == gamepad.dpad) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP, + gamepad.dpad.up.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN, + gamepad.dpad.down.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT, + gamepad.dpad.left.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT, + gamepad.dpad.right.isPressed); + }; + + InputDefault::JoyAxis jx; + jx.min = -1; + if (element == gamepad.leftThumbstick) { + jx.value = gamepad.leftThumbstick.xAxis.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_LX, jx); + jx.value = -gamepad.leftThumbstick.yAxis.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_LY, jx); + } else if (element == gamepad.rightThumbstick) { + jx.value = gamepad.rightThumbstick.xAxis.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_RX, jx); + jx.value = -gamepad.rightThumbstick.yAxis.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_RY, jx); + } else if (element == gamepad.leftTrigger) { + jx.value = gamepad.leftTrigger.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_L2, jx); + } else if (element == gamepad.rightTrigger) { + jx.value = gamepad.rightTrigger.value; + OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_R2, jx); + }; + }; + } else if (controller.gamepad != nil) { + // gamepad is the standard profile with 4 buttons, shoulder buttons and a + // D-pad + controller.gamepad.valueChangedHandler = ^(GCGamepad *gamepad, + GCControllerElement *element) { + int joy_id = [self getJoyIdForController:controller]; + + if (element == gamepad.buttonA) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0, + gamepad.buttonA.isPressed); + } else if (element == gamepad.buttonB) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_1, + gamepad.buttonB.isPressed); + } else if (element == gamepad.buttonX) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2, + gamepad.buttonX.isPressed); + } else if (element == gamepad.buttonY) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_3, + gamepad.buttonY.isPressed); + } else if (element == gamepad.leftShoulder) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_L, + gamepad.leftShoulder.isPressed); + } else if (element == gamepad.rightShoulder) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_R, + gamepad.rightShoulder.isPressed); + } else if (element == gamepad.dpad) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP, + gamepad.dpad.up.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN, + gamepad.dpad.down.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT, + gamepad.dpad.left.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT, + gamepad.dpad.right.isPressed); + }; + }; +#ifdef ADD_MICRO_GAMEPAD // disabling this for now, only available on iOS 9+, + // while we are setting that as the minimum, seems our + // build environment doesn't like it + } else if (controller.microGamepad != nil) { + // micro gamepads were added in OS 9 and feature just 2 buttons and a d-pad + controller.microGamepad.valueChangedHandler = + ^(GCMicroGamepad *gamepad, GCControllerElement *element) { + int joy_id = [self getJoyIdForController:controller]; + + if (element == gamepad.buttonA) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0, + gamepad.buttonA.isPressed); + } else if (element == gamepad.buttonX) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2, + gamepad.buttonX.isPressed); + } else if (element == gamepad.dpad) { + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP, + gamepad.dpad.up.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN, + gamepad.dpad.down.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT, + gamepad.dpad.left.isPressed); + OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT, + gamepad.dpad.right.isPressed); + }; + }; +#endif + }; + + ///@TODO need to add support for controller.motion which gives us access to + /// the orientation of the device (if supported) + + ///@TODO need to add support for controllerPausedHandler which should be a + /// toggle +}; + +- (void)initGameControllers { + // get told when controllers connect, this will be called right away for + // already connected controllers + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(controllerWasConnected:) + name:GCControllerDidConnectNotification + object:nil]; + + // get told when controllers disconnect + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(controllerWasDisconnected:) + name:GCControllerDidDisconnectNotification + object:nil]; +}; + +- (void)deinitGameControllers { + [[NSNotificationCenter defaultCenter] + removeObserver:self + name:GCControllerDidConnectNotification + object:nil]; + [[NSNotificationCenter defaultCenter] + removeObserver:self + name:GCControllerDidDisconnectNotification + object:nil]; + + if (ios_joysticks != nil) { + [ios_joysticks dealloc]; + ios_joysticks = nil; + }; +}; + static int frame_count = 0; - (void)drawView:(GLView *)view; { @@ -97,8 +375,10 @@ static int frame_count = 0; case 0: { int backingWidth; int backingHeight; - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, + GL_RENDERBUFFER_WIDTH_OES, &backingWidth); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, + GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); OS::VideoMode vm; vm.fullscreen = true; @@ -112,25 +392,35 @@ static int frame_count = 0; }; ++frame_count; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, + NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; - //NSString *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; - OSIPhone::get_singleton()->set_data_dir(String::utf8([documentsDirectory UTF8String])); + // NSString *documentsDirectory = [[[NSFileManager defaultManager] + // URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] + // lastObject]; + OSIPhone::get_singleton()->set_data_dir( + String::utf8([documentsDirectory UTF8String])); - NSString *locale_code = [[[NSLocale preferredLanguages] objectAtIndex:0] substringToIndex:2]; - OSIPhone::get_singleton()->set_locale(String::utf8([locale_code UTF8String])); + NSString *locale_code = + [[[NSLocale preferredLanguages] objectAtIndex:0] substringToIndex:2]; + OSIPhone::get_singleton()->set_locale( + String::utf8([locale_code UTF8String])); NSString *uuid; - if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { + if ([[UIDevice currentDevice] + respondsToSelector:@selector(identifierForVendor)]) { uuid = [UIDevice currentDevice].identifierForVendor.UUIDString; } else { // before iOS 6, so just generate an identifier and store it - uuid = [[NSUserDefaults standardUserDefaults] objectForKey:@"identiferForVendor"]; + uuid = [[NSUserDefaults standardUserDefaults] + objectForKey:@"identiferForVendor"]; if (!uuid) { CFUUIDRef cfuuid = CFUUIDCreate(NULL); uuid = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, cfuuid); CFRelease(cfuuid); - [[NSUserDefaults standardUserDefaults] setObject:uuid forKey:@"identifierForVendor"]; + [[NSUserDefaults standardUserDefaults] + setObject:uuid + forKey:@"identifierForVendor"]; } } @@ -138,9 +428,9 @@ static int frame_count = 0; }; break; /* - case 1: { - ++frame_count; - }; break; + case 1: { + ++frame_count; + }; break; */ case 1: { @@ -173,9 +463,9 @@ static int frame_count = 0; }; break; /* - case 3: { - ++frame_count; - }; break; + case 3: { + ++frame_count; + }; break; */ case 2: { @@ -186,53 +476,85 @@ static int frame_count = 0; default: { if (OSIPhone::get_singleton()) { - //OSIPhone::get_singleton()->update_accelerometer(accel[0], accel[1], accel[2]); + // OSIPhone::get_singleton()->update_accelerometer(accel[0], accel[1], + // accel[2]); if (motionInitialised) { - // Just using polling approach for now, we can set this up so it sends data to us in intervals, might be better. - // See Apple reference pages for more details: + // Just using polling approach for now, we can set this up so it sends + // data to us in intervals, might be better. See Apple reference pages + // for more details: // https://developer.apple.com/reference/coremotion/cmmotionmanager?language=objc - // Apple splits our accelerometer date into a gravity and user movement component. We add them back together + // Apple splits our accelerometer date into a gravity and user movement + // component. We add them back together CMAcceleration gravity = motionManager.deviceMotion.gravity; - CMAcceleration acceleration = motionManager.deviceMotion.userAcceleration; + CMAcceleration acceleration = + motionManager.deviceMotion.userAcceleration; - ///@TODO We don't seem to be getting data here, is my device broken or is this code incorrect? - CMMagneticField magnetic = motionManager.deviceMotion.magneticField.field; + ///@TODO We don't seem to be getting data here, is my device broken or + /// is this code incorrect? + CMMagneticField magnetic = + motionManager.deviceMotion.magneticField.field; - ///@TODO we can access rotationRate as a CMRotationRate variable (processed date) or CMGyroData (raw data), have to see what works best + ///@TODO we can access rotationRate as a CMRotationRate variable + ///(processed date) or CMGyroData (raw data), have to see what works + /// best CMRotationRate rotation = motionManager.deviceMotion.rotationRate; // Adjust for screen orientation. - // [[UIDevice currentDevice] orientation] changes even if we've fixed our orientation which is not - // a good thing when you're trying to get your user to move the screen in all directions and want consistent output - - ///@TODO Using [[UIApplication sharedApplication] statusBarOrientation] is a bit of a hack. Godot obviously knows the orientation so maybe we + // [[UIDevice currentDevice] orientation] changes even if we've fixed + // our orientation which is not a good thing when you're trying to get + // your user to move the screen in all directions and want consistent + // output + + ///@TODO Using [[UIApplication sharedApplication] statusBarOrientation] + /// is a bit of a hack. Godot obviously knows the orientation so maybe + /// we // can use that instead? (note that left and right seem swapped) switch ([[UIApplication sharedApplication] statusBarOrientation]) { case UIDeviceOrientationLandscapeLeft: { - OSIPhone::get_singleton()->update_gravity(-gravity.y, gravity.x, gravity.z); - OSIPhone::get_singleton()->update_accelerometer(-(acceleration.y + gravity.y), (acceleration.x + gravity.x), acceleration.z + gravity.z); - OSIPhone::get_singleton()->update_magnetometer(-magnetic.y, magnetic.x, magnetic.z); - OSIPhone::get_singleton()->update_gyroscope(-rotation.y, rotation.x, rotation.z); + OSIPhone::get_singleton()->update_gravity(-gravity.y, gravity.x, + gravity.z); + OSIPhone::get_singleton()->update_accelerometer( + -(acceleration.y + gravity.y), (acceleration.x + gravity.x), + acceleration.z + gravity.z); + OSIPhone::get_singleton()->update_magnetometer( + -magnetic.y, magnetic.x, magnetic.z); + OSIPhone::get_singleton()->update_gyroscope(-rotation.y, rotation.x, + rotation.z); }; break; case UIDeviceOrientationLandscapeRight: { - OSIPhone::get_singleton()->update_gravity(gravity.y, -gravity.x, gravity.z); - OSIPhone::get_singleton()->update_accelerometer((acceleration.y + gravity.y), -(acceleration.x + gravity.x), acceleration.z + gravity.z); - OSIPhone::get_singleton()->update_magnetometer(magnetic.y, -magnetic.x, magnetic.z); - OSIPhone::get_singleton()->update_gyroscope(rotation.y, -rotation.x, rotation.z); + OSIPhone::get_singleton()->update_gravity(gravity.y, -gravity.x, + gravity.z); + OSIPhone::get_singleton()->update_accelerometer( + (acceleration.y + gravity.y), -(acceleration.x + gravity.x), + acceleration.z + gravity.z); + OSIPhone::get_singleton()->update_magnetometer( + magnetic.y, -magnetic.x, magnetic.z); + OSIPhone::get_singleton()->update_gyroscope(rotation.y, -rotation.x, + rotation.z); }; break; case UIDeviceOrientationPortraitUpsideDown: { - OSIPhone::get_singleton()->update_gravity(-gravity.x, gravity.y, gravity.z); - OSIPhone::get_singleton()->update_accelerometer(-(acceleration.x + gravity.x), (acceleration.y + gravity.y), acceleration.z + gravity.z); - OSIPhone::get_singleton()->update_magnetometer(-magnetic.x, magnetic.y, magnetic.z); - OSIPhone::get_singleton()->update_gyroscope(-rotation.x, rotation.y, rotation.z); + OSIPhone::get_singleton()->update_gravity(-gravity.x, gravity.y, + gravity.z); + OSIPhone::get_singleton()->update_accelerometer( + -(acceleration.x + gravity.x), (acceleration.y + gravity.y), + acceleration.z + gravity.z); + OSIPhone::get_singleton()->update_magnetometer( + -magnetic.x, magnetic.y, magnetic.z); + OSIPhone::get_singleton()->update_gyroscope(-rotation.x, rotation.y, + rotation.z); }; break; default: { // assume portrait - OSIPhone::get_singleton()->update_gravity(gravity.x, gravity.y, gravity.z); - OSIPhone::get_singleton()->update_accelerometer(acceleration.x + gravity.x, acceleration.y + gravity.y, acceleration.z + gravity.z); - OSIPhone::get_singleton()->update_magnetometer(magnetic.x, magnetic.y, magnetic.z); - OSIPhone::get_singleton()->update_gyroscope(rotation.x, rotation.y, rotation.z); + OSIPhone::get_singleton()->update_gravity(gravity.x, gravity.y, + gravity.z); + OSIPhone::get_singleton()->update_accelerometer( + acceleration.x + gravity.x, acceleration.y + gravity.y, + acceleration.z + gravity.z); + OSIPhone::get_singleton()->update_magnetometer(magnetic.x, magnetic.y, + magnetic.z); + OSIPhone::get_singleton()->update_gyroscope(rotation.x, rotation.y, + rotation.z); }; break; }; } @@ -247,7 +569,8 @@ static int frame_count = 0; - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { printf("****************** did receive memory warning!\n"); - OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_OS_MEMORY_WARNING); + OS::get_singleton()->get_main_loop()->notification( + MainLoop::NOTIFICATION_OS_MEMORY_WARNING); }; - (void)applicationDidFinishLaunching:(UIApplication *)application { @@ -257,25 +580,29 @@ static int frame_count = 0; [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; // disable idle timer - //application.idleTimerDisabled = YES; + // application.idleTimerDisabled = YES; - //Create a full-screen window + // Create a full-screen window window = [[UIWindow alloc] initWithFrame:rect]; - //window.autoresizesSubviews = YES; - //[window setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleWidth]; + // window.autoresizesSubviews = YES; + //[window setAutoresizingMask:UIViewAutoresizingFlexibleWidth | + // UIViewAutoresizingFlexibleWidth]; - //Create the OpenGL ES view and add it to the window + // Create the OpenGL ES view and add it to the window GLView *glView = [[GLView alloc] initWithFrame:rect]; printf("glview is %p\n", glView); //[window addSubview:glView]; glView.delegate = self; - //glView.autoresizesSubviews = YES; - //[glView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleWidth]; + // glView.autoresizesSubviews = YES; + //[glView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | + // UIViewAutoresizingFlexibleWidth]; int backingWidth; int backingHeight; - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, + GL_RENDERBUFFER_WIDTH_OES, &backingWidth); + glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, + GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); iphone_main(backingWidth, backingHeight, gargc, gargv); @@ -284,26 +611,30 @@ static int frame_count = 0; window.rootViewController = view_controller; _set_keep_screen_on(bool(GLOBAL_DEF("display/keep_screen_on", true)) ? YES : NO); - glView.useCADisplayLink = bool(GLOBAL_DEF("display.iOS/use_cadisplaylink", true)) ? YES : NO; + glView.useCADisplayLink = + bool(GLOBAL_DEF("display.iOS/use_cadisplaylink", true)) ? YES : NO; printf("cadisaplylink: %d", glView.useCADisplayLink); glView.animationInterval = 1.0 / kRenderingFrequency; [glView startAnimation]; - //Show the window + // Show the window [window makeKeyAndVisible]; - //Configure and start accelerometer + // Configure and start accelerometer if (!motionInitialised) { motionManager = [[CMMotionManager alloc] init]; if (motionManager.deviceMotionAvailable) { motionManager.deviceMotionUpdateInterval = 1.0 / 70.0; - [motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXMagneticNorthZVertical]; + [motionManager startDeviceMotionUpdatesUsingReferenceFrame: + CMAttitudeReferenceFrameXMagneticNorthZVertical]; motionInitialised = YES; }; }; - //OSIPhone::screen_width = rect.size.width - rect.origin.x; - //OSIPhone::screen_height = rect.size.height - rect.origin.y; + [self initGameControllers]; + + // OSIPhone::screen_width = rect.size.width - rect.origin.x; + // OSIPhone::screen_height = rect.size.height - rect.origin.y; mainViewController = view_controller; @@ -319,16 +650,22 @@ static int frame_count = 0; String adid = GLOBAL_DEF("mobileapptracker/advertiser_id", ""); String convkey = GLOBAL_DEF("mobileapptracker/conversion_key", ""); - NSString *advertiser_id = [NSString stringWithUTF8String:adid.utf8().get_data()]; - NSString *conversion_key = [NSString stringWithUTF8String:convkey.utf8().get_data()]; + NSString *advertiser_id = + [NSString stringWithUTF8String:adid.utf8().get_data()]; + NSString *conversion_key = + [NSString stringWithUTF8String:convkey.utf8().get_data()]; // Account Configuration info - must be set - [MobileAppTracker initializeWithMATAdvertiserId:advertiser_id MATConversionKey:conversion_key]; + [MobileAppTracker initializeWithMATAdvertiserId:advertiser_id + MATConversionKey:conversion_key]; // Used to pass us the IFA, enables highly accurate 1-to-1 attribution. // Required for many advertising networks. - [MobileAppTracker setAppleAdvertisingIdentifier:[[ASIdentifierManager sharedManager] advertisingIdentifier] - advertisingTrackingEnabled:[[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]]; + [MobileAppTracker + setAppleAdvertisingIdentifier:[[ASIdentifierManager sharedManager] + advertisingIdentifier] + advertisingTrackingEnabled:[[ASIdentifierManager sharedManager] + isAdvertisingTrackingEnabled]]; #endif }; @@ -337,6 +674,8 @@ static int frame_count = 0; printf("********************* will terminate\n"); + [self deinitGameControllers]; + if (motionInitialised) { ///@TODO is this the right place to clean this up? [motionManager stopDeviceMotionUpdates]; @@ -353,7 +692,8 @@ static int frame_count = 0; ///@TODO maybe add pause motionManager? and where would we unpause it? if (OS::get_singleton()->get_main_loop()) - OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); + OS::get_singleton()->get_main_loop()->notification( + MainLoop::NOTIFICATION_WM_FOCUS_OUT); [view_controller.view stopAnimation]; if (OS::get_singleton()->native_video_is_playing()) { @@ -363,14 +703,15 @@ static int frame_count = 0; - (void)applicationWillEnterForeground:(UIApplication *)application { printf("********************* did enter foreground\n"); - //OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); + // OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); [view_controller.view startAnimation]; } - (void)applicationWillResignActive:(UIApplication *)application { printf("********************* will resign active\n"); - //OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); - [view_controller.view stopAnimation]; // FIXME: pause seems to be recommended elsewhere + // OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); + [view_controller.view + stopAnimation]; // FIXME: pause seems to be recommended elsewhere } - (void)applicationDidBecomeActive:(UIApplication *)application { @@ -380,9 +721,11 @@ static int frame_count = 0; [MobileAppTracker measureSession]; #endif if (OS::get_singleton()->get_main_loop()) - OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); + OS::get_singleton()->get_main_loop()->notification( + MainLoop::NOTIFICATION_WM_FOCUS_IN); - [view_controller.view startAnimation]; // FIXME: resume seems to be recommended elsewhere + [view_controller.view + startAnimation]; // FIXME: resume seems to be recommended elsewhere if (OSIPhone::get_singleton()->native_video_is_playing()) { OSIPhone::get_singleton()->native_video_unpause(); }; @@ -397,14 +740,17 @@ static int frame_count = 0; } // For 4.2+ support -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation { #ifdef MODULE_PARSE_ENABLED NSLog(@"Handling application openURL"); - return [[FBSDKApplicationDelegate sharedInstance] - application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; + return + [[FBSDKApplicationDelegate sharedInstance] application:application + openURL:url + sourceApplication:sourceApplication + annotation:annotation]; #endif #ifdef MODULE_FACEBOOKSCORER_IOS_ENABLED @@ -414,21 +760,25 @@ static int frame_count = 0; #endif } -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { +- (void)application:(UIApplication *)application + didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { #ifdef MODULE_PARSE_ENABLED // Store the deviceToken in the current installation and save it to Parse. PFInstallation *currentInstallation = [PFInstallation currentInstallation]; - //NSString* token = [[NSString alloc] initWithData:deviceToken encoding:NSUTF8StringEncoding]; + // NSString* token = [[NSString alloc] initWithData:deviceToken + // encoding:NSUTF8StringEncoding]; NSLog(@"Device Token : %@ ", deviceToken); [currentInstallation setDeviceTokenFromData:deviceToken]; [currentInstallation saveInBackground]; #endif } -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { +- (void)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)userInfo { #ifdef MODULE_PARSE_ENABLED [PFPush handlePush:userInfo]; - NSDictionary *aps = [userInfo objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; + NSDictionary *aps = + [userInfo objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSLog(@"Push Notification Payload (app active) %@", aps); diff --git a/platform/iphone/os_iphone.cpp b/platform/iphone/os_iphone.cpp index bc25afabea..0a9d776421 100644 --- a/platform/iphone/os_iphone.cpp +++ b/platform/iphone/os_iphone.cpp @@ -357,6 +357,22 @@ void OSIPhone::update_gyroscope(float p_x, float p_y, float p_z) { input->set_gyroscope(Vector3(p_x, p_y, p_z)); }; +int OSIPhone::get_unused_joy_id() { + return input->get_unused_joy_id(); +}; + +void OSIPhone::joy_connection_changed(int p_idx, bool p_connected, String p_name) { + input->joy_connection_changed(p_idx, p_connected, p_name); +}; + +void OSIPhone::joy_button(int p_device, int p_button, bool p_pressed) { + input->joy_button(p_device, p_button, p_pressed); +}; + +void OSIPhone::joy_axis(int p_device, int p_axis, const InputDefault::JoyAxis &p_value) { + input->joy_axis(p_device, p_axis, p_value); +}; + void OSIPhone::delete_main_loop() { if (main_loop) { diff --git a/platform/iphone/os_iphone.h b/platform/iphone/os_iphone.h index 754dea073f..209bf00788 100644 --- a/platform/iphone/os_iphone.h +++ b/platform/iphone/os_iphone.h @@ -145,6 +145,11 @@ public: void update_magnetometer(float p_x, float p_y, float p_z); void update_gyroscope(float p_x, float p_y, float p_z); + int get_unused_joy_id(); + void joy_connection_changed(int p_idx, bool p_connected, String p_name); + void joy_button(int p_device, int p_button, bool p_pressed); + void joy_axis(int p_device, int p_axis, const InputDefault::JoyAxis &p_value); + static OSIPhone *get_singleton(); virtual void set_mouse_show(bool p_show); diff --git a/platform/javascript/export/export.cpp b/platform/javascript/export/export.cpp index 1a3c5f3e8f..ea388072c5 100644 --- a/platform/javascript/export/export.cpp +++ b/platform/javascript/export/export.cpp @@ -316,7 +316,7 @@ Error EditorExportPlatformJavaScript::run(const Ref<EditorExportPreset> &p_prese EditorExportPlatformJavaScript::EditorExportPlatformJavaScript() { - Image img(_javascript_logo); + Ref<Image> img = memnew(Image(_javascript_logo)); logo.instance(); logo->create_from_image(img); } 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.h b/platform/osx/os_osx.h index 2ecc379a7f..ff02bf0794 100644 --- a/platform/osx/os_osx.h +++ b/platform/osx/os_osx.h @@ -151,7 +151,7 @@ public: virtual Size2 get_window_size() const; - virtual void set_icon(const Image &p_icon); + virtual void set_icon(const Ref<Image> &p_icon); virtual MainLoop *get_main_loop() const; diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index c6c2e6dab1..065506c612 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)); } } @@ -1238,26 +1227,27 @@ void OS_OSX::set_window_title(const String &p_title) { [window_object setTitle:[NSString stringWithUTF8String:p_title.utf8().get_data()]]; } -void OS_OSX::set_icon(const Image &p_icon) { +void OS_OSX::set_icon(const Ref<Image> &p_icon) { - Image img = p_icon; - img.convert(Image::FORMAT_RGBA8); + Ref<Image> img = p_icon; + img = img->duplicate(); + img->convert(Image::FORMAT_RGBA8); NSBitmapImageRep *imgrep = [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL - pixelsWide:p_icon.get_width() - pixelsHigh:p_icon.get_height() + pixelsWide:img->get_width() + pixelsHigh:img->get_height() bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace - bytesPerRow:p_icon.get_width() * 4 + bytesPerRow:img->get_width() * 4 bitsPerPixel:32] autorelease]; ERR_FAIL_COND(imgrep == nil); uint8_t *pixels = [imgrep bitmapData]; - int len = img.get_width() * img.get_height(); - PoolVector<uint8_t> data = img.get_data(); + int len = img->get_width() * img->get_height(); + PoolVector<uint8_t> data = img->get_data(); PoolVector<uint8_t>::Read r = data.read(); /* Premultiply the alpha channel */ @@ -1269,7 +1259,7 @@ void OS_OSX::set_icon(const Image &p_icon) { pixels[i * 4 + 3] = alpha; } - NSImage *nsimg = [[[NSImage alloc] initWithSize:NSMakeSize(img.get_width(), img.get_height())] autorelease]; + NSImage *nsimg = [[[NSImage alloc] initWithSize:NSMakeSize(img->get_width(), img->get_height())] autorelease]; ERR_FAIL_COND(nsimg == nil); [nsimg addRepresentation:imgrep]; @@ -1630,7 +1620,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/os_uwp.cpp b/platform/uwp/os_uwp.cpp index 818b827e83..c68b2ffa33 100644 --- a/platform/uwp/os_uwp.cpp +++ b/platform/uwp/os_uwp.cpp @@ -746,7 +746,7 @@ String OSUWP::get_executable_path() const { return ""; } -void OSUWP::set_icon(const Image &p_icon) { +void OSUWP::set_icon(const Ref<Image> &p_icon) { } bool OSUWP::has_environment(const String &p_var) const { diff --git a/platform/uwp/os_uwp.h b/platform/uwp/os_uwp.h index 7d9e681da1..22602e4564 100644 --- a/platform/uwp/os_uwp.h +++ b/platform/uwp/os_uwp.h @@ -227,7 +227,7 @@ public: virtual String get_clipboard() const; void set_cursor_shape(CursorShape p_shape); - void set_icon(const Image &p_icon); + void set_icon(const Ref<Image> &p_icon); virtual String get_executable_path() const; 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/export/export.cpp b/platform/windows/export/export.cpp index 2d11bfe4d8..3802e7e784 100644 --- a/platform/windows/export/export.cpp +++ b/platform/windows/export/export.cpp @@ -35,7 +35,7 @@ void register_windows_exporter() { Ref<EditorExportPlatformPC> platform; platform.instance(); - Image img(_windows_logo); + Ref<Image> img = memnew(Image(_windows_logo)); Ref<ImageTexture> logo; logo.instance(); logo->create_from_image(img); diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 99b6890913..42597f79c8 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: { @@ -1993,13 +1996,14 @@ String OS_Windows::get_executable_path() const { return s; } -void OS_Windows::set_icon(const Image &p_icon) { +void OS_Windows::set_icon(const Ref<Image> &p_icon) { - Image icon = p_icon; - if (icon.get_format() != Image::FORMAT_RGBA8) - icon.convert(Image::FORMAT_RGBA8); - int w = icon.get_width(); - int h = icon.get_height(); + ERR_FAIL_COND(!p_icon.is_valid()); + Ref<Image> icon = p_icon->duplicate(); + if (icon->get_format() != Image::FORMAT_RGBA8) + icon->convert(Image::FORMAT_RGBA8); + int w = icon->get_width(); + int h = icon->get_height(); /* Create temporary bitmap buffer */ int icon_len = 40 + h * w * 4; @@ -2020,7 +2024,7 @@ void OS_Windows::set_icon(const Image &p_icon) { encode_uint32(0, &icon_bmp[36]); uint8_t *wr = &icon_bmp[40]; - PoolVector<uint8_t>::Read r = icon.get_data().read(); + PoolVector<uint8_t>::Read r = icon->get_data().read(); for (int i = 0; i < h; i++) { diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 87eceafa02..4dd05928df 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -254,7 +254,7 @@ public: virtual String get_clipboard() const; void set_cursor_shape(CursorShape p_shape); - void set_icon(const Image &p_icon); + void set_icon(const Ref<Image> &p_icon); virtual String get_executable_path() const; 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/export/export.cpp b/platform/x11/export/export.cpp index b9ded188bf..d6bad95e5b 100644 --- a/platform/x11/export/export.cpp +++ b/platform/x11/export/export.cpp @@ -37,7 +37,7 @@ void register_x11_exporter() { Ref<EditorExportPlatformPC> platform; platform.instance(); - Image img(_x11_logo); + Ref<Image> img = memnew(Image(_x11_logo)); Ref<ImageTexture> logo; logo.instance(); logo->create_from_image(img); diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 2e2fe3ba8a..59ac1fed96 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -1857,15 +1857,15 @@ void OS_X11::alert(const String &p_alert, const String &p_title) { execute("/usr/bin/xmessage", args, true); } -void OS_X11::set_icon(const Image &p_icon) { +void OS_X11::set_icon(const Ref<Image> &p_icon) { Atom net_wm_icon = XInternAtom(x11_display, "_NET_WM_ICON", False); - if (!p_icon.empty()) { - Image img = p_icon; - img.convert(Image::FORMAT_RGBA8); + if (p_icon.is_valid()) { + Ref<Image> img = p_icon->duplicate(); + img->convert(Image::FORMAT_RGBA8); - int w = img.get_width(); - int h = img.get_height(); + int w = img->get_width(); + int h = img->get_height(); // We're using long to have wordsize (32Bit build -> 32 Bits, 64 Bit build -> 64 Bits Vector<long> pd; @@ -1875,7 +1875,7 @@ void OS_X11::set_icon(const Image &p_icon) { pd[0] = w; pd[1] = h; - PoolVector<uint8_t>::Read r = img.get_data().read(); + PoolVector<uint8_t>::Read r = img->get_data().read(); long *wr = &pd[2]; uint8_t const *pr = r.ptr(); diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index 44994e40ec..7f01f9c617 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -206,7 +206,7 @@ public: virtual int get_mouse_button_state() const; virtual void set_window_title(const String &p_title); - virtual void set_icon(const Image &p_icon); + virtual void set_icon(const Ref<Image> &p_icon); virtual MainLoop *get_main_loop() const; diff --git a/platform/x11/power_x11.cpp b/platform/x11/power_x11.cpp index 3454a6313e..093d24f406 100644 --- a/platform/x11/power_x11.cpp +++ b/platform/x11/power_x11.cpp @@ -28,6 +28,31 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ +/* +Adapted from corresponding SDL 2.0 code. +*/ + +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org> + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + #include "power_x11.h" #include <stdio.h> diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp index 792861cbf3..0a1a8b56ff 100644 --- a/scene/2d/ray_cast_2d.cpp +++ b/scene/2d/ray_cast_2d.cpp @@ -157,16 +157,16 @@ void RayCast2D::_notification(int p_what) { break; Transform2D xf; xf.rotate(cast_to.angle()); - xf.translate(Vector2(0, cast_to.length())); + xf.translate(Vector2(cast_to.length(), 0)); //Vector2 tip = Vector2(0,s->get_length()); Color dcol = get_tree()->get_debug_collisions_color(); //0.9,0.2,0.2,0.4); draw_line(Vector2(), cast_to, dcol, 3); Vector<Vector2> pts; float tsize = 4; - pts.push_back(xf.xform(Vector2(0, tsize))); - pts.push_back(xf.xform(Vector2(0.707 * tsize, 0))); - pts.push_back(xf.xform(Vector2(-0.707 * tsize, 0))); + pts.push_back(xf.xform(Vector2(tsize, 0))); + pts.push_back(xf.xform(Vector2(0, 0.707 * tsize))); + pts.push_back(xf.xform(Vector2(0, -0.707 * tsize))); Vector<Color> cols; for (int i = 0; i < 3; i++) cols.push_back(dcol); diff --git a/scene/3d/baked_light_instance.cpp b/scene/3d/baked_light_instance.cpp deleted file mode 100644 index ffa7597113..0000000000 --- a/scene/3d/baked_light_instance.cpp +++ /dev/null @@ -1,1754 +0,0 @@ -/*************************************************************************/ -/* baked_light_instance.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "baked_light_instance.h" -#include "light.h" -#include "math.h" -#include "mesh_instance.h" -#include "scene/scene_string_names.h" - -#define FINDMINMAX(x0, x1, x2, min, max) \ - min = max = x0; \ - if (x1 < min) min = x1; \ - if (x1 > max) max = x1; \ - if (x2 < min) min = x2; \ - if (x2 > max) max = x2; - -static bool planeBoxOverlap(Vector3 normal, float d, Vector3 maxbox) { - int q; - Vector3 vmin, vmax; - for (q = 0; q <= 2; q++) { - if (normal[q] > 0.0f) { - vmin[q] = -maxbox[q]; - vmax[q] = maxbox[q]; - } else { - vmin[q] = maxbox[q]; - vmax[q] = -maxbox[q]; - } - } - if (normal.dot(vmin) + d > 0.0f) return false; - if (normal.dot(vmax) + d >= 0.0f) return true; - - return false; -} - -/*======================== X-tests ========================*/ -#define AXISTEST_X01(a, b, fa, fb) \ - p0 = a * v0.y - b * v0.z; \ - p2 = a * v2.y - b * v2.z; \ - if (p0 < p2) { \ - min = p0; \ - max = p2; \ - } else { \ - min = p2; \ - max = p0; \ - } \ - rad = fa * boxhalfsize.y + fb * boxhalfsize.z; \ - if (min > rad || max < -rad) return false; - -#define AXISTEST_X2(a, b, fa, fb) \ - p0 = a * v0.y - b * v0.z; \ - p1 = a * v1.y - b * v1.z; \ - if (p0 < p1) { \ - min = p0; \ - max = p1; \ - } else { \ - min = p1; \ - max = p0; \ - } \ - rad = fa * boxhalfsize.y + fb * boxhalfsize.z; \ - if (min > rad || max < -rad) return false; - -/*======================== Y-tests ========================*/ -#define AXISTEST_Y02(a, b, fa, fb) \ - p0 = -a * v0.x + b * v0.z; \ - p2 = -a * v2.x + b * v2.z; \ - if (p0 < p2) { \ - min = p0; \ - max = p2; \ - } else { \ - min = p2; \ - max = p0; \ - } \ - rad = fa * boxhalfsize.x + fb * boxhalfsize.z; \ - if (min > rad || max < -rad) return false; - -#define AXISTEST_Y1(a, b, fa, fb) \ - p0 = -a * v0.x + b * v0.z; \ - p1 = -a * v1.x + b * v1.z; \ - if (p0 < p1) { \ - min = p0; \ - max = p1; \ - } else { \ - min = p1; \ - max = p0; \ - } \ - rad = fa * boxhalfsize.x + fb * boxhalfsize.z; \ - if (min > rad || max < -rad) return false; - -/*======================== Z-tests ========================*/ - -#define AXISTEST_Z12(a, b, fa, fb) \ - p1 = a * v1.x - b * v1.y; \ - p2 = a * v2.x - b * v2.y; \ - if (p2 < p1) { \ - min = p2; \ - max = p1; \ - } else { \ - min = p1; \ - max = p2; \ - } \ - rad = fa * boxhalfsize.x + fb * boxhalfsize.y; \ - if (min > rad || max < -rad) return false; - -#define AXISTEST_Z0(a, b, fa, fb) \ - p0 = a * v0.x - b * v0.y; \ - p1 = a * v1.x - b * v1.y; \ - if (p0 < p1) { \ - min = p0; \ - max = p1; \ - } else { \ - min = p1; \ - max = p0; \ - } \ - rad = fa * boxhalfsize.x + fb * boxhalfsize.y; \ - if (min > rad || max < -rad) return false; - -static bool fast_tri_box_overlap(const Vector3 &boxcenter, const Vector3 boxhalfsize, const Vector3 *triverts) { - - /* use separating axis theorem to test overlap between triangle and box */ - /* need to test for overlap in these directions: */ - /* 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle */ - /* we do not even need to test these) */ - /* 2) normal of the triangle */ - /* 3) crossproduct(edge from tri, {x,y,z}-directin) */ - /* this gives 3x3=9 more tests */ - Vector3 v0, v1, v2; - float min, max, d, p0, p1, p2, rad, fex, fey, fez; - Vector3 normal, e0, e1, e2; - - /* This is the fastest branch on Sun */ - /* move everything so that the boxcenter is in (0,0,0) */ - - v0 = triverts[0] - boxcenter; - v1 = triverts[1] - boxcenter; - v2 = triverts[2] - boxcenter; - - /* compute triangle edges */ - e0 = v1 - v0; /* tri edge 0 */ - e1 = v2 - v1; /* tri edge 1 */ - e2 = v0 - v2; /* tri edge 2 */ - - /* Bullet 3: */ - /* test the 9 tests first (this was faster) */ - fex = Math::abs(e0.x); - fey = Math::abs(e0.y); - fez = Math::abs(e0.z); - AXISTEST_X01(e0.z, e0.y, fez, fey); - AXISTEST_Y02(e0.z, e0.x, fez, fex); - AXISTEST_Z12(e0.y, e0.x, fey, fex); - - fex = Math::abs(e1.x); - fey = Math::abs(e1.y); - fez = Math::abs(e1.z); - AXISTEST_X01(e1.z, e1.y, fez, fey); - AXISTEST_Y02(e1.z, e1.x, fez, fex); - AXISTEST_Z0(e1.y, e1.x, fey, fex); - - fex = Math::abs(e2.x); - fey = Math::abs(e2.y); - fez = Math::abs(e2.z); - AXISTEST_X2(e2.z, e2.y, fez, fey); - AXISTEST_Y1(e2.z, e2.x, fez, fex); - AXISTEST_Z12(e2.y, e2.x, fey, fex); - - /* Bullet 1: */ - /* first test overlap in the {x,y,z}-directions */ - /* find min, max of the triangle each direction, and test for overlap in */ - /* that direction -- this is equivalent to testing a minimal AABB around */ - /* the triangle against the AABB */ - - /* test in X-direction */ - FINDMINMAX(v0.x, v1.x, v2.x, min, max); - if (min > boxhalfsize.x || max < -boxhalfsize.x) return false; - - /* test in Y-direction */ - FINDMINMAX(v0.y, v1.y, v2.y, min, max); - if (min > boxhalfsize.y || max < -boxhalfsize.y) return false; - - /* test in Z-direction */ - FINDMINMAX(v0.z, v1.z, v2.z, min, max); - if (min > boxhalfsize.z || max < -boxhalfsize.z) return false; - - /* Bullet 2: */ - /* test if the box intersects the plane of the triangle */ - /* compute plane equation of triangle: normal*x+d=0 */ - normal = e0.cross(e1); - d = -normal.dot(v0); /* plane eq: normal.x+d=0 */ - if (!planeBoxOverlap(normal, d, boxhalfsize)) return false; - - return true; /* box and triangle overlaps */ -} - -Vector<Color> BakedLight::_get_bake_texture(Image &p_image, const Color &p_color) { - - Vector<Color> ret; - - if (p_image.empty()) { - - ret.resize(bake_texture_size * bake_texture_size); - for (int i = 0; i < bake_texture_size * bake_texture_size; i++) { - ret[i] = p_color; - } - - return ret; - } - - p_image.convert(Image::FORMAT_RGBA8); - p_image.resize(bake_texture_size, bake_texture_size, Image::INTERPOLATE_CUBIC); - - PoolVector<uint8_t>::Read r = p_image.get_data().read(); - ret.resize(bake_texture_size * bake_texture_size); - - for (int i = 0; i < bake_texture_size * bake_texture_size; i++) { - Color c; - c.r = r[i * 4 + 0] / 255.0; - c.g = r[i * 4 + 1] / 255.0; - c.b = r[i * 4 + 2] / 255.0; - c.a = r[i * 4 + 3] / 255.0; - ret[i] = c; - } - - return ret; -} - -BakedLight::MaterialCache BakedLight::_get_material_cache(Ref<Material> p_material) { - - //this way of obtaining materials is inaccurate and also does not support some compressed formats very well - Ref<SpatialMaterial> mat = p_material; - - Ref<Material> material = mat; //hack for now - - if (material_cache.has(material)) { - return material_cache[material]; - } - - MaterialCache mc; - - if (mat.is_valid()) { - - Ref<ImageTexture> albedo_tex = mat->get_texture(SpatialMaterial::TEXTURE_ALBEDO); - - Image img_albedo; - if (albedo_tex.is_valid()) { - - img_albedo = albedo_tex->get_data(); - } - - mc.albedo = _get_bake_texture(img_albedo, mat->get_albedo()); - - Ref<ImageTexture> emission_tex = mat->get_texture(SpatialMaterial::TEXTURE_EMISSION); - - Color emission_col = mat->get_emission(); - emission_col.r *= mat->get_emission_energy(); - emission_col.g *= mat->get_emission_energy(); - emission_col.b *= mat->get_emission_energy(); - - Image img_emission; - - if (emission_tex.is_valid()) { - - img_emission = emission_tex->get_data(); - } - - mc.emission = _get_bake_texture(img_emission, emission_col); - - } else { - Image empty; - - mc.albedo = _get_bake_texture(empty, Color(0.7, 0.7, 0.7)); - mc.emission = _get_bake_texture(empty, Color(0, 0, 0)); - } - - material_cache[p_material] = mc; - return mc; -} - -static _FORCE_INLINE_ Vector2 get_uv(const Vector3 &p_pos, const Vector3 *p_vtx, const Vector2 *p_uv) { - - if (p_pos.distance_squared_to(p_vtx[0]) < CMP_EPSILON2) - return p_uv[0]; - if (p_pos.distance_squared_to(p_vtx[1]) < CMP_EPSILON2) - return p_uv[1]; - if (p_pos.distance_squared_to(p_vtx[2]) < CMP_EPSILON2) - return p_uv[2]; - - Vector3 v0 = p_vtx[1] - p_vtx[0]; - Vector3 v1 = p_vtx[2] - p_vtx[0]; - Vector3 v2 = p_pos - p_vtx[0]; - - float d00 = v0.dot(v0); - float d01 = v0.dot(v1); - float d11 = v1.dot(v1); - float d20 = v2.dot(v0); - float d21 = v2.dot(v1); - float denom = (d00 * d11 - d01 * d01); - if (denom == 0) - return p_uv[0]; - float v = (d11 * d20 - d01 * d21) / denom; - float w = (d00 * d21 - d01 * d20) / denom; - float u = 1.0f - v - w; - - return p_uv[0] * u + p_uv[1] * v + p_uv[2] * w; -} - -void BakedLight::_plot_face(int p_idx, int p_level, const Vector3 *p_vtx, const Vector2 *p_uv, const MaterialCache &p_material, const Rect3 &p_aabb) { - - if (p_level == cell_subdiv - 1) { - //plot the face by guessing it's albedo and emission value - - //find best axis to map to, for scanning values - int closest_axis; - float closest_dot; - - Vector3 normal = Plane(p_vtx[0], p_vtx[1], p_vtx[2]).normal; - - for (int i = 0; i < 3; i++) { - - Vector3 axis; - axis[i] = 1.0; - float dot = ABS(normal.dot(axis)); - if (i == 0 || dot > closest_dot) { - closest_axis = i; - closest_dot = dot; - } - } - - Vector3 axis; - axis[closest_axis] = 1.0; - Vector3 t1; - t1[(closest_axis + 1) % 3] = 1.0; - Vector3 t2; - t2[(closest_axis + 2) % 3] = 1.0; - - t1 *= p_aabb.size[(closest_axis + 1) % 3] / float(color_scan_cell_width); - t2 *= p_aabb.size[(closest_axis + 2) % 3] / float(color_scan_cell_width); - - Color albedo_accum; - Color emission_accum; - float alpha = 0.0; - - //map to a grid average in the best axis for this face - for (int i = 0; i < color_scan_cell_width; i++) { - - Vector3 ofs_i = float(i) * t1; - - for (int j = 0; j < color_scan_cell_width; j++) { - - Vector3 ofs_j = float(j) * t2; - - Vector3 from = p_aabb.pos + ofs_i + ofs_j; - Vector3 to = from + t1 + t2 + axis * p_aabb.size[closest_axis]; - Vector3 half = (to - from) * 0.5; - - //is in this cell? - if (!fast_tri_box_overlap(from + half, half, p_vtx)) { - continue; //face does not span this cell - } - - //go from -size to +size*2 to avoid skipping collisions - Vector3 ray_from = from + (t1 + t2) * 0.5 - axis * p_aabb.size[closest_axis]; - Vector3 ray_to = ray_from + axis * p_aabb.size[closest_axis] * 2; - - Vector3 intersection; - - if (!Geometry::ray_intersects_triangle(ray_from, ray_to, p_vtx[0], p_vtx[1], p_vtx[2], &intersection)) { - //no intersect? look in edges - - float closest_dist = 1e20; - for (int j = 0; j < 3; j++) { - Vector3 c; - Vector3 inters; - Geometry::get_closest_points_between_segments(p_vtx[j], p_vtx[(j + 1) % 3], ray_from, ray_to, inters, c); - float d = c.distance_to(intersection); - if (j == 0 || d < closest_dist) { - closest_dist = d; - intersection = inters; - } - } - } - - Vector2 uv = get_uv(intersection, p_vtx, p_uv); - - int uv_x = CLAMP(Math::fposmod(uv.x, 1.0f) * bake_texture_size, 0, bake_texture_size - 1); - int uv_y = CLAMP(Math::fposmod(uv.y, 1.0f) * bake_texture_size, 0, bake_texture_size - 1); - - int ofs = uv_y * bake_texture_size + uv_x; - albedo_accum.r += p_material.albedo[ofs].r; - albedo_accum.g += p_material.albedo[ofs].g; - albedo_accum.b += p_material.albedo[ofs].b; - albedo_accum.a += p_material.albedo[ofs].a; - - emission_accum.r += p_material.emission[ofs].r; - emission_accum.g += p_material.emission[ofs].g; - emission_accum.b += p_material.emission[ofs].b; - alpha += 1.0; - } - } - - if (alpha == 0) { - //could not in any way get texture information.. so use closest point to center - - Face3 f(p_vtx[0], p_vtx[1], p_vtx[2]); - Vector3 inters = f.get_closest_point_to(p_aabb.pos + p_aabb.size * 0.5); - - Vector2 uv = get_uv(inters, p_vtx, p_uv); - - int uv_x = CLAMP(Math::fposmod(uv.x, 1.0f) * bake_texture_size, 0, bake_texture_size - 1); - int uv_y = CLAMP(Math::fposmod(uv.y, 1.0f) * bake_texture_size, 0, bake_texture_size - 1); - - int ofs = uv_y * bake_texture_size + uv_x; - - alpha = 1.0 / (color_scan_cell_width * color_scan_cell_width); - - albedo_accum.r = p_material.albedo[ofs].r * alpha; - albedo_accum.g = p_material.albedo[ofs].g * alpha; - albedo_accum.b = p_material.albedo[ofs].b * alpha; - albedo_accum.a = p_material.albedo[ofs].a * alpha; - - emission_accum.r = p_material.emission[ofs].r * alpha; - emission_accum.g = p_material.emission[ofs].g * alpha; - emission_accum.b = p_material.emission[ofs].b * alpha; - - zero_alphas++; - } else { - - float accdiv = 1.0 / (color_scan_cell_width * color_scan_cell_width); - alpha *= accdiv; - - albedo_accum.r *= accdiv; - albedo_accum.g *= accdiv; - albedo_accum.b *= accdiv; - albedo_accum.a *= accdiv; - - emission_accum.r *= accdiv; - emission_accum.g *= accdiv; - emission_accum.b *= accdiv; - } - - //put this temporarily here, corrected in a later step - bake_cells_write[p_idx].albedo[0] += albedo_accum.r; - bake_cells_write[p_idx].albedo[1] += albedo_accum.g; - bake_cells_write[p_idx].albedo[2] += albedo_accum.b; - bake_cells_write[p_idx].light[0] += emission_accum.r; - bake_cells_write[p_idx].light[1] += emission_accum.g; - bake_cells_write[p_idx].light[2] += emission_accum.b; - bake_cells_write[p_idx].alpha += alpha; - - static const Vector3 side_normals[6] = { - Vector3(-1, 0, 0), - Vector3(1, 0, 0), - Vector3(0, -1, 0), - Vector3(0, 1, 0), - Vector3(0, 0, -1), - Vector3(0, 0, 1), - }; - - for (int i = 0; i < 6; i++) { - if (normal.dot(side_normals[i]) > CMP_EPSILON) { - bake_cells_write[p_idx].used_sides |= (1 << i); - } - } - - } else { - //go down - for (int i = 0; i < 8; i++) { - - Rect3 aabb = p_aabb; - aabb.size *= 0.5; - - if (i & 1) - aabb.pos.x += aabb.size.x; - if (i & 2) - aabb.pos.y += aabb.size.y; - if (i & 4) - aabb.pos.z += aabb.size.z; - - { - Rect3 test_aabb = aabb; - //test_aabb.grow_by(test_aabb.get_longest_axis_size()*0.05); //grow a bit to avoid numerical error in real-time - Vector3 qsize = test_aabb.size * 0.5; //quarter size, for fast aabb test - - if (!fast_tri_box_overlap(test_aabb.pos + qsize, qsize, p_vtx)) { - //if (!Face3(p_vtx[0],p_vtx[1],p_vtx[2]).intersects_aabb2(aabb)) { - //does not fit in child, go on - continue; - } - } - - if (bake_cells_write[p_idx].childs[i] == CHILD_EMPTY) { - //sub cell must be created - - if (bake_cells_used == (1 << bake_cells_alloc)) { - //exhausted cells, creating more space - bake_cells_alloc++; - bake_cells_write = PoolVector<BakeCell>::Write(); - bake_cells.resize(1 << bake_cells_alloc); - bake_cells_write = bake_cells.write(); - } - - bake_cells_write[p_idx].childs[i] = bake_cells_used; - bake_cells_level_used[p_level + 1]++; - bake_cells_used++; - } - - _plot_face(bake_cells_write[p_idx].childs[i], p_level + 1, p_vtx, p_uv, p_material, aabb); - } - } -} - -void BakedLight::_fixup_plot(int p_idx, int p_level, int p_x, int p_y, int p_z) { - - if (p_level == cell_subdiv - 1) { - - float alpha = bake_cells_write[p_idx].alpha; - - bake_cells_write[p_idx].albedo[0] /= alpha; - bake_cells_write[p_idx].albedo[1] /= alpha; - bake_cells_write[p_idx].albedo[2] /= alpha; - - //transfer emission to light - bake_cells_write[p_idx].light[0] /= alpha; - bake_cells_write[p_idx].light[1] /= alpha; - bake_cells_write[p_idx].light[2] /= alpha; - - bake_cells_write[p_idx].alpha = 1.0; - - //remove neighbours from used sides - - for (int n = 0; n < 6; n++) { - - int ofs[3] = { 0, 0, 0 }; - - ofs[n / 2] = (n & 1) ? 1 : -1; - - //convert to x,y,z on this level - int x = p_x; - int y = p_y; - int z = p_z; - - x += ofs[0]; - y += ofs[1]; - z += ofs[2]; - - int ofs_x = 0; - int ofs_y = 0; - int ofs_z = 0; - int size = 1 << p_level; - int half = size / 2; - - if (x < 0 || x >= size || y < 0 || y >= size || z < 0 || z >= size) { - //neighbour is out, can't use it - bake_cells_write[p_idx].used_sides &= ~(1 << uint32_t(n)); - continue; - } - - uint32_t neighbour = 0; - - for (int i = 0; i < cell_subdiv - 1; i++) { - - BakeCell *bc = &bake_cells_write[neighbour]; - - int child = 0; - if (x >= ofs_x + half) { - child |= 1; - ofs_x += half; - } - if (y >= ofs_y + half) { - child |= 2; - ofs_y += half; - } - if (z >= ofs_z + half) { - child |= 4; - ofs_z += half; - } - - neighbour = bc->childs[child]; - if (neighbour == CHILD_EMPTY) { - break; - } - - half >>= 1; - } - - if (neighbour != CHILD_EMPTY) { - bake_cells_write[p_idx].used_sides &= ~(1 << uint32_t(n)); - } - } - } else { - - //go down - - float alpha_average = 0; - int half = cells_per_axis >> (p_level + 1); - for (int i = 0; i < 8; i++) { - - uint32_t child = bake_cells_write[p_idx].childs[i]; - - if (child == CHILD_EMPTY) - continue; - - int nx = p_x; - int ny = p_y; - int nz = p_z; - - if (i & 1) - nx += half; - if (i & 2) - ny += half; - if (i & 4) - nz += half; - - _fixup_plot(child, p_level + 1, nx, ny, nz); - alpha_average += bake_cells_write[child].alpha; - } - - bake_cells_write[p_idx].alpha = alpha_average / 8.0; - bake_cells_write[p_idx].light[0] = 0; - bake_cells_write[p_idx].light[1] = 0; - bake_cells_write[p_idx].light[2] = 0; - bake_cells_write[p_idx].albedo[0] = 0; - bake_cells_write[p_idx].albedo[1] = 0; - bake_cells_write[p_idx].albedo[2] = 0; - } - - //clean up light - bake_cells_write[p_idx].light_pass = 0; - //find neighbours -} - -void BakedLight::_bake_add_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh) { - - for (int i = 0; i < p_mesh->get_surface_count(); i++) { - - if (p_mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) - continue; //only triangles - - MaterialCache material = _get_material_cache(p_mesh->surface_get_material(i)); - - Array a = p_mesh->surface_get_arrays(i); - - PoolVector<Vector3> vertices = a[Mesh::ARRAY_VERTEX]; - PoolVector<Vector3>::Read vr = vertices.read(); - PoolVector<Vector2> uv = a[Mesh::ARRAY_TEX_UV]; - PoolVector<Vector2>::Read uvr; - PoolVector<int> index = a[Mesh::ARRAY_INDEX]; - - bool read_uv = false; - - if (uv.size()) { - - uvr = uv.read(); - read_uv = true; - } - - if (index.size()) { - - int facecount = index.size() / 3; - PoolVector<int>::Read ir = index.read(); - - for (int j = 0; j < facecount; j++) { - - Vector3 vtxs[3]; - Vector2 uvs[3]; - - for (int k = 0; k < 3; k++) { - vtxs[k] = p_xform.xform(vr[ir[j * 3 + k]]); - } - - if (read_uv) { - for (int k = 0; k < 3; k++) { - uvs[k] = uvr[ir[j * 3 + k]]; - } - } - - //plot face - _plot_face(0, 0, vtxs, uvs, material, bounds); - } - - } else { - - int facecount = vertices.size() / 3; - - for (int j = 0; j < facecount; j++) { - - Vector3 vtxs[3]; - Vector2 uvs[3]; - - for (int k = 0; k < 3; k++) { - vtxs[k] = p_xform.xform(vr[j * 3 + k]); - } - - if (read_uv) { - for (int k = 0; k < 3; k++) { - uvs[k] = uvr[j * 3 + k]; - } - } - - //plot face - _plot_face(0, 0, vtxs, uvs, material, bounds); - } - } - } -} - -void BakedLight::_bake_add_to_aabb(const Transform &p_xform, Ref<Mesh> &p_mesh, bool &first) { - - for (int i = 0; i < p_mesh->get_surface_count(); i++) { - - if (p_mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) - continue; //only triangles - - Array a = p_mesh->surface_get_arrays(i); - PoolVector<Vector3> vertices = a[Mesh::ARRAY_VERTEX]; - int vc = vertices.size(); - PoolVector<Vector3>::Read vr = vertices.read(); - - if (first) { - bounds.pos = p_xform.xform(vr[0]); - first = false; - } - - for (int j = 0; j < vc; j++) { - bounds.expand_to(p_xform.xform(vr[j])); - } - } -} - -void BakedLight::bake() { - - bake_cells_alloc = 16; - bake_cells.resize(1 << bake_cells_alloc); - bake_cells_used = 1; - cells_per_axis = (1 << (cell_subdiv - 1)); - zero_alphas = 0; - - bool aabb_first = true; - print_line("Generating AABB"); - - bake_cells_level_used.resize(cell_subdiv); - for (int i = 0; i < cell_subdiv; i++) { - bake_cells_level_used[i] = 0; - } - - int count = 0; - for (Set<GeometryInstance *>::Element *E = geometries.front(); E; E = E->next()) { - - print_line("aabb geom " + itos(count) + "/" + itos(geometries.size())); - - GeometryInstance *geom = E->get(); - - if (geom->cast_to<MeshInstance>()) { - - MeshInstance *mesh_instance = geom->cast_to<MeshInstance>(); - Ref<Mesh> mesh = mesh_instance->get_mesh(); - if (mesh.is_valid()) { - - _bake_add_to_aabb(geom->get_relative_transform(this), mesh, aabb_first); - } - } - count++; - } - - print_line("AABB: " + bounds); - ERR_FAIL_COND(aabb_first); - - bake_cells_write = bake_cells.write(); - count = 0; - - for (Set<GeometryInstance *>::Element *E = geometries.front(); E; E = E->next()) { - - GeometryInstance *geom = E->get(); - print_line("plot geom " + itos(count) + "/" + itos(geometries.size())); - - if (geom->cast_to<MeshInstance>()) { - - MeshInstance *mesh_instance = geom->cast_to<MeshInstance>(); - Ref<Mesh> mesh = mesh_instance->get_mesh(); - if (mesh.is_valid()) { - - _bake_add_mesh(geom->get_relative_transform(this), mesh); - } - } - - count++; - } - - _fixup_plot(0, 0, 0, 0, 0); - - bake_cells_write = PoolVector<BakeCell>::Write(); - - bake_cells.resize(bake_cells_used); - - print_line("total bake cells used: " + itos(bake_cells_used)); - for (int i = 0; i < cell_subdiv; i++) { - print_line("level " + itos(i) + ": " + itos(bake_cells_level_used[i])); - } - print_line("zero alphas: " + itos(zero_alphas)); -} - -void BakedLight::_bake_directional(int p_idx, int p_level, int p_x, int p_y, int p_z, const Vector3 &p_dir, const Color &p_color, int p_sign) { - - if (p_level == cell_subdiv - 1) { - - Vector3 end; - end.x = float(p_x + 0.5) / cells_per_axis; - end.y = float(p_y + 0.5) / cells_per_axis; - end.z = float(p_z + 0.5) / cells_per_axis; - - end = bounds.pos + bounds.size * end; - - float max_ray_len = (bounds.size).length() * 1.2; - - Vector3 begin = end + max_ray_len * -p_dir; - - //clip begin - - for (int i = 0; i < 3; i++) { - - if (ABS(p_dir[i]) < CMP_EPSILON) { - continue; // parallel to axis, don't clip - } - - Plane p; - p.normal[i] = 1.0; - p.d = bounds.pos[i]; - if (p_dir[i] < 0) { - p.d += bounds.size[i]; - } - - Vector3 inters; - if (p.intersects_segment(end, begin, &inters)) { - begin = inters; - } - } - - int idx = _plot_ray(begin, end); - - if (idx >= 0 && light_pass != bake_cells_write[idx].light_pass) { - //hit something, add or remove light to it - - Color albedo = Color(bake_cells_write[idx].albedo[0], bake_cells_write[idx].albedo[1], bake_cells_write[idx].albedo[2]); - bake_cells_write[idx].light[0] += albedo.r * p_color.r * p_sign; - bake_cells_write[idx].light[1] += albedo.g * p_color.g * p_sign; - bake_cells_write[idx].light[2] += albedo.b * p_color.b * p_sign; - bake_cells_write[idx].light_pass = light_pass; - } - - } else { - - int half = cells_per_axis >> (p_level + 1); - - //go down - for (int i = 0; i < 8; i++) { - - uint32_t child = bake_cells_write[p_idx].childs[i]; - - if (child == CHILD_EMPTY) - continue; - - int nx = p_x; - int ny = p_y; - int nz = p_z; - - if (i & 1) - nx += half; - if (i & 2) - ny += half; - if (i & 4) - nz += half; - - _bake_directional(child, p_level + 1, nx, ny, nz, p_dir, p_color, p_sign); - } - } -} - -void BakedLight::_bake_light(Light *p_light) { - - if (p_light->cast_to<DirectionalLight>()) { - - DirectionalLight *dl = p_light->cast_to<DirectionalLight>(); - - Transform rel_xf = dl->get_relative_transform(this); - - Vector3 light_dir = -rel_xf.basis.get_axis(2); - - Color color = dl->get_color(); - float nrg = dl->get_param(Light::PARAM_ENERGY); - color.r *= nrg; - color.g *= nrg; - color.b *= nrg; - - light_pass++; - _bake_directional(0, 0, 0, 0, 0, light_dir, color, 1); - } -} - -void BakedLight::_upscale_light(int p_idx, int p_level) { - - //go down - - float light_accum[3] = { 0, 0, 0 }; - float alpha_accum = 0; - - bool check_children = p_level < (cell_subdiv - 2); - - for (int i = 0; i < 8; i++) { - - uint32_t child = bake_cells_write[p_idx].childs[i]; - - if (child == CHILD_EMPTY) - continue; - - if (check_children) { - _upscale_light(child, p_level + 1); - } - - light_accum[0] += bake_cells_write[child].light[0]; - light_accum[1] += bake_cells_write[child].light[1]; - light_accum[2] += bake_cells_write[child].light[2]; - alpha_accum += bake_cells_write[child].alpha; - } - - bake_cells_write[p_idx].light[0] = light_accum[0] / 8.0; - bake_cells_write[p_idx].light[1] = light_accum[1] / 8.0; - bake_cells_write[p_idx].light[2] = light_accum[2] / 8.0; - bake_cells_write[p_idx].alpha = alpha_accum / 8.0; -} - -void BakedLight::bake_lights() { - - ERR_FAIL_COND(bake_cells.size() == 0); - - bake_cells_write = bake_cells.write(); - - for (Set<Light *>::Element *E = lights.front(); E; E = E->next()) { - - _bake_light(E->get()); - } - - _upscale_light(0, 0); - - bake_cells_write = PoolVector<BakeCell>::Write(); -} - -Color BakedLight::_cone_trace(const Vector3 &p_from, const Vector3 &p_dir, float p_half_angle) { - - Color color(0, 0, 0, 0); - float tha = Math::tan(p_half_angle); //tan half angle - Vector3 from = (p_from - bounds.pos) / bounds.size; //convert to 0..1 - from /= cells_per_axis; //convert to voxels of size 1 - Vector3 dir = (p_dir / bounds.size).normalized(); - - float max_dist = Vector3(cells_per_axis, cells_per_axis, cells_per_axis).length(); - - float dist = 1.0; - // self occlusion in flat surfaces - - float alpha = 0; - - while (dist < max_dist && alpha < 0.95) { - -#if 0 - // smallest sample diameter possible is the voxel size - float diameter = MAX(1.0, 2.0 * tha * dist); - float lod = log2(diameter); - - Vector3 sample_pos = from + dist * dir; - - - Color samples_base[2][8]={{Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0)}, - {Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0),Color(0,0,0,0)}}; - - float levelf = Math::fposmod(lod,1.0); - float fx = Math::fposmod(sample_pos.x,1.0); - float fy = Math::fposmod(sample_pos.y,1.0); - float fz = Math::fposmod(sample_pos.z,1.0); - - for(int l=0;l<2;l++){ - - int bx = Math::floor(sample_pos.x); - int by = Math::floor(sample_pos.y); - int bz = Math::floor(sample_pos.z); - - int lodn=int(Math::floor(lod))-l; - - bx>>=lodn; - by>>=lodn; - bz>>=lodn; - - int limit = MAX(0,cell_subdiv-lodn-1); - - for(int c=0;c<8;c++) { - - int x = bx; - int y = by; - int z = bz; - - if (c&1) { - x+=1; - } - if (c&2) { - y+=1; - } - if (c&4) { - z+=1; - } - - int ofs_x=0; - int ofs_y=0; - int ofs_z=0; - int size = cells_per_axis>>lodn; - int half=size/2; - - bool outside=x<0 || x>=size || y<0 || y>=size || z<0 || z>=size; - - if (outside) - continue; - - - uint32_t cell=0; - - for(int i=0;i<limit;i++) { - - BakeCell *bc = &bake_cells_write[cell]; - - int child = 0; - if (x >= ofs_x + half) { - child|=1; - ofs_x+=half; - } - if (y >= ofs_y + half) { - child|=2; - ofs_y+=half; - } - if (z >= ofs_z + half) { - child|=4; - ofs_z+=half; - } - - cell = bc->childs[child]; - if (cell==CHILD_EMPTY) - break; - - half>>=1; - } - - if (cell!=CHILD_EMPTY) { - - samples_base[l][c].r=bake_cells_write[cell].light[0]; - samples_base[l][c].g=bake_cells_write[cell].light[1]; - samples_base[l][c].b=bake_cells_write[cell].light[2]; - samples_base[l][c].a=bake_cells_write[cell].alpha; - } - - } - - - } - - Color m0x0 = samples_base[0][0].linear_interpolate(samples_base[0][1],fx); - Color m0x1 = samples_base[0][2].linear_interpolate(samples_base[0][3],fx); - Color m0y0 = m0x0.linear_interpolate(m0x1,fy); - m0x0 = samples_base[0][4].linear_interpolate(samples_base[0][5],fx); - m0x1 = samples_base[0][6].linear_interpolate(samples_base[0][7],fx); - Color m0y1 = m0x0.linear_interpolate(m0x1,fy); - Color m0z = m0y0.linear_interpolate(m0y1,fz); - - Color m1x0 = samples_base[1][0].linear_interpolate(samples_base[1][1],fx); - Color m1x1 = samples_base[1][2].linear_interpolate(samples_base[1][3],fx); - Color m1y0 = m1x0.linear_interpolate(m1x1,fy); - m1x0 = samples_base[1][4].linear_interpolate(samples_base[1][5],fx); - m1x1 = samples_base[1][6].linear_interpolate(samples_base[1][7],fx); - Color m1y1 = m1x0.linear_interpolate(m1x1,fy); - Color m1z = m1y0.linear_interpolate(m1y1,fz); - - Color m = m0z.linear_interpolate(m1z,levelf); -#else - float diameter = 1.0; - Vector3 sample_pos = from + dist * dir; - - Color m(0, 0, 0, 0); - { - int x = Math::floor(sample_pos.x); - int y = Math::floor(sample_pos.y); - int z = Math::floor(sample_pos.z); - - int ofs_x = 0; - int ofs_y = 0; - int ofs_z = 0; - int size = cells_per_axis; - int half = size / 2; - - bool outside = x < 0 || x >= size || y < 0 || y >= size || z < 0 || z >= size; - - if (!outside) { - - uint32_t cell = 0; - - for (int i = 0; i < cell_subdiv - 1; i++) { - - BakeCell *bc = &bake_cells_write[cell]; - - int child = 0; - if (x >= ofs_x + half) { - child |= 1; - ofs_x += half; - } - if (y >= ofs_y + half) { - child |= 2; - ofs_y += half; - } - if (z >= ofs_z + half) { - child |= 4; - ofs_z += half; - } - - cell = bc->childs[child]; - if (cell == CHILD_EMPTY) - break; - - half >>= 1; - } - - if (cell != CHILD_EMPTY) { - - m.r = bake_cells_write[cell].light[0]; - m.g = bake_cells_write[cell].light[1]; - m.b = bake_cells_write[cell].light[2]; - m.a = bake_cells_write[cell].alpha; - } - } - } - -#endif - // front-to-back compositing - float a = (1.0 - alpha); - color.r += a * m.r; - color.g += a * m.g; - color.b += a * m.b; - alpha += a * m.a; - //occlusion += a * voxelColor.a; - //occlusion += (a * voxelColor.a) / (1.0 + 0.03 * diameter); - dist += diameter * 0.5; // smoother - //dist += diameter; // faster but misses more voxels - } - - return color; -} - -void BakedLight::_bake_radiance(int p_idx, int p_level, int p_x, int p_y, int p_z) { - - if (p_level == cell_subdiv - 1) { - - const int NUM_CONES = 6; - Vector3 cone_directions[6] = { - Vector3(1, 0, 0), - Vector3(0.5, 0.866025, 0), - Vector3(0.5, 0.267617, 0.823639), - Vector3(0.5, -0.700629, 0.509037), - Vector3(0.5, -0.700629, -0.509037), - Vector3(0.5, 0.267617, -0.823639) - }; - float coneWeights[6] = { 0.25, 0.15, 0.15, 0.15, 0.15, 0.15 }; - - Vector3 pos = (Vector3(p_x, p_y, p_z) / float(cells_per_axis)) * bounds.size + bounds.pos; - Vector3 voxel_size = bounds.size / float(cells_per_axis); - pos += voxel_size * 0.5; - - Color accum; - - bake_cells_write[p_idx].light[0] = 0; - bake_cells_write[p_idx].light[1] = 0; - bake_cells_write[p_idx].light[2] = 0; - - int freepix = 0; - for (int i = 0; i < 6; i++) { - - if (!(bake_cells_write[p_idx].used_sides & (1 << i))) - continue; - - if ((i & 1) == 0) - bake_cells_write[p_idx].light[i / 2] = 1.0; - freepix++; - continue; - - int ofs = i / 2; - - Vector3 dir; - if ((i & 1) == 0) - dir[ofs] = 1.0; - else - dir[ofs] = -1.0; - - for (int j = 0; j < 1; j++) { - - Vector3 cone_dir; - cone_dir.x = cone_directions[j][(ofs + 0) % 3]; - cone_dir.y = cone_directions[j][(ofs + 1) % 3]; - cone_dir.z = cone_directions[j][(ofs + 2) % 3]; - - cone_dir[ofs] *= dir[ofs]; - - Color res = _cone_trace(pos + dir * voxel_size, cone_dir, Math::deg2rad(29.9849)); - accum.r += res.r; //*coneWeights[j]; - accum.g += res.g; //*coneWeights[j]; - accum.b += res.b; //*coneWeights[j]; - } - } -#if 0 - if (freepix==0) { - bake_cells_write[p_idx].light[0]=0; - bake_cells_write[p_idx].light[1]=0; - bake_cells_write[p_idx].light[2]=0; - } - - if (freepix==1) { - bake_cells_write[p_idx].light[0]=1; - bake_cells_write[p_idx].light[1]=0; - bake_cells_write[p_idx].light[2]=0; - } - - if (freepix==2) { - bake_cells_write[p_idx].light[0]=0; - bake_cells_write[p_idx].light[1]=1; - bake_cells_write[p_idx].light[2]=0; - } - - if (freepix==3) { - bake_cells_write[p_idx].light[0]=1; - bake_cells_write[p_idx].light[1]=1; - bake_cells_write[p_idx].light[2]=0; - } - - if (freepix==4) { - bake_cells_write[p_idx].light[0]=0; - bake_cells_write[p_idx].light[1]=0; - bake_cells_write[p_idx].light[2]=1; - } - - if (freepix==5) { - bake_cells_write[p_idx].light[0]=1; - bake_cells_write[p_idx].light[1]=0; - bake_cells_write[p_idx].light[2]=1; - } - - if (freepix==6) { - bake_cells_write[p_idx].light[0]=0; - bake_cells_write[p_idx].light[0]=1; - bake_cells_write[p_idx].light[0]=1; - } -#endif - //bake_cells_write[p_idx].radiance[0]=accum.r; - //bake_cells_write[p_idx].radiance[1]=accum.g; - //bake_cells_write[p_idx].radiance[2]=accum.b; - - } else { - - int half = cells_per_axis >> (p_level + 1); - - //go down - for (int i = 0; i < 8; i++) { - - uint32_t child = bake_cells_write[p_idx].childs[i]; - - if (child == CHILD_EMPTY) - continue; - - int nx = p_x; - int ny = p_y; - int nz = p_z; - - if (i & 1) - nx += half; - if (i & 2) - ny += half; - if (i & 4) - nz += half; - - _bake_radiance(child, p_level + 1, nx, ny, nz); - } - } -} - -void BakedLight::bake_radiance() { - - ERR_FAIL_COND(bake_cells.size() == 0); - - bake_cells_write = bake_cells.write(); - - _bake_radiance(0, 0, 0, 0, 0); - - bake_cells_write = PoolVector<BakeCell>::Write(); -} -int BakedLight::_find_cell(int x, int y, int z) { - - uint32_t cell = 0; - - int ofs_x = 0; - int ofs_y = 0; - int ofs_z = 0; - int size = cells_per_axis; - int half = size / 2; - - if (x < 0 || x >= size) - return -1; - if (y < 0 || y >= size) - return -1; - if (z < 0 || z >= size) - return -1; - - for (int i = 0; i < cell_subdiv - 1; i++) { - - BakeCell *bc = &bake_cells_write[cell]; - - int child = 0; - if (x >= ofs_x + half) { - child |= 1; - ofs_x += half; - } - if (y >= ofs_y + half) { - child |= 2; - ofs_y += half; - } - if (z >= ofs_z + half) { - child |= 4; - ofs_z += half; - } - - cell = bc->childs[child]; - if (cell == CHILD_EMPTY) - return -1; - - half >>= 1; - } - - return cell; -} - -int BakedLight::_plot_ray(const Vector3 &p_from, const Vector3 &p_to) { - - Vector3 from = (p_from - bounds.pos) / bounds.size; - Vector3 to = (p_to - bounds.pos) / bounds.size; - - int x1 = Math::floor(from.x * cells_per_axis); - int y1 = Math::floor(from.y * cells_per_axis); - int z1 = Math::floor(from.z * cells_per_axis); - - int x2 = Math::floor(to.x * cells_per_axis); - int y2 = Math::floor(to.y * cells_per_axis); - int z2 = Math::floor(to.z * cells_per_axis); - - int i, dx, dy, dz, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2; - int point[3]; - - point[0] = x1; - point[1] = y1; - point[2] = z1; - dx = x2 - x1; - dy = y2 - y1; - dz = z2 - z1; - x_inc = (dx < 0) ? -1 : 1; - l = ABS(dx); - y_inc = (dy < 0) ? -1 : 1; - m = ABS(dy); - z_inc = (dz < 0) ? -1 : 1; - n = ABS(dz); - dx2 = l << 1; - dy2 = m << 1; - dz2 = n << 1; - - if ((l >= m) && (l >= n)) { - err_1 = dy2 - l; - err_2 = dz2 - l; - for (i = 0; i < l; i++) { - int cell = _find_cell(point[0], point[1], point[2]); - if (cell >= 0) - return cell; - - if (err_1 > 0) { - point[1] += y_inc; - err_1 -= dx2; - } - if (err_2 > 0) { - point[2] += z_inc; - err_2 -= dx2; - } - err_1 += dy2; - err_2 += dz2; - point[0] += x_inc; - } - } else if ((m >= l) && (m >= n)) { - err_1 = dx2 - m; - err_2 = dz2 - m; - for (i = 0; i < m; i++) { - int cell = _find_cell(point[0], point[1], point[2]); - if (cell >= 0) - return cell; - if (err_1 > 0) { - point[0] += x_inc; - err_1 -= dy2; - } - if (err_2 > 0) { - point[2] += z_inc; - err_2 -= dy2; - } - err_1 += dx2; - err_2 += dz2; - point[1] += y_inc; - } - } else { - err_1 = dy2 - n; - err_2 = dx2 - n; - for (i = 0; i < n; i++) { - int cell = _find_cell(point[0], point[1], point[2]); - if (cell >= 0) - return cell; - - if (err_1 > 0) { - point[1] += y_inc; - err_1 -= dz2; - } - if (err_2 > 0) { - point[0] += x_inc; - err_2 -= dz2; - } - err_1 += dy2; - err_2 += dx2; - point[2] += z_inc; - } - } - return _find_cell(point[0], point[1], point[2]); -} - -void BakedLight::set_cell_subdiv(int p_subdiv) { - - cell_subdiv = p_subdiv; - - //VS::get_singleton()->baked_light_set_subdivision(baked_light,p_subdiv); -} - -int BakedLight::get_cell_subdiv() const { - - return cell_subdiv; -} - -Rect3 BakedLight::get_aabb() const { - - return Rect3(Vector3(0, 0, 0), Vector3(1, 1, 1)); -} -PoolVector<Face3> BakedLight::get_faces(uint32_t p_usage_flags) const { - - return PoolVector<Face3>(); -} - -String BakedLight::get_configuration_warning() const { - return String(); -} - -void BakedLight::_debug_mesh(int p_idx, int p_level, const Rect3 &p_aabb, DebugMode p_mode, Ref<MultiMesh> &p_multimesh, int &idx) { - - if (p_level == cell_subdiv - 1) { - - Vector3 center = p_aabb.pos + p_aabb.size * 0.5; - Transform xform; - xform.origin = center; - xform.basis.scale(p_aabb.size * 0.5); - p_multimesh->set_instance_transform(idx, xform); - Color col; - switch (p_mode) { - case DEBUG_ALBEDO: { - col = Color(bake_cells_write[p_idx].albedo[0], bake_cells_write[p_idx].albedo[1], bake_cells_write[p_idx].albedo[2]); - } break; - case DEBUG_LIGHT: { - col = Color(bake_cells_write[p_idx].light[0], bake_cells_write[p_idx].light[1], bake_cells_write[p_idx].light[2]); - Color colr = Color(bake_cells_write[p_idx].radiance[0], bake_cells_write[p_idx].radiance[1], bake_cells_write[p_idx].radiance[2]); - col.r += colr.r; - col.g += colr.g; - col.b += colr.b; - } break; - } - p_multimesh->set_instance_color(idx, col); - - idx++; - - } else { - - for (int i = 0; i < 8; i++) { - - if (bake_cells_write[p_idx].childs[i] == CHILD_EMPTY) - continue; - - Rect3 aabb = p_aabb; - aabb.size *= 0.5; - - if (i & 1) - aabb.pos.x += aabb.size.x; - if (i & 2) - aabb.pos.y += aabb.size.y; - if (i & 4) - aabb.pos.z += aabb.size.z; - - _debug_mesh(bake_cells_write[p_idx].childs[i], p_level + 1, aabb, p_mode, p_multimesh, idx); - } - } -} - -void BakedLight::create_debug_mesh(DebugMode p_mode) { - - Ref<MultiMesh> mm; - mm.instance(); - - mm->set_transform_format(MultiMesh::TRANSFORM_3D); - mm->set_color_format(MultiMesh::COLOR_8BIT); - mm->set_instance_count(bake_cells_level_used[cell_subdiv - 1]); - - Ref<Mesh> mesh; - mesh.instance(); - - { - Array arr; - arr.resize(Mesh::ARRAY_MAX); - - PoolVector<Vector3> vertices; - PoolVector<Color> colors; - - int vtx_idx = 0; -#define ADD_VTX(m_idx) \ - ; \ - vertices.push_back(face_points[m_idx]); \ - colors.push_back(Color(1, 1, 1, 1)); \ - vtx_idx++; - - for (int i = 0; i < 6; i++) { - - Vector3 face_points[4]; - - for (int j = 0; j < 4; j++) { - - float v[3]; - v[0] = 1.0; - v[1] = 1 - 2 * ((j >> 1) & 1); - v[2] = v[1] * (1 - 2 * (j & 1)); - - for (int k = 0; k < 3; k++) { - - if (i < 3) - face_points[j][(i + k) % 3] = v[k] * (i >= 3 ? -1 : 1); - else - face_points[3 - j][(i + k) % 3] = v[k] * (i >= 3 ? -1 : 1); - } - } - - //tri 1 - ADD_VTX(0); - ADD_VTX(1); - ADD_VTX(2); - //tri 2 - ADD_VTX(2); - ADD_VTX(3); - ADD_VTX(0); - } - - arr[Mesh::ARRAY_VERTEX] = vertices; - arr[Mesh::ARRAY_COLOR] = colors; - mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, arr); - } - - { - Ref<SpatialMaterial> fsm; - fsm.instance(); - fsm->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true); - fsm->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); - fsm->set_flag(SpatialMaterial::FLAG_UNSHADED, true); - fsm->set_albedo(Color(1, 1, 1, 1)); - - mesh->surface_set_material(0, fsm); - } - - mm->set_mesh(mesh); - - bake_cells_write = bake_cells.write(); - - int idx = 0; - _debug_mesh(0, 0, bounds, p_mode, mm, idx); - - print_line("written: " + itos(idx) + " total: " + itos(bake_cells_level_used[cell_subdiv - 1])); - - MultiMeshInstance *mmi = memnew(MultiMeshInstance); - mmi->set_multimesh(mm); - add_child(mmi); -#ifdef TOOLS_ENABLED - if (get_tree()->get_edited_scene_root() == this) { - mmi->set_owner(this); - } else { - mmi->set_owner(get_owner()); - } -#else - mmi->set_owner(get_owner()); -#endif -} - -void BakedLight::_debug_mesh_albedo() { - create_debug_mesh(DEBUG_ALBEDO); -} - -void BakedLight::_debug_mesh_light() { - create_debug_mesh(DEBUG_LIGHT); -} - -void BakedLight::_bind_methods() { - - ClassDB::bind_method(D_METHOD("set_cell_subdiv", "steps"), &BakedLight::set_cell_subdiv); - ClassDB::bind_method(D_METHOD("get_cell_subdiv"), &BakedLight::get_cell_subdiv); - - ClassDB::bind_method(D_METHOD("bake"), &BakedLight::bake); - ClassDB::set_method_flags(get_class_static(), _scs_create("bake"), METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR); - - ClassDB::bind_method(D_METHOD("bake_lights"), &BakedLight::bake_lights); - ClassDB::set_method_flags(get_class_static(), _scs_create("bake_lights"), METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR); - - ClassDB::bind_method(D_METHOD("bake_radiance"), &BakedLight::bake_radiance); - ClassDB::set_method_flags(get_class_static(), _scs_create("bake_radiance"), METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR); - - ClassDB::bind_method(D_METHOD("debug_mesh_albedo"), &BakedLight::_debug_mesh_albedo); - ClassDB::set_method_flags(get_class_static(), _scs_create("debug_mesh_albedo"), METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR); - - ClassDB::bind_method(D_METHOD("debug_mesh_light"), &BakedLight::_debug_mesh_light); - ClassDB::set_method_flags(get_class_static(), _scs_create("debug_mesh_light"), METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR); - - ADD_PROPERTY(PropertyInfo(Variant::INT, "cell_subdiv"), "set_cell_subdiv", "get_cell_subdiv"); - ADD_SIGNAL(MethodInfo("baked_light_changed")); -} - -BakedLight::BakedLight() { - - //baked_light=VisualServer::get_singleton()->baked_light_create(); - VS::get_singleton()->instance_set_base(get_instance(), baked_light); - - cell_subdiv = 8; - bake_texture_size = 128; - color_scan_cell_width = 8; - light_pass = 0; -} - -BakedLight::~BakedLight() { - - VS::get_singleton()->free(baked_light); -} - -///////////////////////// - -#if 0 -void BakedLightSampler::set_param(Param p_param,float p_value) { - ERR_FAIL_INDEX(p_param,PARAM_MAX); - params[p_param]=p_value; - VS::get_singleton()->baked_light_sampler_set_param(base,VS::BakedLightSamplerParam(p_param),p_value); -} - -float BakedLightSampler::get_param(Param p_param) const{ - - ERR_FAIL_INDEX_V(p_param,PARAM_MAX,0); - return params[p_param]; - -} - -void BakedLightSampler::set_resolution(int p_resolution){ - - ERR_FAIL_COND(p_resolution<4 || p_resolution>32); - resolution=p_resolution; - VS::get_singleton()->baked_light_sampler_set_resolution(base,resolution); -} -int BakedLightSampler::get_resolution() const { - - return resolution; -} - -AABB BakedLightSampler::get_aabb() const { - - float r = get_param(PARAM_RADIUS); - return AABB( Vector3(-r,-r,-r),Vector3(r*2,r*2,r*2)); -} -DVector<Face3> BakedLightSampler::get_faces(uint32_t p_usage_flags) const { - return DVector<Face3>(); -} - -void BakedLightSampler::_bind_methods() { - - ClassDB::bind_method(D_METHOD("set_param","param","value"),&BakedLightSampler::set_param); - ClassDB::bind_method(D_METHOD("get_param","param"),&BakedLightSampler::get_param); - - ClassDB::bind_method(D_METHOD("set_resolution","resolution"),&BakedLightSampler::set_resolution); - ClassDB::bind_method(D_METHOD("get_resolution"),&BakedLightSampler::get_resolution); - - - BIND_CONSTANT( PARAM_RADIUS ); - BIND_CONSTANT( PARAM_STRENGTH ); - BIND_CONSTANT( PARAM_ATTENUATION ); - BIND_CONSTANT( PARAM_DETAIL_RATIO ); - BIND_CONSTANT( PARAM_MAX ); - - ADD_PROPERTYI( PropertyInfo(Variant::REAL,"params/radius",PROPERTY_HINT_RANGE,"0.01,1024,0.01"),"set_param","get_param",PARAM_RADIUS); - ADD_PROPERTYI( PropertyInfo(Variant::REAL,"params/strength",PROPERTY_HINT_RANGE,"0.01,16,0.01"),"set_param","get_param",PARAM_STRENGTH); - ADD_PROPERTYI( PropertyInfo(Variant::REAL,"params/attenuation",PROPERTY_HINT_EXP_EASING),"set_param","get_param",PARAM_ATTENUATION); - ADD_PROPERTYI( PropertyInfo(Variant::REAL,"params/detail_ratio",PROPERTY_HINT_RANGE,"0.01,1.0,0.01"),"set_param","get_param",PARAM_DETAIL_RATIO); - //ADD_PROPERTYI( PropertyInfo(Variant::REAL,"params/detail_ratio",PROPERTY_HINT_RANGE,"0,20,1"),"set_param","get_param",PARAM_DETAIL_RATIO); - ADD_PROPERTY( PropertyInfo(Variant::REAL,"params/resolution",PROPERTY_HINT_RANGE,"4,32,1"),"set_resolution","get_resolution"); - -} - -BakedLightSampler::BakedLightSampler() { - - base = VS::get_singleton()->baked_light_sampler_create(); - set_base(base); - - params[PARAM_RADIUS]=1.0; - params[PARAM_STRENGTH]=1.0; - params[PARAM_ATTENUATION]=1.0; - params[PARAM_DETAIL_RATIO]=0.1; - resolution=16; - - -} - -BakedLightSampler::~BakedLightSampler(){ - - VS::get_singleton()->free(base); -} -#endif diff --git a/scene/3d/baked_light_instance.h b/scene/3d/baked_light_instance.h deleted file mode 100644 index 63a5fa7255..0000000000 --- a/scene/3d/baked_light_instance.h +++ /dev/null @@ -1,199 +0,0 @@ -/*************************************************************************/ -/* baked_light_instance.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef BAKED_LIGHT_INSTANCE_H -#define BAKED_LIGHT_INSTANCE_H - -#include "scene/3d/multimesh_instance.h" -#include "scene/3d/visual_instance.h" -#include "scene/resources/baked_light.h" - -class BakedLightBaker; -class Light; - -class BakedLight : public VisualInstance { - GDCLASS(BakedLight, VisualInstance); - -public: - enum DebugMode { - DEBUG_ALBEDO, - DEBUG_LIGHT - }; - -private: - RID baked_light; - int cell_subdiv; - Rect3 bounds; - int cells_per_axis; - - enum { - CHILD_EMPTY = 0xFFFFFFFF, - }; - - /* BAKE DATA */ - - struct BakeCell { - - uint32_t childs[8]; - float albedo[3]; //albedo in RGB24 - float light[3]; //accumulated light in 16:16 fixed point (needs to be integer for moving lights fast) - float radiance[3]; //accumulated light in 16:16 fixed point (needs to be integer for moving lights fast) - uint32_t used_sides; - float alpha; //used for upsampling - uint32_t light_pass; //used for baking light - - BakeCell() { - for (int i = 0; i < 8; i++) { - childs[i] = 0xFFFFFFFF; - } - - for (int i = 0; i < 3; i++) { - light[i] = 0; - albedo[i] = 0; - radiance[i] = 0; - } - alpha = 0; - light_pass = 0; - used_sides = 0; - } - }; - - int bake_texture_size; - int color_scan_cell_width; - - struct MaterialCache { - //128x128 textures - Vector<Color> albedo; - Vector<Color> emission; - }; - - Vector<Color> _get_bake_texture(Image &p_image, const Color &p_color); - - Map<Ref<Material>, MaterialCache> material_cache; - MaterialCache _get_material_cache(Ref<Material> p_material); - - int bake_cells_alloc; - int bake_cells_used; - int zero_alphas; - Vector<int> bake_cells_level_used; - PoolVector<BakeCell> bake_cells; - PoolVector<BakeCell>::Write bake_cells_write; - - void _plot_face(int p_idx, int p_level, const Vector3 *p_vtx, const Vector2 *p_uv, const MaterialCache &p_material, const Rect3 &p_aabb); - void _fixup_plot(int p_idx, int p_level, int p_x, int p_y, int p_z); - void _bake_add_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh); - void _bake_add_to_aabb(const Transform &p_xform, Ref<Mesh> &p_mesh, bool &first); - - void _debug_mesh(int p_idx, int p_level, const Rect3 &p_aabb, DebugMode p_mode, Ref<MultiMesh> &p_multimesh, int &idx); - void _debug_mesh_albedo(); - void _debug_mesh_light(); - - _FORCE_INLINE_ int _find_cell(int x, int y, int z); - int _plot_ray(const Vector3 &p_from, const Vector3 &p_to); - - uint32_t light_pass; - - void _bake_directional(int p_idx, int p_level, int p_x, int p_y, int p_z, const Vector3 &p_dir, const Color &p_color, int p_sign); - void _upscale_light(int p_idx, int p_level); - void _bake_light(Light *p_light); - - Color _cone_trace(const Vector3 &p_from, const Vector3 &p_dir, float p_half_angle); - void _bake_radiance(int p_idx, int p_level, int p_x, int p_y, int p_z); - - friend class GeometryInstance; - - Set<GeometryInstance *> geometries; - friend class Light; - - Set<Light *> lights; - -protected: - static void _bind_methods(); - -public: - void set_cell_subdiv(int p_subdiv); - int get_cell_subdiv() const; - - void bake(); - void bake_lights(); - void bake_radiance(); - - void create_debug_mesh(DebugMode p_mode); - - virtual Rect3 get_aabb() const; - virtual PoolVector<Face3> get_faces(uint32_t p_usage_flags) const; - - String get_configuration_warning() const; - - BakedLight(); - ~BakedLight(); -}; - -#if 0 -class BakedLightSampler : public VisualInstance { - GDCLASS(BakedLightSampler,VisualInstance); - - -public: - - enum Param { - PARAM_RADIUS=VS::BAKED_LIGHT_SAMPLER_RADIUS, - PARAM_STRENGTH=VS::BAKED_LIGHT_SAMPLER_STRENGTH, - PARAM_ATTENUATION=VS::BAKED_LIGHT_SAMPLER_ATTENUATION, - PARAM_DETAIL_RATIO=VS::BAKED_LIGHT_SAMPLER_DETAIL_RATIO, - PARAM_MAX=VS::BAKED_LIGHT_SAMPLER_MAX - }; - - - -protected: - - RID base; - float params[PARAM_MAX]; - int resolution; - static void _bind_methods(); -public: - - virtual AABB get_aabb() const; - virtual PoolVector<Face3> get_faces(uint32_t p_usage_flags) const; - - void set_param(Param p_param,float p_value); - float get_param(Param p_param) const; - - void set_resolution(int p_resolution); - int get_resolution() const; - - BakedLightSampler(); - ~BakedLightSampler(); -}; - -VARIANT_ENUM_CAST( BakedLightSampler::Param ); - -#endif -#endif // BAKED_LIGHT_H diff --git a/scene/3d/gi_probe.cpp b/scene/3d/gi_probe.cpp index 7370e1330c..96311236ef 100644 --- a/scene/3d/gi_probe.cpp +++ b/scene/3d/gi_probe.cpp @@ -881,11 +881,11 @@ void GIProbe::_fixup_plot(int p_idx, int p_level, int p_x, int p_y, int p_z, Bak } } -Vector<Color> GIProbe::_get_bake_texture(Image &p_image, const Color &p_color) { +Vector<Color> GIProbe::_get_bake_texture(Ref<Image> p_image, const Color &p_color) { Vector<Color> ret; - if (p_image.empty()) { + if (p_image.is_null()) { ret.resize(bake_texture_size * bake_texture_size); for (int i = 0; i < bake_texture_size * bake_texture_size; i++) { @@ -895,14 +895,14 @@ Vector<Color> GIProbe::_get_bake_texture(Image &p_image, const Color &p_color) { return ret; } - if (p_image.is_compressed()) { + if (p_image->is_compressed()) { print_line("DECOMPRESSING!!!!"); - p_image.decompress(); + p_image->decompress(); } - p_image.convert(Image::FORMAT_RGBA8); - p_image.resize(bake_texture_size, bake_texture_size, Image::INTERPOLATE_CUBIC); + p_image->convert(Image::FORMAT_RGBA8); + p_image->resize(bake_texture_size, bake_texture_size, Image::INTERPOLATE_CUBIC); - PoolVector<uint8_t>::Read r = p_image.get_data().read(); + PoolVector<uint8_t>::Read r = p_image->get_data().read(); ret.resize(bake_texture_size * bake_texture_size); for (int i = 0; i < bake_texture_size * bake_texture_size; i++) { @@ -934,7 +934,7 @@ GIProbe::Baker::MaterialCache GIProbe::_get_material_cache(Ref<Material> p_mater Ref<Texture> albedo_tex = mat->get_texture(SpatialMaterial::TEXTURE_ALBEDO); - Image img_albedo; + Ref<Image> img_albedo; if (albedo_tex.is_valid()) { img_albedo = albedo_tex->get_data(); @@ -950,7 +950,7 @@ GIProbe::Baker::MaterialCache GIProbe::_get_material_cache(Ref<Material> p_mater emission_col.g *= mat->get_emission_energy(); emission_col.b *= mat->get_emission_energy(); - Image img_emission; + Ref<Image> img_emission; if (emission_tex.is_valid()) { @@ -960,7 +960,7 @@ GIProbe::Baker::MaterialCache GIProbe::_get_material_cache(Ref<Material> p_mater mc.emission = _get_bake_texture(img_emission, emission_col); } else { - Image empty; + Ref<Image> empty; mc.albedo = _get_bake_texture(empty, Color(0.7, 0.7, 0.7)); mc.emission = _get_bake_texture(empty, Color(0, 0, 0)); diff --git a/scene/3d/gi_probe.h b/scene/3d/gi_probe.h index ae89a6f068..3b05d9952b 100644 --- a/scene/3d/gi_probe.h +++ b/scene/3d/gi_probe.h @@ -134,7 +134,7 @@ private: Vector<Color> emission; }; - Vector<Color> _get_bake_texture(Image &p_image, const Color &p_color); + Vector<Color> _get_bake_texture(Ref<Image> p_image, const Color &p_color); Map<Ref<Material>, MaterialCache> material_cache; MaterialCache _get_material_cache(Ref<Material> p_material); int leaf_voxel_count; @@ -170,7 +170,7 @@ private: int color_scan_cell_width; int bake_texture_size; - Vector<Color> _get_bake_texture(Image &p_image, const Color &p_color); + Vector<Color> _get_bake_texture(Ref<Image> p_image, const Color &p_color); Baker::MaterialCache _get_material_cache(Ref<Material> p_material, Baker *p_baker); void _plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, const Vector3 *p_vtx, const Vector2 *p_uv, const Baker::MaterialCache &p_material, const Rect3 &p_aabb, Baker *p_baker); void _plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, Baker *p_baker, const Vector<Ref<Material> > &p_materials, const Ref<Material> &p_override_material); diff --git a/scene/3d/light.cpp b/scene/3d/light.cpp index bb14ad5108..6ab65d3994 100644 --- a/scene/3d/light.cpp +++ b/scene/3d/light.cpp @@ -29,7 +29,6 @@ /*************************************************************************/ #include "light.h" -#include "baked_light_instance.h" #include "global_config.h" #include "scene/resources/surface_tool.h" @@ -166,26 +165,9 @@ void Light::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE) { _update_visibility(); - - Node *node = this; - - while (node) { - - baked_light = node->cast_to<BakedLight>(); - if (baked_light) { - baked_light->lights.insert(this); - break; - } - - node = node->get_parent(); - } } if (p_what == NOTIFICATION_EXIT_TREE) { - - if (baked_light) { - baked_light->lights.erase(this); - } } } @@ -262,8 +244,6 @@ Light::Light(VisualServer::LightType p_type) { light = VisualServer::get_singleton()->light_create(p_type); VS::get_singleton()->instance_set_base(get_instance(), light); - baked_light = NULL; - editor_only = false; set_color(Color(1, 1, 1, 1)); set_shadow(false); diff --git a/scene/3d/light.h b/scene/3d/light.h index ed8758b09b..c02f9d12d3 100644 --- a/scene/3d/light.h +++ b/scene/3d/light.h @@ -75,7 +75,6 @@ private: bool editor_only; void _update_visibility(); - BakedLight *baked_light; // bind helpers protected: diff --git a/scene/3d/particles.cpp b/scene/3d/particles.cpp index 038ca33a41..71079ea780 100644 --- a/scene/3d/particles.cpp +++ b/scene/3d/particles.cpp @@ -48,11 +48,13 @@ void Particles::set_emitting(bool p_emitting) { void Particles::set_amount(int p_amount) { + ERR_FAIL_COND(p_amount < 1); amount = p_amount; VS::get_singleton()->particles_set_amount(particles, amount); } void Particles::set_lifetime(float p_lifetime) { + ERR_FAIL_COND(p_lifetime <= 0); lifetime = p_lifetime; VS::get_singleton()->particles_set_lifetime(particles, lifetime); } diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index adb5e2f0b6..264ee6297e 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -178,7 +178,7 @@ void ColorPicker::_update_presets() { } } - Image i(size.x * presets.size(), size.y, false, Image::FORMAT_RGB8, img); + Ref<Image> i = memnew(Image(size.x * presets.size(), size.y, false, Image::FORMAT_RGB8, img)); Ref<ImageTexture> t; t.instance(); @@ -399,16 +399,16 @@ void ColorPicker::_screen_input(const InputEvent &ev) { Viewport *r = get_tree()->get_root(); if (!r->get_visible_rect().has_point(Point2(mev.global_x, mev.global_y))) return; - Image img = r->get_screen_capture(); - if (!img.empty()) { + Ref<Image> img = r->get_screen_capture(); + if (!img.is_null()) { last_capture = img; r->queue_screen_capture(); } - if (!last_capture.empty()) { - int pw = last_capture.get_format() == Image::FORMAT_RGBA8 ? 4 : 3; - int ofs = (mev.global_y * last_capture.get_width() + mev.global_x) * pw; + if (last_capture.is_valid() && !last_capture->empty()) { + int pw = last_capture->get_format() == Image::FORMAT_RGBA8 ? 4 : 3; + int ofs = (mev.global_y * last_capture->get_width() + mev.global_x) * pw; - PoolVector<uint8_t>::Read r = last_capture.get_data().read(); + PoolVector<uint8_t>::Read r = last_capture->get_data().read(); Color c(r[ofs + 0] / 255.0, r[ofs + 1] / 255.0, r[ofs + 2] / 255.0); diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index bce1ae07f7..437a491b54 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -47,7 +47,7 @@ class ColorPicker : public BoxContainer { private: Control *screen; - Image last_capture; + Ref<Image> last_capture; Control *uv_edit; Control *w_edit; TextureRect *sample; diff --git a/scene/gui/color_ramp_edit.cpp b/scene/gui/color_ramp_edit.cpp index c6f73fe6e6..a0fd2dd33c 100644 --- a/scene/gui/color_ramp_edit.cpp +++ b/scene/gui/color_ramp_edit.cpp @@ -42,7 +42,8 @@ ColorRampEdit::ColorRampEdit() { add_child(popup); checker = Ref<ImageTexture>(memnew(ImageTexture)); - checker->create_from_image(Image(checker_bg_png), ImageTexture::FLAG_REPEAT); + Ref<Image> img = memnew(Image(checker_bg_png)); + checker->create_from_image(img, ImageTexture::FLAG_REPEAT); } int ColorRampEdit::_get_point_from_pos(int x) { diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 2f1af318e9..391b39443d 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -336,8 +336,8 @@ void FileDialog::update_file_list() { dirs.push_back(".."); } - dirs.sort_custom<NoCaseComparator>(); - files.sort_custom<NoCaseComparator>(); + dirs.sort_custom<NaturalNoCaseComparator>(); + files.sort_custom<NaturalNoCaseComparator>(); while (!dirs.empty()) { String &dir_name = dirs.front()->get(); 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/popup_menu.cpp b/scene/gui/popup_menu.cpp index 6ac6eac655..e3f26e0f0b 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -108,6 +108,11 @@ Size2 PopupMenu::get_minimum_size() const { accel_max_w = MAX(accel_w, accel_max_w); } + if (items[i].submenu != "") { + + size.width += get_icon("submenu")->get_width(); + } + minsize.height += size.height; max_w = MAX(max_w, size.width); } @@ -273,7 +278,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 +298,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/gui/video_player.h b/scene/gui/video_player.h index c3a839c514..1d70718a6a 100644 --- a/scene/gui/video_player.h +++ b/scene/gui/video_player.h @@ -59,7 +59,7 @@ class VideoPlayer : public Control { RID stream_rid; Ref<ImageTexture> texture; - Image last_frame; + Ref<Image> last_frame; AudioRBResampler resampler; 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/scene/main/viewport.cpp b/scene/main/viewport.cpp index 406640275c..aaf839b072 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1226,10 +1226,10 @@ void Viewport::queue_screen_capture() { //VS::get_singleton()->viewport_queue_screen_capture(viewport); } -Image Viewport::get_screen_capture() const { +Ref<Image> Viewport::get_screen_capture() const { //return VS::get_singleton()->viewport_get_screen_capture(viewport); - return Image(); + return Ref<Image>(); } Ref<ViewportTexture> Viewport::get_texture() const { diff --git a/scene/main/viewport.h b/scene/main/viewport.h index d784fc8ee9..e0f9cf1de2 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -383,7 +383,7 @@ public: Vector2 get_camera_rect_size() const; void queue_screen_capture(); - Image get_screen_capture() const; + Ref<Image> get_screen_capture() const; void set_use_own_world(bool p_world); bool is_using_own_world() const; diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 513aa8153d..76ff6edc63 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -212,7 +212,7 @@ #include "scene/resources/environment.h" #include "scene/3d/area.h" -#include "scene/3d/baked_light_instance.h" + #include "scene/3d/body_shape.h" #include "scene/3d/immediate_geometry.h" #include "scene/3d/multimesh_instance.h" @@ -452,7 +452,7 @@ void register_scene_types() { ClassDB::register_class<PathFollow>(); ClassDB::register_class<VisibilityNotifier>(); ClassDB::register_class<VisibilityEnabler>(); - ClassDB::register_class<BakedLight>(); + // ClassDB::register_class<BakedLight>(); //ClassDB::register_type<BakedLightSampler>(); ClassDB::register_class<WorldEnvironment>(); ClassDB::register_class<RemoteTransform>(); diff --git a/scene/resources/baked_light.cpp b/scene/resources/baked_light.cpp deleted file mode 100644 index 1d896e640a..0000000000 --- a/scene/resources/baked_light.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/*************************************************************************/ -/* baked_light.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "baked_light.h" -#include "servers/visual_server.h" diff --git a/scene/resources/baked_light.h b/scene/resources/baked_light.h deleted file mode 100644 index 8d25c9caa2..0000000000 --- a/scene/resources/baked_light.h +++ /dev/null @@ -1,36 +0,0 @@ -/*************************************************************************/ -/* baked_light.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef BAKED_LIGHT_H -#define BAKED_LIGHT_H - -#include "resource.h" -#include "scene/resources/texture.h" - -#endif // BAKED_LIGHT_H diff --git a/scene/resources/bit_mask.cpp b/scene/resources/bit_mask.cpp index b8a9ea3361..e512f8a968 100644 --- a/scene/resources/bit_mask.cpp +++ b/scene/resources/bit_mask.cpp @@ -41,16 +41,16 @@ void BitMap::create(const Size2 &p_size) { zeromem(bitmask.ptr(), bitmask.size()); } -void BitMap::create_from_image_alpha(const Image &p_image) { +void BitMap::create_from_image_alpha(const Ref<Image> &p_image) { - ERR_FAIL_COND(p_image.empty()); - Image img = p_image; - img.convert(Image::FORMAT_LA8); - ERR_FAIL_COND(img.get_format() != Image::FORMAT_LA8); + ERR_FAIL_COND(p_image.is_null() || p_image->empty()); + Ref<Image> img = p_image->duplicate(); + img->convert(Image::FORMAT_LA8); + ERR_FAIL_COND(img->get_format() != Image::FORMAT_LA8); - create(Size2(img.get_width(), img.get_height())); + create(Size2(img->get_width(), img->get_height())); - PoolVector<uint8_t>::Read r = img.get_data().read(); + PoolVector<uint8_t>::Read r = img->get_data().read(); uint8_t *w = bitmask.ptr(); for (int i = 0; i < width * height; i++) { diff --git a/scene/resources/bit_mask.h b/scene/resources/bit_mask.h index 78da6ce0d8..5ab7a3134d 100644 --- a/scene/resources/bit_mask.h +++ b/scene/resources/bit_mask.h @@ -30,6 +30,7 @@ #ifndef BIT_MASK_H #define BIT_MASK_H +#include "image.h" #include "io/resource_loader.h" #include "resource.h" @@ -51,7 +52,7 @@ protected: public: void create(const Size2 &p_size); - void create_from_image_alpha(const Image &p_image); + void create_from_image_alpha(const Ref<Image> &p_image); void set_bit(const Point2 &p_pos, bool p_value); bool get_bit(const Point2 &p_pos) const; diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index 7d134a2c20..ac3b46c69f 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -53,20 +53,20 @@ static Ref<StyleBoxTexture> make_stylebox(T p_src, float p_left, float p_top, fl } else { texture = Ref<ImageTexture>(memnew(ImageTexture)); - Image img(p_src); + Ref<Image> img = memnew(Image(p_src)); if (scale > 1) { - Size2 orig_size = Size2(img.get_width(), img.get_height()); + Size2 orig_size = Size2(img->get_width(), img->get_height()); - img.convert(Image::FORMAT_RGBA8); - img.expand_x2_hq2x(); + img->convert(Image::FORMAT_RGBA8); + img->expand_x2_hq2x(); if (scale != 2.0) { - img.resize(orig_size.x * scale, orig_size.y * scale); + img->resize(orig_size.x * scale, orig_size.y * scale); } } else if (scale < 1) { - Size2 orig_size = Size2(img.get_width(), img.get_height()); - img.convert(Image::FORMAT_RGBA8); - img.resize(orig_size.x * scale, orig_size.y * scale); + Size2 orig_size = Size2(img->get_width(), img->get_height()); + img->convert(Image::FORMAT_RGBA8); + img->resize(orig_size.x * scale, orig_size.y * scale); } texture->create_from_image(img, ImageTexture::FLAG_FILTER); @@ -105,19 +105,19 @@ template <class T> static Ref<Texture> make_icon(T p_src) { Ref<ImageTexture> texture(memnew(ImageTexture)); - Image img = Image(p_src); + Ref<Image> img = memnew(Image(p_src)); if (scale > 1) { - Size2 orig_size = Size2(img.get_width(), img.get_height()); + Size2 orig_size = Size2(img->get_width(), img->get_height()); - img.convert(Image::FORMAT_RGBA8); - img.expand_x2_hq2x(); + img->convert(Image::FORMAT_RGBA8); + img->expand_x2_hq2x(); if (scale != 2.0) { - img.resize(orig_size.x * scale, orig_size.y * scale); + img->resize(orig_size.x * scale, orig_size.y * scale); } } else if (scale < 1) { - Size2 orig_size = Size2(img.get_width(), img.get_height()); - img.convert(Image::FORMAT_RGBA8); - img.resize(orig_size.x * scale, orig_size.y * scale); + Size2 orig_size = Size2(img->get_width(), img->get_height()); + img->convert(Image::FORMAT_RGBA8); + img->resize(orig_size.x * scale, orig_size.y * scale); } texture->create_from_image(img, ImageTexture::FLAG_FILTER); @@ -162,7 +162,7 @@ static Ref<BitmapFont> make_font2(int p_height, int p_ascent, int p_charcount, c Ref<BitmapFont> font(memnew(BitmapFont)); - Image image(p_img); + Ref<Image> image = memnew(Image(p_img)); Ref<ImageTexture> tex = memnew(ImageTexture); tex->create_from_image(image); diff --git a/scene/resources/dynamic_font.cpp b/scene/resources/dynamic_font.cpp index 6a5c4b97fc..d2848076a0 100644 --- a/scene/resources/dynamic_font.cpp +++ b/scene/resources/dynamic_font.cpp @@ -569,7 +569,7 @@ void DynamicFontAtSize::_update_char(CharType p_char) { //blit to image and texture { - Image img(tex.texture_size, tex.texture_size, 0, Image::FORMAT_LA8, tex.imgdata); + Ref<Image> img = memnew(Image(tex.texture_size, tex.texture_size, 0, Image::FORMAT_LA8, tex.imgdata)); if (tex.texture.is_null()) { tex.texture.instance(); diff --git a/scene/resources/sky_box.cpp b/scene/resources/sky_box.cpp index 241675569f..2fd074de0f 100644 --- a/scene/resources/sky_box.cpp +++ b/scene/resources/sky_box.cpp @@ -88,24 +88,25 @@ void ImageSkyBox::set_image_path(ImagePath p_image, const String &p_path) { if (all_ok) { - Image images[IMAGE_PATH_MAX]; + Ref<Image> images[IMAGE_PATH_MAX]; int w = 0, h = 0; Image::Format format; for (int i = 0; i < IMAGE_PATH_MAX; i++) { - Error err = ImageLoader::load_image(image_path[i], &images[i]); + images[i].instance(); + Error err = ImageLoader::load_image(image_path[i], images[i]); if (err) { ERR_PRINTS("Error loading image for skybox: " + image_path[i]); return; } if (i == 0) { - w = images[0].get_width(); - h = images[0].get_height(); - format = images[0].get_format(); + w = images[0]->get_width(); + h = images[0]->get_height(); + format = images[0]->get_format(); } else { - if (images[i].get_width() != w || images[i].get_height() != h || images[i].get_format() != format) { - ERR_PRINTS("Image size mismatch (" + itos(images[i].get_width()) + "," + itos(images[i].get_height()) + ":" + Image::get_format_name(images[i].get_format()) + " when it should be " + itos(w) + "," + itos(h) + ":" + Image::get_format_name(format) + "): " + image_path[i]); + if (images[i]->get_width() != w || images[i]->get_height() != h || images[i]->get_format() != format) { + ERR_PRINTS("Image size mismatch (" + itos(images[i]->get_width()) + "," + itos(images[i]->get_height()) + ":" + Image::get_format_name(images[i]->get_format()) + " when it should be " + itos(w) + "," + itos(h) + ":" + Image::get_format_name(format) + "): " + image_path[i]); return; } } diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index f0ac30a76e..ff80aa4284 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -91,9 +91,10 @@ void ImageTexture::reload_from_file() { return; uint32_t flags = get_flags(); - Image img; + Ref<Image> img; + img.instance(); - Error err = ImageLoader::load_image(path, &img); + Error err = ImageLoader::load_image(path, img); ERR_FAIL_COND(err != OK); create_from_image(img, flags); @@ -101,7 +102,7 @@ void ImageTexture::reload_from_file() { bool ImageTexture::_set(const StringName &p_name, const Variant &p_value) { - if (p_name == "image" && p_value.get_type() == Variant::IMAGE) + if (p_name == "image") create_from_image(p_value, flags); else if (p_name == "flags") if (w * h == 0) @@ -155,7 +156,7 @@ void ImageTexture::_get_property_list(List<PropertyInfo> *p_list) const { } p_list->push_back(PropertyInfo(Variant::INT, "flags", PROPERTY_HINT_FLAGS, "Mipmaps,Repeat,Filter,Anisotropic,sRGB,Mirrored Repeat")); - p_list->push_back(PropertyInfo(Variant::IMAGE, "image", img_hint, String::num(lossy_storage_quality))); + p_list->push_back(PropertyInfo(Variant::OBJECT, "image", PROPERTY_HINT_RESOURCE_TYPE, "Image")); p_list->push_back(PropertyInfo(Variant::VECTOR2, "size", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::INT, "storage", PROPERTY_HINT_ENUM, "Uncompressed,Compress Lossy,Compress Lossless")); p_list->push_back(PropertyInfo(Variant::REAL, "lossy_quality", PROPERTY_HINT_RANGE, "0.0,1.0,0.01")); @@ -167,8 +168,9 @@ void ImageTexture::_reload_hook(const RID &p_hook) { if (!path.is_resource_file()) return; - Image img; - Error err = ImageLoader::load_image(path, &img); + Ref<Image> img; + img.instance(); + Error err = ImageLoader::load_image(path, img); ERR_FAIL_COND(err != OK); @@ -185,14 +187,14 @@ void ImageTexture::create(int p_width, int p_height, Image::Format p_format, uin w = p_width; h = p_height; } -void ImageTexture::create_from_image(const Image &p_image, uint32_t p_flags) { +void ImageTexture::create_from_image(const Ref<Image> &p_image, uint32_t p_flags) { flags = p_flags; - w = p_image.get_width(); - h = p_image.get_height(); - format = p_image.get_format(); + w = p_image->get_width(); + h = p_image->get_height(); + format = p_image->get_format(); - VisualServer::get_singleton()->texture_allocate(texture, p_image.get_width(), p_image.get_height(), p_image.get_format(), p_flags); + VisualServer::get_singleton()->texture_allocate(texture, p_image->get_width(), p_image->get_height(), p_image->get_format(), p_flags); VisualServer::get_singleton()->texture_set_data(texture, p_image); _change_notify(); } @@ -220,12 +222,13 @@ Image::Format ImageTexture::get_format() const { void ImageTexture::load(const String &p_path) { - Image img; - img.load(p_path); + Ref<Image> img; + img.instance(); + img->load(p_path); create_from_image(img); } -void ImageTexture::set_data(const Image &p_image) { +void ImageTexture::set_data(const Ref<Image> &p_image) { VisualServer::get_singleton()->texture_set_data(texture, p_image); @@ -237,7 +240,7 @@ void ImageTexture::_resource_path_changed() { String path = get_path(); } -Image ImageTexture::get_data() const { +Ref<Image> ImageTexture::get_data() const { return VisualServer::get_singleton()->texture_get_data(texture); } @@ -257,42 +260,6 @@ RID ImageTexture::get_rid() const { return texture; } -void ImageTexture::fix_alpha_edges() { - - if (format == Image::FORMAT_RGBA8 /*&& !(flags&FLAG_CUBEMAP)*/) { - - Image img = get_data(); - img.fix_alpha_edges(); - set_data(img); - } -} - -void ImageTexture::premultiply_alpha() { - - if (format == Image::FORMAT_RGBA8 /*&& !(flags&FLAG_CUBEMAP)*/) { - - Image img = get_data(); - img.premultiply_alpha(); - set_data(img); - } -} - -void ImageTexture::normal_to_xy() { - - Image img = get_data(); - img.normalmap_to_xy(); - create_from_image(img, flags); -} - -void ImageTexture::shrink_x2_and_keep_size() { - - Size2 sizeov = get_size(); - Image img = get_data(); - img.resize(img.get_width() / 2, img.get_height() / 2, Image::INTERPOLATE_BILINEAR); - create_from_image(img, flags); - set_size_override(sizeov); -} - bool ImageTexture::has_alpha() const { return (format == Image::FORMAT_LA8 || format == Image::FORMAT_RGBA8); @@ -358,7 +325,8 @@ float ImageTexture::get_lossy_storage_quality() const { void ImageTexture::_set_data(Dictionary p_data) { - Image img = p_data["image"]; + Ref<Image> img = p_data["image"]; + ERR_FAIL_COND(!img.is_valid()); uint32_t flags = p_data["flags"]; create_from_image(img, flags); @@ -372,19 +340,15 @@ void ImageTexture::_set_data(Dictionary p_data) { void ImageTexture::_bind_methods() { ClassDB::bind_method(D_METHOD("create", "width", "height", "format", "flags"), &ImageTexture::create, DEFVAL(FLAGS_DEFAULT)); - ClassDB::bind_method(D_METHOD("create_from_image", "image", "flags"), &ImageTexture::create_from_image, DEFVAL(FLAGS_DEFAULT)); + ClassDB::bind_method(D_METHOD("create_from_image", "image:Image", "flags"), &ImageTexture::create_from_image, DEFVAL(FLAGS_DEFAULT)); ClassDB::bind_method(D_METHOD("get_format"), &ImageTexture::get_format); ClassDB::bind_method(D_METHOD("load", "path"), &ImageTexture::load); - ClassDB::bind_method(D_METHOD("set_data", "image"), &ImageTexture::set_data); - ClassDB::bind_method(D_METHOD("get_data", "cube_side"), &ImageTexture::get_data); + ClassDB::bind_method(D_METHOD("set_data", "image:Image"), &ImageTexture::set_data); + ClassDB::bind_method(D_METHOD("get_data:Image", "cube_side"), &ImageTexture::get_data); ClassDB::bind_method(D_METHOD("set_storage", "mode"), &ImageTexture::set_storage); ClassDB::bind_method(D_METHOD("get_storage"), &ImageTexture::get_storage); ClassDB::bind_method(D_METHOD("set_lossy_storage_quality", "quality"), &ImageTexture::set_lossy_storage_quality); ClassDB::bind_method(D_METHOD("get_lossy_storage_quality"), &ImageTexture::get_lossy_storage_quality); - ClassDB::bind_method(D_METHOD("fix_alpha_edges"), &ImageTexture::fix_alpha_edges); - ClassDB::bind_method(D_METHOD("premultiply_alpha"), &ImageTexture::premultiply_alpha); - ClassDB::bind_method(D_METHOD("normal_to_xy"), &ImageTexture::normal_to_xy); - ClassDB::bind_method(D_METHOD("shrink_x2_and_keep_size"), &ImageTexture::shrink_x2_and_keep_size); ClassDB::bind_method(D_METHOD("set_size_override", "size"), &ImageTexture::set_size_override); ClassDB::set_method_flags(get_class_static(), _scs_create("fix_alpha_edges"), METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR); @@ -442,7 +406,9 @@ Image::Format StreamTexture::get_format() const { return format; } -Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &flags, Image &image, int p_size_limit) { +Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &flags, Ref<Image> image, int p_size_limit) { + + ERR_FAIL_COND_V(image.is_null(), ERR_INVALID_PARAMETER); FileAccess *f = FileAccess::open(p_path, FileAccess::READ); ERR_FAIL_COND_V(!f, ERR_CANT_OPEN); @@ -509,7 +475,7 @@ Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &fla } //mipmaps need to be read independently, they will be later combined - Vector<Image> mipmap_images; + Vector<Ref<Image> > mipmap_images; int total_size = 0; for (int i = 0; i < mipmaps; i++) { @@ -525,18 +491,18 @@ Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &fla f->get_buffer(w.ptr(), size); } - Image img; + Ref<Image> img; if (df & FORMAT_BIT_LOSSLESS) { img = Image::lossless_unpacker(pv); } else { img = Image::lossy_unpacker(pv); } - if (img.empty()) { + if (img.is_null()) { memdelete(f); - ERR_FAIL_COND_V(img.empty(), ERR_FILE_CORRUPT); + ERR_FAIL_COND_V(img->empty(), ERR_FILE_CORRUPT); } - total_size += img.get_data().size(); + total_size += img->get_data().size(); mipmap_images.push_back(img); } @@ -560,7 +526,7 @@ Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &fla int ofs = 0; for (int i = 0; i < mipmap_images.size(); i++) { - PoolVector<uint8_t> id = mipmap_images[i].get_data(); + PoolVector<uint8_t> id = mipmap_images[i]->get_data(); int len = id.size(); PoolVector<uint8_t>::Read r = id.read(); copymem(&w[ofs], r.ptr(), len); @@ -568,7 +534,7 @@ Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &fla } } - image = Image(sw, sh, true, mipmap_images[0].get_format(), img_data); + image->create(sw, sh, true, mipmap_images[0]->get_format(), img_data); return OK; } @@ -591,7 +557,7 @@ Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &fla memdelete(f); - image = Image(tw, th, false, format, img_data); + image->create(tw, th, false, format, img_data); return OK; } else { @@ -637,7 +603,7 @@ Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &fla } } - image = Image(sw, sh, true, format, img_data); + image->create(sw, sh, true, format, img_data); return OK; } @@ -649,19 +615,20 @@ Error StreamTexture::_load_data(const String &p_path, int &tw, int &th, int &fla Error StreamTexture::load(const String &p_path) { int lw, lh, lflags; - Image image; + Ref<Image> image; + image.instance(); Error err = _load_data(p_path, lw, lh, lflags, image); if (err) return err; - VS::get_singleton()->texture_allocate(texture, image.get_width(), image.get_height(), image.get_format(), lflags); + VS::get_singleton()->texture_allocate(texture, image->get_width(), image->get_height(), image->get_format(), lflags); VS::get_singleton()->texture_set_data(texture, image); w = lw; h = lh; flags = lflags; path_to_file = p_path; - format = image.get_format(); + format = image->get_format(); return OK; } @@ -707,7 +674,7 @@ bool StreamTexture::has_alpha() const { return false; } -Image StreamTexture::get_data() const { +Ref<Image> StreamTexture::get_data() const { return VS::get_singleton()->texture_get_data(texture); } @@ -1175,25 +1142,25 @@ uint32_t CubeMap::get_flags() const { return flags; } -void CubeMap::set_side(Side p_side, const Image &p_image) { +void CubeMap::set_side(Side p_side, const Ref<Image> &p_image) { - ERR_FAIL_COND(p_image.empty()); + ERR_FAIL_COND(p_image->empty()); ERR_FAIL_INDEX(p_side, 6); if (!_is_valid()) { - format = p_image.get_format(); - w = p_image.get_width(); - h = p_image.get_height(); - VS::get_singleton()->texture_allocate(cubemap, w, h, p_image.get_format(), flags | VS::TEXTURE_FLAG_CUBEMAP); + format = p_image->get_format(); + w = p_image->get_width(); + h = p_image->get_height(); + VS::get_singleton()->texture_allocate(cubemap, w, h, p_image->get_format(), flags | VS::TEXTURE_FLAG_CUBEMAP); } VS::get_singleton()->texture_set_data(cubemap, p_image, VS::CubeMapSide(p_side)); valid[p_side] = true; } -Image CubeMap::get_side(Side p_side) const { +Ref<Image> CubeMap::get_side(Side p_side) const { if (!valid[p_side]) - return Image(); + return Ref<Image>(); return VS::get_singleton()->texture_get_data(cubemap, VS::CubeMapSide(p_side)); } @@ -1306,14 +1273,12 @@ void CubeMap::_get_property_list(List<PropertyInfo> *p_list) const { } p_list->push_back(PropertyInfo(Variant::INT, "flags", PROPERTY_HINT_FLAGS, "Mipmaps,Repeat,Filter")); - p_list->push_back(PropertyInfo(Variant::IMAGE, "side/left", img_hint, String::num(lossy_storage_quality))); - p_list->push_back(PropertyInfo(Variant::IMAGE, "side/right", img_hint, String::num(lossy_storage_quality))); - p_list->push_back(PropertyInfo(Variant::IMAGE, "side/bottom", img_hint, String::num(lossy_storage_quality))); - p_list->push_back(PropertyInfo(Variant::IMAGE, "side/top", img_hint, String::num(lossy_storage_quality))); - p_list->push_back(PropertyInfo(Variant::IMAGE, "side/front", img_hint, String::num(lossy_storage_quality))); - p_list->push_back(PropertyInfo(Variant::IMAGE, "side/back", img_hint, String::num(lossy_storage_quality))); - p_list->push_back(PropertyInfo(Variant::INT, "storage", PROPERTY_HINT_ENUM, "Uncompressed,Compress Lossy,Compress Lossless", PROPERTY_USAGE_EDITOR)); - p_list->push_back(PropertyInfo(Variant::REAL, "lossy_quality", PROPERTY_HINT_RANGE, "0.0,1.0,0.01")); + p_list->push_back(PropertyInfo(Variant::OBJECT, "side/left", PROPERTY_HINT_RESOURCE_TYPE, "Image")); + p_list->push_back(PropertyInfo(Variant::OBJECT, "side/right", PROPERTY_HINT_RESOURCE_TYPE, "Image")); + p_list->push_back(PropertyInfo(Variant::OBJECT, "side/bottom", PROPERTY_HINT_RESOURCE_TYPE, "Image")); + p_list->push_back(PropertyInfo(Variant::OBJECT, "side/top", PROPERTY_HINT_RESOURCE_TYPE, "Image")); + p_list->push_back(PropertyInfo(Variant::OBJECT, "side/front", PROPERTY_HINT_RESOURCE_TYPE, "Image")); + p_list->push_back(PropertyInfo(Variant::OBJECT, "side/back", PROPERTY_HINT_RESOURCE_TYPE, "Image")); } void CubeMap::_bind_methods() { @@ -1603,7 +1568,7 @@ void CurveTexture::set_points(const PoolVector<Vector2> &p_points) { } } - Image image(width, 1, false, Image::FORMAT_RF, data); + Ref<Image> image = memnew(Image(width, 1, false, Image::FORMAT_RF, data)); VS::get_singleton()->texture_allocate(texture, width, 1, Image::FORMAT_RF, VS::TEXTURE_FLAG_FILTER); VS::get_singleton()->texture_set_data(texture, image); @@ -1715,7 +1680,7 @@ void GradientTexture::_update() { } } - Image image(width, 1, false, Image::FORMAT_RGBA8, data); + Ref<Image> image = memnew(Image(width, 1, false, Image::FORMAT_RGBA8, data)); VS::get_singleton()->texture_allocate(texture, width, 1, Image::FORMAT_RGBA8, VS::TEXTURE_FLAG_FILTER); VS::get_singleton()->texture_set_data(texture, image); diff --git a/scene/resources/texture.h b/scene/resources/texture.h index a6ea163813..3aa007fa00 100644 --- a/scene/resources/texture.h +++ b/scene/resources/texture.h @@ -73,7 +73,7 @@ public: virtual void draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false) const; virtual bool get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, Rect2 &r_rect, Rect2 &r_src_rect) const; - virtual Image get_data() const { return Image(); } + virtual Ref<Image> get_data() const { return Ref<Image>(); } Texture(); }; @@ -116,14 +116,14 @@ protected: public: void create(int p_width, int p_height, Image::Format p_format, uint32_t p_flags = FLAGS_DEFAULT); - void create_from_image(const Image &p_image, uint32_t p_flags = FLAGS_DEFAULT); + void create_from_image(const Ref<Image> &p_image, uint32_t p_flags = FLAGS_DEFAULT); void set_flags(uint32_t p_flags); uint32_t get_flags() const; Image::Format get_format() const; void load(const String &p_path); - void set_data(const Image &p_image); - Image get_data() const; + void set_data(const Ref<Image> &p_image); + Ref<Image> get_data() const; int get_width() const; int get_height() const; @@ -140,11 +140,6 @@ public: void set_lossy_storage_quality(float p_lossy_storage_quality); float get_lossy_storage_quality() const; - void fix_alpha_edges(); - void premultiply_alpha(); - void normal_to_xy(); - void shrink_x2_and_keep_size(); - void set_size_override(const Size2 &p_size); virtual void set_path(const String &p_path, bool p_take_over = false); @@ -175,7 +170,7 @@ public: }; private: - Error _load_data(const String &p_path, int &tw, int &th, int &flags, Image &image, int p_size_limit = 0); + Error _load_data(const String &p_path, int &tw, int &th, int &flags, Ref<Image> image, int p_size_limit = 0); String path_to_file; RID texture; Image::Format format; @@ -212,7 +207,7 @@ public: virtual bool has_alpha() const; virtual void set_flags(uint32_t p_flags); - virtual Image get_data() const; + virtual Ref<Image> get_data() const; StreamTexture(); ~StreamTexture(); @@ -370,8 +365,8 @@ protected: public: void set_flags(uint32_t p_flags); uint32_t get_flags() const; - void set_side(Side p_side, const Image &p_image); - Image get_side(Side p_side) const; + void set_side(Side p_side, const Ref<Image> &p_image); + Ref<Image> get_side(Side p_side) const; Image::Format get_format() const; int get_width() const; 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/servers/visual/rasterizer.h b/servers/visual/rasterizer.h index ff679bc15f..624bd1dad7 100644 --- a/servers/visual/rasterizer.h +++ b/servers/visual/rasterizer.h @@ -163,8 +163,8 @@ public: virtual RID texture_create() = 0; virtual void texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags = VS::TEXTURE_FLAGS_DEFAULT) = 0; - virtual void texture_set_data(RID p_texture, const Image &p_image, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) = 0; - virtual Image texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) const = 0; + virtual void texture_set_data(RID p_texture, const Ref<Image> &p_image, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) = 0; + virtual Ref<Image> texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) const = 0; virtual void texture_set_flags(RID p_texture, uint32_t p_flags) = 0; virtual uint32_t texture_get_flags(RID p_texture) const = 0; virtual Image::Format texture_get_format(RID p_texture) const = 0; @@ -931,7 +931,7 @@ public: virtual RasterizerCanvas *get_canvas() = 0; virtual RasterizerScene *get_scene() = 0; - virtual void set_boot_image(const Image &p_image, const Color &p_color, bool p_scale) = 0; + virtual void set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale) = 0; virtual void initialize() = 0; virtual void begin_frame() = 0; diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp index 5ba975d193..2fdff29f0a 100644 --- a/servers/visual/visual_server_raster.cpp +++ b/servers/visual/visual_server_raster.cpp @@ -121,7 +121,7 @@ int VisualServerRaster::get_render_info(RenderInfo p_info) { /* TESTING */ -void VisualServerRaster::set_boot_image(const Image &p_image, const Color &p_color, bool p_scale) { +void VisualServerRaster::set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale) { redraw_request(); VSG::rasterizer->set_boot_image(p_image, p_color, p_scale); diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index 7de497d529..db3c7f822a 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -623,8 +623,8 @@ public: BIND0R(RID, texture_create) BIND5(texture_allocate, RID, int, int, Image::Format, uint32_t) - BIND3(texture_set_data, RID, const Image &, CubeMapSide) - BIND2RC(Image, texture_get_data, RID, CubeMapSide) + BIND3(texture_set_data, RID, const Ref<Image> &, CubeMapSide) + BIND2RC(Ref<Image>, texture_get_data, RID, CubeMapSide) BIND2(texture_set_flags, RID, uint32_t) BIND1RC(uint32_t, texture_get_flags, RID) BIND1RC(Image::Format, texture_get_format, RID) @@ -1109,7 +1109,7 @@ public: /* TESTING */ - virtual void set_boot_image(const Image &p_image, const Color &p_color, bool p_scale); + virtual void set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale); virtual void set_default_clear_color(const Color &p_color); virtual bool has_feature(Features p_feature) const; diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index 5a7ae93a31..5df1ca456b 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -68,10 +68,11 @@ VisualServer *VisualServer::create() { return NULL; } -RID VisualServer::texture_create_from_image(const Image &p_image, uint32_t p_flags) { +RID VisualServer::texture_create_from_image(const Ref<Image> &p_image, uint32_t p_flags) { + ERR_FAIL_COND_V(!p_image.is_valid(), RID()); RID texture = texture_create(); - texture_allocate(texture, p_image.get_width(), p_image.get_height(), p_image.get_format(), p_flags); //if it has mipmaps, use, else generate + texture_allocate(texture, p_image->get_width(), p_image->get_height(), p_image->get_format(), p_flags); //if it has mipmaps, use, else generate ERR_FAIL_COND_V(!texture.is_valid(), texture); texture_set_data(texture, p_image); @@ -120,12 +121,12 @@ RID VisualServer::get_test_texture() { } } - Image data(TEST_TEXTURE_SIZE, TEST_TEXTURE_SIZE, false, Image::FORMAT_RGB8, test_data); + Ref<Image> data = memnew(Image(TEST_TEXTURE_SIZE, TEST_TEXTURE_SIZE, false, Image::FORMAT_RGB8, test_data)); test_texture = texture_create_from_image(data); return test_texture; -}; +} void VisualServer::_free_internal_rids() { @@ -324,7 +325,7 @@ RID VisualServer::get_white_texture() { for (int i = 0; i < 16 * 3; i++) w[i] = 255; } - Image white(4, 4, 0, Image::FORMAT_RGB8, wt); + Ref<Image> white = memnew(Image(4, 4, 0, Image::FORMAT_RGB8, wt)); white_texture = texture_create(); texture_allocate(white_texture, 4, 4, Image::FORMAT_RGB8); texture_set_data(white_texture, white); diff --git a/servers/visual_server.h b/servers/visual_server.h index 7accc7d904..28f21a36eb 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -32,6 +32,7 @@ #include "bsp_tree.h" #include "geometry.h" +#include "image.h" #include "math_2d.h" #include "object.h" #include "rid.h" @@ -106,10 +107,10 @@ public: }; virtual RID texture_create() = 0; - RID texture_create_from_image(const Image &p_image, uint32_t p_flags = TEXTURE_FLAGS_DEFAULT); // helper + RID texture_create_from_image(const Ref<Image> &p_image, uint32_t p_flags = TEXTURE_FLAGS_DEFAULT); // helper virtual void texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags = TEXTURE_FLAGS_DEFAULT) = 0; - virtual void texture_set_data(RID p_texture, const Image &p_image, CubeMapSide p_cube_side = CUBEMAP_LEFT) = 0; - virtual Image texture_get_data(RID p_texture, CubeMapSide p_cube_side = CUBEMAP_LEFT) const = 0; + virtual void texture_set_data(RID p_texture, const Ref<Image> &p_image, CubeMapSide p_cube_side = CUBEMAP_LEFT) = 0; + virtual Ref<Image> texture_get_data(RID p_texture, CubeMapSide p_cube_side = CUBEMAP_LEFT) const = 0; virtual void texture_set_flags(RID p_texture, uint32_t p_flags) = 0; virtual uint32_t texture_get_flags(RID p_texture) const = 0; virtual Image::Format texture_get_format(RID p_texture) const = 0; @@ -884,7 +885,7 @@ public: virtual void mesh_add_surface_from_mesh_data(RID p_mesh, const Geometry::MeshData &p_mesh_data); virtual void mesh_add_surface_from_planes(RID p_mesh, const PoolVector<Plane> &p_planes); - virtual void set_boot_image(const Image &p_image, const Color &p_color, bool p_scale) = 0; + virtual void set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale) = 0; virtual void set_default_clear_color(const Color &p_color) = 0; enum Features { 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 |