From af31769a634cf52b8c41b3844a7f0f4c3d65f17d Mon Sep 17 00:00:00 2001 From: Jan Boon Date: Thu, 14 Nov 2019 10:15:40 +0800 Subject: [PATCH 01/22] Add LICENSE copy to the repository root --- LICENSE | 661 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 661 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..0ad25db4b --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. From ed8a5c14a788af04ad07a81bc1cccb45c7ab7a85 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Thu, 14 Nov 2019 16:37:09 +0800 Subject: [PATCH 02/22] Add sound sheet build process --- code/nel/tools/build_gamedata/0_setup.py | 14 ++-- .../processes/soundbank/0_setup.py | 65 +++++++++++++++++++ .../processes/soundbank/1_export.py | 49 ++++++++++++++ .../processes/soundbank/2_build.py | 64 ++++++++++++++++++ .../processes/soundbank/3_install.py | 55 ++++++++++++++++ 5 files changed, 237 insertions(+), 10 deletions(-) create mode 100644 code/nel/tools/build_gamedata/processes/soundbank/0_setup.py create mode 100644 code/nel/tools/build_gamedata/processes/soundbank/1_export.py create mode 100644 code/nel/tools/build_gamedata/processes/soundbank/2_build.py create mode 100644 code/nel/tools/build_gamedata/processes/soundbank/3_install.py diff --git a/code/nel/tools/build_gamedata/0_setup.py b/code/nel/tools/build_gamedata/0_setup.py index 479121428..42a9a409b 100755 --- a/code/nel/tools/build_gamedata/0_setup.py +++ b/code/nel/tools/build_gamedata/0_setup.py @@ -88,13 +88,9 @@ if not args.noconf: except NameError: SoundDirectory = "V:" try: - SoundSheetsDirectory + SoundDfnDirectory except NameError: - SoundSheetsDirectory = "V:" - try: - SoundSheetsDfnDirectory - except NameError: - SoundSheetsDfnDirectory = "V:/DFN" + SoundDfnDirectory = "V:/DFN" try: ExportBuildDirectory except NameError: @@ -231,8 +227,7 @@ if not args.noconf: WorkspaceDirectory = askVar(log, "[IN] Workspace Directory", WorkspaceDirectory).replace("\\", "/") DatabaseDirectory = askVar(log, "[IN] Database Directory", DatabaseDirectory).replace("\\", "/") SoundDirectory = askVar(log, "[IN] Sound Directory", SoundDirectory).replace("\\", "/") - SoundSheetsDirectory = askVar(log, "[IN] Sound Sheets Directory", SoundSheetsDirectory).replace("\\", "/") - SoundSheetsDfnDirectory = askVar(log, "[IN] Sound Sheets DFN Directory", SoundSheetsDfnDirectory).replace("\\", "/") + SoundDfnDirectory = askVar(log, "[IN] Sound DFN Directory", SoundDfnDirectory).replace("\\", "/") ExportBuildDirectory = askVar(log, "[OUT] Export Build Directory", ExportBuildDirectory).replace("\\", "/") InstallDirectory = askVar(log, "[OUT] Install Directory", InstallDirectory).replace("\\", "/") ClientDevDirectory = askVar(log, "[OUT] Client Dev Directory", ClientDevDirectory).replace("\\", "/") @@ -317,8 +312,7 @@ if not args.noconf: sf.write("# Data build directories\n") sf.write("DatabaseDirectory = \"" + str(DatabaseDirectory) + "\"\n") sf.write("SoundDirectory = \"" + str(SoundDirectory) + "\"\n") - sf.write("SoundSheetsDirectory = \"" + str(SoundSheetsDirectory) + "\"\n") - sf.write("SoundSheetsDfnDirectory = \"" + str(SoundSheetsDfnDirectory) + "\"\n") + sf.write("SoundDfnDirectory = \"" + str(SoundDfnDirectory) + "\"\n") sf.write("ExportBuildDirectory = \"" + str(ExportBuildDirectory) + "\"\n") sf.write("\n") sf.write("# Install directories\n") diff --git a/code/nel/tools/build_gamedata/processes/soundbank/0_setup.py b/code/nel/tools/build_gamedata/processes/soundbank/0_setup.py new file mode 100644 index 000000000..368011d1a --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/soundbank/0_setup.py @@ -0,0 +1,65 @@ +#!/usr/bin/python +# +# \file 0_setup.py +# \brief Setup soundbank +# \date 2009-06-03 10:47GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Setup soundbank +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Setup soundbank") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +# Setup source directories +printLog(log, ">>> Setup source directories <<<") +mkPath(log, SoundDirectory) +mkPath(log, SoundDfnDirectory) + +# Setup export directories +printLog(log, ">>> Setup export directories <<<") + +# Setup build directories +printLog(log, ">>> Setup build directories <<<") +mkPath(log, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory) + +# Setup client directories +printLog(log, ">>> Setup client directories <<<") +mkPath(log, InstallDirectory + "/" + SoundInstallDirectory) + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/soundbank/1_export.py b/code/nel/tools/build_gamedata/processes/soundbank/1_export.py new file mode 100644 index 000000000..ffecbb4d3 --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/soundbank/1_export.py @@ -0,0 +1,49 @@ +#!/usr/bin/python +# +# \file 1_export.py +# \brief Export soundbank +# \date 2009-06-03 10:47GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Export soundbank +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Export soundbank") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/soundbank/2_build.py b/code/nel/tools/build_gamedata/processes/soundbank/2_build.py new file mode 100644 index 000000000..03d2f6b07 --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/soundbank/2_build.py @@ -0,0 +1,64 @@ +#!/usr/bin/python +# +# \file 2_build.py +# \brief Build soundbank +# \date 2009-06-03 10:47GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Build soundbank +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Build soundbank") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +# Find tools +BuildSoundbank = findTool(log, ToolDirectories, BuildSoundbankTool, ToolSuffix) +printLog(log, "") + +# build_soundbank +printLog(log, ">>> Build soundbank <<<") +if BuildSoundbank == "": + toolLogFail(log, BuildSoundbankTool, ToolSuffix) +else: + mkPath(log, SoundDirectory) + mkPath(log, SoundDfnDirectory) + mkPath(log, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory) + subprocess.call([ BuildSoundbank, SoundDirectory, SoundDfnDirectory, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory ]) +printLog(log, "") + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/soundbank/3_install.py b/code/nel/tools/build_gamedata/processes/soundbank/3_install.py new file mode 100644 index 000000000..e8a2a6242 --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/soundbank/3_install.py @@ -0,0 +1,55 @@ +#!/usr/bin/python +# +# \file 3_install.py +# \brief Install soundbank +# \date 2009-06-03 10:47GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Install soundbank +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Install soundbank") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +printLog(log, ">>> Install soundbank packed_sheets <<<") +mkPath(log, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory) +mkPath(log, InstallDirectory + "/" + SoundInstallDirectory) +copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory, InstallDirectory + "/" + SoundInstallDirectory, ".packed_sheets") + +printLog(log, "") +log.close() + + +# end of file From 02305cdb33886784beeddcf0a74cf04b786b9a06 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Thu, 14 Nov 2019 16:38:47 +0800 Subject: [PATCH 03/22] Fix sound sheet build code that caused random and missing values --- code/nel/src/sound/complex_sound.cpp | 5 ++++- code/nel/src/sound/simple_sound.cpp | 1 + code/nel/src/sound/stream_file_sound.cpp | 2 +- code/nel/src/sound/stream_sound.cpp | 15 +++++++-------- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/code/nel/src/sound/complex_sound.cpp b/code/nel/src/sound/complex_sound.cpp index 30b97347f..f33f4b2bf 100644 --- a/code/nel/src/sound/complex_sound.cpp +++ b/code/nel/src/sound/complex_sound.cpp @@ -171,6 +171,8 @@ CComplexSound::CComplexSound() : _PatternMode(CComplexSound::MODE_UNDEFINED), _TicksPerSeconds(1.0f), _XFadeLength(3000), // default to 3000 sec. + _DoFadeIn(true), + _DoFadeOut(true), _MaxDistValid(false), _Duration(0), _DurationValid(false) @@ -314,7 +316,8 @@ void CComplexSound::importForm(const std::string& filename, NLGEORGES::UFormElm& if (mode == "Chained" || mode == "Sparse") { // XFade length - formRoot.getValueByName(_XFadeLength, ".SoundType.XFadeLength"); + if (!formRoot.getValueByName(_XFadeLength, ".SoundType.XFadeLength")) + formRoot.getValueByName(_XFadeLength, ".SoundType.XFadeLenght"); // WORKAROUND: Typo in sound assets // Fade in/out flag. formRoot.getValueByName(_DoFadeIn, ".SoundType.DoFadeIn"); formRoot.getValueByName(_DoFadeOut, ".SoundType.DoFadeOut"); diff --git a/code/nel/src/sound/simple_sound.cpp b/code/nel/src/sound/simple_sound.cpp index 393c9daeb..c4c320ea4 100644 --- a/code/nel/src/sound/simple_sound.cpp +++ b/code/nel/src/sound/simple_sound.cpp @@ -38,6 +38,7 @@ CSimpleSound::CSimpleSound() : _Registered(false), _Buffer(NULL), // _Detailed(false), // not used? + _Alpha(1.0), _NeedContext(false) { // init with NULL in case of unexecpted access diff --git a/code/nel/src/sound/stream_file_sound.cpp b/code/nel/src/sound/stream_file_sound.cpp index 83641cdf7..1eb40f4bb 100644 --- a/code/nel/src/sound/stream_file_sound.cpp +++ b/code/nel/src/sound/stream_file_sound.cpp @@ -41,7 +41,7 @@ using namespace std; namespace NLSOUND { -CStreamFileSound::CStreamFileSound() +CStreamFileSound::CStreamFileSound() : m_Async(true) { } diff --git a/code/nel/src/sound/stream_sound.cpp b/code/nel/src/sound/stream_sound.cpp index 21b6de9d0..8933f8be7 100644 --- a/code/nel/src/sound/stream_sound.cpp +++ b/code/nel/src/sound/stream_sound.cpp @@ -18,19 +18,19 @@ #include "nel/sound/stream_sound.h" #if NLSOUND_SHEET_VERSION_BUILT < 2 -# include "nel/sound/group_controller_root.h" +#include "nel/sound/group_controller_root.h" #endif -namespace NLSOUND { +namespace NLSOUND +{ CStreamSound::CStreamSound() + : m_Alpha(1.0f) { - } CStreamSound::~CStreamSound() { - } void CStreamSound::importForm(const std::string &filename, NLGEORGES::UFormElm &root) @@ -49,7 +49,7 @@ void CStreamSound::importForm(const std::string &filename, NLGEORGES::UFormElm & CSound::importForm(filename, root); // MaxDistance - root.getValueByName(_MaxDist, ".SoundType.MaxDistance"); + root.getValueByName(_MaxDist, ".SoundType.MaxDistance"); // MinDistance root.getValueByName(_MinDist, ".SoundType.MinDistance"); @@ -60,7 +60,6 @@ void CStreamSound::importForm(const std::string &filename, NLGEORGES::UFormElm & #if NLSOUND_SHEET_VERSION_BUILT < 2 _GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_STREAM_GROUP_CONTROLLER); #endif - } void CStreamSound::serial(NLMISC::IStream &s) @@ -71,9 +70,9 @@ void CStreamSound::serial(NLMISC::IStream &s) s.serial(m_Alpha); #if NLSOUND_SHEET_VERSION_BUILT < 2 - if (s.isReading()) _GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_STREAM_GROUP_CONTROLLER); + if (s.isReading()) + _GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_STREAM_GROUP_CONTROLLER); #endif - } } /* namespace NLSOUND */ From 255c6956c754fda2b3f9fff824d209905c9e6cf7 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Thu, 14 Nov 2019 19:06:23 +0800 Subject: [PATCH 04/22] Skip git directory --- code/nel/src/misc/path.cpp | 4 ++-- code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/nel/src/misc/path.cpp b/code/nel/src/misc/path.cpp index 0c650918f..961a907b4 100644 --- a/code/nel/src/misc/path.cpp +++ b/code/nel/src/misc/path.cpp @@ -898,9 +898,9 @@ void CFileContainer::getPathContent (const string &path, bool recurse, bool want if (isdirectory(de)) { // skip CVS, .svn and .hg directory - if ((!showEverything) && (fn == "CVS" || fn == ".svn" || fn == ".hg")) + if ((!showEverything) && (fn == "CVS" || fn == ".svn" || fn == ".hg" || fn == ".git")) { - NL_DISPLAY_PATH("PATH: CPath::getPathContent(%s, %d, %d, %d): skip CVS, .svn and .hg directory", path.c_str(), recurse, wantDir, wantFile); + NL_DISPLAY_PATH("PATH: CPath::getPathContent(%s, %d, %d, %d): skip '%s' directory", path.c_str(), recurse, wantDir, wantFile, fn.c_str()); continue; } diff --git a/code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp b/code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp index d44e5a155..c0a74297b 100644 --- a/code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp +++ b/code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp @@ -457,7 +457,9 @@ bool CFileTreeCtrl::enumObjects(HTREEITEM hParentItem,IShellFolder* pParentFolde string ext5 = pItemInfo->displayName.substr(displayNameSize-5); bool cvs = ext3 == "CVS" || ext4 == "CVS\\" || ext4 == "CVS/" || - ext4 == ".svn" || ext5 == ".svn\\" || ext5 == ".svn/"; + ext4 == ".svn" || ext5 == ".svn\\" || ext5 == ".svn/" || + ext4 == ".hg" || ext5 == ".hg\\" || ext5 == ".hg/" || + ext4 == ".git" || ext5 == ".git\\" || ext5 == ".git/"; /* bool cvs = ( pItemInfo->displayName[displayNameSize-3] == 'C') && (pItemInfo->displayName[displayNameSize-2] == 'V') && From c15e75ecc8c68d3eca5aa3e3b4fefcbc6eaafa52 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Fri, 15 Nov 2019 11:02:20 +0800 Subject: [PATCH 05/22] Build rest of sound sheets --- code/nel/include/nel/sound/clustered_sound.h | 2 +- code/nel/include/nel/sound/u_audio_mixer.h | 4 ++++ code/nel/src/sound/audio_mixer_user.cpp | 17 +++++++++++++++++ code/nel/src/sound/clustered_sound.cpp | 16 +++++++++------- .../sound/build_soundbank/build_soundbank.cpp | 2 ++ 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/code/nel/include/nel/sound/clustered_sound.h b/code/nel/include/nel/sound/clustered_sound.h index 4b28a71ec..e37762b20 100644 --- a/code/nel/include/nel/sound/clustered_sound.h +++ b/code/nel/include/nel/sound/clustered_sound.h @@ -189,7 +189,7 @@ public: const std::vector > &getAudioPath() { return _AudioPath;} - + static void buildSheets(const std::string &packedSheetPath); private: diff --git a/code/nel/include/nel/sound/u_audio_mixer.h b/code/nel/include/nel/sound/u_audio_mixer.h index 089013797..a1fb2b3cc 100644 --- a/code/nel/include/nel/sound/u_audio_mixer.h +++ b/code/nel/include/nel/sound/u_audio_mixer.h @@ -169,6 +169,10 @@ public: static std::string buildSampleBank(const std::vector &sampleList, const std::string &bankDir, const std::string &bankName); /// Build the sound bank packed sheets file from georges sound sheet files with .sound extension in the search path, and return the path to the written file. static std::string buildSoundBank(const std::string &packedSheetDir); + /// Build the cluster sound_group sheets. + static std::string buildClusteredSoundGroupSheets(const std::string &packedSheetDir); + /// Build the user var binding sheets. + static std::string buildUserVarBindingSheets(const std::string &packedSheetDir); /** Set the global path to the sample banks * If you have specified some sample bank to load in the * mixer config file, you MUST set the sample path diff --git a/code/nel/src/sound/audio_mixer_user.cpp b/code/nel/src/sound/audio_mixer_user.cpp index fdc6f6e11..0f3ff1110 100644 --- a/code/nel/src/sound/audio_mixer_user.cpp +++ b/code/nel/src/sound/audio_mixer_user.cpp @@ -988,6 +988,23 @@ std::string UAudioMixer::buildSoundBank(const std::string &packedSheetDir) return dir + "sounds.packed_sheets"; } +/// Build the cluster sound_group sheets. +std::string UAudioMixer::buildClusteredSoundGroupSheets(const std::string &packedSheetDir) +{ + std::string dir = CPath::standardizePath(packedSheetDir, true); + CClusteredSound::buildSheets(dir); + return dir + "sound_groups.packed_sheets"; +} + +/// Build the user var binding sheets. +std::string UAudioMixer::buildUserVarBindingSheets(const std::string &packedSheetDir) +{ + std::string dir = CPath::standardizePath(packedSheetDir, true); + std::map container; + ::loadForm("user_var_binding", dir + "user_var_binding.packed_sheets", container, true, false); + return dir + "user_var_binding.packed_sheets"; +} + void CAudioMixerUser::setBackgroundFlagName(uint flagIndex, const std::string &flagName) { if (flagIndex < TBackgroundFlags::NB_BACKGROUND_FLAGS) diff --git a/code/nel/src/sound/clustered_sound.cpp b/code/nel/src/sound/clustered_sound.cpp index 6e62f3176..52a9848da 100644 --- a/code/nel/src/sound/clustered_sound.cpp +++ b/code/nel/src/sound/clustered_sound.cpp @@ -160,10 +160,6 @@ public: }; -// this structure is fill by the loadForm() function and will contain all you need -std::map Container; - - CClusteredSound::CClusteredSound() : _Scene(0), _RootCluster(0), @@ -173,21 +169,27 @@ CClusteredSound::CClusteredSound() } +void CClusteredSound::buildSheets(const std::string &packedSheetPath) +{ + std::map container; + ::loadForm("sound_group", packedSheetPath + "sound_groups.packed_sheets", container, true, false); +} void CClusteredSound::init(NL3D::CScene *scene, float portalInterpolate, float maxEarDist, float minGain) { // load the sound_group sheets - ::loadForm("sound_group", CAudioMixerUser::instance()->getPackedSheetPath()+"sound_groups.packed_sheets", Container, CAudioMixerUser::instance()->getPackedSheetUpdate(), false); + std::map container; + ::loadForm("sound_group", CAudioMixerUser::instance()->getPackedSheetPath()+"sound_groups.packed_sheets", container, CAudioMixerUser::instance()->getPackedSheetUpdate(), false); // copy the container data into internal structure - std::map::iterator first(Container.begin()), last(Container.end()); + std::map::iterator first(container.begin()), last(container.end()); for (; first != last; ++first) { _SoundGroupToSound.insert(first->second._SoundGroupAssoc.begin(), first->second._SoundGroupAssoc.end()); } // and clear the temporary Container - Container.clear(); + container.clear(); _Scene = scene; diff --git a/code/nel/tools/sound/build_soundbank/build_soundbank.cpp b/code/nel/tools/sound/build_soundbank/build_soundbank.cpp index 082b08e90..9829a1898 100644 --- a/code/nel/tools/sound/build_soundbank/build_soundbank.cpp +++ b/code/nel/tools/sound/build_soundbank/build_soundbank.cpp @@ -88,6 +88,8 @@ int main(int nNbArg, char **ppArgs) // build the sound bank UAudioMixer::buildSoundBank(exportDir); + UAudioMixer::buildClusteredSoundGroupSheets(exportDir); + UAudioMixer::buildUserVarBindingSheets(exportDir); // and that's all folks return EXIT_SUCCESS; From 22e9c17a72ef992ff36022cb2e9dfe7a0acfdb10 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Fri, 15 Nov 2019 11:52:18 +0800 Subject: [PATCH 06/22] Add sound copy process --- .../build_gamedata/processes/sound/0_setup.py | 65 +++++++++++++++++++ .../processes/sound/1_export.py | 65 +++++++++++++++++++ .../build_gamedata/processes/sound/2_build.py | 49 ++++++++++++++ .../processes/sound/3_install.py | 57 ++++++++++++++++ 4 files changed, 236 insertions(+) create mode 100644 code/nel/tools/build_gamedata/processes/sound/0_setup.py create mode 100644 code/nel/tools/build_gamedata/processes/sound/1_export.py create mode 100644 code/nel/tools/build_gamedata/processes/sound/2_build.py create mode 100644 code/nel/tools/build_gamedata/processes/sound/3_install.py diff --git a/code/nel/tools/build_gamedata/processes/sound/0_setup.py b/code/nel/tools/build_gamedata/processes/sound/0_setup.py new file mode 100644 index 000000000..7ce690d5d --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/sound/0_setup.py @@ -0,0 +1,65 @@ +#!/usr/bin/python +# +# \file 0_setup.py +# \brief setup sound +# \date 2010-05-24 13:42GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Setup sound +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Setup sound") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +# Setup source directories +printLog(log, ">>> Setup source directories <<<") +mkPath(log, SoundDirectory) +mkPath(log, SoundDfnDirectory) + +# Setup export directories +printLog(log, ">>> Setup export directories <<<") +mkPath(log, ExportBuildDirectory + "/" + SoundExportDirectory) + +# Setup build directories +printLog(log, ">>> Setup build directories <<<") + +# Setup client directories +printLog(log, ">>> Setup client directories <<<") +mkPath(log, InstallDirectory + "/" + SoundInstallDirectory) + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/sound/1_export.py b/code/nel/tools/build_gamedata/processes/sound/1_export.py new file mode 100644 index 000000000..066b2c256 --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/sound/1_export.py @@ -0,0 +1,65 @@ +#!/usr/bin/python +# +# \file 1_export.py +# \brief Export sound +# \date 2010-05-24 13:42GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Export sound +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Export sound") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +# For each sound directory +printLog(log, ">>> Export sound <<<") +mkPath(log, ExportBuildDirectory + "/" + SoundExportDirectory) +mkPath(log, SoundDirectory) +mkPath(log, SoundDfnDirectory) +copyFilesExtNoTreeIfNeeded(log, SoundDfnDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".dfn") +copyFilesExtNoTreeIfNeeded(log, SoundDfnDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".typ") +copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".mixer_config") +copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".mp3") +copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".ogg") +copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".flac") +copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".primitive") +copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".sound_anim") + +printLog(log, "") + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/sound/2_build.py b/code/nel/tools/build_gamedata/processes/sound/2_build.py new file mode 100644 index 000000000..048f8f456 --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/sound/2_build.py @@ -0,0 +1,49 @@ +#!/usr/bin/python +# +# \file 2_build.py +# \brief Build sound +# \date 2010-05-24 13:42GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Build sound +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Build sound") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/sound/3_install.py b/code/nel/tools/build_gamedata/processes/sound/3_install.py new file mode 100644 index 000000000..b8078609f --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/sound/3_install.py @@ -0,0 +1,57 @@ +#!/usr/bin/python +# +# \file 3_install.py +# \brief Install sound +# \date 2010-05-24 13:42GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Install sound +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Install sound") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +printLog(log, ">>> Install sound <<<") +srcDir = ExportBuildDirectory + "/" + SoundExportDirectory +mkPath(log, srcDir) +destDir = InstallDirectory + "/" + SoundInstallDirectory +mkPath(log, destDir) +copyFilesNoTreeIfNeeded(log, srcDir, destDir) + +printLog(log, "") +log.close() + + +# end of file From 68d8e21629c57c953935f17f0ec5be2609f4b5b7 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Fri, 15 Nov 2019 13:32:53 +0800 Subject: [PATCH 07/22] Add signtool support --- code/nel/tools/build_gamedata/0_setup.py | 20 ++++++ .../build_gamedata/configuration/scripts.py | 16 +++-- .../tools/build_gamedata/executables_dev.bat | 6 ++ .../build_gamedata/processes/sign/0_setup.py | 64 +++++++++++++++++++ .../build_gamedata/processes/sign/1_export.py | 57 +++++++++++++++++ .../build_gamedata/processes/sign/2_build.py | 61 ++++++++++++++++++ .../processes/sign/3_install.py | 58 +++++++++++++++++ 7 files changed, 275 insertions(+), 7 deletions(-) create mode 100644 code/nel/tools/build_gamedata/processes/sign/0_setup.py create mode 100644 code/nel/tools/build_gamedata/processes/sign/1_export.py create mode 100644 code/nel/tools/build_gamedata/processes/sign/2_build.py create mode 100644 code/nel/tools/build_gamedata/processes/sign/3_install.py diff --git a/code/nel/tools/build_gamedata/0_setup.py b/code/nel/tools/build_gamedata/0_setup.py index 42a9a409b..69d825fed 100755 --- a/code/nel/tools/build_gamedata/0_setup.py +++ b/code/nel/tools/build_gamedata/0_setup.py @@ -187,6 +187,18 @@ if not args.noconf: PatchmanBridgeServerDirectory except NameError: PatchmanBridgeServerDirectory = "T:/bridge_server" + try: + SignToolExecutable + except NameError: + SignToolExecutable = "C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bin/signtool.exe" + try: + SignToolSha1 + except NameError: + SignToolSha1 = "" + try: + SignToolTimestamp + except NameError: + SignToolTimestamp = "http://timestamp.comodoca.com/authenticode" try: MaxAvailable except NameError: @@ -258,6 +270,9 @@ if not args.noconf: PatchmanCfgAdminDirectory = askVar(log, "[IN] Patchman Cfg Admin Directory", PatchmanCfgAdminDirectory).replace("\\", "/") PatchmanCfgDefaultDirectory = askVar(log, "[IN] Patchman Cfg Default Directory", PatchmanCfgDefaultDirectory).replace("\\", "/") PatchmanBridgeServerDirectory = askVar(log, "[OUT] Patchman Bridge Server Patch Directory", PatchmanBridgeServerDirectory).replace("\\", "/") + SignToolExecutable = askVar(log, "Sign Tool Executable", SignToolExecutable).replace("\\", "/") + SignToolSha1 = askVar(log, "Sign Tool Signature SHA1", SignToolSha1) + SignToolTimestamp = askVar(log, "Sign Tool Timestamp Authority", SignToolTimestamp) MaxAvailable = int(askVar(log, "3dsMax Available", str(MaxAvailable))) if MaxAvailable: MaxDirectory = askVar(log, "3dsMax Directory", MaxDirectory).replace("\\", "/") @@ -346,6 +361,11 @@ if not args.noconf: sf.write("PatchmanCfgDefaultDirectory = \"" + str(PatchmanCfgDefaultDirectory) + "\"\n") sf.write("PatchmanBridgeServerDirectory = \"" + str(PatchmanBridgeServerDirectory) + "\"\n") sf.write("\n") + sf.write("# Sign tool\n") + sf.write("SignToolExecutable = \"" + str(SignToolExecutable) + "\"\n") + sf.write("SignToolSha1 = \"" + str(SignToolSha1) + "\"\n") + sf.write("SignToolTimestamp = \"" + str(SignToolTimestamp) + "\"\n") + sf.write("\n") sf.write("# 3dsMax directives\n") sf.write("MaxAvailable = " + str(MaxAvailable) + "\n") sf.write("MaxDirectory = \"" + str(MaxDirectory) + "\"\n") diff --git a/code/nel/tools/build_gamedata/configuration/scripts.py b/code/nel/tools/build_gamedata/configuration/scripts.py index 9a815a2b9..5bbed497f 100755 --- a/code/nel/tools/build_gamedata/configuration/scripts.py +++ b/code/nel/tools/build_gamedata/configuration/scripts.py @@ -541,9 +541,10 @@ def needUpdateDirNoSubdirLogExtMultidir(log, all_dir_base, all_dir_source, dir_s def findFileMultiDir(log, dirs_where, file_name): try: for dir in dirs_where: - file = findFile(log, dir, file_name) - if file != "": - return file + if dir != "": + file = findFile(log, dir, file_name) + if file != "": + return file except Exception, e: printLog(log, "EXCEPTION " + str(e)) printLog(log, "FILE NOT FOUND " + file_name) @@ -552,10 +553,11 @@ def findFileMultiDir(log, dirs_where, file_name): def findTool(log, dirs_where, file_name, suffix): try: for dir in dirs_where: - tool = findFile(log, dir, file_name + suffix) - if tool != "": - printLog(log, "TOOL " + tool) - return tool + if dir != "": + tool = findFile(log, dir, file_name + suffix) + if tool != "": + printLog(log, "TOOL " + tool) + return tool except Exception, e: printLog(log, "EXCEPTION " + str(e)) printLog(log, "TOOL NOT FOUND " + file_name + suffix) diff --git a/code/nel/tools/build_gamedata/executables_dev.bat b/code/nel/tools/build_gamedata/executables_dev.bat index 2007016c4..bbca70ab7 100644 --- a/code/nel/tools/build_gamedata/executables_dev.bat +++ b/code/nel/tools/build_gamedata/executables_dev.bat @@ -1,3 +1,9 @@ +title Ryzom Core: 0_setup.py (EXECUTABLES) +0_setup.py --noconf -ipj common/gamedev common/exedll common/cfg common/data_common +title Ryzom Core: 1_export.py (EXECUTABLES) +1_export.py -ipj common/gamedev common/exedll common/cfg common/data_common +title Ryzom Core: 2_build.py (EXECUTABLES) +2_build.py -ipj common/gamedev common/exedll common/cfg common/data_common title Ryzom Core: 3_install.py (EXECUTABLES) 3_install.py -ipj common/gamedev common/exedll common/cfg common/data_common title Ryzom Core: b1_client_dev.py diff --git a/code/nel/tools/build_gamedata/processes/sign/0_setup.py b/code/nel/tools/build_gamedata/processes/sign/0_setup.py new file mode 100644 index 000000000..418fcb15e --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/sign/0_setup.py @@ -0,0 +1,64 @@ +#!/usr/bin/python +# +# \file 0_setup.py +# \brief setup sign +# \date 2010-05-24 13:42GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Setup sign +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Setup sign") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +# Setup source directories +printLog(log, ">>> Setup source directories <<<") + +# Setup build directories +printLog(log, ">>> Setup export directories <<<") +mkPath(log, ExportBuildDirectory + "/" + UnsignedExeDllDirectory) + +# Setup build directories +printLog(log, ">>> Setup build directories <<<") +mkPath(log, ExportBuildDirectory + "/" + SignedExeDllDirectory) + +# Setup client directories +printLog(log, ">>> Setup client directories <<<") +mkPath(log, InstallDirectory + "/" + SignInstallDirectory) + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/sign/1_export.py b/code/nel/tools/build_gamedata/processes/sign/1_export.py new file mode 100644 index 000000000..352860bda --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/sign/1_export.py @@ -0,0 +1,57 @@ +#!/usr/bin/python +# +# \file 1_export.py +# \brief Export sign +# \date 2010-05-24 13:42GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Export sign +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Export sign") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +mkPath(log, ExportBuildDirectory + "/" + UnsignedExeDllDirectory) +for file in SignExeDllFiles: + printLog(log, str(WindowsExeDllCfgDirectories)) + printLog(log, file) + filePath = findFileMultiDir(log, WindowsExeDllCfgDirectories, file) + if (filePath != ""): + copyFileIfNeeded(log, filePath, ExportBuildDirectory + "/" + UnsignedExeDllDirectory + "/" + os.path.basename(file)) + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/sign/2_build.py b/code/nel/tools/build_gamedata/processes/sign/2_build.py new file mode 100644 index 000000000..c08049538 --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/sign/2_build.py @@ -0,0 +1,61 @@ +#!/usr/bin/python +# +# \file 2_build.py +# \brief Build sign +# \date 2010-05-24 13:42GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Build sign +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Build sign") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +if SignToolSha1 != "": + unsignedDirectory = ExportBuildDirectory + "/" + UnsignedExeDllDirectory + signedDirectory = ExportBuildDirectory + "/" + SignedExeDllDirectory + mkPath(log, unsignedDirectory) + mkPath(log, signedDirectory) + unsignedFiles = os.listdir(unsignedDirectory) + for fileName in unsignedFiles: + if (fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*"): + if needUpdateLogRemoveDest(log, unsignedDirectory + "/" + fileName, signedDirectory + "/" + fileName): + shutil.copy(unsignedDirectory + "/" + fileName, signedDirectory + "/" + fileName) + subprocess.call([ SignToolExecutable, "sign", "/sha1", SignToolSha1, "/t", SignToolTimestamp, signedDirectory + "/" + fileName ]) + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/sign/3_install.py b/code/nel/tools/build_gamedata/processes/sign/3_install.py new file mode 100644 index 000000000..b537da92d --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/sign/3_install.py @@ -0,0 +1,58 @@ +#!/usr/bin/python +# +# \file 3_install.py +# \brief Install sign +# \date 2010-05-24 13:42GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Install sign +# +# NeL - MMORPG Framework +# Copyright (C) 2009-2014 by authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Install sign") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +srcDir = ExportBuildDirectory + "/" + SignedExeDllDirectory +if SignToolSha1 == "": + srcDir = ExportBuildDirectory + "/" + UnsignedExeDllDirectory +mkPath(log, srcDir) +destDir = InstallDirectory + "/" + SignInstallDirectory +mkPath(log, destDir) +copyFilesNoTreeIfNeeded(log, srcDir, destDir) + +printLog(log, "") +log.close() + + +# end of file From 3475b3046a245aa13193ab2eb924538718dc1cb6 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Fri, 15 Nov 2019 14:16:08 +0800 Subject: [PATCH 08/22] Fix dependency --- code/nel/src/sound/audio_mixer_user.cpp | 62 ++++++++++++------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/code/nel/src/sound/audio_mixer_user.cpp b/code/nel/src/sound/audio_mixer_user.cpp index 0f3ff1110..c7fd988bd 100644 --- a/code/nel/src/sound/audio_mixer_user.cpp +++ b/code/nel/src/sound/audio_mixer_user.cpp @@ -974,37 +974,6 @@ void CAudioMixerUser::buildSampleBankList() CPath::addSearchPath(sbp); } -/// Build the sound bank packed sheets file from georges sound sheet files with .sound extension in the search path, and return the path to the written file. -std::string UAudioMixer::buildSoundBank(const std::string &packedSheetDir) -{ - CGroupControllerRoot *tempRoot = NULL; - if (!CGroupControllerRoot::isInitialized()) - tempRoot = new CGroupControllerRoot(); - std::string dir = CPath::standardizePath(packedSheetDir, true); - CSoundBank *soundBank = new CSoundBank(); - soundBank->load(dir, true); - delete soundBank; - delete tempRoot; - return dir + "sounds.packed_sheets"; -} - -/// Build the cluster sound_group sheets. -std::string UAudioMixer::buildClusteredSoundGroupSheets(const std::string &packedSheetDir) -{ - std::string dir = CPath::standardizePath(packedSheetDir, true); - CClusteredSound::buildSheets(dir); - return dir + "sound_groups.packed_sheets"; -} - -/// Build the user var binding sheets. -std::string UAudioMixer::buildUserVarBindingSheets(const std::string &packedSheetDir) -{ - std::string dir = CPath::standardizePath(packedSheetDir, true); - std::map container; - ::loadForm("user_var_binding", dir + "user_var_binding.packed_sheets", container, true, false); - return dir + "user_var_binding.packed_sheets"; -} - void CAudioMixerUser::setBackgroundFlagName(uint flagIndex, const std::string &flagName) { if (flagIndex < TBackgroundFlags::NB_BACKGROUND_FLAGS) @@ -1144,6 +1113,37 @@ void CAudioMixerUser::initUserVar() } +/// Build the sound bank packed sheets file from georges sound sheet files with .sound extension in the search path, and return the path to the written file. +std::string UAudioMixer::buildSoundBank(const std::string &packedSheetDir) +{ + CGroupControllerRoot *tempRoot = NULL; + if (!CGroupControllerRoot::isInitialized()) + tempRoot = new CGroupControllerRoot(); + std::string dir = CPath::standardizePath(packedSheetDir, true); + CSoundBank *soundBank = new CSoundBank(); + soundBank->load(dir, true); + delete soundBank; + delete tempRoot; + return dir + "sounds.packed_sheets"; +} + +/// Build the cluster sound_group sheets. +std::string UAudioMixer::buildClusteredSoundGroupSheets(const std::string &packedSheetDir) +{ + std::string dir = CPath::standardizePath(packedSheetDir, true); + CClusteredSound::buildSheets(dir); + return dir + "sound_groups.packed_sheets"; +} + +/// Build the user var binding sheets. +std::string UAudioMixer::buildUserVarBindingSheets(const std::string &packedSheetDir) +{ + std::string dir = CPath::standardizePath(packedSheetDir, true); + std::map container; + ::loadForm("user_var_binding", dir + "user_var_binding.packed_sheets", container, true, false); + return dir + "user_var_binding.packed_sheets"; +} + // ****************************************************************** void CAudioMixerUser::CControledSources::serial(NLMISC::IStream &s) From bbee8579c7b8bac92c24bf743a3ce9ad6ed3ec53 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 16 Nov 2019 14:37:05 +0800 Subject: [PATCH 09/22] Login using https --- code/ryzom/client/client_default.cfg | 21 +-- code/ryzom/client/src/client.cpp | 4 + code/ryzom/client/src/client_cfg.cpp | 19 +-- code/ryzom/client/src/http_client_curl.cpp | 2 +- .../src/interface_v3/action_handler_ui.cpp | 2 +- .../src/interface_v3/group_html_webig.cpp | 2 +- code/ryzom/client/src/login.cpp | 127 +++++++++++++++++- code/ryzom/client/src/login.h | 4 +- code/ryzom/client/src/net_manager.cpp | 2 +- 9 files changed, 156 insertions(+), 27 deletions(-) diff --git a/code/ryzom/client/client_default.cfg b/code/ryzom/client/client_default.cfg index 7431807cf..b99c5d154 100644 --- a/code/ryzom/client/client_default.cfg +++ b/code/ryzom/client/client_default.cfg @@ -39,14 +39,15 @@ Gamma_max = 1.0; // NETWORK // ///////////// -Application = { "ryzom_live", "./client_ryzom_r.exe", "./" }; +Application = { "open", "./client_ryzom_r.exe", "./" }; BackgroundDownloader = 0; -StartupHost = "shard.ryzom.com:40916"; +StartupHost = "https://open.ryzom.dev"; StartupPage = "/login/r2_login.php"; +StartupVerify = 1; -ConditionsTermsURL = "http://app.ryzom.com/app_forum/index.php?page=topic/view/21885/1&post148782=en#1"; -LoginSupportURL = "http://app.ryzom.com/app_forum/index.php?page=topic/view/22047/1&post149889=en#1"; -NamingPolicyURL = "http://app.ryzom.com/app_forum/index.php?page=topic/view/21885/1&post148784=en#3"; +ConditionsTermsURL = "http://www.gnu.org/licenses/agpl-3.0.html"; +LoginSupportURL = "https://open.ryzom.dev/ams/"; +NamingPolicyURL = "https://open.ryzom.dev/ams/"; // Full path and filename where cURL can find certificate bundle file // cacert.pem file can be downloaded from https://curl.haxx.se/docs/caextract.html @@ -84,11 +85,15 @@ XMLOutGameInterfaceFiles = { "out_v2_keys.xml", }; +TexturesInterface = "texture_interfaces_v3"; +TexturesInterfaceDXTC = "texture_interfaces_dxtc"; + // The ligo primitive class file LigoPrimitiveClass = "world_editor_classes.xml"; VerboseLog = 1; + /////////// // MOUSE // /////////// @@ -604,11 +609,11 @@ ChannelIgnoreFilter = // interval in minutes for webig notify thread to run WebIgNotifInterval = 10; -WebIgMainDomain = "app.ryzom.com"; +WebIgMainDomain = "https://open.ryzom.dev"; WebIgTrustedDomains = { - "api.ryzom.com", "app.ryzom.com" + "open.ryzom.dev" }; -PatchletUrl = "http://app.ryzom.com/app_patchlet/index.php?patch=preload"; +PatchletUrl = "https://open.ryzom.dev/app_patchlet/index.php?patch=preload"; SelectedSlot = 0; diff --git a/code/ryzom/client/src/client.cpp b/code/ryzom/client/src/client.cpp index 37cb36279..69559e0e8 100644 --- a/code/ryzom/client/src/client.cpp +++ b/code/ryzom/client/src/client.cpp @@ -317,6 +317,10 @@ int main(int argc, char **argv) LoginCustomParameters = "&steam_auth_session_ticket=" + steamClient.getAuthSessionTicket(); #endif +#if !FINAL_VERSION + LoginCustomParameters += "&dbg=1"; +#endif + // initialize patch manager and set the ryzom full path, before it's used CPatchManager *pPM = CPatchManager::getInstance(); pPM->setRyzomFilename(Args.getProgramPath() + Args.getProgramName()); diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp index 7f0222088..bfd6452ee 100644 --- a/code/ryzom/client/src/client_cfg.cpp +++ b/code/ryzom/client/src/client_cfg.cpp @@ -330,9 +330,9 @@ CClientConfig::CClientConfig() TexturesLoginInterface.push_back("texture_interfaces_v3_login"); DisplayAccountButtons = true; - CreateAccountURL = "https://account.ryzom.com/signup/from_client.php"; - EditAccountURL = "https://account.ryzom.com/payment_profile/index.php"; - ForgetPwdURL = "https://account.ryzom.com/payment_profile/lost_secure_password.php"; + CreateAccountURL = "https://open.ryzom.dev/ams/"; + EditAccountURL = "https://open.ryzom.dev/ams/"; + ForgetPwdURL = "https://open.ryzom.dev/ams/"; Position = CVector(0.f, 0.f, 0.f); // Default Position. Heading = CVector(0.f, 1.f, 0.f); // Default Heading. EyesHeight = 1.5f; // Default User Eyes Height. @@ -428,15 +428,15 @@ CClientConfig::CClientConfig() PatchletUrl.clear(); PatchVersion.clear(); - WebIgMainDomain = "atys.ryzom.com"; - WebIgTrustedDomains.push_back(WebIgMainDomain); + WebIgMainDomain = "https://open.ryzom.dev"; + WebIgTrustedDomains.push_back("open.ryzom.dev"); WebIgNotifInterval = 10; // time in minutes CurlMaxConnections = 5; CurlCABundle.clear(); - RingReleaseNotePath = "http://" + WebIgMainDomain + "/releasenotes_ring/index.php"; - ReleaseNotePath = "http://" + WebIgMainDomain + "/releasenotes/index.php"; + RingReleaseNotePath = WebIgMainDomain + "/releasenotes_ring/index.php"; + ReleaseNotePath = WebIgMainDomain + "/releasenotes/index.php"; /////////////// @@ -452,7 +452,7 @@ CClientConfig::CClientConfig() SoundOn = true; // Default is with sound. DriverSound = SoundDrvAuto; SoundForceSoftwareBuffer = true; - SoundOutGameMusic = "Main Menu Loop.ogg"; + SoundOutGameMusic = "main menu loop.ogg"; SoundSFXVolume = 1.f; SoundGameMusicVolume = 1.f; SoundTPFade = 500; @@ -1093,6 +1093,9 @@ void CClientConfig::setValues() /////////// // WEBIG // READ_STRING_FV(WebIgMainDomain); + if (ClientCfg.WebIgMainDomain.find("http://") == std::string::npos + || ClientCfg.WebIgMainDomain.find("https://") == std::string::npos) + ClientCfg.WebIgMainDomain = "http://" + ClientCfg.WebIgMainDomain; READ_STRINGVECTOR_FV(WebIgTrustedDomains); READ_INT_FV(WebIgNotifInterval); READ_INT_FV(CurlMaxConnections); diff --git a/code/ryzom/client/src/http_client_curl.cpp b/code/ryzom/client/src/http_client_curl.cpp index 16436516b..c27672489 100644 --- a/code/ryzom/client/src/http_client_curl.cpp +++ b/code/ryzom/client/src/http_client_curl.cpp @@ -63,7 +63,7 @@ bool CCurlHttpClient::authenticate(const std::string &user, const std::string &p return true; } -static const std::string CAFilename = "ssl_ca_cert.pem"; // this is the certificate "Thawte Server CA" +static const std::string CAFilename = "cacert.pem"; // https://curl.haxx.se/docs/caextract.html // *************************************************************************** bool CCurlHttpClient::verifyServer(bool verify) diff --git a/code/ryzom/client/src/interface_v3/action_handler_ui.cpp b/code/ryzom/client/src/interface_v3/action_handler_ui.cpp index 68b55076e..bf83ddce1 100644 --- a/code/ryzom/client/src/interface_v3/action_handler_ui.cpp +++ b/code/ryzom/client/src/interface_v3/action_handler_ui.cpp @@ -416,7 +416,7 @@ class CAHUIShowHide : public IActionHandler nlwarning("%s is not a group html", window.c_str()); return; } - pGH->setURL("http://"+ClientCfg.WebIgMainDomain+"/index.php?app="+webapp); + pGH->setURL(ClientCfg.WebIgMainDomain + "/index.php?app=" + webapp); } } else diff --git a/code/ryzom/client/src/interface_v3/group_html_webig.cpp b/code/ryzom/client/src/interface_v3/group_html_webig.cpp index 8f5c6da01..11fe6c6c5 100644 --- a/code/ryzom/client/src/interface_v3/group_html_webig.cpp +++ b/code/ryzom/client/src/interface_v3/group_html_webig.cpp @@ -267,7 +267,7 @@ public: uint c = 0; while (_Running) { - string url = "https://"+domain+"/index.php?app=notif&format=lua&rnd="+randomString(); + string url = domain + "/index.php?app=notif&format=lua&rnd=" + randomString(); addWebIGParams(url, true); get(url); diff --git a/code/ryzom/client/src/login.cpp b/code/ryzom/client/src/login.cpp index 1eb6ec867..79381d8f2 100644 --- a/code/ryzom/client/src/login.cpp +++ b/code/ryzom/client/src/login.cpp @@ -155,7 +155,8 @@ CLoginStateMachine LoginSM; bool CStartupHttpClient::connectToLogin() { - return connect(ClientCfg.ConfigFile.getVar("StartupHost").asString(0)); + return connect(ClientCfg.ConfigFile.getVar("StartupHost").asString(0)) + && verifyServer(ClientCfg.ConfigFile.getVar("StartupVerify").asBool(0)); } CStartupHttpClient HttpClient; @@ -2825,7 +2826,36 @@ string checkLogin(const string &login, const string &password, const string &cli if(res.empty()) return "Empty answer from server (error code 62)"; - if(res[0] == '0') + size_t first = res.find("\n\n"); + if (first == std::string::npos) + { + first = res.find("\r\r"); + if (first == std::string::npos) + { + first = res.find("\r\n\r\n"); + if (first != std::string::npos) + { + res = res.substr(first + 4); + } + } + else + { + res = res.substr(first + 2); + } + } + else + { + res = res.substr(first + 2); + } + + nldebug("res1: %s", res.c_str()); + + if (res[0] == 'H') + { + nlwarning("missing response body: %s", res.c_str()); + return "missing response body (error code 64)"; + } + else if(res[0] == '0') { // server returns an error nlwarning("server error: %s", res.substr(2).c_str()); @@ -2878,7 +2908,36 @@ string checkLogin(const string &login, const string &password, const string &cli if(res.empty()) return "Empty answer from server (error code 4)"; - if(res[0] == '0') + size_t first = res.find("\n\n"); + if (first == std::string::npos) + { + first = res.find("\r\r"); + if (first == std::string::npos) + { + first = res.find("\r\n\r\n"); + if (first != std::string::npos) + { + res = res.substr(first + 4); + } + } + else + { + res = res.substr(first + 2); + } + } + else + { + res = res.substr(first + 2); + } + + nldebug("res2: %s", res.c_str()); + + if (res[0] == 'H') + { + nlwarning("missing response body: %s", res.c_str()); + return "missing response body (error code 65)"; + } + else if(res[0] == '0') { // server returns an error nlwarning("server error: %s", res.substr(2).c_str()); @@ -2960,7 +3019,36 @@ string checkLogin(const string &login, const string &password, const string &cli if(res.empty()) return "Empty answer from server (error code 4)"; - if(res[0] == '0') + size_t first = res.find("\n\n"); + if (first == std::string::npos) + { + first = res.find("\r\r"); + if (first == std::string::npos) + { + first = res.find("\r\n\r\n"); + if (first != std::string::npos) + { + res = res.substr(first + 4); + } + } + else + { + res = res.substr(first + 2); + } + } + else + { + res = res.substr(first + 2); + } + + nldebug("res2: %s", res.c_str()); + + if (res[0] == 'H') + { + nlwarning("missing response body: %s", res.c_str()); + return "missing response body (error code 66)"; + } + else if(res[0] == '0') { // server returns an error nlwarning("server error: %s", res.substr(2).c_str()); @@ -3065,7 +3153,36 @@ string selectShard(uint32 shardId, string &cookie, string &addr) if(res.empty()) return "Empty result (error code 13)"; - if(res[0] == '0') + size_t first = res.find("\n\n"); + if (first == std::string::npos) + { + first = res.find("\r\r"); + if (first == std::string::npos) + { + first = res.find("\r\n\r\n"); + if (first != std::string::npos) + { + res = res.substr(first + 4); + } + } + else + { + res = res.substr(first + 2); + } + } + else + { + res = res.substr(first + 2); + } + + nldebug("res2: %s", res.c_str()); + + if (res[0] == 'H') + { + nlwarning("missing response body: %s", res.c_str()); + return "missing response body (error code 66)"; + } + else if(res[0] == '0') { // server returns an error nlwarning("server error: %s", res.substr(2).c_str()); diff --git a/code/ryzom/client/src/login.h b/code/ryzom/client/src/login.h index 2c6e8c960..fa4f041c1 100644 --- a/code/ryzom/client/src/login.h +++ b/code/ryzom/client/src/login.h @@ -19,7 +19,7 @@ #define CL_LOGIN_H #include "nel/misc/types_nl.h" -#include "game_share/http_client.h" +#include "http_client_curl.h" #include #include @@ -74,7 +74,7 @@ extern sint32 ShardSelected; /* * HTTP client preconfigured to connect to the startup login host */ -class CStartupHttpClient : public CHttpClient +class CStartupHttpClient : public CCurlHttpClient { public: diff --git a/code/ryzom/client/src/net_manager.cpp b/code/ryzom/client/src/net_manager.cpp index 7bdcfb5ed..d562e5ea4 100644 --- a/code/ryzom/client/src/net_manager.cpp +++ b/code/ryzom/client/src/net_manager.cpp @@ -3292,7 +3292,7 @@ private: if(i != digitMaxEnd) { ucstring web_app = contentStr.substr(digitStart, i-digitStart); - contentStr = ucstring("http://"+ClientCfg.WebIgMainDomain+"/")+web_app+ucstring("/index.php?")+contentStr.substr(i+1); + contentStr = ucstring(ClientCfg.WebIgMainDomain + "/") + web_app + ucstring("/index.php?") + contentStr.substr((size_t)i + 1); } else { From c330067f194b6ff2ed8dc4faff4bd2f651f67c23 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sun, 17 Nov 2019 06:32:21 +0800 Subject: [PATCH 10/22] Set patch urls --- code/ryzom/client/client_default.cfg | 7 +++++-- code/ryzom/tools/client/client_patcher/main.cpp | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/ryzom/client/client_default.cfg b/code/ryzom/client/client_default.cfg index b99c5d154..501e0097d 100644 --- a/code/ryzom/client/client_default.cfg +++ b/code/ryzom/client/client_default.cfg @@ -46,8 +46,11 @@ StartupPage = "/login/r2_login.php"; StartupVerify = 1; ConditionsTermsURL = "http://www.gnu.org/licenses/agpl-3.0.html"; -LoginSupportURL = "https://open.ryzom.dev/ams/"; -NamingPolicyURL = "https://open.ryzom.dev/ams/"; +LoginSupportURL = "https://open.ryzom.dev/ams/"; +NamingPolicyURL = "https://open.ryzom.dev/ams/"; +ForgetPwdURL = "https://open.ryzom.dev/ams/"; +InstallWebPage = "https://open.ryzom.dev/ams/"; +StreamedPackageHosts = { "https://cdn.ryzom.dev/open/stream/" }; // Full path and filename where cURL can find certificate bundle file // cacert.pem file can be downloaded from https://curl.haxx.se/docs/caextract.html diff --git a/code/ryzom/tools/client/client_patcher/main.cpp b/code/ryzom/tools/client/client_patcher/main.cpp index fc440abf4..0c1a13832 100644 --- a/code/ryzom/tools/client/client_patcher/main.cpp +++ b/code/ryzom/tools/client/client_patcher/main.cpp @@ -191,7 +191,7 @@ struct CClientPatcherTranslations : public NLMISC::CI18N::ILoadProxy }; // hardcoded URL to not depend on external files -static const std::string PatchUrl = "http://dl.ryzom.com/patch_live"; +static const std::string PatchUrl = "https://cdn.ryzom.dev/open/patch"; int main(int argc, char *argv[]) { From 830803cfe9d83b3b1a86b640dda48925c7ffbe24 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sun, 17 Nov 2019 16:36:42 +0800 Subject: [PATCH 11/22] Debug logs should not be disabled in DEV client... --- code/ryzom/client/src/client.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ryzom/client/src/client.cpp b/code/ryzom/client/src/client.cpp index 69559e0e8..2dbdced45 100644 --- a/code/ryzom/client/src/client.cpp +++ b/code/ryzom/client/src/client.cpp @@ -158,8 +158,8 @@ int main(int argc, char **argv) // init the Nel context CApplicationContext *appContext = new CApplicationContext; - // disable nldebug messages in logs in Release -#ifdef NL_RELEASE + // disable nldebug messages in logs in FV +#if FINAL_VERSION && defined(NL_RELEASE) DisableNLDebug = true; #endif From 057b3ab11b8860a6b85a9e0e9c0815cb4278d298 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 18 Nov 2019 07:13:56 +0800 Subject: [PATCH 12/22] Enable callstack logging --- code/nel/src/misc/debug.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/nel/src/misc/debug.cpp b/code/nel/src/misc/debug.cpp index 260834200..71da430de 100644 --- a/code/nel/src/misc/debug.cpp +++ b/code/nel/src/misc/debug.cpp @@ -1048,9 +1048,9 @@ void getCallStack(std::string &result, sint skipNFirst) } -void getCallStackAndLog (string &result, sint /* skipNFirst */) +void getCallStackAndLog (string &result, sint skipNFirst) { - //getCallStack(result, skipNFirst); + getCallStack(result, skipNFirst); //#ifdef NL_OS_WINDOWS // try // { From 111562822d978568e794754db26aad4bc9c50a16 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Mon, 18 Nov 2019 09:31:46 +0800 Subject: [PATCH 13/22] Add handy startsWith string utility function --- code/nel/include/nel/misc/string_common.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/nel/include/nel/misc/string_common.h b/code/nel/include/nel/misc/string_common.h index bb972a4eb..7366a0693 100644 --- a/code/nel/include/nel/misc/string_common.h +++ b/code/nel/include/nel/misc/string_common.h @@ -257,6 +257,20 @@ inline bool fromString(const std::string &str, uint &val) { return sscanf(str.c_ inline bool fromString(const std::string &str, sint &val) { return sscanf(str.c_str(), "%d", &val) == 1; } #endif // NL_COMP_VC6 +inline bool startsWith(const char *str, const char *prefix) +{ + for (int i = 0;; ++i) + { + if (str[i] != prefix[i] || str[i] == '\0') + { + return prefix[i] == '\0'; + } + } +} + +inline bool startsWith(const std::string &str, const char *prefix) { return startsWith(str.c_str(), prefix); } +inline bool startsWith(const std::string &str, const std::string &prefix) { return startsWith(str.c_str(), prefix.c_str()); } + // Convert local codepage to UTF-8 // On Windows, the local codepage is undetermined // On Linux, the local codepage is always UTF-8 (no-op) From edb3ba6002330d8569d34fa3ec1e45771202a700 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Tue, 19 Nov 2019 12:45:34 +0800 Subject: [PATCH 14/22] Patch over https --- .../nel/{gui => misc}/curl_certificates.h | 4 +- .../include/nel/misc}/http_client_curl.h | 22 +++++--- code/nel/src/gui/group_html.cpp | 2 +- .../src/{gui => misc}/curl_certificates.cpp | 20 +++++-- .../src => nel/src/misc}/http_client_curl.cpp | 22 +++++--- code/ryzom/client/src/init_main_loop.cpp | 8 +++ .../src/interface_v3/group_html_webig.cpp | 4 +- .../src/interface_v3/interface_manager.cpp | 4 +- code/ryzom/client/src/login.cpp | 2 +- code/ryzom/client/src/login.h | 6 +- code/ryzom/client/src/login_patch.cpp | 55 +++++++++++-------- 11 files changed, 96 insertions(+), 53 deletions(-) rename code/nel/include/nel/{gui => misc}/curl_certificates.h (97%) rename code/{ryzom/client/src => nel/include/nel/misc}/http_client_curl.h (75%) rename code/nel/src/{gui => misc}/curl_certificates.cpp (97%) rename code/{ryzom/client/src => nel/src/misc}/http_client_curl.cpp (92%) diff --git a/code/nel/include/nel/gui/curl_certificates.h b/code/nel/include/nel/misc/curl_certificates.h similarity index 97% rename from code/nel/include/nel/gui/curl_certificates.h rename to code/nel/include/nel/misc/curl_certificates.h index 9d5ad4855..778074ca1 100644 --- a/code/nel/include/nel/gui/curl_certificates.h +++ b/code/nel/include/nel/misc/curl_certificates.h @@ -22,7 +22,7 @@ // forward declaration to avoid curl.h inclusion everywhere typedef void CURL; -namespace NLGUI +namespace NLMISC { class CCurlCertificates { @@ -36,3 +36,5 @@ namespace NLGUI } // namespace #endif + +/* end of file */ diff --git a/code/ryzom/client/src/http_client_curl.h b/code/nel/include/nel/misc/http_client_curl.h similarity index 75% rename from code/ryzom/client/src/http_client_curl.h rename to code/nel/include/nel/misc/http_client_curl.h index 2ba58746e..b282c2b70 100644 --- a/code/ryzom/client/src/http_client_curl.h +++ b/code/nel/include/nel/misc/http_client_curl.h @@ -20,10 +20,12 @@ #include "nel/misc/types_nl.h" #include +namespace NLMISC +{ /** - * HTTP client with SSL capabilities - */ + * HTTP client with SSL capabilities + */ class CCurlHttpClient { public: @@ -41,19 +43,19 @@ public: bool verifyServer(bool verify); /// Send a 'get' request - bool sendGet(const std::string &url, const std::string& params=std::string(), bool verbose=false); + bool sendGet(const std::string &url, const std::string ¶ms = std::string(), bool verbose = false); /// Send a 'get' request with a cookie - bool sendGetWithCookie(const std::string &url, const std::string &name, const std::string &value, const std::string& params=std::string(), bool verbose=false); + bool sendGetWithCookie(const std::string &url, const std::string &name, const std::string &value, const std::string ¶ms = std::string(), bool verbose = false); /// Send a 'post' request - bool sendPost(const std::string &url, const std::string& params=std::string(), bool verbose=false); + bool sendPost(const std::string &url, const std::string ¶ms = std::string(), bool verbose = false); /// Send a 'post' request with a cookie - bool sendPostWithCookie(const std::string &url, const std::string &name, const std::string &value, const std::string& params=std::string(), bool verbose=false); + bool sendPostWithCookie(const std::string &url, const std::string &name, const std::string &value, const std::string ¶ms = std::string(), bool verbose = false); /// Wait for a response - bool receive(std::string &res, bool verbose=false); + bool receive(std::string &res, bool verbose = false); /// Disconnect if connected (otherwise does nothing) void disconnect(); @@ -61,7 +63,7 @@ public: protected: /// Helper - bool sendRequest(const std::string& methodWB, const std::string &url, const std::string &cookieName, const std::string &cookieValue, const std::string& postParams, bool verbose); + bool sendRequest(const std::string &methodWB, const std::string &url, const std::string &cookieName, const std::string &cookieValue, const std::string &postParams, bool verbose); /// Helper void pushReceivedData(uint8 *buffer, uint size); @@ -69,7 +71,7 @@ protected: static size_t writeDataFromCurl(void *buffer, size_t size, size_t nmemb, void *pHttpClient); private: - void* _CurlStruct; // void* to prevent including curl.h in a header file + void *_CurlStruct; // void* to prevent including curl.h in a header file std::vector _ReceiveBuffer; std::string _Auth; // must be kept here because curl only stores the char pointer @@ -77,6 +79,8 @@ private: extern CCurlHttpClient CurlHttpClient; +} + #endif // NL_HTTP_CLIENT_H /* End of http_client_curl.h */ diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp index 1f739cc5f..ce719f4b0 100644 --- a/code/nel/src/gui/group_html.cpp +++ b/code/nel/src/gui/group_html.cpp @@ -47,7 +47,7 @@ #include "nel/gui/url_parser.h" #include "nel/gui/http_cache.h" #include "nel/gui/http_hsts.h" -#include "nel/gui/curl_certificates.h" +#include "nel/misc/curl_certificates.h" #include "nel/gui/html_parser.h" #include "nel/gui/html_element.h" #include "nel/gui/css_style.h" diff --git a/code/nel/src/gui/curl_certificates.cpp b/code/nel/src/misc/curl_certificates.cpp similarity index 97% rename from code/nel/src/gui/curl_certificates.cpp rename to code/nel/src/misc/curl_certificates.cpp index dbd3005ad..9dcdc72db 100644 --- a/code/nel/src/gui/curl_certificates.cpp +++ b/code/nel/src/misc/curl_certificates.cpp @@ -14,10 +14,12 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -//#include - -#include "stdpch.h" -#include "nel/gui/curl_certificates.h" +#include "stdmisc.h" +#include +#include +#include +#include +#include #include #include @@ -25,6 +27,13 @@ #include +#ifdef NL_OS_WINDOWS +#include +#ifdef X509_NAME +#undef X509_NAME +#endif +#endif + // for compatibility with older versions #ifndef CURL_AT_LEAST_VERSION #define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z) @@ -40,7 +49,7 @@ using namespace NLMISC; #define new DEBUG_NEW #endif -namespace NLGUI +namespace NLMISC { // // x509CertList lifetime manager @@ -385,3 +394,4 @@ namespace NLGUI }// namespace +/* end of file */ diff --git a/code/ryzom/client/src/http_client_curl.cpp b/code/nel/src/misc/http_client_curl.cpp similarity index 92% rename from code/ryzom/client/src/http_client_curl.cpp rename to code/nel/src/misc/http_client_curl.cpp index c27672489..d335716b0 100644 --- a/code/ryzom/client/src/http_client_curl.cpp +++ b/code/nel/src/misc/http_client_curl.cpp @@ -14,15 +14,15 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -#include "stdpch.h" -#include "http_client_curl.h" +#include "stdmisc.h" +#include +#include #include -#include "nel/gui/curl_certificates.h" +#include using namespace NLMISC; -using namespace NLNET; using namespace std; #ifdef DEBUG_NEW @@ -31,6 +31,8 @@ using namespace std; #define _Curl (CURL *)_CurlStruct +namespace NLMISC +{ // Ugly CURL callback size_t CCurlHttpClient::writeDataFromCurl(void *buffer, size_t size, size_t nmemb, void *pHttpClient) @@ -72,10 +74,10 @@ bool CCurlHttpClient::verifyServer(bool verify) curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, verify ? 1 : 0); // specify custom CA certs - NLGUI::CCurlCertificates::addCertificateFile(CAFilename); + CCurlCertificates::addCertificateFile(CAFilename); // if supported, use custom SSL context function to load certificates - NLGUI::CCurlCertificates::useCertificates(_Curl); + CCurlCertificates::useCertificates(_Curl); return true; } @@ -88,6 +90,11 @@ bool CCurlHttpClient::sendRequest(const std::string& methodWB, const std::string // Set URL curl_easy_setopt(_Curl, CURLOPT_URL, url.c_str()); + if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https + { + curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, 1L); + curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYHOST, 2L); + } // Authentication if (!_Auth.empty()) @@ -188,5 +195,6 @@ void CCurlHttpClient::disconnect() CCurlHttpClient CurlHttpClient; +} - +/* end of file */ diff --git a/code/ryzom/client/src/init_main_loop.cpp b/code/ryzom/client/src/init_main_loop.cpp index 0ecc1d095..47c11d899 100644 --- a/code/ryzom/client/src/init_main_loop.cpp +++ b/code/ryzom/client/src/init_main_loop.cpp @@ -28,6 +28,7 @@ #include "nel/misc/path.h" #include "nel/misc/sheet_id.h" #include "nel/misc/big_file.h" +#include "nel/misc/curl_certificates.h" // 3D Interface. #include "nel/3d/bloom_effect.h" #include "nel/3d/u_driver.h" @@ -187,6 +188,13 @@ struct CStatThread : public NLMISC::IRunnable curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)"); curl_easy_setopt(curl, CURLOPT_REFERER, string("http://www.ryzom.com/" + referer).c_str()); curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https + { + NLMISC::CCurlCertificates::addCertificateFile("cacert.pem"); + NLMISC::CCurlCertificates::useCertificates(curl); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); + } CURLcode res = curl_easy_perform(curl); curl_easy_cleanup(curl); //curl_global_cleanup(); diff --git a/code/ryzom/client/src/interface_v3/group_html_webig.cpp b/code/ryzom/client/src/interface_v3/group_html_webig.cpp index 11fe6c6c5..5ec107bcb 100644 --- a/code/ryzom/client/src/interface_v3/group_html_webig.cpp +++ b/code/ryzom/client/src/interface_v3/group_html_webig.cpp @@ -30,7 +30,7 @@ #include "../connection.h" #include -#include "nel/gui/curl_certificates.h" +#include "nel/misc/curl_certificates.h" using namespace std; using namespace NLMISC; @@ -188,7 +188,7 @@ public: curl_easy_setopt(Curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(Curl, CURLOPT_WRITEFUNCTION, writeDataFromCurl); - NLGUI::CCurlCertificates::useCertificates(Curl); + NLMISC::CCurlCertificates::useCertificates(Curl); } ~CWebigNotificationThread() diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp index 16377ac94..d01e89a24 100644 --- a/code/ryzom/client/src/interface_v3/interface_manager.cpp +++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp @@ -113,7 +113,7 @@ #include "nel/gui/lua_helper.h" using namespace NLGUI; #include "nel/gui/lua_ihm.h" -#include "nel/gui/curl_certificates.h" +#include "nel/misc/curl_certificates.h" #include "lua_ihm_ryzom.h" @@ -480,7 +480,7 @@ CInterfaceManager::CInterfaceManager() if (!ClientCfg.CurlCABundle.empty()) { // specify custom CA certs, lookup will be made in this function - NLGUI::CCurlCertificates::addCertificateFile(ClientCfg.CurlCABundle); + NLMISC::CCurlCertificates::addCertificateFile(ClientCfg.CurlCABundle); } NLGUI::CDBManager::getInstance()->resizeBanks( NB_CDB_BANKS ); diff --git a/code/ryzom/client/src/login.cpp b/code/ryzom/client/src/login.cpp index 79381d8f2..eefe56188 100644 --- a/code/ryzom/client/src/login.cpp +++ b/code/ryzom/client/src/login.cpp @@ -50,7 +50,7 @@ #include "global.h" #include "input.h" #include "nel/gui/libwww.h" -#include "http_client_curl.h" +#include "nel/misc/http_client_curl.h" #include "login_progress_post_thread.h" #include "init.h" diff --git a/code/ryzom/client/src/login.h b/code/ryzom/client/src/login.h index fa4f041c1..d01f0ea8a 100644 --- a/code/ryzom/client/src/login.h +++ b/code/ryzom/client/src/login.h @@ -18,8 +18,8 @@ #ifndef CL_LOGIN_H #define CL_LOGIN_H -#include "nel/misc/types_nl.h" -#include "http_client_curl.h" +#include +#include #include #include @@ -74,7 +74,7 @@ extern sint32 ShardSelected; /* * HTTP client preconfigured to connect to the startup login host */ -class CStartupHttpClient : public CCurlHttpClient +class CStartupHttpClient : public NLMISC::CCurlHttpClient { public: diff --git a/code/ryzom/client/src/login_patch.cpp b/code/ryzom/client/src/login_patch.cpp index f4e7e237f..bde537f21 100644 --- a/code/ryzom/client/src/login_patch.cpp +++ b/code/ryzom/client/src/login_patch.cpp @@ -48,6 +48,7 @@ #include "nel/misc/big_file.h" #include "nel/misc/i18n.h" #include "nel/misc/cmd_args.h" +#include "nel/misc/curl_certificates.h" #include "game_share/bg_downloader_msg.h" @@ -239,12 +240,10 @@ void CPatchManager::init(const std::vector& patchURIs, const std::s cf = &ClientCfg.ConfigFile; #endif - std::string appName = "ryzom_live"; - - if (cf->getVarPtr("Application")) - { - appName = cf->getVar("Application").asString(0); - } + // App name matches Domain on the SQL server + std::string appName = cf->getVarPtr("Application") + ? cf->getVar("Application").asString(0) + : "default"; std::string versionFileName = appName + ".version"; getServerFile(versionFileName); @@ -252,7 +251,7 @@ void CPatchManager::init(const std::vector& patchURIs, const std::s // ok, we have the file, extract version number (aka build number) and the // version name if present - CIFile versionFile(ClientPatchPath+versionFileName); + CIFile versionFile(ClientPatchPath + versionFileName); char buffer[1024]; versionFile.getline(buffer, 1024); CSString line(buffer); @@ -266,8 +265,12 @@ void CPatchManager::init(const std::vector& patchURIs, const std::s } #endif - ServerVersion = line.firstWord(true); - VersionName = line.firstWord(true); + // Use the version specified in this file, if the file does not contain an asterisk + if (line[0] != '*') + { + ServerVersion = line.firstWord(true); + VersionName = line.firstWord(true); + } // force the R2ServerVersion R2ServerVersion = ServerVersion; @@ -1258,19 +1261,18 @@ void CPatchManager::readDescFile(sint32 nVersion) if (foundPlatformPatchCategory) { - std::vector forceRemovePatchCategories; + std::set forceRemovePatchCategories; // only download binaries for current platform - forceRemovePatchCategories.push_back("main_exedll"); - forceRemovePatchCategories.push_back("main_exedll_win32"); - forceRemovePatchCategories.push_back("main_exedll_win64"); - forceRemovePatchCategories.push_back("main_exedll_linux32"); - forceRemovePatchCategories.push_back("main_exedll_linux64"); - forceRemovePatchCategories.push_back("main_exedll_osx"); + forceRemovePatchCategories.insert("main_exedll"); + forceRemovePatchCategories.insert("main_exedll_win32"); + forceRemovePatchCategories.insert("main_exedll_win64"); + forceRemovePatchCategories.insert("main_exedll_linux32"); + forceRemovePatchCategories.insert("main_exedll_linux64"); + forceRemovePatchCategories.insert("main_exedll_osx"); // remove current platform category from remove list - forceRemovePatchCategories.erase(std::remove(forceRemovePatchCategories.begin(), - forceRemovePatchCategories.end(), platformPatchCategory), forceRemovePatchCategories.end()); + forceRemovePatchCategories.erase(platformPatchCategory); CBNPFileSet &bnpFS = const_cast(DescFile.getFiles()); @@ -1427,6 +1429,13 @@ void CPatchManager::downloadFileWithCurl (const string &source, const string &de curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, downloadProgressFunc); curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, (void *) progress); curl_easy_setopt(curl, CURLOPT_URL, source.c_str()); + if (source.length() > 8 && (source[4] == 's' || source[4] == 'S')) // 01234 https + { + NLMISC::CCurlCertificates::addCertificateFile("cacert.pem"); + NLMISC::CCurlCertificates::useCertificates(curl); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); + } // create the local file if (NLMISC::CFile::fileExists(dest)) @@ -1525,12 +1534,14 @@ void CPatchManager::downloadFileWithCurl (const string &source, const string &de void CPatchManager::downloadFile (const string &source, const string &dest, NLMISC::IProgressCallback *progress) { // For the moment use only curl - const string sHeadHttp = toLower(source.substr(0,5)); - const string sHeadFtp = toLower(source.substr(0,4)); - const string sHeadFile = toLower(source.substr(0,5)); + const string sourceLower = toLower(source.substr(0, 6)); - if ((sHeadHttp == "http:") || (sHeadFtp == "ftp:") || (sHeadFile == "file:")) + if (startsWith(sourceLower, "http:") + || startsWith(sourceLower, "https:") + || startsWith(sourceLower, "ftp:") + || startsWith(sourceLower, "file:")) { + nldebug("Download patch file %s", source.c_str()); downloadFileWithCurl(source, dest, progress); } else From 0f59a026620482d2d569e51b946608a1e6225515 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Fri, 22 Nov 2019 21:22:45 +0800 Subject: [PATCH 15/22] Adjust continent sheet name --- .../nel/tools/build_gamedata/processes/properties/0_setup.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/nel/tools/build_gamedata/processes/properties/0_setup.py b/code/nel/tools/build_gamedata/processes/properties/0_setup.py index 1a0889caf..2634c4aca 100755 --- a/code/nel/tools/build_gamedata/processes/properties/0_setup.py +++ b/code/nel/tools/build_gamedata/processes/properties/0_setup.py @@ -81,6 +81,10 @@ for line in ps: ContinentPath except NameError: ContinentPath = "_invalid" + try: + ContinentSheet + except NameError: + ContinentSheet = "_invalid" try: BankTileBankName except NameError: @@ -113,6 +117,7 @@ for line in ps: newline = newline.replace("%ContinentPath%", ContinentPath) newline = newline.replace("%CommonName%", CommonName) newline = newline.replace("%CommonPath%", CommonPath) + newline = newline.replace("%ContinentSheet%", ContinentSheet) newline = newline.replace("%BankTileBankName%", BankTileBankName) newline = newline.replace("%IgLandBuildDirectory%", IgLandBuildDirectory) newline = newline.replace("%IgOtherBuildDirectory%", IgOtherBuildDirectory) From 20c339891d3581a28958afd294fd242d58b74654 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 23 Nov 2019 07:35:49 +0800 Subject: [PATCH 16/22] Continent sheet is name by default --- code/nel/tools/build_gamedata/processes/properties/0_setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/nel/tools/build_gamedata/processes/properties/0_setup.py b/code/nel/tools/build_gamedata/processes/properties/0_setup.py index 2634c4aca..b6114d5b2 100755 --- a/code/nel/tools/build_gamedata/processes/properties/0_setup.py +++ b/code/nel/tools/build_gamedata/processes/properties/0_setup.py @@ -84,7 +84,7 @@ for line in ps: try: ContinentSheet except NameError: - ContinentSheet = "_invalid" + ContinentSheet = ContinentName try: BankTileBankName except NameError: From a34541fe95484ae5c27e3d0439790c096b65cf8f Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 23 Nov 2019 17:54:52 +0800 Subject: [PATCH 17/22] Apply zone heightmap after weld to fix rbank build failure, ryzomclassic/#58 --- code/nel/tools/3d/CMakeLists.txt | 1 + code/nel/tools/3d/ig_elevation/CMakeLists.txt | 2 +- .../tools/3d/zone_elevation/CMakeLists.txt | 11 + .../nel/tools/3d/zone_elevation/blue_pill.ico | Bin 0 -> 3638 bytes code/nel/tools/3d/zone_elevation/main.rc | 42 ++ .../3d/zone_elevation/zone_elevation.cpp | 396 ++++++++++++++++++ code/nel/tools/build_gamedata/0_setup.py | 1 + .../build_gamedata/configuration/tools.py | 1 + .../build_gamedata/processes/zone/2_build.py | 46 +- .../nel/tools/pacs/build_rbank/build_surf.cpp | 1 + 10 files changed, 486 insertions(+), 15 deletions(-) create mode 100644 code/nel/tools/3d/zone_elevation/CMakeLists.txt create mode 100644 code/nel/tools/3d/zone_elevation/blue_pill.ico create mode 100644 code/nel/tools/3d/zone_elevation/main.rc create mode 100644 code/nel/tools/3d/zone_elevation/zone_elevation.cpp diff --git a/code/nel/tools/3d/CMakeLists.txt b/code/nel/tools/3d/CMakeLists.txt index 0b6f6540d..e6ba62e3b 100644 --- a/code/nel/tools/3d/CMakeLists.txt +++ b/code/nel/tools/3d/CMakeLists.txt @@ -32,6 +32,7 @@ IF(WITH_NEL_TOOLS) zone_ig_lighter zone_lighter zone_welder + zone_elevation shapes_exporter shape2obj zone_check_bind diff --git a/code/nel/tools/3d/ig_elevation/CMakeLists.txt b/code/nel/tools/3d/ig_elevation/CMakeLists.txt index 9c3e0fe26..6f330bc2e 100644 --- a/code/nel/tools/3d/ig_elevation/CMakeLists.txt +++ b/code/nel/tools/3d/ig_elevation/CMakeLists.txt @@ -5,7 +5,7 @@ SOURCE_GROUP("" FILES ${SRC}) ADD_EXECUTABLE(ig_elevation ${SRC}) TARGET_LINK_LIBRARIES(ig_elevation nelmisc nel3d nelligo) -NL_DEFAULT_PROPS(ig_elevation "NeL, Tools, 3D: ig_elevation") +NL_DEFAULT_PROPS(ig_elevation "NeL, Tools, 3D: IG Elevation") NL_ADD_RUNTIME_FLAGS(ig_elevation) INSTALL(TARGETS ig_elevation RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT tools3d) diff --git a/code/nel/tools/3d/zone_elevation/CMakeLists.txt b/code/nel/tools/3d/zone_elevation/CMakeLists.txt new file mode 100644 index 000000000..20d715e13 --- /dev/null +++ b/code/nel/tools/3d/zone_elevation/CMakeLists.txt @@ -0,0 +1,11 @@ +FILE(GLOB SRC *.cpp *.h *.rc) + +SOURCE_GROUP("" FILES ${SRC}) + +ADD_EXECUTABLE(zone_elevation ${SRC}) + +TARGET_LINK_LIBRARIES(zone_elevation nel3d nelmisc nelligo) +NL_DEFAULT_PROPS(zone_elevation "NeL, Tools, 3D: Zone Elevation") +NL_ADD_RUNTIME_FLAGS(zone_elevation) + +INSTALL(TARGETS zone_elevation RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT tools3d) diff --git a/code/nel/tools/3d/zone_elevation/blue_pill.ico b/code/nel/tools/3d/zone_elevation/blue_pill.ico new file mode 100644 index 0000000000000000000000000000000000000000..269907ec31f3583d18d593121b4728dae9ccc757 GIT binary patch literal 3638 zcmeH|KW`I35XIlz*|+!4@tuP&V32TSMHJ}}5<(;>N>9T#pol2k@BthN$t6vwT~I}I zY23!4jbsTaC50PYBD&BmGkbgXMJ5KNLg;?dYJEFzchegpmP6?(lMwARpH&Y;gfVLqQ@I-Nql zeuS%iU^E)x@+mMJ4ly2&ak6t`iYic5psK)sSpmu^{u^x?NEtv$4y7$7Ra9?m2-J+2 zSW)2CYIV<}*cTKzz7qstNRfQT3goyZZqH*kyPmJed&`;ajXiETCIjGzRu7XkiIuhT zTYR?5V~>aU@j8spvajm5yT(KH0eiQ2toW_~Tp8aLj}_1T_8i84 zzdp;o_xlSNAHH}3^!t5$evHbC*F8iPt13`c;NPo&wRSVD-j3+O67m*UCEYJWoy^kl zJW900%~uSXj5hzSCXa~$7!?1+$m^NE3_nu2&m>dN?MhLQt59(n4~R^ zyDISgAPBgRISeIvG#7B(3F1a$BQ|Z2WuVH6_hT z9Hg%0U+&NA!x>DgE$+W4uN-b!|2~DPntxLP?&*KzCkA>3Je&aP2ykV9-=#c?^$BZc Jtd%`~!!K}6&rARS literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/zone_elevation/main.rc b/code/nel/tools/3d/zone_elevation/main.rc new file mode 100644 index 000000000..05cf7c976 --- /dev/null +++ b/code/nel/tools/3d/zone_elevation/main.rc @@ -0,0 +1,42 @@ +#include +#include "config.h" + +IDI_MAIN_ICON ICON DISCARDABLE "blue_pill.ico" + +#ifdef _DEBUG +#define NL_FILEEXT "_d" +#else +#define NL_FILEEXT "" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION NL_VERSION_RC + PRODUCTVERSION NL_VERSION_RC + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", AUTHOR + VALUE "FileDescription", "NeL Zone Heightmap" + VALUE "FileVersion", NL_VERSION + VALUE "LegalCopyright", COPYRIGHT + VALUE "OriginalFilename", "zone_heightmap" NL_FILEEXT ".exe" + VALUE "ProductName", "NeL Tools" + VALUE "ProductVersion", NL_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x9, 1200 + END +END diff --git a/code/nel/tools/3d/zone_elevation/zone_elevation.cpp b/code/nel/tools/3d/zone_elevation/zone_elevation.cpp new file mode 100644 index 000000000..3287a68ea --- /dev/null +++ b/code/nel/tools/3d/zone_elevation/zone_elevation.cpp @@ -0,0 +1,396 @@ +// NeL - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "../zone_lib/zone_utility.h" + +#include +#include +#include +#include +#include +#include +#include +//#include +#include +//#include +//#include +//#include +//#include +#include +#include +#include + +using namespace NL3D; +using namespace NLMISC; +using namespace NLLIGO; +using namespace std; + +namespace /* anonymous */ +{ + +sint32 s_ZoneMinX, s_ZoneMinY, s_ZoneMaxX, s_ZoneMaxY; +float s_CellSize = 160.0f; + +float s_ZFactor = 1.0f; +NLMISC::CBitmap *s_HeightMap; + +float s_ZFactor2 = 1.0f; +NLMISC::CBitmap *s_HeightMap2; + +std::string s_InputZone; // UTF-8 +std::string s_OutputZone; // UTF-8 + +CZoneRegion s_Land; + +bool loadLand(const string &filename) +{ + try + { + CIFile fileIn; + if (fileIn.open (filename)) + { + CIXml xml(true); + nlverify(xml.init(fileIn)); + s_Land.serial(xml); + } + else + { + nlwarning("Can't open the land file: %s", filename.c_str()); + return false; + } + } + catch (const Exception& e) + { + nlwarning("Error in land file: %s", e.what()); + return true; + } + return true; +} + +bool getXYFromZoneName(sint32 &x, sint32 &y, const string &zoneName) +{ + string xStr, yStr; + uint32 i = 0; + while (zoneName[i] != '_') + { + yStr += zoneName[i]; + ++i; + if (i == zoneName.size()) + goto Fail; + } + if (!NLMISC::fromString(yStr, y)) + goto Fail; + y = -y; + ++i; + while (i < zoneName.size()) + { + xStr += zoneName[i]; + ++i; + } + if (xStr.size() != 2) + goto Fail; + xStr = NLMISC::toUpper(xStr); + x = ((xStr[0] - 'A') * 26 + (xStr[1] - 'A')); + return true; +Fail: + x = -1; + y = -1; + return false; +} + +float getHeight(float x, float y) +{ + float deltaZ = 0.0f, deltaZ2 = 0.0f; + CRGBAF color; + sint32 sizeX = s_ZoneMaxX - s_ZoneMinX + 1; + sint32 sizeY = s_ZoneMaxY - s_ZoneMinY + 1; + + clamp(x, s_CellSize * s_ZoneMinX, s_CellSize * (s_ZoneMaxX + 1)); + clamp(y, s_CellSize * s_ZoneMinY, s_CellSize * (s_ZoneMaxY + 1)); + + if (s_HeightMap != NULL) + { + float xc = (x - s_CellSize * s_ZoneMinX) / (s_CellSize * sizeX); + float yc = 1.0f - ((y - s_CellSize * s_ZoneMinY) / (s_CellSize * sizeY)); + color = s_HeightMap->getColor(xc, yc); + color *= 255; + deltaZ = color.A; + deltaZ = deltaZ - 127.0f; // Median intensity is 127 + deltaZ *= s_ZFactor; + } + + if (s_HeightMap2 != NULL) + { + float xc = (x - s_CellSize * s_ZoneMinX) / (s_CellSize * sizeX); + float yc = 1.0f - ((y - s_CellSize * s_ZoneMinY) / (s_CellSize * sizeY)); + color = s_HeightMap2->getColor(xc, yc); + color *= 255; + deltaZ2 = color.A; + deltaZ2 = deltaZ2 - 127.0f; // Median intensity is 127 + deltaZ2 *= s_ZFactor2; + } + + return (deltaZ + deltaZ2); +} + +NLMISC::CVector getHeightNormal(float x, float y) +{ + sint32 SizeX = s_ZoneMaxX - s_ZoneMinX + 1; + sint32 SizeY = s_ZoneMaxY - s_ZoneMinY + 1; + sint32 bmpW, bmpH; + + // get width/height of the bitmap + if (s_HeightMap != NULL) + { + bmpW = s_HeightMap->getWidth(); + bmpH = s_HeightMap->getHeight(); + } + else if (s_HeightMap2 != NULL) + { + bmpW = s_HeightMap2->getWidth(); + bmpH = s_HeightMap2->getHeight(); + } + else + { + // no heightmap: unmodified normal + return CVector::K; + } + + // compute a good delta to compute tangents of the heightmap: 1/10 of a pixel, avoiding precision problem. + float dx = ((s_CellSize * SizeX) / bmpW) / 10; // eg: 160m/20pixels/10= 0.8 + float dy = ((s_CellSize * SizeY) / bmpH) / 10; + + // compute tangent around the position. + float hc = getHeight(x, y); + float hx = getHeight(x + dx, y); + float hy = getHeight(x, y + dy); + CVector ds(dx, 0, hx - hc); + CVector dt(0, dy, hy - hc); + + // compute the heightmap normal with the tangents + return (ds ^ dt).normed(); +} + +void applyZoneHeightmap() +{ + // Load zone + CIFile zoneFile(s_InputZone); + CZone zone; + zone.serial(zoneFile); + zoneFile.close(); + + // Retrieve patches and vertices + uint16 zoneId = zone.getZoneId(); + std::vector zonePatches; + std::vector zoneBorderVertices; + zone.retrieve(zonePatches, zoneBorderVertices); + + // Apply the Heighmap to all vertices/tangents/interiors (see Land Export tool.) + for (size_t i = 0; i < zonePatches.size(); ++i) + { + CPatchInfo &rPI = zonePatches[i]; + + // Elevate the vertices. + CVector verticesBeforeHeightMap[4]; + for (size_t j = 0; j < 4; ++j) + { + verticesBeforeHeightMap[j] = rPI.Patch.Vertices[j]; + float height = getHeight(rPI.Patch.Vertices[j].x, rPI.Patch.Vertices[j].y); + rPI.Patch.Vertices[j].z += height; + } + + // Interior and tangent are rotated to follow the heightmap normal, avoiding the "Stair Effect". + // Compute the matrix to apply to interiors and tangents. + CMatrix tgMatrix[4]; + for (size_t j = 0; j < 4; ++j) + { + // compute the normal of the heightmap. + CVector hmapNormal = getHeightNormal(rPI.Patch.Vertices[j].x, rPI.Patch.Vertices[j].y); + + // Compute the rotation which transforms the original normal: (0,0,1), to this normal. + CAngleAxis angleAxis; + angleAxis.Axis = CVector::K ^ hmapNormal; + angleAxis.Angle = (float)asin(angleAxis.Axis.norm()); + angleAxis.Axis.normalize(); + + // build the matrix which transform the old tgt/interior to his newValue: + // newVertexPos + rotate * (oldTgPos - oldVertexPos) + tgMatrix[j].identity(); + tgMatrix[j].translate(rPI.Patch.Vertices[j]); + tgMatrix[j].setRot(CQuat(angleAxis)); + tgMatrix[j].translate(-verticesBeforeHeightMap[j]); + } + + // For all interior. + for (size_t j = 0; j < 4; ++j) + rPI.Patch.Interiors[j] = tgMatrix[j] * rPI.Patch.Interiors[j]; + + // when j == 7 or 0 use vertex 0 for delta Z to ensure continuity of normals + // when j == 1 or 2 use vertex 1 + // when j == 3 or 4 use vertex 2 + // when j == 5 or 6 use vertex 3 + for (size_t j = 0; j < 8; ++j) + { + // get the correct vertex + uint vertexId = ((j + 1) / 2) % 4; + // apply the tgMatrix to the tangent + rPI.Patch.Tangents[j] = tgMatrix[vertexId] * rPI.Patch.Tangents[j]; + } + } + + // Save zone + zone.build(zoneId, zonePatches, zoneBorderVertices); + COFile centerSave(s_OutputZone); + nldebug("Writing file %s", s_OutputZone.c_str()); + zone.serial(centerSave); +} + +} /* anonymous namespace */ + +int main(int argc, char **argv) +{ + NLMISC::CApplicationContext myApplicationContext; + + NLMISC::CCmdArgs args; + + args.addAdditionalArg("zonenhw", "Input zone"); // .zonenhw + args.addAdditionalArg("zonew", "Output zone"); // .zonew + args.addArg("", "land", "land", "Ligo land file (either specify this or the boundaries)"); + args.addArg("", "zonemin", "zone", "Zone boundary"); + args.addArg("", "zonemax", "zone", "Zone boundary"); + args.addArg("", "cellsize", "meters", "Zone cell size"); + args.addArg("", "zfactor", "factor", "Factor for heightmap"); + args.addArg("", "heightmap", "bitmap", "Heightmap"); + args.addArg("", "zfactor2", "factor", "Factor for second heightmap"); + args.addArg("", "heightmap2", "bitmap", "Second heightmap"); + // TODO: args.addArg("", "batch", "", "Process all zones in input (specify input as C:/folder/.zonenhw)"); + + if (!args.parse(argc, argv)) + { + return EXIT_FAILURE; + } + + s_InputZone = args.getAdditionalArg("zonenhw")[0]; + s_OutputZone = args.getAdditionalArg("zonew")[0]; + + if (args.haveLongArg("zonemin") && args.haveLongArg("zonemax")) + { + sint32 zoneMinX, zoneMinY; + sint32 zoneMaxX, zoneMaxY; + if (!getXYFromZoneName(zoneMinX, zoneMinY, args.getLongArg("zonemin")[0]) + || !getXYFromZoneName(zoneMaxX, zoneMaxY, args.getLongArg("zonemax")[0])) + { + goto Fail; + } + s_ZoneMinX = min(zoneMinX, zoneMaxX); + s_ZoneMaxX = max(zoneMinX, zoneMaxX); + s_ZoneMinY = min(zoneMinY, zoneMaxY); + s_ZoneMaxY = max(zoneMinY, zoneMaxY); + } + else if (args.haveLongArg("land")) + { + if (!loadLand(args.getLongArg("land")[0])) + goto Fail; + s_ZoneMinX = s_Land.getMinX(); + s_ZoneMaxX = s_Land.getMaxX(); + s_ZoneMinY = s_Land.getMinY(); + s_ZoneMaxY = s_Land.getMaxY(); + } + else + { + nlwarning("Must have either both 'zonemin' and 'zonemax', or 'land' specified"); + goto Fail; + } + + if (args.haveLongArg("heightmap")) + { + nldebug("Loading height map"); + s_HeightMap = new CBitmap(); + try + { + CIFile inFile; + if (inFile.open(args.getLongArg("heightmap")[0])) + { + s_HeightMap->load(inFile); + } + else + { + nldebug("Cant load height map: %s", args.getLongArg("heightmap")[0].c_str()); + delete s_HeightMap; + s_HeightMap = NULL; + } + } + catch (const Exception &) + { + nldebug("Cant load height map: %s", args.getLongArg("heightmap")[0].c_str()); + delete s_HeightMap; + s_HeightMap = NULL; + } + } + + if (args.haveLongArg("heightmap2")) + { + nldebug("Loading height map"); + s_HeightMap2 = new CBitmap(); + try + { + CIFile inFile; + if (inFile.open(args.getLongArg("heightmap2")[0])) + { + s_HeightMap2->load(inFile); + } + else + { + nldebug("Cant load height map: %s", args.getLongArg("heightmap2")[0].c_str()); + delete s_HeightMap2; + s_HeightMap2 = NULL; + } + } + catch (const Exception &) + { + nldebug("Cant load height map: %s", args.getLongArg("heightmap2")[0].c_str()); + delete s_HeightMap2; + s_HeightMap2 = NULL; + } + } + + if (args.haveLongArg("zfactor")) + { + if (!NLMISC::fromString(args.getLongArg("zfactor")[0], s_ZFactor)) + goto Fail; + } + + if (args.haveLongArg("zfactor2")) + { + if (!NLMISC::fromString(args.getLongArg("zfactor2")[0], s_ZFactor2)) + goto Fail; + } + + if (args.haveLongArg("cellsize")) + { + if (!NLMISC::fromString(args.getLongArg("cellsize")[0], s_CellSize)) + goto Fail; + } + + applyZoneHeightmap(); + + return EXIT_SUCCESS; +Fail: + args.displayHelp(); + delete s_HeightMap; + delete s_HeightMap2; + return EXIT_FAILURE; +} diff --git a/code/nel/tools/build_gamedata/0_setup.py b/code/nel/tools/build_gamedata/0_setup.py index 69d825fed..00d19cbe6 100755 --- a/code/nel/tools/build_gamedata/0_setup.py +++ b/code/nel/tools/build_gamedata/0_setup.py @@ -434,6 +434,7 @@ if not args.noverify: findTool(log, ToolDirectories, BuildFarbankTool, ToolSuffix) findTool(log, ToolDirectories, ZoneDependenciesTool, ToolSuffix) findTool(log, ToolDirectories, ZoneWelderTool, ToolSuffix) + findTool(log, ToolDirectories, ZoneElevationTool, ToolSuffix) findTool(log, ToolDirectories, BuildRbankTool, ToolSuffix) findTool(log, ToolDirectories, BuildIndoorRbankTool, ToolSuffix) findTool(log, ToolDirectories, BuildIgBoxesTool, ToolSuffix) diff --git a/code/nel/tools/build_gamedata/configuration/tools.py b/code/nel/tools/build_gamedata/configuration/tools.py index 67cefdd5b..19cf5c9a5 100755 --- a/code/nel/tools/build_gamedata/configuration/tools.py +++ b/code/nel/tools/build_gamedata/configuration/tools.py @@ -60,6 +60,7 @@ BuildSmallbankTool = "build_smallbank" BuildFarbankTool = "build_far_bank" ZoneDependenciesTool = "zone_dependencies" ZoneWelderTool = "zone_welder" +ZoneElevationTool = "zone_elevation" BuildRbankTool = "build_rbank" BuildIndoorRbankTool = "build_indoor_rbank" BuildIgBoxesTool = "build_ig_boxes" diff --git a/code/nel/tools/build_gamedata/processes/zone/2_build.py b/code/nel/tools/build_gamedata/processes/zone/2_build.py index ad2f052fd..f9a31e3c4 100755 --- a/code/nel/tools/build_gamedata/processes/zone/2_build.py +++ b/code/nel/tools/build_gamedata/processes/zone/2_build.py @@ -46,6 +46,7 @@ printLog(log, "") # Find tools ZoneDependencies = findTool(log, ToolDirectories, ZoneDependenciesTool, ToolSuffix) ZoneWelder = findTool(log, ToolDirectories, ZoneWelderTool, ToolSuffix) +ZoneElevation = findTool(log, ToolDirectories, ZoneElevationTool, ToolSuffix) ExecTimeout = findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix) printLog(log, "") @@ -99,7 +100,24 @@ if BuildQuality == 1: printLog(log, "") # For each zone directory -printLog(log, ">>> Build zone weld <<<") +#printLog(log, ">>> Build zone weld <<<") +#if ZoneWelder == "": +# toolLogFail(log, ZoneWelderTool, ToolSuffix) +#elif ExecTimeout == "": +# toolLogFail(log, ExecTimeoutTool, ToolSuffix) +#else: +# mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory) +# mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory) +# files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zone") +# for file in files: +# sourceFile = ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + file +# destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zone")] + ".zonew" +# if needUpdateLogRemoveDest(log, sourceFile, destFile): +# subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ]) +#printLog(log, "") + +# For each zone directory +printLog(log, ">>> Weld zone without heightmap <<<") if ZoneWelder == "": toolLogFail(log, ZoneWelderTool, ToolSuffix) elif ExecTimeout == "": @@ -107,29 +125,29 @@ elif ExecTimeout == "": else: mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory) mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory) - files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zone") + files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zonenh") for file in files: sourceFile = ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + file - destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zone")] + ".zonew" + destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zonenh")] + ".zonenhw" if needUpdateLogRemoveDest(log, sourceFile, destFile): subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ]) printLog(log, "") -# For each zone directory -printLog(log, ">>> Build zone weld no heightmap <<<") -if ZoneWelder == "": - toolLogFail(log, ZoneWelderTool, ToolSuffix) -elif ExecTimeout == "": - toolLogFail(log, ExecTimeoutTool, ToolSuffix) +printLog(log, ">>> Apply zone heightmap to welded zone <<<") +if ZoneElevation == "": + toolLogFail(log, ZoneElevationTool, ToolSuffix) else: - mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory) mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory) - files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zonenh") + mkPath(log, DatabaseDirectory + "/" + LigoBaseSourceDirectory); + land = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportLand + heightMap1 = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap1 + heightMap2 = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap2 + files = findFiles(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory, "", ".zonenhw") for file in files: - sourceFile = ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + file - destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zonenh")] + ".zonenhw" + sourceFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + file + destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zonenhw")] + ".zonew" if needUpdateLogRemoveDest(log, sourceFile, destFile): - subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ]) + subprocess.call([ ZoneElevation, sourceFile, destFile, "--land", land, "--heightmap", heightMap1, "--zfactor", LigoExportZFactor1, "--heightmap2", heightMap2, "--zfactor2", LigoExportZFactor2 ]) printLog(log, "") log.close() diff --git a/code/nel/tools/pacs/build_rbank/build_surf.cpp b/code/nel/tools/pacs/build_rbank/build_surf.cpp index 465f5f94f..ba75234d1 100644 --- a/code/nel/tools/pacs/build_rbank/build_surf.cpp +++ b/code/nel/tools/pacs/build_rbank/build_surf.cpp @@ -880,6 +880,7 @@ void NLPACS::CZoneTessellation::checkSameLandscapeHmBinds(const NL3D::CLandscape // or at least the welding of zones should just keep the same welding as the non heightmapped one nlwarning("ERROR: The zone %s has a different bind strucutre in the landscape and in the landscape_with_No_Heightmap", zoneName.c_str()); nlwarning("ERROR: Hint: Check your heightmap: it may be too precise or has too much noise, causing the zonewelder to behav differently..."); + nlwarning("ERROR: Use the 'zone_heightmap' tool to resolve this!"); nlwarning("More Details (information landscape / information landscape_with_No_Heightmap):"); for(uint j=0;j Date: Sun, 24 Nov 2019 10:19:49 +0800 Subject: [PATCH 18/22] Fix ig elevation paths --- code/nel/tools/3d/ig_elevation/main.cpp | 12 +++++++----- .../nel/tools/build_gamedata/processes/ig/2_build.py | 4 +++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/code/nel/tools/3d/ig_elevation/main.cpp b/code/nel/tools/3d/ig_elevation/main.cpp index a3f7dba5f..122957eb0 100644 --- a/code/nel/tools/3d/ig_elevation/main.cpp +++ b/code/nel/tools/3d/ig_elevation/main.cpp @@ -259,13 +259,13 @@ int main(int nNbArg, char**ppArgs) printf ("ZFactor2 = 0.5;\n"); printf ("LandFile = \"w:/matis.land\";\n"); - return -1; + return EXIT_FAILURE; } SExportOptions options; if (!options.load(ppArgs[1])) { - return -1; + return EXIT_FAILURE; } // Get all ig files in the input directory and elevate to the z of the double heightmap @@ -358,7 +358,7 @@ int main(int nNbArg, char**ppArgs) for (uint32 i = 0; i < vAllFiles.size(); ++i) { - CInstanceGroup *pIG = LoadInstanceGroup (CPath::standardizePath(options.InputIGDir) + vAllFiles[i]); + CInstanceGroup *pIG = LoadInstanceGroup (vAllFiles[i]); if (pIG != NULL) { @@ -430,11 +430,13 @@ int main(int nNbArg, char**ppArgs) pIGout->build (vGlobalPos, IA, Clusters, Portals, PLN); pIGout->enableRealTimeSunContribution(realTimeSunContribution); - SaveInstanceGroup (CPath::standardizePath(options.OutputIGDir) + vAllFiles[i], pIGout); + std::string outFilePath = CPath::standardizePath(options.OutputIGDir, true) + CFile::getFilename(vAllFiles[i]); + nldebug("Writing %s...", outFilePath.c_str()); + SaveInstanceGroup(outFilePath, pIGout); delete pIG; } } - return 1; + return EXIT_SUCCESS; } diff --git a/code/nel/tools/build_gamedata/processes/ig/2_build.py b/code/nel/tools/build_gamedata/processes/ig/2_build.py index afb84c312..c2ab57059 100755 --- a/code/nel/tools/build_gamedata/processes/ig/2_build.py +++ b/code/nel/tools/build_gamedata/processes/ig/2_build.py @@ -54,6 +54,8 @@ mkPath(log, configDir) def igElevation(inputIgDir, outputIgDir): printLog(log, ">>> IG Elevation <<<") + mkPath(log, inputIgDir) + mkPath(log, outputIgDir) needUpdateIg = needUpdateDirByTagLog(log, inputIgDir, ".ig", outputIgDir, ".ig") if needUpdateIg: printLog(log, "DETECT UPDATE IG->Elevated") @@ -100,7 +102,7 @@ def igElevation(inputIgDir, outputIgDir): os.remove(configFile) # Copy remaining IG files - copyFilesLogless(log, inputIgDir, outputIgDir) + #BUG:copyFilesLogless(log, inputIgDir, outputIgDir) else: printLog(log, "DETECT DECIDE SKIP") printLog(log, "SKIP *") From 671035c9b1bae40b0144bab9f97ff1d163127c92 Mon Sep 17 00:00:00 2001 From: Jan Boon Date: Tue, 26 Nov 2019 08:40:33 +0800 Subject: [PATCH 19/22] Add source of old Qt based BNP make gui from sfb --- code/nel/tools/misc/bnp_make_qt/main.cpp | 11 + code/nel/tools/misc/bnp_make_qt/main.h | 8 + .../nel/tools/misc/bnp_make_qt/mainwindow.cpp | 253 ++++++++++++++ code/nel/tools/misc/bnp_make_qt/mainwindow.h | 61 ++++ code/nel/tools/misc/bnp_make_qt/mainwindow.ui | 322 ++++++++++++++++++ 5 files changed, 655 insertions(+) create mode 100644 code/nel/tools/misc/bnp_make_qt/main.cpp create mode 100644 code/nel/tools/misc/bnp_make_qt/main.h create mode 100644 code/nel/tools/misc/bnp_make_qt/mainwindow.cpp create mode 100644 code/nel/tools/misc/bnp_make_qt/mainwindow.h create mode 100644 code/nel/tools/misc/bnp_make_qt/mainwindow.ui diff --git a/code/nel/tools/misc/bnp_make_qt/main.cpp b/code/nel/tools/misc/bnp_make_qt/main.cpp new file mode 100644 index 000000000..4efc51df3 --- /dev/null +++ b/code/nel/tools/misc/bnp_make_qt/main.cpp @@ -0,0 +1,11 @@ +#include "main.h" + +int main(int argc, char * argv[]) +{ + QApplication application(argc, argv); + MainWindow window; + + window.show(); + + return application.exec(); +} diff --git a/code/nel/tools/misc/bnp_make_qt/main.h b/code/nel/tools/misc/bnp_make_qt/main.h new file mode 100644 index 000000000..a8a4b8652 --- /dev/null +++ b/code/nel/tools/misc/bnp_make_qt/main.h @@ -0,0 +1,8 @@ +#ifndef MAIN_H +#define MAIN_H + +#include + +#include "mainwindow.h" + +#endif // MAIN_H diff --git a/code/nel/tools/misc/bnp_make_qt/mainwindow.cpp b/code/nel/tools/misc/bnp_make_qt/mainwindow.cpp new file mode 100644 index 000000000..888330a80 --- /dev/null +++ b/code/nel/tools/misc/bnp_make_qt/mainwindow.cpp @@ -0,0 +1,253 @@ +#include "mainwindow.h" + +MainWindow::MainWindow(QWidget * parent) : + QMainWindow(parent), + uiMainWindow_(new Ui::MainWindow), + processList_(new QProcess(this)), + processSearch_(new QProcess(this)), + processPack_(new QProcess(this)), + processUnpack_(new QProcess(this)) +{ + uiMainWindow_->setupUi(this); + + settings_ = new QSettings("bnp_make_frontend.cfg", QSettings::IniFormat); + bnpMakeBinary_ = settings_->value("BnpMakeBinary").toString(); + dataPath_ = settings_->value("DataPath").toString(); + + uiMainWindow_->lineEditSearchPath->setText(dataPath_); + uiMainWindow_->lineEditBnpMake->setText(bnpMakeBinary_); + uiMainWindow_->lineEditDataPath->setText(dataPath_); + + connect(uiMainWindow_->pushButtonListBrowse, SIGNAL(clicked()), this, SLOT(onButtonListBrowseClicked())); + connect(uiMainWindow_->pushButtonList, SIGNAL(clicked()), this, SLOT(onButtonListClicked())); + connect(processList_, SIGNAL(finished(int)), this, SLOT(onProcessListComplete())); + + connect(uiMainWindow_->pushButtonSearchBrowse, SIGNAL(clicked()), this, SLOT(onButtonSearchBrowseClicked())); + connect(uiMainWindow_->pushButtonSearch, SIGNAL(clicked()), this, SLOT(onButtonSearchClicked())); + connect(processSearch_, SIGNAL(finished(int)), this, SLOT(onProcessSearchComplete())); + + connect(uiMainWindow_->pushButtonPackBrowse, SIGNAL(clicked()), this, SLOT(onButtonPackBrowseClicked())); + connect(uiMainWindow_->pushButtonPack, SIGNAL(clicked()), this, SLOT(onButtonPackClicked())); + connect(processPack_, SIGNAL(finished(int)), this, SLOT(onProcessPackComplete())); + + connect(uiMainWindow_->pushButtonUnpackBrowse, SIGNAL(clicked()), this, SLOT(onButtonUnpackBrowseClicked())); + connect(uiMainWindow_->pushButtonUnpack, SIGNAL(clicked()), this, SLOT(onButtonUnpackClicked())); + connect(processUnpack_, SIGNAL(finished(int)), this, SLOT(onProcessUnpackComplete())); + + connect(uiMainWindow_->pushButtonBnpMakeBrowse, SIGNAL(clicked()), this, SLOT(onButtonBnpMakeBrowseClicked())); + connect(uiMainWindow_->pushButtonDataPathBrowse, SIGNAL(clicked()), this, SLOT(onButtonDataPathBrowseClicked())); +} + +MainWindow::~MainWindow() +{ + delete uiMainWindow_; +} + +void MainWindow::onButtonListBrowseClicked() +{ + QString fileName; + + fileName = QFileDialog::getOpenFileName(this, "Choose a BNP file", dataPath_, "BNP file (*.bnp)"); + uiMainWindow_->lineEditList->setText(fileName); +} + +void MainWindow::onButtonListClicked() +{ + QStringList arguments; + + uiMainWindow_->textEditList->clear(); + + if (bnpMakeBinary_ != "") + if (uiMainWindow_->lineEditList->text() != "") + { + arguments << "/l" << uiMainWindow_->lineEditList->text(); + processList_->start(bnpMakeBinary_, arguments); + } + else + uiMainWindow_->textEditList->append("Choose a BNP file."); + else + uiMainWindow_->textEditList->append("Check bnp_make path."); +} + +void MainWindow::onProcessListComplete() +{ + QString output; + + output = processList_->readAllStandardOutput(); + uiMainWindow_->textEditList->append(output); + uiMainWindow_->textEditList->append("List complete."); +} + +void MainWindow::onButtonSearchBrowseClicked() +{ + QString directory; + + directory = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + uiMainWindow_->lineEditSearchPath->setText(directory); +} + +void MainWindow::onButtonSearchClicked() +{ + QDir dir; + QStringList nameFilters; + + uiMainWindow_->textEditSearch->clear(); + + if (bnpMakeBinary_ != "") + if (uiMainWindow_->lineEditSearchPath->text() != "") + { + dir.cd(uiMainWindow_->lineEditSearchPath->text()); + + nameFilters << "*.bnp"; + dir.setNameFilters(nameFilters); + dir.setFilter(QDir::Files); + + fileInfoList_ = dir.entryInfoList(); + fileInfoListIndex_ = 0; + + onProcessSearchComplete(); + } + else + uiMainWindow_->textEditSearch->append("Choose a directory."); + else + uiMainWindow_->textEditSearch->append("Check bnp_make path."); +} + +void MainWindow::onProcessSearchComplete() +{ + QFileInfo fileInfo; + QStringList arguments; + QString output; + QStringList outputList; + QString line; + + if (fileInfoListIndex_ > 0) + { + output = processSearch_->readAllStandardOutput(); + + if (uiMainWindow_->lineEditSearchString->text() == "") + uiMainWindow_->textEditSearch->append(output); + else + { + outputList = output.split("\n"); + + foreach (line, outputList) + if (line.contains(uiMainWindow_->lineEditSearchString->text())) + uiMainWindow_->textEditSearch->append(line.trimmed()); + } + } + + if (fileInfoListIndex_ < fileInfoList_.count()) + { + fileInfo = fileInfoList_.at(fileInfoListIndex_++); + uiMainWindow_->textEditSearch->append("===> " + uiMainWindow_->lineEditSearchPath->text() + "/" + fileInfo.fileName() + ":"); + arguments << "/l" << uiMainWindow_->lineEditSearchPath->text() + "/" + fileInfo.fileName(); + processSearch_->start(bnpMakeBinary_, arguments); + } + else + { + uiMainWindow_->textEditSearch->append("Search complete."); + } +} + +void MainWindow::onButtonPackBrowseClicked() +{ + QString directory; + + directory = QFileDialog::getExistingDirectory(this, tr("Choose the source directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + uiMainWindow_->lineEditPack->setText(directory); +} + +void MainWindow::onButtonPackClicked() +{ + QStringList arguments; + + uiMainWindow_->textEditPack->clear(); + + if (bnpMakeBinary_ != "") + if (uiMainWindow_->lineEditPack->text() != "") + { + uiMainWindow_->textEditPack->append("Pack in progress..."); + + arguments << "/p" << uiMainWindow_->lineEditPack->text(); + processPack_->start(bnpMakeBinary_, arguments); + } + else + uiMainWindow_->textEditPack->append("Choose the source directory."); + else + uiMainWindow_->textEditPack->append("Check bnp_make path."); +} + +void MainWindow::onProcessPackComplete() +{ + QString output; + + output = processPack_->readAllStandardOutput(); + uiMainWindow_->textEditPack->append(output); + uiMainWindow_->textEditPack->append("Pack complete."); +} + +void MainWindow::onButtonUnpackBrowseClicked() +{ + QString fileName; + + fileName = QFileDialog::getOpenFileName(this, "Choose a BNP file", dataPath_, "BNP file (*.bnp)"); + uiMainWindow_->lineEditUnpack->setText(fileName); +} + +void MainWindow::onButtonUnpackClicked() +{ + QStringList arguments; + + uiMainWindow_->textEditUnpack->clear(); + + if (bnpMakeBinary_ != "") + if (uiMainWindow_->lineEditUnpack->text() != "") + { + uiMainWindow_->textEditUnpack->append("Unpack in progress..."); + + arguments << "/u" << uiMainWindow_->lineEditUnpack->text(); + processUnpack_->start(bnpMakeBinary_, arguments); + } + else + uiMainWindow_->textEditUnpack->append("Choose a BNP file."); + else + uiMainWindow_->textEditUnpack->append("Check bnp_make path."); +} + +void MainWindow::onProcessUnpackComplete() +{ + uiMainWindow_->textEditUnpack->append("Unpack complete."); +} + +void MainWindow::onButtonBnpMakeBrowseClicked() +{ + QString fileName; + + fileName = QFileDialog::getOpenFileName(this, "Locate the bnp_make binary", dataPath_); + uiMainWindow_->lineEditBnpMake->setText(fileName); + + bnpMakeBinary_ = fileName; + settings_->setValue("BnpMakeBinary", fileName); + + uiMainWindow_->textEditSettings->clear(); + if (fileName != "") + uiMainWindow_->textEditSettings->append("bnp_make path changed."); + else + uiMainWindow_->textEditSettings->append("Locate the bnp_make binary."); +} + +void MainWindow::onButtonDataPathBrowseClicked() +{ + QString directory; + + directory = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + uiMainWindow_->lineEditDataPath->setText(directory); + + dataPath_ = directory; + settings_->setValue("DataPath", directory); + uiMainWindow_->lineEditSearchPath->setText(directory); + + uiMainWindow_->textEditSettings->clear(); + uiMainWindow_->textEditSettings->append("Data path changed."); +} diff --git a/code/nel/tools/misc/bnp_make_qt/mainwindow.h b/code/nel/tools/misc/bnp_make_qt/mainwindow.h new file mode 100644 index 000000000..776b5fe01 --- /dev/null +++ b/code/nel/tools/misc/bnp_make_qt/mainwindow.h @@ -0,0 +1,61 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include + +#include "ui_mainwindow.h" + +namespace Ui +{ + class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + + public: + explicit MainWindow(QWidget * parent = 0); + ~MainWindow(); + + public slots: + void onButtonListBrowseClicked(); + void onButtonListClicked(); + void onProcessListComplete(); + + void onButtonSearchBrowseClicked(); + void onButtonSearchClicked(); + void onProcessSearchComplete(); + + void onButtonPackBrowseClicked(); + void onButtonPackClicked(); + void onProcessPackComplete(); + + void onButtonUnpackBrowseClicked(); + void onButtonUnpackClicked(); + void onProcessUnpackComplete(); + + void onButtonBnpMakeBrowseClicked(); + void onButtonDataPathBrowseClicked(); + + private: + Ui::MainWindow * uiMainWindow_; + QSettings * settings_; + QString bnpMakeBinary_; + QString dataPath_; + + QProcess * processList_; + + QProcess * processSearch_; + int fileInfoListIndex_; + QFileInfoList fileInfoList_; + + QProcess * processPack_; + + QProcess * processUnpack_; +}; + +#endif // MAINWINDOW_H diff --git a/code/nel/tools/misc/bnp_make_qt/mainwindow.ui b/code/nel/tools/misc/bnp_make_qt/mainwindow.ui new file mode 100644 index 000000000..37097744e --- /dev/null +++ b/code/nel/tools/misc/bnp_make_qt/mainwindow.ui @@ -0,0 +1,322 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + bnp-make-frontend + + + + :/images/bnp-make-frontend.ico:/images/bnp-make-frontend.ico + + + QTabWidget::Rounded + + + + + + + 0 + + + + List + + + + + + + + + + BNP file: + + + + + + + true + + + + + + + Browse + + + + + + + + + List + + + + + + + true + + + + + + + + + + Search + + + + + + + + + + Search path: + + + + + + + true + + + + + + + Browse + + + + + + + + + + + Search string: + + + + + + + + + + + + Search + + + + + + + true + + + + + + + + + + Pack + + + + + + + + + + Source path: + + + + + + + true + + + + + + + Browse + + + + + + + + + Pack + + + + + + + true + + + + + + + + + + Unpack + + + + + + + + + + BNP file: + + + + + + + true + + + + + + + Browse + + + + + + + + + Unpack + + + + + + + true + + + + + + + + + + Settings + + + + + + + + + + bnp_make path: + + + + + + + true + + + + + + + Browse + + + + + + + + + + + Data path: + + + + + + + true + + + + + + + Browse + + + + + + + + + true + + + + + + + + + + + + + + + + + + From df21e21085f278095662f3aa2672d9c41760505b Mon Sep 17 00:00:00 2001 From: Nimetu Date: Tue, 26 Nov 2019 11:43:23 +0200 Subject: [PATCH 20/22] Fixed: nelmisc linker error --HG-- branch : develop --- code/CMakeLists.txt | 3 ++- code/nel/src/gui/CMakeLists.txt | 4 ++-- code/nel/src/misc/CMakeLists.txt | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 46900daa6..71910d8f7 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -220,6 +220,8 @@ IF(WITH_NEL) IF(WITH_GUI) FIND_PACKAGE(Luabind REQUIRED) + ENDIF() + FIND_PACKAGE(CURL REQUIRED) IF((WIN32 OR CURL_LIBRARIES MATCHES "\\.a") AND WITH_STATIC_CURL) @@ -269,7 +271,6 @@ IF(WITH_NEL) ENDIF() ENDIF() ENDIF() - ENDIF() INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/nel/include) ADD_SUBDIRECTORY(nel) diff --git a/code/nel/src/gui/CMakeLists.txt b/code/nel/src/gui/CMakeLists.txt index cb7bbe23a..19c0cfea8 100644 --- a/code/nel/src/gui/CMakeLists.txt +++ b/code/nel/src/gui/CMakeLists.txt @@ -6,9 +6,9 @@ SOURCE_GROUP("src" FILES ${SRC}) NL_TARGET_LIB(nelgui ${SRC} ${HEADERS}) -INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${LUA_INCLUDE_DIR} ${LUABIND_INCLUDE_DIR} ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${LUA_INCLUDE_DIR} ${LUABIND_INCLUDE_DIR} ${CURL_INCLUDE_DIRS}) -TARGET_LINK_LIBRARIES(nelgui nelmisc nel3d ${LUA_LIBRARIES} ${LUABIND_LIBRARIES} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES}) +TARGET_LINK_LIBRARIES(nelgui nelmisc nel3d ${LUA_LIBRARIES} ${LUABIND_LIBRARIES} ${CURL_LIBRARIES}) NL_DEFAULT_PROPS(nelgui "NeL, Library: NeL GUI") NL_ADD_RUNTIME_FLAGS(nelgui) diff --git a/code/nel/src/misc/CMakeLists.txt b/code/nel/src/misc/CMakeLists.txt index ec0dcd357..e8470983c 100644 --- a/code/nel/src/misc/CMakeLists.txt +++ b/code/nel/src/misc/CMakeLists.txt @@ -209,15 +209,15 @@ IF(UNIX) ENDIF() ENDIF() -INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${PNG_INCLUDE_DIR} config_file) +INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR} config_file) -TARGET_LINK_LIBRARIES(nelmisc ${CMAKE_THREAD_LIBS_INIT} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARY}) +TARGET_LINK_LIBRARIES(nelmisc ${CMAKE_THREAD_LIBS_INIT} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARY} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES}) NL_DEFAULT_PROPS(nelmisc "NeL, Library: NeL Misc") NL_ADD_RUNTIME_FLAGS(nelmisc) NL_ADD_LIB_SUFFIX(nelmisc) -ADD_DEFINITIONS(${LIBXML2_DEFINITIONS}) +ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${CURL_DEFINITIONS} ) IF(WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(nelmisc ${CMAKE_CURRENT_SOURCE_DIR}/stdmisc.h ${CMAKE_CURRENT_SOURCE_DIR}/stdmisc.cpp) From 02e7393c1414c225897e706255e63d7e30cffa53 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Tue, 26 Nov 2019 11:43:26 +0200 Subject: [PATCH 21/22] Changed: Move hardcoded urls to cmake. --HG-- branch : develop --- code/CMakeLists.txt | 19 +++++++++++++++++++ code/CMakeModules/nel.cmake | 2 ++ code/config.h.cmake | 8 ++++++++ code/ryzom/client/src/client_cfg.cpp | 14 +++++++++----- .../tools/client/client_patcher/main.cpp | 2 +- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 71910d8f7..67d516ba5 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -63,6 +63,25 @@ SET(RYZOM_VERSION_MAJOR 3) SET(RYZOM_VERSION_MINOR 5) SET(RYZOM_VERSION_PATCH 0) +SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Create Account URL") +SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Edit Account URL") +SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Forget Password URL") +SET(RYZOM_CLIENT_PATCH_URL "https://cdn.ryzom.dev/open/patch/" CACHE STRING "Ryzom Client Patch URL") + +SET(RYZOM_WEBIG_MAIN_URL "https://open.ryzom.dev/" CACHE STRING "Ryzom Client WebIG Main URL") +SET(RYZOM_WEBIG_TRUSTED_DOMAIN "open.ryzom.dev" CACHE STRING "Ryzom Client WebIG Trusted Domain") + +# urls when compiling ryzom live client +IF(WITH_RYZOM_LIVE) + SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://account.ryzom.com/signup/from_client.php") + SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://account.ryzom.com/payment_profile/index.php") + SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://account.ryzom.com/payment_profile/lost_secure_password.php") + SET(RYZOM_CLIENT_PATCH_URL "http://dl.ryzom.com/patch_live") + + SET(RYZOM_WEBIG_MAIN_URL "https://app.ryzom.com/") + SET(RYZOM_WEBIG_TRUSTED_DOMAIN "app.ryzom.com") +ENDIF() + #----------------------------------------------------------------------------- # Redirect output files SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index bd70dd2ff..bac079fb6 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -281,6 +281,8 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS) OPTION(WITH_RYZOM "Build Ryzom Core." ON ) OPTION(WITH_SNOWBALLS "Build Snowballs." OFF) OPTION(WITH_TOOLS "Build Tools" OFF) + + OPTION(WITH_RYZOM_LIVE "Use ryzom.com urls" OFF) ENDMACRO(NL_SETUP_DEFAULT_OPTIONS) MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS) diff --git a/code/config.h.cmake b/code/config.h.cmake index 9d698ac08..fa4749cb2 100644 --- a/code/config.h.cmake +++ b/code/config.h.cmake @@ -33,6 +33,14 @@ #cmakedefine RYZOM_VERSION_RC ${RYZOM_VERSION_RC} #cmakedefine RYZOM_PRODUCT_VERSION "${RYZOM_PRODUCT_VERSION}" +#cmakedefine RYZOM_CLIENT_CREATE_ACCOUNT_URL "${RYZOM_CLIENT_CREATE_ACCOUNT_URL}" +#cmakedefine RYZOM_CLIENT_EDIT_ACCOUNT_URL "${RYZOM_CLIENT_EDIT_ACCOUNT_URL}" +#cmakedefine RYZOM_CLIENT_FORGET_PASSWORD_URL "${RYZOM_CLIENT_FORGET_PASSWORD_URL}" +#cmakedefine RYZOM_CLIENT_PATCH_URL "${RYZOM_CLIENT_PATCH_URL}" + +#cmakedefine RYZOM_WEBIG_MAIN_URL "${RYZOM_WEBIG_MAIN_URL}" +#cmakedefine RYZOM_WEBIG_TRUSTED_DOMAIN "${RYZOM_WEBIG_TRUSTED_DOMAIN}" + #cmakedefine AUTHOR "${AUTHOR}" #cmakedefine YEAR "${YEAR}" #cmakedefine COPYRIGHT "${COPYRIGHT}" diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp index bfd6452ee..aac38c885 100644 --- a/code/ryzom/client/src/client_cfg.cpp +++ b/code/ryzom/client/src/client_cfg.cpp @@ -42,6 +42,10 @@ // Game Share. #include "game_share/time_weather_season/time_and_season.h" +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #ifdef NL_OS_MAC #include "app_bundle_utils.h" #endif // NL_OS_MAC @@ -330,9 +334,9 @@ CClientConfig::CClientConfig() TexturesLoginInterface.push_back("texture_interfaces_v3_login"); DisplayAccountButtons = true; - CreateAccountURL = "https://open.ryzom.dev/ams/"; - EditAccountURL = "https://open.ryzom.dev/ams/"; - ForgetPwdURL = "https://open.ryzom.dev/ams/"; + CreateAccountURL = RYZOM_CLIENT_CREATE_ACCOUNT_URL; // "https://open.ryzom.dev/ams/"; + EditAccountURL = RYZOM_CLIENT_EDIT_ACCOUNT_URL; // "https://open.ryzom.dev/ams/"; + ForgetPwdURL = RYZOM_CLIENT_FORGET_PASSWORD_URL; // "https://open.ryzom.dev/ams/"; Position = CVector(0.f, 0.f, 0.f); // Default Position. Heading = CVector(0.f, 1.f, 0.f); // Default Heading. EyesHeight = 1.5f; // Default User Eyes Height. @@ -428,8 +432,8 @@ CClientConfig::CClientConfig() PatchletUrl.clear(); PatchVersion.clear(); - WebIgMainDomain = "https://open.ryzom.dev"; - WebIgTrustedDomains.push_back("open.ryzom.dev"); + WebIgMainDomain = RYZOM_WEBIG_MAIN_URL; // https://open.ryzom.dev/" + WebIgTrustedDomains.push_back(RYZOM_WEBIG_TRUSTED_DOMAIN); // open.ryzom.dev WebIgNotifInterval = 10; // time in minutes CurlMaxConnections = 5; diff --git a/code/ryzom/tools/client/client_patcher/main.cpp b/code/ryzom/tools/client/client_patcher/main.cpp index 0c1a13832..e7d57a335 100644 --- a/code/ryzom/tools/client/client_patcher/main.cpp +++ b/code/ryzom/tools/client/client_patcher/main.cpp @@ -191,7 +191,7 @@ struct CClientPatcherTranslations : public NLMISC::CI18N::ILoadProxy }; // hardcoded URL to not depend on external files -static const std::string PatchUrl = "https://cdn.ryzom.dev/open/patch"; +static const std::string PatchUrl = RYZOM_CLIENT_PATCH_URL; // "https://cdn.ryzom.dev/open/patch"; int main(int argc, char *argv[]) { From 03340ee875a349080f761a4ce2a7fb762b7d76eb Mon Sep 17 00:00:00 2001 From: Jan Boon Date: Wed, 27 Nov 2019 09:16:28 +0800 Subject: [PATCH 22/22] Tag cleanup --HG-- branch : develop --- .hgtags | 55 +++++++++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/.hgtags b/.hgtags index 6eeec5b9a..38ed6cd84 100644 --- a/.hgtags +++ b/.hgtags @@ -1,28 +1,27 @@ -4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 ryzomcore/v0.8.0 -00d9b6e29e95f56785fbf85abe60afd34674f402 ryzomcore/v0.9.0 -79776c337176dd5b02e1a74fe5dfb703b91747aa ryzomcore/v0.9.1 -fedf2aa443d09707beed814b0f499c6a5519cc84 ryzomcore/v0.10.0 -edaa3624a56420b02ccc64c26059801a389927ee ryzomcore/v0.11.0 -e3fe4855f22c3e75722e015dc33c091c340b3ad7 ryzomcore/v0.11.1 -9e583b717fd63be0be9fd60b99087abf1691ea49 ryzomcore/v0.11.2 -bfe5628e14a024ba7ea32e4b326ae433a07856b9 ryzomcore/v0.11.3 -9a6120735daa97c96ac5d85ca35c7f21f607bd87 ryzomcore/v0.12.0 -3e17907af67e8d66d80e6b714707bbf912607f2a ryzom-patch-3.0.0 -153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom-patch-3.0.1 -9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom-patch-3.0.2 -4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom-patch-3.1.0 -d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom-patch-3.1.0-hotfix -043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom-patch-3.1.0-april_patch -4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom-patch-3.2.0 -18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom-patch-3.2.1 -822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom-patch-3.3.0 -00dde390a394fce9da06c2f3264140282158d39f ryzom-patch-3.3.0 -0000000000000000000000000000000000000000 3.3.0 -dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom-patch-3.3.1 -fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom-patch-3.4.0 -70eba02e8eab6920586dbabf74e9e8180c729980 ryzom-patch-3.4.0 Steam Fix -3941482843f9cd130cfc16634efc08d34a98ed35 ryzom-patch-3.4.0 Atysmas -ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom-patch-3.5.0 -95783afa226f241062134eb62f4323295d29ac84 ryzom-patch-3.5.0.9637 -8eb94c3549be898fdc4a7c6d791d2477bdc11a18 ryzomcore/v1.0.1 -3e92c7104c20d6bc6c2147b4b5fc289e8621d322 ryzomcore/v1.0.0 +4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 v0.8.0 +00d9b6e29e95f56785fbf85abe60afd34674f402 v0.9.0 +79776c337176dd5b02e1a74fe5dfb703b91747aa v0.9.1 +fedf2aa443d09707beed814b0f499c6a5519cc84 v0.10.0 +edaa3624a56420b02ccc64c26059801a389927ee v0.11.0 +e3fe4855f22c3e75722e015dc33c091c340b3ad7 v0.11.1 +9e583b717fd63be0be9fd60b99087abf1691ea49 v0.11.2 +bfe5628e14a024ba7ea32e4b326ae433a07856b9 v0.11.3 +9a6120735daa97c96ac5d85ca35c7f21f607bd87 v0.12.0 +3e92c7104c20d6bc6c2147b4b5fc289e8621d322 v1.0.0 +8eb94c3549be898fdc4a7c6d791d2477bdc11a18 v1.0.1 +3e17907af67e8d66d80e6b714707bbf912607f2a ryzom/3.0.0 +153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom/3.0.1 +9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom/3.0.2 +4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom/3.1.0 +d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom/3.1.0-hotfix +043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom/3.1.0-april_patch +4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom/3.2.0 +18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom/3.2.1 +822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom/3.3.0 +00dde390a394fce9da06c2f3264140282158d39f ryzom/3.3.0 +dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom/3.3.1 +fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom/3.4.0 +70eba02e8eab6920586dbabf74e9e8180c729980 ryzom/3.4.0-steam_fix +3941482843f9cd130cfc16634efc08d34a98ed35 ryzom/3.4.0-atysmas +ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom/3.5.0 +95783afa226f241062134eb62f4323295d29ac84 ryzom/3.5.0.9637