diff --git a/LICENSES/GL.txt b/LICENSES/GL.txt deleted file mode 100644 index dd124a024..000000000 --- a/LICENSES/GL.txt +++ /dev/null @@ -1,22 +0,0 @@ -Mesa 3-D graphics library -Version: 6.2 - -Copyright (C) 1999-2004 Brian Paul All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/LICENSES/SDL.txt b/LICENSES/SDL.txt deleted file mode 100644 index 630b88627..000000000 --- a/LICENSES/SDL.txt +++ /dev/null @@ -1,22 +0,0 @@ -SDL - Simple DirectMedia Layer -Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This library 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Sam Lantinga -slouken@libsdl.org - -The GNU Library GPL is available at http://www.gnu.org/copyleft/lesser.html - diff --git a/LICENSES/expat.txt b/LICENSES/expat.txt deleted file mode 100644 index 2ce393145..000000000 --- a/LICENSES/expat.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/LICENSES/gtk-atk-pango-glib.txt b/LICENSES/gtk-atk-pango-glib.txt deleted file mode 100644 index 07a2d156d..000000000 --- a/LICENSES/gtk-atk-pango-glib.txt +++ /dev/null @@ -1,182 +0,0 @@ -http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html - -LGPL v 2.1 - -Version 2.1, February 1999 - -Copyright (C) 1991, 1999 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - - To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - - Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - - When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - - We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - - For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - - Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - - Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - - You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - - * a) The modified work must itself be a software library. - * b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - * c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - * d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - - (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - -Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - -This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - -4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - -If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - -5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - -However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - -When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - -If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - -Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - -6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - -You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - - * a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - * b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - * c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - * d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - * e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - -For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - -7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - - * a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - * b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - -8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - -10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - -11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - -14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS -How to Apply These Terms to Your New Libraries - -If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). - -To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - -one line to give the library's name and an idea of what it does. -Copyright (C) year name of author - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - -Yoyodyne, Inc., hereby disclaims all copyright interest in -the library `Frob' (a library for tweaking knobs) written -by James Random Hacker. - -signature of Ty Coon, 1 April 1990 -Ty Coon, President of Vice - -That's all there is to it! - diff --git a/LICENSES/jpeglib.txt b/LICENSES/jpeglib.txt deleted file mode 100644 index fd3ea50ad..000000000 --- a/LICENSES/jpeglib.txt +++ /dev/null @@ -1,16 +0,0 @@ -http://nyctergatis.com/jpeglib/ - -The license below is known as the modified BSD license, with an additional reference to the Independent JPEG Group to comply with its terms. It applies to the source code written specifically for the Palm, not to the work of the Independent JPEG Group (see the remark below). - -Copyright (c) 2003, Yves Piguet. -All rights reserved. -Based on the work of the Independent JPEG Group. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Yves Piguet nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/LICENSES/libpng.txt b/LICENSES/libpng.txt deleted file mode 100644 index 50b4041cc..000000000 --- a/LICENSES/libpng.txt +++ /dev/null @@ -1,109 +0,0 @@ - -This copy of the libpng notices is provided for your convenience. In case of -any discrepancy between this copy and the notices in the file png.h that is -included in the libpng distribution, the latter shall prevail. - -COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: - -If you modify libpng you may insert additional notices immediately following -this sentence. - -libpng versions 1.2.6, August 15, 2004, through 1.2.35, February 14, 2009, are -Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.2.5 -with the following individual added to the list of Contributing Authors - - Cosmin Truta - -libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are -Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.0.6 -with the following individuals added to the list of Contributing Authors - - Simon-Pierre Cadieux - Eric S. Raymond - Gilles Vollant - -and with the following additions to the disclaimer: - - There is no warranty against interference with your enjoyment of the - library or against infringement. There is no warranty that our - efforts or the library will fulfill any of your particular purposes - or needs. This library is provided with all faults, and the entire - risk of satisfactory quality, performance, accuracy, and effort is with - the user. - -libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are -Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-0.96, -with the following individuals added to the list of Contributing Authors: - - Tom Lane - Glenn Randers-Pehrson - Willem van Schaik - -libpng versions 0.89, June 1996, through 0.96, May 1997, are -Copyright (c) 1996, 1997 Andreas Dilger -Distributed according to the same disclaimer and license as libpng-0.88, -with the following individuals added to the list of Contributing Authors: - - John Bowler - Kevin Bracey - Sam Bushell - Magnus Holmgren - Greg Roelofs - Tom Tanner - -libpng versions 0.5, May 1995, through 0.88, January 1996, are -Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. - -For the purposes of this copyright and license, "Contributing Authors" -is defined as the following set of individuals: - - Andreas Dilger - Dave Martindale - Guy Eric Schalnat - Paul Schmidt - Tim Wegner - -The PNG Reference Library is supplied "AS IS". The Contributing Authors -and Group 42, Inc. disclaim all warranties, expressed or implied, -including, without limitation, the warranties of merchantability and of -fitness for any purpose. The Contributing Authors and Group 42, Inc. -assume no liability for direct, indirect, incidental, special, exemplary, -or consequential damages, which may result from the use of the PNG -Reference Library, even if advised of the possibility of such damage. - -Permission is hereby granted to use, copy, modify, and distribute this -source code, or portions hereof, for any purpose, without fee, subject -to the following restrictions: - -1. The origin of this source code must not be misrepresented. - -2. Altered versions must be plainly marked as such and must not - be misrepresented as being the original source. - -3. This Copyright notice may not be removed or altered from any - source or altered source distribution. - -The Contributing Authors and Group 42, Inc. specifically permit, without -fee, and encourage the use of this source code as a component to -supporting the PNG file format in commercial products. If you use this -source code in a product, acknowledgment is not required but would be -appreciated. - - -A "png_get_copyright" function is available, for convenient use in "about" -boxes and the like: - - printf("%s",png_get_copyright(NULL)); - -Also, the PNG logo (in PNG format, of course) is supplied in the -files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). - -Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a -certification mark of the Open Source Initiative. - -Glenn Randers-Pehrson -glennrp at users.sourceforge.net -February 14, 2009 diff --git a/LICENSES/mesa.txt b/LICENSES/mesa.txt deleted file mode 100644 index cb275f35e..000000000 --- a/LICENSES/mesa.txt +++ /dev/null @@ -1,58 +0,0 @@ -http://www.mesa3d.org/license.html - -License / Copyright Information - -The Mesa distribution consists of several components. Different copyrights and licenses apply to different components. For example, GLUT is copyrighted by Mark Kilgard, some demo programs are copyrighted by SGI, some of the Mesa device drivers are copyrighted by their authors. See below for a list of Mesa's main components and the license for each. - -The core Mesa library is licensed according to the terms of the MIT license. This allows integration with the XFree86, Xorg and DRI projects. - -The default Mesa license is as follows: - -Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Attention, Contributors - -When contributing to the Mesa project you must agree to the licensing terms of the component to which you're contributing. The following section lists the primary components of the Mesa distribution and their respective licenses. -Mesa Component Licenses - -Component Location Primary Author License ----------------------------------------------------------------------------- -Main Mesa code src/mesa/ Brian Paul Mesa (MIT) - -Device drivers src/mesa/drivers/* See drivers See drivers - -Ext headers include/GL/glext.h SGI SGI Free B - include/GL/glxext.h - -GLUT src/glut/ Mark Kilgard Mark's copyright - -Mesa GLU library src/glu/mesa/ Brian Paul GNU-LGPL - -SGI GLU library src/glu/sgi/ SGI SGI Free B - -demo programs progs/demos/ various see source files - -X demos progs/xdemos/ Brian Paul see source files - -SGI demos progs/samples/ SGI SGI copyright - -RedBook demos progs/redbook/ SGI SGI copyright - - diff --git a/LICENSES/ogg-vorbis.txt b/LICENSES/ogg-vorbis.txt deleted file mode 100644 index 585f13729..000000000 --- a/LICENSES/ogg-vorbis.txt +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (c) 2001, Xiphophorus - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -- Neither the name of the Xiphophorus nor the names of its contributors -may be used to endorse or promote products derived from this software -without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/LICENSES/tut.txt b/LICENSES/tut.txt deleted file mode 100644 index bcd715a17..000000000 --- a/LICENSES/tut.txt +++ /dev/null @@ -1,10 +0,0 @@ - Copyright 2002-2006 Vladimir Dyuzhev -Copyright 2007 Denis Kononenko -Copyright 2008 Micha? Rzechonek - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/LICENSES/vivox.txt b/LICENSES/vivox.txt deleted file mode 100644 index dd70e8a77..000000000 --- a/LICENSES/vivox.txt +++ /dev/null @@ -1,180 +0,0 @@ -================= -Vivox SDK License -================= - -RSA Data Security, Inc. MD5 Message-Digest Algorithm - -Audio coding: Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) - -Open Source Software Licensing -Each open source software component utilized by this product is subject to its own copyright and licensing terms, as listed below. - - -************************************************************* -************************************************************* - -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -************************************************************* -************************************************************* -RTP code under Lesser General Public License - -/* -The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack. -Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -************************************************************ -************************************************************* - - - - -/* - * The Vovida Software License, Version 1.0 - * - * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The names "VOCAL", "Vovida Open Communication Application Library", - * and "Vovida Open Communication Application Library (VOCAL)" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact vocal@vovida.org. - * - * 4. Products derived from this software may not be called "VOCAL", nor - * may "VOCAL" appear in their name, without prior written - * permission of Vovida Networks, Inc. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND - * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA - * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES - * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * - * This software consists of voluntary contributions made by Vovida - * Networks, Inc. and many individuals on behalf of Vovida Networks, - * Inc. For more information on Vovida Networks, Inc., please see - * - * - */ -************************************************************* -************************************************************* - -Internet Software Consortium code - -/* This is from the BIND 4.9.4 release, modified to compile by itself*/ -/* Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -************************************************************* - -************************************************************* - -************************************************************ - -http://tinyxpath.sourceforge.net/ - -TinyXPath is covered by the zlib license : - - www.sourceforge.net/projects/tinyxpath - Copyright (c) 2002-2006 Yves Berquin (yvesb@users.sourceforge.net) - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any - damages arising from the use of this software. - - Permission is granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product documentation - would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source distribution. - - -************************************************************ -************************************************************ - -THE FREE SOFTWARE FOUNDATION - -Any customer may request the source code for all open source portions of this product which are covered by the Free Software Foundation's General Public License (GPL), for a period of three years from purchase. Please contact the vendor from whom you obtained this product for instructions. A fee equivalent to the cost of making the code available may be charged. Alternatively, customers may choose to download desired GPL components directly from their original vendors. Specifically, this product contains the following GPL-licensed components: - -From Vivox: - - Assorted software components. To request source, contact Vivox at: - Vivox, Inc. - Attn: customer support - 40 Speen Street Suite 402 - Framingham, MA 01701 - diff --git a/LICENSES/zlib.txt b/LICENSES/zlib.txt deleted file mode 100644 index 5afe0a609..000000000 --- a/LICENSES/zlib.txt +++ /dev/null @@ -1,28 +0,0 @@ -'zlib' general purpose compression library version 1.1.4, March 11th, 2002 - -Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the -use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -The origin of this software must not be misrepresented; you must not claim -that you wrote the original software. If you use this software in a product, -an acknowledgment in the product documentation would be appreciated but is -not required. - -Altered source versions must be plainly marked as such, and must not be -misrepresented as being the original software. - -This notice may not be removed or altered from any source distribution. - -Jean-loup Gailly -jloup@gzip.org - -Mark Adler -madler@alumni.caltech.edu - diff --git a/doc/contributions.txt b/doc/contributions.txt index 6c39a77dd..258e139bc 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -4,6 +4,10 @@ along with the issue identifier corresponding to the patches we've received from them. To see more about these contributions, visit the browsable version: http://wiki.secondlife.com/wiki/Source_contributions +Entries are related to URLs as follows: +IMP-xxx: http://redmine.kokuaviewer.org/issues/xxx +Everything else ([VWR|SNOW|CT|SVC|WEB]-xxx): https://jira.secondlife.com/browse/KEY-xxx + Able Whitman VWR-650 VWR-1460 @@ -58,12 +62,18 @@ Aimee Trescothick Alejandro Rosenthal VWR-1184 Aleric Inglewood + VWR-10579 (IMP-552) VWR-10759 VWR-10837 VWR-12984 + VWR-13040 (IMP-575) VWR-13996 VWR-14426 VWR-14914 + VWR-24247 + VWR-24312 + VWR-24320 + VWR-24333 SNOW-47 SNOW-84 SNOW-86 @@ -72,18 +82,37 @@ Aleric Inglewood SNOW-129 SNOW-196 SNOW-203 + SNOW-240 SNOW-408 - SNOW-415 + SNOW-415 (IMP-576) + SNOW-477 (IMP-577) SNOW-479 SNOW-626 - SNOW-713 - SNOW-744 - SNOW-751 + SNOW-713 (IMP-692) + SNOW-744 (IMP-578) SNOW-752 SNOW-753 + SNOW-766 (IMP-553) SNOW-772 SNOW-793 + SNOW-796 (IMP-581) + SNOW-800 (IMP-556) SNOW-806 + IMP-429 + IMP-561 + IMP-565 + IMP-566 + IMP-567 + IMP-573 + IMP-590 + IMP-660 + IMP-661 + IMP-662 + IMP-663 + IMP-664 + IMP-670 + IMP-701 + IMP-734 Alissa Sabre VWR-81 VWR-83 @@ -105,7 +134,7 @@ Alissa Sabre VWR-1351 VWR-1353 VWR-1410 - VWR-1843 + VWR-1843 VWR-2116 VWR-2826 VWR-3290 @@ -113,17 +142,17 @@ Alissa Sabre VWR-3857 VWR-4010 VWR-5575 - VWR-5929 - VWR-6384 - VWR-6385 + VWR-5929 + VWR-6384 + VWR-6385 VWR-6386 - VWR-6430 + VWR-6430 VWR-6858 - VWR-6668 - VWR-7086 - VWR-7087 - VWR-7153 - VWR-7168 + VWR-6668 + VWR-7086 + VWR-7087 + VWR-7153 + VWR-7168 VWR-9190 VWR-10728 VWR-12620 @@ -181,6 +210,7 @@ Boroondas Gupte SNOW-201 SNOW-396 SNOW-589 + SNOW-623 (IMP-554) SNOW-624 VWR-233 WEB-262 @@ -549,7 +579,7 @@ Pf Shan CT-321 princess niven VWR-5733 - CT-85 + CT-85 CT-320 CT-352 Renault Clio @@ -590,6 +620,7 @@ Robin Cornelius VWR-11128 VWR-12758 VWR-12686 + VWR-12838 Ryozu Kojima VWR-53 VWR-287 @@ -788,4 +819,3 @@ Zi Ree Zipherius Turas VWR-76 VWR-77 - diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index e81510b2c..33637ab1e 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -132,27 +132,25 @@ endif (SERVER) # Configure prebuilt binary download. This must be done last so that # all subdirectories have a chance to list the packages they need. -if(NOT STANDALONE) - # We need scp for proprietary downloads. - if(INSTALL_PROPRIETARY) - include(FindSCP) - endif(INSTALL_PROPRIETARY) +# We need scp for proprietary downloads. +if(INSTALL_PROPRIETARY) + include(FindSCP) +endif(INSTALL_PROPRIETARY) - # The use_prebuilt_binary macro in cmake/Prebuilt.cmake records - # packages in the PREBUILT property of the 'prepare' target. - get_property(PREBUILT_PACKAGES TARGET prepare PROPERTY PREBUILT) +# The use_prebuilt_binary macro in cmake/Prebuilt.cmake records +# packages in the PREBUILT property of the 'prepare' target. +get_property(PREBUILT_PACKAGES TARGET prepare PROPERTY PREBUILT) - # Create a script to download the needed binaries. - configure_file(${CMAKE_SOURCE_DIR}/cmake/DownloadPrebuilt.cmake.in - ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake @ONLY) +# Create a script to download the needed binaries. +configure_file(${CMAKE_SOURCE_DIR}/cmake/DownloadPrebuilt.cmake.in + ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake @ONLY) - # Drive the download script at build time. Depend on 'install.xml' - # to aqcuire new binaries when needed. - add_custom_command( - COMMENT "Obtaining prebuilt binaries..." - OUTPUT ${CMAKE_BINARY_DIR}/prepare/prebuilt - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake - DEPENDS ${CMAKE_SOURCE_DIR}/../install.xml - ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake - ) -endif(NOT STANDALONE) +# Drive the download script at build time. Depend on 'install.xml' +# to aqcuire new binaries when needed. +add_custom_command( + COMMENT "Obtaining prebuilt binaries..." + OUTPUT ${CMAKE_BINARY_DIR}/prepare/prebuilt + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake + DEPENDS ${CMAKE_SOURCE_DIR}/../install.xml + ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake + ) diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 9aad06080..4b2f9dc4b 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -1,296 +1,313 @@ -# -*- cmake -*- -# -# Compilation options shared by all Second Life components. - -include(Variables) - - -# Portable compilation flags. - -set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -DLL_DEBUG=1") -set(CMAKE_CXX_FLAGS_RELEASE - "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=1 -DNDEBUG") -set(CMAKE_C_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_RELEASESSE2 - "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=1 -DNDEBUG") -#llimage now requires this (?) -set(CMAKE_C_FLAGS_RELEASESSE2 - "${CMAKE_CXX_FLAGS_RELEASESSE2}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-DLL_RELEASE=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=0 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1") - -# Don't bother with a MinSizeRel build. - -set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;ReleaseSSE2;Debug" CACHE STRING - "Supported build types." FORCE) - -# Platform-specific compilation flags. - -if (WINDOWS) - # Don't build DLLs. - set(BUILD_SHARED_LIBS OFF) - - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd" - CACHE STRING "C++ compiler debug options" FORCE) - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP" - CACHE STRING "C++ compiler release-with-debug options" FORCE) - set(CMAKE_CXX_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /arch:SSE /fp:fast" - CACHE STRING "C++ compiler release options" FORCE) - set(CMAKE_C_FLAGS_RELEASE - "${CMAKE_C_FLAGS_RELEASE} ${LL_C_FLAGS} /O2 /Zi /MD /MP /arch:SSE /fp:fast" - CACHE STRING "C compiler release options" FORCE) - set(CMAKE_CXX_FLAGS_RELEASESSE2 - "${CMAKE_CXX_FLAGS_RELEASESSE2} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /arch:SSE2 /fp:fast" - CACHE STRING "C++ compiler release-SSE2 options" FORCE) - set(CMAKE_C_FLAGS_RELEASESSE2 - "${CMAKE_C_FLAGS_RELEASESSE2} ${LL_C_FLAGS} /O2 /Zi /MD /MP /arch:SSE2 /fp:fast" - CACHE STRING "C compiler release-SSE2 options" FORCE) - - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LARGEADDRESSAWARE") - - set(CMAKE_CXX_STANDARD_LIBRARIES "") - set(CMAKE_C_STANDARD_LIBRARIES "") - - add_definitions( - /DLL_WINDOWS=1 - /DUNICODE - /D_UNICODE - /GS - /TP - /W3 - /c - /Zc:forScope - /nologo - /Oy- - ) - - if(MSVC80 OR MSVC90 OR MSVC10) - set(CMAKE_CXX_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0" - CACHE STRING "C++ compiler release options" FORCE) - set(CMAKE_CXX_FLAGS_RELEASESSE2 - "${CMAKE_CXX_FLAGS_RELEASESSE2} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0" - CACHE STRING "C++ compiler release-SSE2 options" FORCE) - set(CMAKE_C_FLAGS_RELEASESSE2 - "${CMAKE_CXX_FLAGS_RELEASESSE2} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0" - CACHE STRING "C compiler release-SSE2 options" FORCE) - add_definitions( - /Zc:wchar_t- - ) - endif (MSVC80 OR MSVC90 OR MSVC10) - - # Are we using the crummy Visual Studio KDU build workaround? - if (NOT VS_DISABLE_FATAL_WARNINGS) - add_definitions(/WX) - endif (NOT VS_DISABLE_FATAL_WARNINGS) - - # Various libs are compiler specific, generate some variables here we can just use - # when we require them instead of reimplementing the test each time. - - if (MSVC71) - set(MSVC_DIR 7.1) - set(MSVC_SUFFIX 71) - elseif (MSVC80) - set(MSVC_DIR 8.0) - set(MSVC_SUFFIX 80) - elseif (MSVC90) - set(MSVC_DIR 9.0) - set(MSVC_SUFFIX 90) - elseif (MSVC10) - set(MSVC_DIR 10.0) - set(MSVC_SUFFIX 100) - endif (MSVC71) - -endif (WINDOWS) - -set (GCC_EXTRA_OPTIMIZATION "-ffast-math -frounding-math") - -if (LINUX) - set(CMAKE_SKIP_RPATH TRUE) - - # Here's a giant hack for Fedora 8, where we can't use - # _FORTIFY_SOURCE if we're using a compiler older than gcc 4.1. - - find_program(GXX g++) - mark_as_advanced(GXX) - - if (GXX) - execute_process( - COMMAND ${GXX} --version - COMMAND sed "s/^[gc+ ]*//" - COMMAND head -1 - OUTPUT_VARIABLE GXX_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - else (GXX) - set(GXX_VERSION x) - endif (GXX) - - # The quoting hack here is necessary in case we're using distcc or - # ccache as our compiler. CMake doesn't pass the command line - # through the shell by default, so we end up trying to run "distcc" - # " g++" - notice the leading space. Ugh. - - execute_process( - COMMAND sh -c "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} --version" - COMMAND sed "s/^[gc+ ]*//" - COMMAND head -1 - OUTPUT_VARIABLE CXX_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE) - - if (${GXX_VERSION} STREQUAL ${CXX_VERSION}) - add_definitions(-D_FORTIFY_SOURCE=2) - else (${GXX_VERSION} STREQUAL ${CXX_VERSION}) - if (NOT ${GXX_VERSION} MATCHES " 4.1.*Red Hat") - add_definitions(-D_FORTIFY_SOURCE=2) - endif (NOT ${GXX_VERSION} MATCHES " 4.1.*Red Hat") - endif (${GXX_VERSION} STREQUAL ${CXX_VERSION}) - - #Lets actualy get a numerical version of gxx's version - STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION ${CXX_VERSION}) - - #gcc 4.3 and above don't like the LL boost - if(${CXX_VERSION} GREATER 429) - add_definitions(-Wno-parentheses) - endif (${CXX_VERSION} GREATER 429) - - # End of hacks. - - add_definitions( - -DLL_LINUX=1 - -D_REENTRANT - -fexceptions - -fno-math-errno - -fno-strict-aliasing - -fsigned-char - -g - -pthread - ) - - if (SERVER) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth-60") - if (EXISTS /etc/debian_version) - FILE(READ /etc/debian_version DEBIAN_VERSION) - else (EXISTS /etc/debian_version) - set(DEBIAN_VERSION "") - endif (EXISTS /etc/debian_version) - - if (NOT DEBIAN_VERSION STREQUAL "3.1") - add_definitions(-DCTYPE_WORKAROUND) - endif (NOT DEBIAN_VERSION STREQUAL "3.1") - - if (EXISTS /usr/lib/mysql4/mysql) - link_directories(/usr/lib/mysql4/mysql) - endif (EXISTS /usr/lib/mysql4/mysql) - - add_definitions( - -msse2 - -mfpmath=sse - ) - endif (SERVER) - - if (VIEWER) - add_definitions(-DAPPID=secondlife) - add_definitions(-fvisibility=hidden) - # don't catch SIGCHLD in our base application class for the viewer - some of our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The viewer doesn't need to catch SIGCHLD anyway. - add_definitions(-DLL_IGNORE_SIGCHLD) - if (NOT STANDALONE) - # this stops us requiring a really recent glibc at runtime - add_definitions(-fno-stack-protector) - endif (NOT STANDALONE) - set(CMAKE_CXX_FLAGS_RELEASESSE2 "${CMAKE_CXX_FLAGS_RELEASESSE2} -march=pentium4 -mfpmath=sse -msse2 ${GCC_EXTRA_OPTIMIZATIONS}") - set(CMAKE_C_FLAGS_RELEASESSE2 "${CMAKE_C_FLAGS_RELEASESSE2} -march=pentium4 -mfpmath=sse -msse2 "${GCC_EXTRA_OPTIMIZATIONS}) - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -march=pentium4 -mfpmath=sse -msse2 ${GCC_EXTRA_OPTIMIZATIONS}") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 ${CMAKE_C_FLAGS_RELWITHDEBINFO} -march=pentium4 -mfpmath=sse -msse2 "${GCC_EXTRA_OPTIMIZATIONS}) - endif (VIEWER) - - set(CMAKE_CXX_FLAGS_DEBUG "-fno-inline ${CMAKE_CXX_FLAGS_DEBUG}") - set(CMAKE_CXX_FLAGS_RELEASE "-O3 ${CMAKE_CXX_FLAGS_RELEASE}") - set(CMAKE_C_FLAGS_RELEASE "-O3 ${CMAKE_C_FLAGS_RELEASE}") - set(CMAKE_CXX_FLAGS_RELEASESSE2 "-O3 ${CMAKE_CXX_FLAGS_RELEASESSE2}") - set(CMAKE_C_FLAGS_RELEASESSE2 "-O3 ${CMAKE_C_FLAGS_RELEASESSE2}") -endif (LINUX) - - -if (DARWIN) - add_definitions(-DLL_DARWIN=1) - set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlong-branch") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlong-branch") - # NOTE: it's critical that the optimization flag is put in front. - # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered. - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_C_FLAGS_RELWITHDEBINFO}") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -msse3 -mtune=generic -mfpmath=sse ${GCC_EXTRA_OPTIMIZATIONS}") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -03 -msse3 -mtune=generic -mfpmath=sse ${GCC_EXTRA_OPTIMIZATIONS}") - set(CMAKE_CXX_FLAGS_RELEASESSE2 "${CMAKE_CXX_FLAGS_RELEASESSE2} -O3 -msse2 -mtune=generic -mfpmath=sse ${GCC_EXTRA_OPTIMIZATIONS}") - set(CMAKE_C_FLAGS_RELEASESSE2 "${CMAKE_C_FLAGS_RELEASESSE2} -03 -msse2 -mtune=generic -mfpmath=sse ${GCC_EXTRA_OPTIMIZATIONS}") -endif (DARWIN) - - -if (LINUX OR DARWIN) - set(GCC_WARNINGS "-Wall -Wno-sign-compare -Wno-trigraphs -Wno-non-virtual-dtor -Woverloaded-virtual") - - if (NOT GCC_DISABLE_FATAL_WARNINGS) - set(GCC_WARNINGS "${GCC_WARNINGS} -Werror") - endif (NOT GCC_DISABLE_FATAL_WARNINGS) - - set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder") - - set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}") - - if (WORD_SIZE EQUAL 32) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") - elseif (WORD_SIZE EQUAL 64) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64") - endif (WORD_SIZE EQUAL 32) -endif (LINUX OR DARWIN) - - -if (STANDALONE) - add_definitions(-DLL_STANDALONE=1) - - if (LINUX AND ${ARCH} STREQUAL "i686") - add_definitions(-march=pentiumpro) - endif (LINUX AND ${ARCH} STREQUAL "i686") - -else (STANDALONE) - set(${ARCH}_linux_INCLUDES - ELFIO - atk-1.0 - glib-2.0 - gstreamer-0.10 - gtk-2.0 - llfreetype2 - pango-1.0 - ) -endif (STANDALONE) - -if(1 EQUAL 1) - add_definitions(-DOPENSIM_RULES=1) -endif(1 EQUAL 1) - -if(SERVER) - include_directories(${LIBS_PREBUILT_DIR}/include/havok) -endif(SERVER) - -SET( CMAKE_EXE_LINKER_FLAGS_RELEASESSE2 - "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" CACHE STRING - "Flags used for linking binaries under SSE2 build." - FORCE ) -SET( CMAKE_SHARED_LINKER_FLAGS_RELEASESSE2 - "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}" CACHE STRING - "Flags used by the shared libraries linker under SSE2 build." - FORCE ) -MARK_AS_ADVANCED( - CMAKE_CXX_FLAGS_RELEASESSE2 - CMAKE_C_FLAGS_RELEASESSE2 - CMAKE_EXE_LINKER_FLAGS_RELEASESSE2 - CMAKE_SHARED_LINKER_FLAGS_RELEASESSE2 ) +# -*- cmake -*- +# +# Compilation options shared by all Second Life components. + +include(Variables) + + +# Portable compilation flags. + +set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -DLL_DEBUG=1") +set(CMAKE_CXX_FLAGS_RELEASE + "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=1 -DNDEBUG") +set(CMAKE_C_FLAGS_RELEASE + "${CMAKE_CXX_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_RELEASESSE2 + "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=1 -DNDEBUG") +#llimage now requires this (?) +set(CMAKE_C_FLAGS_RELEASESSE2 + "${CMAKE_CXX_FLAGS_RELEASESSE2}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "-DLL_RELEASE=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=0 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1") + +# Don't bother with a MinSizeRel build. + +set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;ReleaseSSE2;Debug" CACHE STRING + "Supported build types." FORCE) + +# Platform-specific compilation flags. + +if (WINDOWS) + # Don't build DLLs. + set(BUILD_SHARED_LIBS OFF) + + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd" + CACHE STRING "C++ compiler debug options" FORCE) + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP" + CACHE STRING "C++ compiler release-with-debug options" FORCE) + set(CMAKE_CXX_FLAGS_RELEASE + "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /arch:SSE /fp:fast" + CACHE STRING "C++ compiler release options" FORCE) + set(CMAKE_C_FLAGS_RELEASE + "${CMAKE_C_FLAGS_RELEASE} ${LL_C_FLAGS} /O2 /Zi /MD /MP /arch:SSE /fp:fast" + CACHE STRING "C compiler release options" FORCE) + set(CMAKE_CXX_FLAGS_RELEASESSE2 + "${CMAKE_CXX_FLAGS_RELEASESSE2} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /arch:SSE2 /fp:fast" + CACHE STRING "C++ compiler release-SSE2 options" FORCE) + set(CMAKE_C_FLAGS_RELEASESSE2 + "${CMAKE_C_FLAGS_RELEASESSE2} ${LL_C_FLAGS} /O2 /Zi /MD /MP /arch:SSE2 /fp:fast" + CACHE STRING "C compiler release-SSE2 options" FORCE) + + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LARGEADDRESSAWARE") + + set(CMAKE_CXX_STANDARD_LIBRARIES "") + set(CMAKE_C_STANDARD_LIBRARIES "") + + add_definitions( + /DLL_WINDOWS=1 + /DUNICODE + /D_UNICODE + /GS + /TP + /W3 + /c + /Zc:forScope + /nologo + /Oy- + ) + + if(MSVC80 OR MSVC90 OR MSVC10) + set(CMAKE_CXX_FLAGS_RELEASE + "${CMAKE_CXX_FLAGS_RELEASE} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0" + CACHE STRING "C++ compiler release options" FORCE) + set(CMAKE_CXX_FLAGS_RELEASESSE2 + "${CMAKE_CXX_FLAGS_RELEASESSE2} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0" + CACHE STRING "C++ compiler release-SSE2 options" FORCE) + set(CMAKE_C_FLAGS_RELEASESSE2 + "${CMAKE_CXX_FLAGS_RELEASESSE2} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0" + CACHE STRING "C compiler release-SSE2 options" FORCE) + add_definitions( + /Zc:wchar_t- + ) + endif (MSVC80 OR MSVC90 OR MSVC10) + + # Are we using the crummy Visual Studio KDU build workaround? + if (NOT VS_DISABLE_FATAL_WARNINGS) + add_definitions(/WX) + endif (NOT VS_DISABLE_FATAL_WARNINGS) + + # Various libs are compiler specific, generate some variables here we can just use + # when we require them instead of reimplementing the test each time. + + if (MSVC71) + set(MSVC_DIR 7.1) + set(MSVC_SUFFIX 71) + elseif (MSVC80) + set(MSVC_DIR 8.0) + set(MSVC_SUFFIX 80) + elseif (MSVC90) + set(MSVC_DIR 9.0) + set(MSVC_SUFFIX 90) + elseif (MSVC10) + set(MSVC_DIR 10.0) + set(MSVC_SUFFIX 100) + endif (MSVC71) + + if (MSVC10) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /MANIFEST:NO") + SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /MANIFEST:NO") + endif(MSVC10) + + +endif (WINDOWS) + +set (GCC_EXTRA_OPTIMIZATION "-ffast-math -frounding-math") + +if (LINUX) + set(CMAKE_SKIP_RPATH TRUE) + + # Here's a giant hack for Fedora 8, where we can't use + # _FORTIFY_SOURCE if we're using a compiler older than gcc 4.1. + + find_program(GXX g++) + mark_as_advanced(GXX) + + if (GXX) + execute_process( + COMMAND ${GXX} --version + COMMAND sed "s/^[gc+ ]*//" + COMMAND head -1 + OUTPUT_VARIABLE GXX_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + else (GXX) + set(GXX_VERSION x) + endif (GXX) + + # The quoting hack here is necessary in case we're using distcc or + # ccache as our compiler. CMake doesn't pass the command line + # through the shell by default, so we end up trying to run "distcc" + # " g++" - notice the leading space. Ugh. + + execute_process( + COMMAND sh -c "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} --version" + COMMAND sed "s/^[gc+ ]*//" + COMMAND head -1 + OUTPUT_VARIABLE CXX_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if (${GXX_VERSION} STREQUAL ${CXX_VERSION}) + add_definitions(-D_FORTIFY_SOURCE=2) + else (${GXX_VERSION} STREQUAL ${CXX_VERSION}) + if (NOT ${GXX_VERSION} MATCHES " 4.1.*Red Hat") + add_definitions(-D_FORTIFY_SOURCE=2) + endif (NOT ${GXX_VERSION} MATCHES " 4.1.*Red Hat") + endif (${GXX_VERSION} STREQUAL ${CXX_VERSION}) + + #Lets actualy get a numerical version of gxx's version + STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION ${CXX_VERSION}) + + #gcc 4.3 and above don't like the LL boost + if(${CXX_VERSION} GREATER 429) + add_definitions(-Wno-parentheses) + endif (${CXX_VERSION} GREATER 429) + + # End of hacks. + + add_definitions( + -DLL_LINUX=1 + -D_REENTRANT + -fexceptions + -fno-math-errno + -fno-strict-aliasing + -fsigned-char + -g + -pthread + ) + + if (SERVER) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth-60") + if (EXISTS /etc/debian_version) + FILE(READ /etc/debian_version DEBIAN_VERSION) + else (EXISTS /etc/debian_version) + set(DEBIAN_VERSION "") + endif (EXISTS /etc/debian_version) + + if (NOT DEBIAN_VERSION STREQUAL "3.1") + add_definitions(-DCTYPE_WORKAROUND) + endif (NOT DEBIAN_VERSION STREQUAL "3.1") + + if (EXISTS /usr/lib/mysql4/mysql) + link_directories(/usr/lib/mysql4/mysql) + endif (EXISTS /usr/lib/mysql4/mysql) + + add_definitions( + -msse2 + -mfpmath=sse + ) + endif (SERVER) + + if (VIEWER) + add_definitions(-DAPPID=secondlife) + add_definitions(-fvisibility=hidden) + # don't catch SIGCHLD in our base application class for the viewer - some of our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The viewer doesn't need to catch SIGCHLD anyway. + add_definitions(-DLL_IGNORE_SIGCHLD) + if (NOT STANDALONE) + # this stops us requiring a really recent glibc at runtime + add_definitions(-fno-stack-protector) + endif (NOT STANDALONE) + if (${ARCH} STREQUAL "x86_64") + add_definitions(-DLINUX64=1 -pipe) + set(CMAKE_CXX_FLAGS_RELEASESSE2 "${CMAKE_CXX_FLAGS_RELEASESSE2} -fomit-frame-pointer -mmmx -msse -mfpmath=sse -msse2 -ffast-math -ftree-vectorize -fweb -fexpensive-optimizations -frename-registers") + set(CMAKE_C_FLAGS_RELEASESSE2 "${CMAKE_C_FLAGS_RELEASESSE2} -fomit-frame-pointer -mmmx -msse -mfpmath=sse -msse2 -ffast-math -ftree-vectorize -fweb -fexpensive-optimizations -frename-registers") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fomit-frame-pointer -mmmx -msse -mfpmath=sse -msse2 -ffast-math -ftree-vectorize -fweb -fexpensive-optimizations -frename-registers") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -fomit-frame-pointer -mmmx -msse -mfpmath=sse -msse2 -ffast-math -ftree-vectorize -fweb -fexpensive-optimizations -frename-registers") + else (${ARCH} STREQUAL "x86_64") + set(CMAKE_CXX_FLAGS_RELEASESSE2 "${CMAKE_CXX_FLAGS_RELEASESSE2} -march=pentium4 -mfpmath=sse -msse2 ${GCC_EXTRA_OPTIMIZATIONS}") + set(CMAKE_C_FLAGS_RELEASESSE2 "${CMAKE_C_FLAGS_RELEASESSE2} -march=pentium4 -mfpmath=sse -msse2 "${GCC_EXTRA_OPTIMIZATIONS}) + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -march=pentium4 -mfpmath=sse -msse2 ${GCC_EXTRA_OPTIMIZATIONS}") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -march=pentium4 -mfpmath=sse -msse2 "${GCC_EXTRA_OPTIMIZATIONS}) + endif (${ARCH} STREQUAL "x86_64") + endif (VIEWER) + + set(CMAKE_CXX_FLAGS_DEBUG "-fno-inline ${CMAKE_CXX_FLAGS_DEBUG}") + set(CMAKE_CXX_FLAGS_RELEASE "-O3 ${CMAKE_CXX_FLAGS_RELEASE}") + set(CMAKE_C_FLAGS_RELEASE "-O3 ${CMAKE_C_FLAGS_RELEASE}") + set(CMAKE_CXX_FLAGS_RELEASESSE2 "-O3 ${CMAKE_CXX_FLAGS_RELEASESSE2}") + set(CMAKE_C_FLAGS_RELEASESSE2 "-O3 ${CMAKE_C_FLAGS_RELEASESSE2}") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 ${CMAKE_C_FLAGS_RELWITHDEBINFO}") +endif (LINUX) + + +if (DARWIN) + add_definitions(-DLL_DARWIN=1) + set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlong-branch") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlong-branch") + # NOTE: it's critical that the optimization flag is put in front. + # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered. + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_C_FLAGS_RELWITHDEBINFO}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -msse3 -mtune=generic -mfpmath=sse ${GCC_EXTRA_OPTIMIZATIONS}") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -03 -msse3 -mtune=generic -mfpmath=sse ${GCC_EXTRA_OPTIMIZATIONS}") + set(CMAKE_CXX_FLAGS_RELEASESSE2 "${CMAKE_CXX_FLAGS_RELEASESSE2} -O3 -msse2 -mtune=generic -mfpmath=sse ${GCC_EXTRA_OPTIMIZATIONS}") + set(CMAKE_C_FLAGS_RELEASESSE2 "${CMAKE_C_FLAGS_RELEASESSE2} -03 -msse2 -mtune=generic -mfpmath=sse ${GCC_EXTRA_OPTIMIZATIONS}") +endif (DARWIN) + + +if (LINUX OR DARWIN) + set(GCC_WARNINGS "-Wall -Wno-sign-compare -Wno-trigraphs -Wno-non-virtual-dtor -Woverloaded-virtual") + + if (NOT GCC_DISABLE_FATAL_WARNINGS) + set(GCC_WARNINGS "${GCC_WARNINGS} -Werror") + endif (NOT GCC_DISABLE_FATAL_WARNINGS) + + set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder") + + set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}") + + if (WORD_SIZE EQUAL 32) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") + elseif (WORD_SIZE EQUAL 64) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64") + endif (WORD_SIZE EQUAL 32) +endif (LINUX OR DARWIN) + + +if (STANDALONE) + add_definitions(-DLL_STANDALONE=1) + + if (LINUX AND ${ARCH} STREQUAL "i686") + add_definitions(-march=pentiumpro) + endif (LINUX AND ${ARCH} STREQUAL "i686") + +else (STANDALONE) + set(${ARCH}_linux_INCLUDES + ELFIO + atk-1.0 + glib-2.0 + gstreamer-0.10 + gtk-2.0 + llfreetype2 + pango-1.0 + ) +endif (STANDALONE) + +if(1 EQUAL 1) + add_definitions(-DOPENSIM_RULES=1) +endif(1 EQUAL 1) + +if(SERVER) + include_directories(${LIBS_PREBUILT_DIR}/include/havok) +endif(SERVER) + +SET( CMAKE_EXE_LINKER_FLAGS_RELEASESSE2 + "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" CACHE STRING + "Flags used for linking binaries under SSE2 build." + FORCE ) +SET( CMAKE_SHARED_LINKER_FLAGS_RELEASESSE2 + "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}" CACHE STRING + "Flags used by the shared libraries linker under SSE2 build." + FORCE ) +MARK_AS_ADVANCED( + CMAKE_CXX_FLAGS_RELEASESSE2 + CMAKE_C_FLAGS_RELEASESSE2 + CMAKE_EXE_LINKER_FLAGS_RELEASESSE2 + CMAKE_SHARED_LINKER_FLAGS_RELEASESSE2 ) diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index 5cd150d58..d1f089891 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -14,16 +14,18 @@ else (STANDALONE) use_prebuilt_binary(apr_suite) if (WINDOWS) set(APR_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/apr-1.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/apr-1.lib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libapr-1.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.lib ) set(APRICONV_LIBRARIES debug ${ARCH_PREBUILT_DIRS_DEBUG}/libapriconv-1.lib optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libapriconv-1.lib ) + # Doesn't need to link with iconv.dll + set(APRICONV_LIBRARIES "") set(APRUTIL_LIBRARIES - debug ${ARCH_PREBUILT_DIRS_DEBUG}/aprutil-1.lib - optimized ${ARCH_PREBUILT_DIRS_RELEASE}/aprutil-1.lib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.lib ${APRICONV_LIBRARIES} + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.lib ${APRICONV_LIBRARIES} ) elseif (DARWIN) set(APR_LIBRARIES @@ -41,9 +43,8 @@ else (STANDALONE) set(APRICONV_LIBRARIES iconv) endif (WINDOWS) set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1) - set(APRUTIL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1) if (LINUX AND VIEWER) - list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid) + list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES}) endif (LINUX AND VIEWER) endif (STANDALONE) diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index 1379d3a41..5ebc7959f 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -1,59 +1,59 @@ -# -*- cmake -*- -include(Prebuilt) - -set(Boost_FIND_QUIETLY ON) -set(Boost_FIND_REQUIRED ON) - -if (STANDALONE) - include(FindBoost) - - set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) - set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) - set(BOOST_REGEX_LIBRARY boost_regex-mt) - set(BOOST_SIGNALS_LIBRARY boost_signals-mt) - set(BOOST_SYSTEM_LIBRARY boost_system-mt) -else (STANDALONE) - use_prebuilt_binary(boost) - set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) - - if (WINDOWS) - set(BOOST_VERSION 1_45) - - # SNOW-788 - # 00-Common.cmake alreay sets MSVC_SUFFIX to be correct for the VS we are using eg VC71, VC80, VC90 etc - # The precompiled boost libs for VC71 use a different suffix to VS80 and VS90 - # This code should ensure the cmake rules are valid for any VS being used in future as long as the approprate - # boost libs are avaiable - RC. - - if (MSVC71) - set(BOOST_OPTIM_SUFFIX mt-s) - set(BOOST_DEBUG_SUFFIX mt-sgd) - else (MSVC71) - set(BOOST_OPTIM_SUFFIX mt) - set(BOOST_DEBUG_SUFFIX mt-gd) - endif (MSVC71) - - set(BOOST_PROGRAM_OPTIONS_LIBRARY - optimized libboost_program_options-vc${MSVC_SUFFIX}-${BOOST_OPTIM_SUFFIX}-${BOOST_VERSION} - debug libboost_program_options-vc${MSVC_SUFFIX}-${BOOST_DEBUG_SUFFIX}-${BOOST_VERSION}) - set(BOOST_REGEX_LIBRARY - optimized libboost_regex-vc${MSVC_SUFFIX}-${BOOST_OPTIM_SUFFIX}-${BOOST_VERSION} - debug libboost_regex-vc${MSVC_SUFFIX}-${BOOST_DEBUG_SUFFIX}-${BOOST_VERSION}) - set(BOOST_SIGNALS_LIBRARY - optimized libboost_signals-vc${MSVC_SUFFIX}-${BOOST_OPTIM_SUFFIX}-${BOOST_VERSION} - debug libboost_signals-vc${MSVC_SUFFIX}-${BOOST_DEBUG_SUFFIX}-${BOOST_VERSION}) - - elseif (DARWIN) - set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) - set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) - set(BOOST_REGEX_LIBRARY boost_regex-mt) - set(BOOST_SIGNALS_LIBRARY boost_signals-mt) - set(BOOST_SYSTEM_LIBRARY boost_system-mt) - elseif (LINUX) - set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) - set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) - set(BOOST_REGEX_LIBRARY boost_regex-mt) - set(BOOST_SIGNALS_LIBRARY boost_signals-mt) - set(BOOST_SYSTEM_LIBRARY boost_system-mt) - endif (WINDOWS) -endif (STANDALONE) +# -*- cmake -*- +include(Prebuilt) + +set(Boost_FIND_QUIETLY ON) +set(Boost_FIND_REQUIRED ON) + +if (STANDALONE) + include(FindBoost) + + set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) + set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) + set(BOOST_REGEX_LIBRARY boost_regex-mt) + set(BOOST_SIGNALS_LIBRARY boost_signals-mt) + set(BOOST_SYSTEM_LIBRARY boost_system-mt) +else (STANDALONE) + use_prebuilt_binary(boost) + set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) + + if (WINDOWS) + set(BOOST_VERSION 1_45) + + # SNOW-788 + # 00-Common.cmake alreay sets MSVC_SUFFIX to be correct for the VS we are using eg VC71, VC80, VC90 etc + # The precompiled boost libs for VC71 use a different suffix to VS80 and VS90 + # This code should ensure the cmake rules are valid for any VS being used in future as long as the approprate + # boost libs are avaiable - RC. + + if (MSVC71) + set(BOOST_OPTIM_SUFFIX mt-s) + set(BOOST_DEBUG_SUFFIX mt-sgd) + else (MSVC71) + set(BOOST_OPTIM_SUFFIX mt) + set(BOOST_DEBUG_SUFFIX mt-gd) + endif (MSVC71) + + set(BOOST_PROGRAM_OPTIONS_LIBRARY + optimized libboost_program_options-vc${MSVC_SUFFIX}-${BOOST_OPTIM_SUFFIX}-${BOOST_VERSION} + debug libboost_program_options-vc${MSVC_SUFFIX}-${BOOST_DEBUG_SUFFIX}-${BOOST_VERSION}) + set(BOOST_REGEX_LIBRARY + optimized libboost_regex-vc${MSVC_SUFFIX}-${BOOST_OPTIM_SUFFIX}-${BOOST_VERSION} + debug libboost_regex-vc${MSVC_SUFFIX}-${BOOST_DEBUG_SUFFIX}-${BOOST_VERSION}) + set(BOOST_SIGNALS_LIBRARY + optimized libboost_signals-vc${MSVC_SUFFIX}-${BOOST_OPTIM_SUFFIX}-${BOOST_VERSION} + debug libboost_signals-vc${MSVC_SUFFIX}-${BOOST_DEBUG_SUFFIX}-${BOOST_VERSION}) + + elseif (DARWIN) + set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) + set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) + set(BOOST_REGEX_LIBRARY boost_regex-mt) + set(BOOST_SIGNALS_LIBRARY boost_signals-mt) + set(BOOST_SYSTEM_LIBRARY boost_system-mt) + elseif (LINUX) + set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) + set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) + set(BOOST_REGEX_LIBRARY boost_regex-mt) + set(BOOST_SIGNALS_LIBRARY boost_signals-mt) + set(BOOST_SYSTEM_LIBRARY boost_system-mt) + endif (WINDOWS) +endif (STANDALONE) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 47f6da4f8..b7ec75f54 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -28,17 +28,18 @@ set(cmake_SOURCE_FILES FindCARes.cmake FindELFIO.cmake FindGooglePerfTools.cmake + FindHunSpell.cmake FindMono.cmake FindMT.cmake FindMySQL.cmake FindNDOF.cmake FindOpenJPEG.cmake FindXmlRpcEpi.cmake - FindZLIB.cmake FMOD.cmake FreeType.cmake GStreamer010Plugin.cmake GooglePerfTools.cmake + HUNSPELL.cmake JPEG.cmake LLAddBuildTest.cmake LLAudio.cmake diff --git a/indra/cmake/CopyWinLibs.cmake b/indra/cmake/CopyWinLibs.cmake index 88d2670e3..2995fb5fe 100644 --- a/indra/cmake/CopyWinLibs.cmake +++ b/indra/cmake/CopyWinLibs.cmake @@ -1,487 +1,489 @@ -# -*- cmake -*- - -# The copy_win_libs folder contains file lists and a script used to -# copy dlls, exes and such needed to run the SecondLife from within -# VisualStudio. - -include(CMakeCopyIfDifferent) - -set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32") -set(vivox_files - SLVoice.exe - alut.dll - vivoxsdk.dll - ortp.dll - wrap_oal.dll - ) -copy_if_different( - ${vivox_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Debug" - out_targets - ${vivox_files} - ) -set(all_targets ${all_targets} ${out_targets}) - - -set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") -set(debug_files - libapr-1.dll - libaprutil-1.dll - libapriconv-1.dll - ) - -copy_if_different( - ${debug_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Debug" - out_targets - ${debug_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -# Debug config runtime files required for the plugin test mule -set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") -set(plugintest_debug_files - libeay32.dll - libglib-2.0-0.dll - libgmodule-2.0-0.dll - libgobject-2.0-0.dll - libgthread-2.0-0.dll - qtcored4.dll - qtguid4.dll - qtnetworkd4.dll - qtopengld4.dll - qtwebkitd4.dll - ssleay32.dll - ) -copy_if_different( - ${plugintest_debug_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Debug" - out_targets - ${plugintest_debug_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -# Debug config runtime files required for the plugin test mule (Qt image format plugins) -set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/imageformats") -set(plugintest_debug_files - qgifd4.dll - qicod4.dll - qjpegd4.dll - qmngd4.dll - qsvgd4.dll - qtiffd4.dll - ) -copy_if_different( - ${plugintest_debug_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Debug/imageformats" - out_targets - ${plugintest_debug_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugintest_debug_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/llplugin/imageformats" - out_targets - ${plugintest_debug_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -# Release & ReleaseDebInfo config runtime files required for the plugin test mule -set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") -set(plugintest_release_files - libeay32.dll - libglib-2.0-0.dll - libgmodule-2.0-0.dll - libgobject-2.0-0.dll - libgthread-2.0-0.dll -# llkdu.dll (not required for plugin test) - qtcore4.dll - qtgui4.dll - qtnetwork4.dll - qtopengl4.dll - qtwebkit4.dll - ssleay32.dll - ) -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Release" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/ReleaseSSE2" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/RelWithDebInfo" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -# Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt image format plugins) -set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/imageformats") -set(plugintest_release_files - qgif4.dll - qico4.dll - qjpeg4.dll - qmng4.dll - qsvg4.dll - qtiff4.dll - ) -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Release/imageformats" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/ReleaseSSE2/imageformats" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/RelWithDebInfo/imageformats" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin/imageformats" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/llplugin/imageformats" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugintest_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin/imageformats" - out_targets - ${plugintest_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -# Debug config runtime files required for the plugins -set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") -set(plugins_debug_files - libeay32.dll - qtcored4.dll - qtguid4.dll - qtnetworkd4.dll - qtopengld4.dll - qtwebkitd4.dll - ssleay32.dll - ) -copy_if_different( - ${plugins_debug_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin" - out_targets - ${plugins_debug_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -# Release & ReleaseDebInfo config runtime files required for the plugins -set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") -set(plugins_release_files - libeay32.dll - qtcore4.dll - qtgui4.dll - qtnetwork4.dll - qtopengl4.dll - qtwebkit4.dll - ssleay32.dll - ) -copy_if_different( - ${plugins_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin" - out_targets - ${plugins_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugins_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/llplugin" - out_targets - ${plugins_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${plugins_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin" - out_targets - ${plugins_release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") -set(release_files - libtcmalloc_minimal.dll - fmod.dll - libapr-1.dll - libaprutil-1.dll - libapriconv-1.dll - ) - -copy_if_different( - ${release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Release" - out_targets - ${release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${vivox_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Release" - out_targets - ${vivox_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2" - out_targets - ${release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${vivox_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2" - out_targets - ${vivox_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" - out_targets - ${release_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -copy_if_different( - ${vivox_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" - out_targets - ${vivox_files} - ) -set(all_targets ${all_targets} ${out_targets}) - -set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu") -if(EXISTS ${internal_llkdu_path}) - set(internal_llkdu_src "${CMAKE_BINARY_DIR}/llkdu/${CMAKE_CFG_INTDIR}/llkdu.dll") - set(llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llkdu.dll") - ADD_CUSTOM_COMMAND( - OUTPUT ${llkdu_dst} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${internal_llkdu_src} ${llkdu_dst} - DEPENDS ${internal_llkdu_src} - COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}" - ) - set(all_targets ${all_targets} ${llkdu_dst}) -else(EXISTS ${internal_llkdu_path}) - if (EXISTS "${debug_src_dir}/llkdu.dll") - set(debug_llkdu_src "${debug_src_dir}/llkdu.dll") - set(debug_llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/Debug/llkdu.dll") - ADD_CUSTOM_COMMAND( - OUTPUT ${debug_llkdu_dst} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst} - DEPENDS ${debug_llkdu_src} - COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/Debug" - ) - set(all_targets ${all_targets} ${debug_llkdu_dst}) - endif (EXISTS "${debug_src_dir}/llkdu.dll") - - if (EXISTS "${release_src_dir}/llkdu.dll") - set(release_llkdu_src "${release_src_dir}/llkdu.dll") - set(release_llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/Release/llkdu.dll") - ADD_CUSTOM_COMMAND( - OUTPUT ${release_llkdu_dst} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst} - DEPENDS ${release_llkdu_src} - COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/Release" - ) - set(all_targets ${all_targets} ${release_llkdu_dst}) - - set(releasesse2_llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/llkdu.dll") - ADD_CUSTOM_COMMAND( - OUTPUT ${releasesse2_llkdu_dst} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${releasesse2_llkdu_dst} - DEPENDS ${release_llkdu_src} - COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2" - ) - set(all_targets ${all_targets} ${releasesse2_llkdu_dst}) - - set(relwithdebinfo_llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llkdu.dll") - ADD_CUSTOM_COMMAND( - OUTPUT ${relwithdebinfo_llkdu_dst} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst} - DEPENDS ${release_llkdu_src} - COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" - ) - set(all_targets ${all_targets} ${relwithdebinfo_llkdu_dst}) - endif (EXISTS "${release_src_dir}/llkdu.dll") - -endif (EXISTS ${internal_llkdu_path}) - -# Copy MS C runtime dlls, required for packaging. -# *TODO - Adapt this to support VC9 -if (MSVC80) - FIND_PATH(debug_msvc8_redist_path msvcr80d.dll - PATHS - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT - NO_DEFAULT_PATH - NO_DEFAULT_PATH - ) - - if(EXISTS ${debug_msvc8_redist_path}) - set(debug_msvc8_files - msvcr80d.dll - msvcp80d.dll - Microsoft.VC80.DebugCRT.manifest - ) - - copy_if_different( - ${debug_msvc8_redist_path} - "${CMAKE_CURRENT_BINARY_DIR}/Debug" - out_targets - ${debug_msvc8_files} - ) - set(all_targets ${all_targets} ${out_targets}) - - set(debug_appconfig_file ${CMAKE_CURRENT_BINARY_DIR}/Debug/${VIEWER_BINARY_NAME}.exe.config) - add_custom_command( - OUTPUT ${debug_appconfig_file} - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/build_win32_appConfig.py - ${CMAKE_CURRENT_BINARY_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest - ${CMAKE_CURRENT_SOURCE_DIR}/SecondLifeDebug.exe.config - ${debug_appconfig_file} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest - COMMENT "Creating debug app config file" - ) - - endif (EXISTS ${debug_msvc8_redist_path}) - - FIND_PATH(release_msvc8_redist_path msvcr80.dll - PATHS - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC80.CRT - NO_DEFAULT_PATH - NO_DEFAULT_PATH - ) - - if(EXISTS ${release_msvc8_redist_path}) - set(release_msvc8_files - msvcr80.dll - msvcp80.dll - Microsoft.VC80.CRT.manifest - ) - - copy_if_different( - ${release_msvc8_redist_path} - "${CMAKE_CURRENT_BINARY_DIR}/Release" - out_targets - ${release_msvc8_files} - ) - set(all_targets ${all_targets} ${out_targets}) - - copy_if_different( - ${release_msvc8_redist_path} - "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2" - out_targets - ${release_msvc8_files} - ) - set(all_targets ${all_targets} ${out_targets}) - - copy_if_different( - ${release_msvc8_redist_path} - "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" - out_targets - ${release_msvc8_files} - ) - set(all_targets ${all_targets} ${out_targets}) - - set(release_appconfig_file ${CMAKE_CURRENT_BINARY_DIR}/Release/${VIEWER_BINARY_NAME}.exe.config) - add_custom_command( - OUTPUT ${release_appconfig_file} - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/build_win32_appConfig.py - ${CMAKE_CURRENT_BINARY_DIR}/Release/Microsoft.VC80.CRT.manifest - ${CMAKE_CURRENT_SOURCE_DIR}/SecondLife.exe.config - ${release_appconfig_file} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Release/Microsoft.VC80.CRT.manifest - COMMENT "Creating release app config file" - ) - - set(releasesse2_appconfig_file ${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/${VIEWER_BINARY_NAME}.exe.config) - add_custom_command( - OUTPUT ${releasesse2_appconfig_file} - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/build_win32_appConfig.py - ${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/Microsoft.VC80.CRT.manifest - ${CMAKE_CURRENT_SOURCE_DIR}/SecondLife.exe.config - ${releasesse2_appconfig_file} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/Microsoft.VC80.CRT.manifest - COMMENT "Creating release-sse2 app config file" - ) - - set(relwithdebinfo_appconfig_file ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/${VIEWER_BINARY_NAME}.exe.config) - add_custom_command( - OUTPUT ${relwithdebinfo_appconfig_file} - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/build_win32_appConfig.py - ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest - ${CMAKE_CURRENT_SOURCE_DIR}/SecondLife.exe.config - ${relwithdebinfo_appconfig_file} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest - COMMENT "Creating relwithdebinfo app config file" - ) - - endif (EXISTS ${release_msvc8_redist_path}) -endif (MSVC80) - -add_custom_target(copy_win_libs ALL - DEPENDS - ${all_targets} - ${release_appconfig_file} - ${releasesse2_appconfig_file} - ${relwithdebinfo_appconfig_file} - ${debug_appconfig_file} - ) -add_dependencies(copy_win_libs prepare) - -if(EXISTS ${internal_llkdu_path}) - add_dependencies(copy_win_libs llkdu) -endif(EXISTS ${internal_llkdu_path}) +# -*- cmake -*- + +# The copy_win_libs folder contains file lists and a script used to +# copy dlls, exes and such needed to run the SecondLife from within +# VisualStudio. + +include(CMakeCopyIfDifferent) + +set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32") +set(vivox_files + SLVoice.exe + alut.dll + vivoxsdk.dll + ortp.dll + wrap_oal.dll + ) +copy_if_different( + ${vivox_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Debug" + out_targets + ${vivox_files} + ) +set(all_targets ${all_targets} ${out_targets}) + + +set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") +set(debug_files + libhunspell.dll + libapr-1.dll + libaprutil-1.dll + libapriconv-1.dll + ) + +copy_if_different( + ${debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Debug" + out_targets + ${debug_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +# Debug config runtime files required for the plugin test mule +set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") +set(plugintest_debug_files + libeay32.dll + libglib-2.0-0.dll + libgmodule-2.0-0.dll + libgobject-2.0-0.dll + libgthread-2.0-0.dll + qtcored4.dll + qtguid4.dll + qtnetworkd4.dll + qtopengld4.dll + qtwebkitd4.dll + ssleay32.dll + ) +copy_if_different( + ${plugintest_debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Debug" + out_targets + ${plugintest_debug_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +# Debug config runtime files required for the plugin test mule (Qt image format plugins) +set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/imageformats") +set(plugintest_debug_files + qgifd4.dll + qicod4.dll + qjpegd4.dll + qmngd4.dll + qsvgd4.dll + qtiffd4.dll + ) +copy_if_different( + ${plugintest_debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Debug/imageformats" + out_targets + ${plugintest_debug_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugintest_debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/llplugin/imageformats" + out_targets + ${plugintest_debug_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +# Release & ReleaseDebInfo config runtime files required for the plugin test mule +set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") +set(plugintest_release_files + libeay32.dll + libglib-2.0-0.dll + libgmodule-2.0-0.dll + libgobject-2.0-0.dll + libgthread-2.0-0.dll +# llkdu.dll (not required for plugin test) + qtcore4.dll + qtgui4.dll + qtnetwork4.dll + qtopengl4.dll + qtwebkit4.dll + ssleay32.dll + ) +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Release" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/ReleaseSSE2" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/RelWithDebInfo" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +# Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt image format plugins) +set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/imageformats") +set(plugintest_release_files + qgif4.dll + qico4.dll + qjpeg4.dll + qmng4.dll + qsvg4.dll + qtiff4.dll + ) +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/Release/imageformats" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/ReleaseSSE2/imageformats" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/../test_apps/llplugintest/RelWithDebInfo/imageformats" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin/imageformats" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/llplugin/imageformats" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugintest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin/imageformats" + out_targets + ${plugintest_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +# Debug config runtime files required for the plugins +set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") +set(plugins_debug_files + libeay32.dll + qtcored4.dll + qtguid4.dll + qtnetworkd4.dll + qtopengld4.dll + qtwebkitd4.dll + ssleay32.dll + ) +copy_if_different( + ${plugins_debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin" + out_targets + ${plugins_debug_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +# Release & ReleaseDebInfo config runtime files required for the plugins +set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") +set(plugins_release_files + libeay32.dll + qtcore4.dll + qtgui4.dll + qtnetwork4.dll + qtopengl4.dll + qtwebkit4.dll + ssleay32.dll + ) +copy_if_different( + ${plugins_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin" + out_targets + ${plugins_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugins_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/llplugin" + out_targets + ${plugins_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${plugins_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin" + out_targets + ${plugins_release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") +set(release_files + libtcmalloc_minimal.dll + fmod.dll + libhunspell.dll + libapr-1.dll + libaprutil-1.dll + libapriconv-1.dll + ) + +copy_if_different( + ${release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Release" + out_targets + ${release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${vivox_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Release" + out_targets + ${vivox_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2" + out_targets + ${release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${vivox_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2" + out_targets + ${vivox_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" + out_targets + ${release_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +copy_if_different( + ${vivox_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" + out_targets + ${vivox_files} + ) +set(all_targets ${all_targets} ${out_targets}) + +set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu") +if(EXISTS ${internal_llkdu_path}) + set(internal_llkdu_src "${CMAKE_BINARY_DIR}/llkdu/${CMAKE_CFG_INTDIR}/llkdu.dll") + set(llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llkdu.dll") + ADD_CUSTOM_COMMAND( + OUTPUT ${llkdu_dst} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${internal_llkdu_src} ${llkdu_dst} + DEPENDS ${internal_llkdu_src} + COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}" + ) + set(all_targets ${all_targets} ${llkdu_dst}) +else(EXISTS ${internal_llkdu_path}) + if (EXISTS "${debug_src_dir}/llkdu.dll") + set(debug_llkdu_src "${debug_src_dir}/llkdu.dll") + set(debug_llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/Debug/llkdu.dll") + ADD_CUSTOM_COMMAND( + OUTPUT ${debug_llkdu_dst} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst} + DEPENDS ${debug_llkdu_src} + COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/Debug" + ) + set(all_targets ${all_targets} ${debug_llkdu_dst}) + endif (EXISTS "${debug_src_dir}/llkdu.dll") + + if (EXISTS "${release_src_dir}/llkdu.dll") + set(release_llkdu_src "${release_src_dir}/llkdu.dll") + set(release_llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/Release/llkdu.dll") + ADD_CUSTOM_COMMAND( + OUTPUT ${release_llkdu_dst} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst} + DEPENDS ${release_llkdu_src} + COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/Release" + ) + set(all_targets ${all_targets} ${release_llkdu_dst}) + + set(releasesse2_llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/llkdu.dll") + ADD_CUSTOM_COMMAND( + OUTPUT ${releasesse2_llkdu_dst} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${releasesse2_llkdu_dst} + DEPENDS ${release_llkdu_src} + COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2" + ) + set(all_targets ${all_targets} ${releasesse2_llkdu_dst}) + + set(relwithdebinfo_llkdu_dst "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llkdu.dll") + ADD_CUSTOM_COMMAND( + OUTPUT ${relwithdebinfo_llkdu_dst} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst} + DEPENDS ${release_llkdu_src} + COMMENT "Copying llkdu.dll ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" + ) + set(all_targets ${all_targets} ${relwithdebinfo_llkdu_dst}) + endif (EXISTS "${release_src_dir}/llkdu.dll") + +endif (EXISTS ${internal_llkdu_path}) + +# Copy MS C runtime dlls, required for packaging. +# *TODO - Adapt this to support VC9 +if (MSVC80) + FIND_PATH(debug_msvc8_redist_path msvcr80d.dll + PATHS + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT + NO_DEFAULT_PATH + NO_DEFAULT_PATH + ) + + if(EXISTS ${debug_msvc8_redist_path}) + set(debug_msvc8_files + msvcr80d.dll + msvcp80d.dll + Microsoft.VC80.DebugCRT.manifest + ) + + copy_if_different( + ${debug_msvc8_redist_path} + "${CMAKE_CURRENT_BINARY_DIR}/Debug" + out_targets + ${debug_msvc8_files} + ) + set(all_targets ${all_targets} ${out_targets}) + + set(debug_appconfig_file ${CMAKE_CURRENT_BINARY_DIR}/Debug/${VIEWER_BINARY_NAME}.exe.config) + add_custom_command( + OUTPUT ${debug_appconfig_file} + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/build_win32_appConfig.py + ${CMAKE_CURRENT_BINARY_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest + ${CMAKE_CURRENT_SOURCE_DIR}/SecondLifeDebug.exe.config + ${debug_appconfig_file} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest + COMMENT "Creating debug app config file" + ) + + endif (EXISTS ${debug_msvc8_redist_path}) + + FIND_PATH(release_msvc8_redist_path msvcr80.dll + PATHS + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC80.CRT + NO_DEFAULT_PATH + NO_DEFAULT_PATH + ) + + if(EXISTS ${release_msvc8_redist_path}) + set(release_msvc8_files + msvcr80.dll + msvcp80.dll + Microsoft.VC80.CRT.manifest + ) + + copy_if_different( + ${release_msvc8_redist_path} + "${CMAKE_CURRENT_BINARY_DIR}/Release" + out_targets + ${release_msvc8_files} + ) + set(all_targets ${all_targets} ${out_targets}) + + copy_if_different( + ${release_msvc8_redist_path} + "${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2" + out_targets + ${release_msvc8_files} + ) + set(all_targets ${all_targets} ${out_targets}) + + copy_if_different( + ${release_msvc8_redist_path} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" + out_targets + ${release_msvc8_files} + ) + set(all_targets ${all_targets} ${out_targets}) + + set(release_appconfig_file ${CMAKE_CURRENT_BINARY_DIR}/Release/${VIEWER_BINARY_NAME}.exe.config) + add_custom_command( + OUTPUT ${release_appconfig_file} + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/build_win32_appConfig.py + ${CMAKE_CURRENT_BINARY_DIR}/Release/Microsoft.VC80.CRT.manifest + ${CMAKE_CURRENT_SOURCE_DIR}/SecondLife.exe.config + ${release_appconfig_file} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Release/Microsoft.VC80.CRT.manifest + COMMENT "Creating release app config file" + ) + + set(releasesse2_appconfig_file ${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/${VIEWER_BINARY_NAME}.exe.config) + add_custom_command( + OUTPUT ${releasesse2_appconfig_file} + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/build_win32_appConfig.py + ${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/Microsoft.VC80.CRT.manifest + ${CMAKE_CURRENT_SOURCE_DIR}/SecondLife.exe.config + ${releasesse2_appconfig_file} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ReleaseSSE2/Microsoft.VC80.CRT.manifest + COMMENT "Creating release-sse2 app config file" + ) + + set(relwithdebinfo_appconfig_file ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/${VIEWER_BINARY_NAME}.exe.config) + add_custom_command( + OUTPUT ${relwithdebinfo_appconfig_file} + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/build_win32_appConfig.py + ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest + ${CMAKE_CURRENT_SOURCE_DIR}/SecondLife.exe.config + ${relwithdebinfo_appconfig_file} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest + COMMENT "Creating relwithdebinfo app config file" + ) + + endif (EXISTS ${release_msvc8_redist_path}) +endif (MSVC80) + +add_custom_target(copy_win_libs ALL + DEPENDS + ${all_targets} + ${release_appconfig_file} + ${releasesse2_appconfig_file} + ${relwithdebinfo_appconfig_file} + ${debug_appconfig_file} + ) +add_dependencies(copy_win_libs prepare) + +if(EXISTS ${internal_llkdu_path}) + add_dependencies(copy_win_libs llkdu) +endif(EXISTS ${internal_llkdu_path}) diff --git a/indra/cmake/FindHunSpell.cmake b/indra/cmake/FindHunSpell.cmake new file mode 100644 index 000000000..d41f9cf76 --- /dev/null +++ b/indra/cmake/FindHunSpell.cmake @@ -0,0 +1,34 @@ +FIND_PATH(HUNSPELL_INCLUDE_DIR hunspell.hxx + /usr/local/include/hunspell + /usr/local/include + /usr/include/hunspell + /usr/include + ) + +SET(HUNSPELL_NAMES ${HUNSPELL_NAMES} hunspell hunspell-1.2) +FIND_LIBRARY(HUNSPELL_LIBRARY + NAMES ${HUNSPELL_NAMES} + PATHS /usr/lib /usr/local/lib + ) + +IF(HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR) + SET(HUNSPELL_LIBRARIES ${HUNSPELL_LIBRARY}) + SET(HUNSPELL_FOUND "YES") +ELSE(HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR) + SET(HUNSPELL_FOUND "NO") +ENDIF(HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR) + +IF(HUNSPELL_FOUND) + IF(NOT HUNSPELL_FIND_QUIETLY) + MESSAGE(STATUS "Found Hunspell: ${HUNSPELL_LIBRARIES}") + ENDIF(NOT HUNSPELL_FIND_QUIETLY) +ELSE(HUNSPELL_FOUND) + IF(HUNSPELL_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find HunSpell library") + ENDIF(HUNSPELL_FIND_REQUIRED) +ENDIF(HUNSPELL_FOUND) + +MARK_AS_ADVANCED( + HUNSPELL_LIBRARY + HUNSPELL_INCLUDE_DIR + ) diff --git a/indra/cmake/FindLLQtWebkit.cmake b/indra/cmake/FindLLQtWebkit.cmake new file mode 100644 index 000000000..c747ec32a --- /dev/null +++ b/indra/cmake/FindLLQtWebkit.cmake @@ -0,0 +1,62 @@ +# -*- cmake -*- + +# - Find llqtwebkit +# Find the llqtwebkit includes and library +# This module defines +# LLQTWEBKIT_INCLUDE_DIR, where to find llqtwebkit.h, etc. +# LLQTWEBKIT_LIBRARY, the llqtwebkit library with full path. +# LLQTWEBKIT_FOUND, If false, do not try to use llqtwebkit. +# also defined, but not for general use are +# LLQTWEBKIT_LIBRARIES, the libraries needed to use llqtwebkit. +# LLQTWEBKIT_LIBRARY_DIRS, where to find the llqtwebkit library. +# LLQTWEBKIT_DEFINITIONS - You should add_definitions(${LLQTWEBKIT_DEFINITIONS}) +# before compiling code that includes llqtwebkit library files. + +# Try to use pkg-config first. +# This allows to have two different libllqtwebkit packages installed: +# one for viewer 2.x and one for viewer 1.x. +include(FindPkgConfig) +if (PKG_CONFIG_FOUND) + if (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) + set(_PACKAGE_ARGS libllqtwebkit>=${LLQtWebkit_FIND_VERSION} REQUIRED) + else (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) + set(_PACKAGE_ARGS libllqtwebkit) + endif (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) + if (NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" VERSION_LESS "2.8") + # As virtually nobody will have a pkg-config file for this, do this check always quiet. + # Unfortunately cmake 2.8 or higher is required for pkg_check_modules to have a 'QUIET'. + set(_PACKAGE_ARGS ${_PACKAGE_ARGS} QUIET) + endif () + pkg_check_modules(LLQTWEBKIT ${_PACKAGE_ARGS}) +endif (PKG_CONFIG_FOUND) +set(LLQTWEBKIT_DEFINITIONS ${LLQTWEBKIT_CFLAGS_OTHER}) + +find_path(LLQTWEBKIT_INCLUDE_DIR llqtwebkit.h NO_SYSTEM_ENVIRONMENT_PATH HINTS ${LLQTWEBKIT_INCLUDE_DIRS}) + +find_library(LLQTWEBKIT_LIBRARY NAMES llqtwebkit NO_SYSTEM_ENVIRONMENT_PATH HINTS ${LLQTWEBKIT_LIBRARY_DIRS}) + +if (NOT PKG_CONFIG_FOUND OR NOT LLQTWEBKIT_FOUND) # If pkg-config couldn't find it, pretend we don't have pkg-config. + set(LLQTWEBKIT_LIBRARIES llqtwebkit) + get_filename_component(LLQTWEBKIT_LIBRARY_DIRS ${LLQTWEBKIT_LIBRARY} PATH) +endif (NOT PKG_CONFIG_FOUND OR NOT LLQTWEBKIT_FOUND) + +# Handle the QUIETLY and REQUIRED arguments and set LLQTWEBKIT_FOUND +# to TRUE if all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + LLQTWEBKIT + DEFAULT_MSG + LLQTWEBKIT_LIBRARY + LLQTWEBKIT_INCLUDE_DIR + LLQTWEBKIT_LIBRARIES + LLQTWEBKIT_LIBRARY_DIRS + ) + +mark_as_advanced( + LLQTWEBKIT_LIBRARY + LLQTWEBKIT_INCLUDE_DIR + LLQTWEBKIT_LIBRARIES + LLQTWEBKIT_LIBRARY_DIRS + LLQTWEBKIT_DEFINITIONS + ) + diff --git a/indra/cmake/FindMT.cmake b/indra/cmake/FindMT.cmake index 5239a4c2f..71b5a43e5 100644 --- a/indra/cmake/FindMT.cmake +++ b/indra/cmake/FindMT.cmake @@ -1,15 +1,17 @@ -#Find the windows manifest tool. - -FIND_PROGRAM(HAVE_MANIFEST_TOOL NAMES mt - PATHS - "$ENV{PROGRAMFILES}/Microsoft Visual Studio 8/VC/bin" - "$ENV{PROGRAMFILES}/Microsoft Visual Studio 8/Common7/Tools/Bin" - "$ENV{PROGRAMFILES}/Microsoft Visual Studio 8/SDK/v2.0/Bin") -IF(HAVE_MANIFEST_TOOL) - MESSAGE(STATUS "Found Mainfest Tool. Embedding custom manifests.") -ELSE(HAVE_MANIFEST_TOOL) - MESSAGE(FATAL_ERROR "Manifest tool, mt.exe, can't be found.") -ENDIF(HAVE_MANIFEST_TOOL) - -STRING(REPLACE "/MANIFEST" "/MANIFEST:NO" CMAKE_EXE_LINKER_FLAGS - ${CMAKE_EXE_LINKER_FLAGS}) +#Find the windows manifest tool. +if (MSVC80) + FIND_PROGRAM(HAVE_MANIFEST_TOOL NAMES mt + PATHS + "$ENV{PROGRAMFILES}/Microsoft Visual Studio 8/VC/bin" + "$ENV{PROGRAMFILES}/Microsoft Visual Studio 8/Common7/Tools/Bin" + "$ENV{PROGRAMFILES}/Microsoft Visual Studio 8/SDK/v2.0/Bin") + IF(HAVE_MANIFEST_TOOL) + MESSAGE(STATUS "Found Mainfest Tool. Embedding custom manifests.") + ELSE(HAVE_MANIFEST_TOOL) + MESSAGE(FATAL_ERROR "Manifest tool, mt.exe, can't be found.") + ENDIF(HAVE_MANIFEST_TOOL) + + STRING(REPLACE "/MANIFEST " "/MANIFEST:NO" CMAKE_EXE_LINKER_FLAGS + ${CMAKE_EXE_LINKER_FLAGS}) + +endif (MSVC80) diff --git a/indra/cmake/FindZLIB.cmake b/indra/cmake/FindMyZLIB.cmake similarity index 100% rename from indra/cmake/FindZLIB.cmake rename to indra/cmake/FindMyZLIB.cmake diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake index b47f41871..a71e29df3 100644 --- a/indra/cmake/GooglePerfTools.cmake +++ b/indra/cmake/GooglePerfTools.cmake @@ -1,50 +1,52 @@ -# -*- cmake -*- -include(Prebuilt) - -if (STANDALONE) - include(FindGooglePerfTools) -else (STANDALONE) - if (LINUX OR WINDOWS) - use_prebuilt_binary(google) - endif (LINUX OR WINDOWS) - if (WINDOWS) - set(TCMALLOC_LIBRARIES libtcmalloc_minimal.lib) - set(TCMALLOC_LINKER_FLAGS "/INCLUDE:\"__tcmalloc\"") - endif (WINDOWS) - if (LINUX) - if(USE_GOOGLE_PERFTOOLS) - set(TCMALLOC_LIBRARIES tcmalloc) - set(STACKTRACE_LIBRARIES stacktrace) - set(PROFILER_LIBRARIES profiler) - else() - set(TCMALLOC_LIBRARIES tcmalloc_minimal) - endif() - set(GOOGLE_PERFTOOLS_INCLUDE_DIR - ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include) - set(GOOGLE_PERFTOOLS_FOUND "YES") - endif (LINUX) -endif (STANDALONE) - -#if (GOOGLE_PERFTOOLS_FOUND) -# set(USE_GOOGLE_PERFTOOLS ON CACHE BOOL "Build with Google PerfTools support.") -#endif (GOOGLE_PERFTOOLS_FOUND) - -# XXX Disable temporarily, until we have compilation issues on 64-bit -# Etch sorted. -#set(USE_GOOGLE_PERFTOOLS OFF) - -if (USE_GOOGLE_PERFTOOLS) - set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1) - include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR}) - set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES}) -else (USE_GOOGLE_PERFTOOLS) - set(TCMALLOC_FLAG -ULL_USE_TCMALLOC) -endif (USE_GOOGLE_PERFTOOLS) - -if (NOT(DISABLE_TCMALLOC OR USE_GOOGLE_PERFTOOLS)) - message(STATUS "Building with Google TCMalloc") - set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1_) - include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR}) - set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES}) - set(GOOGLE_PERFTOOLS_LINKER_FLAGS ${TCMALLOC_LINKER_FLAGS}) -endif() +# -*- cmake -*- +include(Prebuilt) + +if (STANDALONE) + include(FindGooglePerfTools) +else (STANDALONE) + if (LINUX OR WINDOWS) + use_prebuilt_binary(google) + endif (LINUX OR WINDOWS) + if (WINDOWS) + set(TCMALLOC_LIBRARIES libtcmalloc_minimal.lib) + set(TCMALLOC_LINKER_FLAGS "/INCLUDE:\"__tcmalloc\"") + endif (WINDOWS) + if (LINUX) + if(USE_GOOGLE_PERFTOOLS) + set(TCMALLOC_LIBRARIES tcmalloc) + set(STACKTRACE_LIBRARIES stacktrace) + set(PROFILER_LIBRARIES profiler) + else() + set(TCMALLOC_LIBRARIES tcmalloc_minimal) + endif() + set(GOOGLE_PERFTOOLS_INCLUDE_DIR + ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include) + set(GOOGLE_PERFTOOLS_FOUND "YES") + endif (LINUX) +endif (STANDALONE) + +if (GOOGLE_PERFTOOLS_FOUND) + set(USE_GOOGLE_PERFTOOLS ON CACHE BOOL "Build with Google PerfTools support.") +else (GOOGLE_PERFTOOLS_FOUND) + set(USE_GOOGLE_PERFTOOLS OFF) +endif (GOOGLE_PERFTOOLS_FOUND) + +# XXX Disable temporarily, until we have compilation issues on 64-bit +# Etch sorted. +#set(USE_GOOGLE_PERFTOOLS OFF) + +if (USE_GOOGLE_PERFTOOLS) + set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1) + include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR}) + set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES}) +else (USE_GOOGLE_PERFTOOLS) + set(TCMALLOC_FLAG -ULL_USE_TCMALLOC) +endif (USE_GOOGLE_PERFTOOLS) + +if (NOT(DISABLE_TCMALLOC OR USE_GOOGLE_PERFTOOLS OR STANDALONE)) + message(STATUS "Building with Google TCMalloc") + set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1) + include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR}) + set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES}) + set(GOOGLE_PERFTOOLS_LINKER_FLAGS ${TCMALLOC_LINKER_FLAGS}) +endif() diff --git a/indra/cmake/HUNSPELL.cmake b/indra/cmake/HUNSPELL.cmake new file mode 100644 index 000000000..cd5d7e00b --- /dev/null +++ b/indra/cmake/HUNSPELL.cmake @@ -0,0 +1,16 @@ +# -*- cmake -*- +include(Prebuilt) + +if (STANDALONE) + include(FindHunSpell) +else (STANDALONE) + use_prebuilt_binary(hunspell) + + set(HUNSPELL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/hunspell) + + if (LINUX OR DARWIN) + set(HUNSPELL_LIBRARY hunspell-1.2) + else (LINUX OR DARWIN) + set(HUNSPELL_LIBRARY libhunspell) + endif (LINUX OR DARWIN) +endif (STANDALONE) diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake index 410766e4f..2862ba7f0 100644 --- a/indra/cmake/LLCommon.cmake +++ b/indra/cmake/LLCommon.cmake @@ -7,7 +7,6 @@ include(ZLIB) set(LLCOMMON_INCLUDE_DIRS ${LIBS_OPEN_DIR}/llcommon - ${APRUTIL_INCLUDE_DIR} ${APR_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ) diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake index 409a8335c..5cf92335e 100644 --- a/indra/cmake/LLWindow.cmake +++ b/indra/cmake/LLWindow.cmake @@ -13,11 +13,11 @@ if (STANDALONE) SDL_LIBRARY ) else (STANDALONE) - use_prebuilt_binary(SDL) if (NOT DARWIN) use_prebuilt_binary(mesa) endif (NOT DARWIN) if (LINUX AND VIEWER) + use_prebuilt_binary(SDL) set (SDL_FOUND TRUE) set (SDL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/i686-linux) set (SDL_LIBRARY SDL) diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake index 4d0b7b2d8..f075adaa0 100644 --- a/indra/cmake/PNG.cmake +++ b/indra/cmake/PNG.cmake @@ -8,6 +8,10 @@ if (STANDALONE) include(FindPNG) else (STANDALONE) use_prebuilt_binary(libpng) - set(PNG_LIBRARIES png12) + if (WINDOWS) + set(PNG_LIBRARIES libpng15) + else (WINDOWS) + set(PNG_LIBRARIES png12) + endif (WINDOWS) set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) endif (STANDALONE) diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake index 002661422..a84ab64aa 100644 --- a/indra/cmake/Python.cmake +++ b/indra/cmake/Python.cmake @@ -1,57 +1,57 @@ -# -*- cmake -*- - -set(PYTHONINTERP_FOUND) - -if (WINDOWS) - # On Windows, explicitly avoid Cygwin Python. - - find_program(PYTHON_EXECUTABLE - NAMES python25.exe python23.exe python.exe - NO_DEFAULT_PATH # added so that cmake does not find cygwin python - PATHS - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath] - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] - - ) -elseif (EXISTS /etc/debian_version) - # On Debian and Ubuntu, avoid Python 2.4 if possible. - - find_program(PYTHON_EXECUTABLE python2.5 python2.3 python PATHS /usr/bin) - - if (PYTHON_EXECUTABLE) - set(PYTHONINTERP_FOUND ON) - endif (PYTHON_EXECUTABLE) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - # On MAC OS X be sure to search standard locations first - - string(REPLACE ":" ";" PATH_LIST "$ENV{PATH}") - find_program(PYTHON_EXECUTABLE - NAMES python python25 python24 python23 - NO_DEFAULT_PATH # Avoid searching non-standard locations first - PATHS - /bin - /usr/bin - /usr/local/bin - ${PATH_LIST} - ) - - if (PYTHON_EXECUTABLE) - set(PYTHONINTERP_FOUND ON) - endif (PYTHON_EXECUTABLE) -else (WINDOWS) - include(FindPythonInterp) -endif (WINDOWS) - -if (NOT PYTHON_EXECUTABLE) - message(FATAL_ERROR "No Python interpreter found") -endif (NOT PYTHON_EXECUTABLE) - -mark_as_advanced(PYTHON_EXECUTABLE) +# -*- cmake -*- + +set(PYTHONINTERP_FOUND) + +if (WINDOWS) + # On Windows, explicitly avoid Cygwin Python. + + find_program(PYTHON_EXECUTABLE + NAMES python25.exe python23.exe python.exe + NO_DEFAULT_PATH # added so that cmake does not find cygwin python + PATHS + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] + + ) +elseif (EXISTS /etc/debian_version) + # On Debian and Ubuntu, avoid Python 2.4 if possible. + + find_program(PYTHON_EXECUTABLE python2.5 python2.3 python PATHS /usr/bin) + + if (PYTHON_EXECUTABLE) + set(PYTHONINTERP_FOUND ON) + endif (PYTHON_EXECUTABLE) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + # On MAC OS X be sure to search standard locations first + + string(REPLACE ":" ";" PATH_LIST "$ENV{PATH}") + find_program(PYTHON_EXECUTABLE + NAMES python python25 python24 python23 + NO_DEFAULT_PATH # Avoid searching non-standard locations first + PATHS + /bin + /usr/bin + /usr/local/bin + ${PATH_LIST} + ) + + if (PYTHON_EXECUTABLE) + set(PYTHONINTERP_FOUND ON) + endif (PYTHON_EXECUTABLE) +else (WINDOWS) + include(FindPythonInterp) +endif (WINDOWS) + +if (NOT PYTHON_EXECUTABLE) + message(FATAL_ERROR "No Python interpreter found") +endif (NOT PYTHON_EXECUTABLE) + +mark_as_advanced(PYTHON_EXECUTABLE) diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake index 6067602d5..64fa85ff2 100644 --- a/indra/cmake/UI.cmake +++ b/indra/cmake/UI.cmake @@ -42,6 +42,7 @@ else (STANDALONE) gdk_pixbuf-2.0 Xinerama glib-2.0 + gio-2.0 gmodule-2.0 gobject-2.0 gthread-2.0 diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 746de0fe9..e52492c38 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -3,9 +3,24 @@ include(Prebuilt) if (NOT STANDALONE) use_prebuilt_binary(vivox) - if (LINUX) - #use_prebuilt_binary(libuuid) + if(LINUX) + use_prebuilt_binary(libuuid) + if (${ARCH} STREQUAL "x86_64") + use_prebuilt_binary(32bitcompatibilitylibs) + endif (${ARCH} STREQUAL "x86_64") use_prebuilt_binary(fontconfig) - endif (LINUX) + endif(LINUX) +else (NOT STANDALONE) + # Download there even when using standalone. + set(STANDALONE OFF) + use_prebuilt_binary(vivox) + if(LINUX AND ${ARCH} STREQUAL "x86_64") + use_prebuilt_binary(32bitcompatibilitylibs) + endif(LINUX AND ${ARCH} STREQUAL "x86_64") + set(STANDALONE ON) endif(NOT STANDALONE) +if (WINDOWS) + use_prebuilt_binary(dbghelp) +endif (WINDOWS) + diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake index 44f5619e1..a4befa495 100644 --- a/indra/cmake/WebKitLibPlugin.cmake +++ b/indra/cmake/WebKitLibPlugin.cmake @@ -3,7 +3,29 @@ include(Linking) include(Prebuilt) if (STANDALONE) - find_package(LLQtWebkit REQUIRED) + # The minimal version, 4.4.3, is rather arbitrary: it's the version in Debian/Lenny. + find_package(Qt4 4.4.3 COMPONENTS QtCore QtGui QtNetwork QtOpenGL QtWebKit REQUIRED) + include(${QT_USE_FILE}) + set(QTDIR $ENV{QTDIR}) + if (QTDIR AND NOT "${QT_BINARY_DIR}" STREQUAL "${QTDIR}/bin") + message(FATAL_ERROR "\"${QT_BINARY_DIR}\" is unequal \"${QTDIR}/bin\"; " + "Qt is found by looking for qmake in your PATH. " + "Please set your PATH such that 'qmake' is found in \$QTDIR/bin, " + "or unset QTDIR if the found Qt is correct.") + endif (QTDIR AND NOT "${QT_BINARY_DIR}" STREQUAL "${QTDIR}/bin") + find_package(LLQtWebkit REQUIRED QUIET) + # Add the plugins. + set(QT_PLUGIN_LIBRARIES) + foreach(qlibname qgif qjpeg) + find_library(QT_PLUGIN_${qlibname} ${qlibname} PATHS ${QT_PLUGINS_DIR}/imageformats NO_DEFAULT_PATH) + if (QT_PLUGIN_${qlibname}) + list(APPEND QT_PLUGIN_LIBRARIES ${QT_PLUGIN_${qlibname}}) + else (QT_PLUGIN_${qtlibname}) + message(FATAL_ERROR "Could not find the Qt plugin ${qlibname} in \"${QT_PLUGINS_DIR}/imageformats\"!") + endif (QT_PLUGIN_${qlibname}) + endforeach(qlibname) + # qjpeg depends on libjpeg + list(APPEND QT_PLUGIN_LIBRARIES jpeg) set(WEBKITLIBPLUGIN OFF CACHE BOOL "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.") else (STANDALONE) @@ -32,25 +54,26 @@ if (WINDOWS) elseif (DARWIN) set(WEBKIT_PLUGIN_LIBRARIES optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib - debug ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/libllqtwebkit.dylib ) elseif (LINUX) - if (STANDALONE) - set(WEBKIT_PLUGIN_LIBRARIES ${LLQTWEBKIT_LIBRARY}) - else (STANDALONE) + if (STANDALONE) + set(WEBKIT_PLUGIN_LIBRARIES ${LLQTWEBKIT_LIBRARY} ${QT_LIBRARIES} ${QT_PLUGIN_LIBRARIES}) + else (STANDALONE) set(WEBKIT_PLUGIN_LIBRARIES - llqtwebkit - qgif - qjpeg - QtWebKit - QtOpenGL - QtNetwork - QtGui - QtCore - fontconfig - X11 - Xrender - GL - ) - endif (STANDALONE) + llqtwebkit + qgif + qjpeg + QtWebKit + QtOpenGL + QtNetwork + QtGui + QtCore + jpeg + fontconfig + X11 + Xrender + GL + ) + endif (STANDALONE) endif (WINDOWS) diff --git a/indra/cmake/XmlRpcEpi.cmake b/indra/cmake/XmlRpcEpi.cmake index 107d1926b..56eb7e250 100644 --- a/indra/cmake/XmlRpcEpi.cmake +++ b/indra/cmake/XmlRpcEpi.cmake @@ -8,10 +8,6 @@ if (STANDALONE) include(FindXmlRpcEpi) else (STANDALONE) use_prebuilt_binary(xmlrpc-epi) - if (WINDOWS) - set(XMLRPCEPI_LIBRARIES xmlrpcepi) - else (WINDOWS) - set(XMLRPCEPI_LIBRARIES xmlrpc-epi) - endif (WINDOWS) + set(XMLRPCEPI_LIBRARIES xmlrpc-epi) set(XMLRPCEPI_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) endif (STANDALONE) diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index bfac97981..492fd3700 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -156,6 +156,9 @@ ARGUMENTS=[ dict(name='source', description='Source directory.', default=DEFAULT_SRCTREE), + dict(name='standalone', + description='Set to ON if this is a standalone build.', + default="OFF"), dict(name='artwork', description='Artwork directory.', default=DEFAULT_SRCTREE), dict(name='touch', description="""File to touch when action is finished. Touch file will @@ -634,9 +637,9 @@ class LLManifest(object): is_glob = False # look under each prefix for matching paths - paths = [os.path.join(self.get_src_prefix(), src), + paths = set([os.path.join(self.get_src_prefix(), src), os.path.join(self.get_artwork_prefix(), src), - os.path.join(self.get_build_prefix(), src)] + os.path.join(self.get_build_prefix(), src)]) for path in paths: if self.wildcard_pattern.search(path): is_glob = True diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index 908eca5a6..41930f539 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -723,4 +723,4 @@ BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid) } return FALSE; -} \ No newline at end of file +} diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 485c323dd..7f352269b 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -1,212 +1,218 @@ -# -*- cmake -*- - -project(llcommon) - -include(00-Common) -include(LLCommon) -include(Linking) - -include_directories( - ${EXPAT_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${ZLIB_INCLUDE_DIRS} - ) - -set(llcommon_SOURCE_FILES - imageids.cpp - indra_constants.cpp - llapp.cpp - llapr.cpp - llassettype.cpp - llavatarname.cpp - llbase32.cpp - llbase64.cpp - llcommon.cpp - llcommonutils.cpp - llcrc.cpp - llcriticaldamp.cpp - llcursortypes.cpp - lldate.cpp - llerror.cpp - llerrorthread.cpp - llevent.cpp - llfasttimer.cpp - llfile.cpp - llfindlocale.cpp - llfixedbuffer.cpp - llformat.cpp - llframetimer.cpp - llheartbeat.cpp - llindraconfigfile.cpp - llliveappconfig.cpp - lllivefile.cpp - lllog.cpp - llmd5.cpp - llmemory.cpp - llmemorystream.cpp - llmetrics.cpp - llmortician.cpp - lloptioninterface.cpp - llprocesslauncher.cpp - llprocessor.cpp - llqueuedthread.cpp - llrand.cpp - llrun.cpp - llsd.cpp - llsdserialize.cpp - llsdserialize_xml.cpp - llsdutil.cpp - llsecondlifeurls.cpp - llstat.cpp - llstreamtools.cpp - llstring.cpp - llstringtable.cpp - llsys.cpp - llthread.cpp - lltimer.cpp - lluri.cpp - lluuid.cpp - llworkerthread.cpp - metaclass.cpp - metaproperty.cpp - reflective.cpp - timing.cpp - u64.cpp - ) - -set(llcommon_HEADER_FILES - CMakeLists.txt - - bitpack.h - ctype_workaround.h - doublelinkedlist.h - imageids.h - indra_constants.h - linden_common.h - linked_lists.h - llagentconstants.h - llapp.h - llapr.h - llassettype.h - llassoclist.h - llavatarconstants.h - llavatarname.h - llbase32.h - llbase64.h - llboost.h - llchat.h - llclickaction.h - llcommon.h - llcommonutils.h - llcrc.h - llcriticaldamp.h - llcursortypes.h - lldarray.h - lldarrayptr.h - lldate.h - lldefs.h - lldepthstack.h - lldlinked.h - lldqueueptr.h - llendianswizzle.h - llenum.h - llerror.h - llerrorcontrol.h - llerrorlegacy.h - llerrorthread.h - llevent.h - lleventemitter.h - llextendedstatus.h - llfasttimer.h - llfile.h - llfindlocale.h - llfixedbuffer.h - llformat.h - llframetimer.h - llhash.h - llheartbeat.h - llhttpstatuscodes.h - llindexedqueue.h - llindraconfigfile.h - llkeythrottle.h - lllinkedqueue.h - llliveappconfig.h - lllivefile.h - lllocalidhashmap.h - lllog.h - lllslconstants.h - llmap.h - llmd5.h - llmemory.h - llmemorystream.h - llmemtype.h - llmetrics.h - llmortician.h - llnametable.h - lloptioninterface.h - llpreprocessor.h - llpriqueuemap.h - llprocesslauncher.h - llprocessor.h - llptrskiplist.h - llptrskipmap.h - llqueuedthread.h - llrand.h - llrun.h - llsd.h - llsdserialize.h - llsdserialize_xml.h - llsdutil.h - llsecondlifeurls.h - llsimplehash.h - llskiplist.h - llskipmap.h - llstack.h - llstat.h - llstatenums.h - llstl.h - llstreamtools.h - llstrider.h - llstring.h - llstringtable.h - llsys.h - llthread.h - lltimer.h - lluri.h - lluuid.h - lluuidhashmap.h - llversionserver.h - llversionviewer.h - llworkerthread.h - metaclass.h - metaclasst.h - metaproperty.h - metapropertyt.h - processor.h - reflective.h - reflectivet.h - roles_constants.h - stdenums.h - stdtypes.h - string_table.h - timer.h - timing.h - u64.h - ) - -set_source_files_properties(${llcommon_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) - -add_library (llcommon ${llcommon_SOURCE_FILES}) -add_dependencies(llcommon prepare) -target_link_libraries( - llcommon - ${APRUTIL_LIBRARIES} - ${APR_LIBRARIES} - ${EXPAT_LIBRARIES} - ${ZLIB_LIBRARIES} - ${WINDOWS_LIBRARIES} - ) - +# -*- cmake -*- + +project(llcommon) + +include(00-Common) +include(LLCommon) +include(Linking) + +include_directories( + ${EXPAT_INCLUDE_DIRS} + ${LLCOMMON_INCLUDE_DIRS} + ${ZLIB_INCLUDE_DIRS} + ) + +set(llcommon_SOURCE_FILES + aiaprpool.cpp + imageids.cpp + indra_constants.cpp + llapp.cpp + llapr.cpp + llassettype.cpp + llavatarname.cpp + llbase32.cpp + llbase64.cpp + llcommon.cpp + llcommonutils.cpp + llcrc.cpp + llcriticaldamp.cpp + llcursortypes.cpp + lldate.cpp + lldictionary.cpp + llerror.cpp + llerrorthread.cpp + llevent.cpp + llfasttimer.cpp + llfile.cpp + llfindlocale.cpp + llfixedbuffer.cpp + llformat.cpp + llframetimer.cpp + llheartbeat.cpp + llindraconfigfile.cpp + llliveappconfig.cpp + lllivefile.cpp + lllog.cpp + llmd5.cpp + llmemory.cpp + llmemorystream.cpp + llmetrics.cpp + llmortician.cpp + lloptioninterface.cpp + llprocesslauncher.cpp + llprocessor.cpp + llqueuedthread.cpp + llrand.cpp + llrun.cpp + llsd.cpp + llsdserialize.cpp + llsdserialize_xml.cpp + llsdutil.cpp + llsecondlifeurls.cpp + llstat.cpp + llstreamtools.cpp + llstring.cpp + llstringtable.cpp + llsys.cpp + llthread.cpp + lltimer.cpp + lluri.cpp + lluuid.cpp + llworkerthread.cpp + metaclass.cpp + metaproperty.cpp + reflective.cpp + timing.cpp + u64.cpp + ) + +set(llcommon_HEADER_FILES + CMakeLists.txt + + aiaprpool.h + aithreadsafe.h + bitpack.h + ctype_workaround.h + doublelinkedlist.h + imageids.h + indra_constants.h + linden_common.h + linked_lists.h + llagentconstants.h + llapp.h + llapr.h + llassettype.h + llassoclist.h + llavatarconstants.h + llavatarname.h + llbase32.h + llbase64.h + llboost.h + llchat.h + llclickaction.h + llcommon.h + llcommonutils.h + llcrc.h + llcriticaldamp.h + llcursortypes.h + lldarray.h + lldarrayptr.h + lldate.h + lldefs.h + lldepthstack.h + lldictionary.h + lldlinked.h + lldqueueptr.h + llendianswizzle.h + llenum.h + llerror.h + llerrorcontrol.h + llerrorlegacy.h + llerrorthread.h + llevent.h + lleventemitter.h + llextendedstatus.h + llfasttimer.h + llfile.h + llfindlocale.h + llfixedbuffer.h + llformat.h + llframetimer.h + llhash.h + llheartbeat.h + llhttpstatuscodes.h + llindexedqueue.h + llindraconfigfile.h + llkeythrottle.h + lllinkedqueue.h + llliveappconfig.h + lllivefile.h + lllocalidhashmap.h + lllog.h + lllslconstants.h + llmap.h + llmd5.h + llmemory.h + llmemorystream.h + llmemtype.h + llmetrics.h + llmortician.h + llnametable.h + lloptioninterface.h + llpreprocessor.h + llpriqueuemap.h + llprocesslauncher.h + llprocessor.h + llptrskiplist.h + llptrskipmap.h + llqueuedthread.h + llrand.h + llrun.h + llscopedvolatileaprpool.h + llsd.h + llsdserialize.h + llsdserialize_xml.h + llsdutil.h + llsecondlifeurls.h + llsimplehash.h + llskiplist.h + llskipmap.h + llstack.h + llstat.h + llstatenums.h + llstl.h + llstreamtools.h + llstrider.h + llstring.h + llstringtable.h + llsys.h + llthread.h + lltimer.h + lluri.h + lluuid.h + lluuidhashmap.h + llversionserver.h + llversionviewer.h + llworkerthread.h + metaclass.h + metaclasst.h + metaproperty.h + metapropertyt.h + processor.h + reflective.h + reflectivet.h + roles_constants.h + stdenums.h + stdtypes.h + string_table.h + timer.h + timing.h + u64.h + ) + +set_source_files_properties(${llcommon_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) + +add_library (llcommon SHARED ${llcommon_SOURCE_FILES}) +add_dependencies(llcommon prepare) +target_link_libraries( + llcommon + ${APRUTIL_LIBRARIES} + ${APR_LIBRARIES} + ${EXPAT_LIBRARIES} + ${ZLIB_LIBRARIES} + ${WINDOWS_LIBRARIES} + ) + diff --git a/indra/llcommon/aiaprpool.cpp b/indra/llcommon/aiaprpool.cpp new file mode 100644 index 000000000..d3748e983 --- /dev/null +++ b/indra/llcommon/aiaprpool.cpp @@ -0,0 +1,198 @@ +/** + * @file aiaprpool.cpp + * + * Copyright (c) 2010, Aleric Inglewood. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution. + * + * CHANGELOG + * and additional copyright holders. + * + * 04/04/2010 + * - Initial version, written by Aleric Inglewood @ SL + * + * 10/11/2010 + * - Changed filename, class names and license to a more + * company-neutral format. + * - Added APR_HAS_THREADS #if's to allow creation and destruction + * of subpools by threads other than the parent pool owner. + */ + +#include "linden_common.h" + +#include "llerror.h" +#include "aiaprpool.h" +#include "llthread.h" + +// Create a subpool from parent. +void AIAPRPool::create(AIAPRPool& parent) +{ + llassert(!mPool); // Must be non-initialized. + mParent = &parent; + if (!mParent) // Using the default parameter? + { + // By default use the root pool of the current thread. + mParent = &AIThreadLocalData::tldata().mRootPool; + } + llassert(mParent->mPool); // Parent must be initialized. +#if APR_HAS_THREADS + // As per the documentation of APR (ie http://apr.apache.org/docs/apr/1.4/apr__pools_8h.html): + // + // Note that most operations on pools are not thread-safe: a single pool should only be + // accessed by a single thread at any given time. The one exception to this rule is creating + // a subpool of a given pool: one or more threads can safely create subpools at the same + // time that another thread accesses the parent pool. + // + // In other words, it's safe for any thread to create a (sub)pool, independent of who + // owns the parent pool. + mOwner = apr_os_thread_current(); +#else + mOwner = mParent->mOwner; + llassert(apr_os_thread_equal(mOwner, apr_os_thread_current())); +#endif + apr_status_t const apr_pool_create_status = apr_pool_create(&mPool, mParent->mPool); + llassert_always(apr_pool_create_status == APR_SUCCESS); + llassert(mPool); // Initialized. + apr_pool_cleanup_register(mPool, this, &s_plain_cleanup, &apr_pool_cleanup_null); +} + +// Destroy the (sub)pool, if any. +void AIAPRPool::destroy(void) +{ + // Only do anything if we are not already (being) destroyed. + if (mPool) + { +#if !APR_HAS_THREADS + // If we are a root pool, then every thread may destruct us: in that case + // we have to assume that no other thread will use this pool concurrently, + // of course. Otherwise, if we are a subpool, only the thread that owns + // the parent may destruct us, since that is the pool that is still alive, + // possibly being used by others and being altered here. + llassert(!mParent || apr_os_thread_equal(mParent->mOwner, apr_os_thread_current())); +#endif + apr_pool_t* pool = mPool; + mPool = NULL; // Mark that we are BEING destructed. + apr_pool_cleanup_kill(pool, this, &s_plain_cleanup); + apr_pool_destroy(pool); + } +} + +bool AIAPRPool::parent_is_being_destructed(void) +{ + return mParent && (!mParent->mPool || mParent->parent_is_being_destructed()); +} + +AIAPRInitialization::AIAPRInitialization(void) +{ + static bool apr_initialized = false; + + if (!apr_initialized) + { + apr_initialize(); + } + + apr_initialized = true; +} + +bool AIAPRRootPool::sCountInitialized = false; +apr_uint32_t volatile AIAPRRootPool::sCount; + +extern apr_thread_mutex_t* gLogMutexp; +extern apr_thread_mutex_t* gCallStacksLogMutexp; + +AIAPRRootPool::AIAPRRootPool(void) : AIAPRInitialization(), AIAPRPool(0) +{ + // sCountInitialized don't need locking because when we get here there is still only a single thread. + if (!sCountInitialized) + { + // Initialize the logging mutex + apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, mPool); + apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, mPool); + + apr_status_t status = apr_atomic_init(mPool); + llassert_always(status == APR_SUCCESS); + apr_atomic_set32(&sCount, 1); // Set to 1 to account for the global root pool. + sCountInitialized = true; + + // Initialize thread-local APR pool support. + // Because this recursively calls AIAPRRootPool::AIAPRRootPool(void) + // it must be done last, so that sCount is already initialized. + AIThreadLocalData::init(); + } + apr_atomic_inc32(&sCount); +} + +AIAPRRootPool::~AIAPRRootPool() +{ + if (!apr_atomic_dec32(&sCount)) + { + // The last pool was destructed. Cleanup remainder of APR. + LL_INFOS("APR") << "Cleaning up APR" << LL_ENDL; + + if (gLogMutexp) + { + // Clean up the logging mutex + + // All other threads NEED to be done before we clean up APR, so this is okay. + apr_thread_mutex_destroy(gLogMutexp); + gLogMutexp = NULL; + } + if (gCallStacksLogMutexp) + { + // Clean up the logging mutex + + // All other threads NEED to be done before we clean up APR, so this is okay. + apr_thread_mutex_destroy(gCallStacksLogMutexp); + gCallStacksLogMutexp = NULL; + } + + // Must destroy ALL, and therefore this last AIAPRRootPool, before terminating APR. + static_cast(this)->destroy(); + + apr_terminate(); + } +} + +//static +AIAPRRootPool& AIAPRRootPool::get(void) +{ + static AIAPRRootPool global_APRpool(0); // This is what used to be gAPRPoolp. + return global_APRpool; +} + +void AIVolatileAPRPool::clearVolatileAPRPool() +{ + llassert_always(mNumActiveRef > 0); + if (--mNumActiveRef == 0) + { + if (isOld()) + { + destroy(); + mNumTotalRef = 0 ; + } + else + { + // This does not actually free the memory, + // it just allows the pool to re-use this memory for the next allocation. + clear(); + } + } + + // Paranoia check if the pool is jammed. + llassert(mNumTotalRef < (FULL_VOLATILE_APR_POOL << 2)) ; +} diff --git a/indra/llcommon/aiaprpool.h b/indra/llcommon/aiaprpool.h new file mode 100644 index 000000000..72e9ddbd4 --- /dev/null +++ b/indra/llcommon/aiaprpool.h @@ -0,0 +1,238 @@ +/** + * @file aiaprpool.h + * @brief Implementation of AIAPRPool. + * + * Copyright (c) 2010, Aleric Inglewood. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution. + * + * CHANGELOG + * and additional copyright holders. + * + * 04/04/2010 + * - Initial version, written by Aleric Inglewood @ SL + * + * 10/11/2010 + * - Changed filename, class names and license to a more + * company-neutral format. + * - Added APR_HAS_THREADS #if's to allow creation and destruction + * of subpools by threads other than the parent pool owner. + */ + +#ifndef AIAPRPOOL_H +#define AIAPRPOOL_H + +#ifdef LL_WINDOWS +#include // Needed before including apr_portable.h +#endif + +#include "apr_portable.h" +#include "apr_pools.h" +#include "llerror.h" + +extern void ll_init_apr(); + +/** + * @brief A wrapper around the APR memory pool API. + * + * Usage of this class should be restricted to passing it to libapr-1 function calls that need it. + * + */ +class LL_COMMON_API AIAPRPool +{ +protected: + apr_pool_t* mPool; //!< Pointer to the underlaying pool. NULL if not initialized. + AIAPRPool* mParent; //!< Pointer to the parent pool, if any. Only valid when mPool is non-zero. + apr_os_thread_t mOwner; //!< The thread that owns this memory pool. Only valid when mPool is non-zero. + +public: + //! Construct an uninitialized (destructed) pool. + AIAPRPool(void) : mPool(NULL) { } + + //! Construct a subpool from an existing pool. + // This is not a copy-constructor, this class doesn't have one! + AIAPRPool(AIAPRPool& parent) : mPool(NULL) { create(parent); } + + //! Destruct the memory pool (free all of it's subpools and allocated memory). + ~AIAPRPool() { destroy(); } + +protected: + // Create a pool that is allocated from the Operating System. Only used by AIAPRRootPool. + AIAPRPool(int) : mPool(NULL), mParent(NULL), mOwner(apr_os_thread_current()) + { + apr_status_t const apr_pool_create_status = apr_pool_create(&mPool, NULL); + llassert_always(apr_pool_create_status == APR_SUCCESS); + llassert(mPool); + apr_pool_cleanup_register(mPool, this, &s_plain_cleanup, &apr_pool_cleanup_null); + } + +public: + //! Create a subpool from parent. May only be called for an uninitialized/destroyed pool. + // The default parameter causes the root pool of the current thread to be used. + void create(AIAPRPool& parent = *static_cast(NULL)); + + //! Destroy the (sub)pool, if any. + void destroy(void); + + // Use some safebool idiom (http://www.artima.com/cppsource/safebool.html) rather than operator bool. + typedef apr_pool_t* const AIAPRPool::* const bool_type; + //! Return true if the pool is initialized. + operator bool_type() const { return mPool ? &AIAPRPool::mPool : 0; } + + // Painful, but we have to either provide access to this, or wrap + // every APR function call that needs a apr_pool_t* to be passed. + // NEVER destroy a pool that is returned by this function! + apr_pool_t* operator()(void) const + { + llassert(mPool); + llassert(apr_os_thread_equal(mOwner, apr_os_thread_current())); + return mPool; + } + + // Free all memory without destructing the pool. + void clear(void) + { + llassert(mPool); + llassert(apr_os_thread_equal(mOwner, apr_os_thread_current())); + apr_pool_clear(mPool); + } + +// These methods would make this class 'complete' (as wrapper around the libapr +// pool functions), but we don't use memory pools in the viewer (only when +// we are forced to pass one to a libapr call), so don't define them in order +// not to encourage people to use them. +#if 0 + void* palloc(size_t size) + { + llassert(mPool); + llassert(apr_os_thread_equal(mOwner, apr_os_thread_current())); + return apr_palloc(mPool, size); + } + void* pcalloc(size_t size) + { + llassert(mPool); + llassert(apr_os_thread_equal(mOwner, apr_os_thread_current())); + return apr_pcalloc(mPool, size); + } +#endif + +private: + bool parent_is_being_destructed(void); + static apr_status_t s_plain_cleanup(void* userdata) { return static_cast(userdata)->plain_cleanup(); } + + apr_status_t plain_cleanup(void) + { + if (mPool && // We are not being destructed, + parent_is_being_destructed()) // but our parent is. + // This means the pool is being destructed recursively by libapr + // because one of it's parents is being destructed. + { + mPool = NULL; // Stop destroy() from destructing the pool again. + } + return APR_SUCCESS; + } +}; + +class AIAPRInitialization +{ +public: + AIAPRInitialization(void); +}; + +/** + * @brief Root memory pool (allocates memory from the operating system). + * + * This class should only be used by AIThreadLocalData and AIThreadSafeSimpleDCRootPool_pbase + * (and LLMutexRootPool when APR_HAS_THREADS isn't defined). + */ +class LL_COMMON_API AIAPRRootPool : public AIAPRInitialization, public AIAPRPool +{ +private: + friend class AIThreadLocalData; + friend class AIThreadSafeSimpleDCRootPool_pbase; +#if !APR_HAS_THREADS + friend class LLMutexRootPool; +#endif + //! Construct a root memory pool. + // Should only be used by AIThreadLocalData and AIThreadSafeSimpleDCRootPool_pbase. + AIAPRRootPool(void); + ~AIAPRRootPool(); + +private: + // Keep track of how many root pools exist and when the last one is destructed. + static bool sCountInitialized; + static apr_uint32_t volatile sCount; + +public: + // Return a global root pool that is independent of AIThreadLocalData. + // Normally you should not use this. Only use for early initialization + // (before main) and deinitialization (after main). + static AIAPRRootPool& get(void); + +#if APR_POOL_DEBUG + void grab_ownership(void) + { + // You need a patched libapr to use this. + // See http://web.archiveorange.com/archive/v/5XO9y2zoxUOMt6Gmi1OI + apr_pool_owner_set(mPool); + } +#endif + +private: + // Used for constructing the Special Global Root Pool (returned by AIAPRRootPool::get). + // It is the same as the default constructor but omits to increment sCount. As a result, + // we must be sure that at least one other AIAPRRootPool is created before termination + // of the application (which is the case: we create one AIAPRRootPool per thread). + AIAPRRootPool(int) : AIAPRInitialization(), AIAPRPool(0) { } +}; + +//! Volatile memory pool +// +// 'Volatile' APR memory pool which normally only clears memory, +// and does not destroy the pool (the same pool is reused) for +// greater efficiency. However, as a safe guard the apr pool +// is destructed every FULL_VOLATILE_APR_POOL uses to allow +// the system memory to be allocated more efficiently and not +// get scattered through RAM. +// +class LL_COMMON_API AIVolatileAPRPool : protected AIAPRPool +{ +public: + AIVolatileAPRPool(void) : mNumActiveRef(0), mNumTotalRef(0) { } + + apr_pool_t* getVolatileAPRPool(void) + { + if (!mPool) create(); + ++mNumActiveRef; + ++mNumTotalRef; + return AIAPRPool::operator()(); + } + void clearVolatileAPRPool(void); + + bool isOld(void) const { return mNumTotalRef > FULL_VOLATILE_APR_POOL; } + bool isUnused() const { return mNumActiveRef == 0; } + +private: + S32 mNumActiveRef; // Number of active uses of the pool. + S32 mNumTotalRef; // Number of total uses of the pool since last creation. + + // Maximum number of references to AIVolatileAPRPool until the pool is recreated. + static S32 const FULL_VOLATILE_APR_POOL = 1024; +}; + +#endif // AIAPRPOOL_H diff --git a/indra/llcommon/aithreadsafe.h b/indra/llcommon/aithreadsafe.h new file mode 100644 index 000000000..795c15e0a --- /dev/null +++ b/indra/llcommon/aithreadsafe.h @@ -0,0 +1,519 @@ +/** + * @file aithreadsafe.h + * @brief Implementation of AIThreadSafe, AIReadAccessConst, AIReadAccess and AIWriteAccess. + * + * Copyright (c) 2010, Aleric Inglewood. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution. + * + * CHANGELOG + * and additional copyright holders. + * + * 31/03/2010 + * Initial version, written by Aleric Inglewood @ SL + */ + +#ifndef AITHREADSAFE_H +#define AITHREADSAFE_H + +#include + +#include "llthread.h" +#include "llerror.h" + +// g++ 4.2.x (and before?) have the bug that when you try to pass a temporary +// to a function taking a const reference, it still calls the copy constructor. +// Define this to hack around that. +#define AI_NEED_ACCESS_CC (defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ < 3)) || (__GNUC__ < 4))) + +template struct AIReadAccessConst; +template struct AIReadAccess; +template struct AIWriteAccess; +template struct AIAccess; + +template +class AIThreadSafeBits +{ +private: + // AIThreadSafe is a wrapper around an instance of T. + // Because T might not have a default constructor, it is constructed + // 'in place', with placement new, in the memory reserved here. + // + // Make sure that the memory that T will be placed in is properly + // aligned by using an array of long's. + long mMemory[(sizeof(T) + sizeof(long) - 1) / sizeof(long)]; + +public: + // The wrapped objects are constructed in-place with placement new *outside* + // of this object (by AITHREADSAFE macro(s) or derived classes). + // However, we are responsible for the destruction of the wrapped object. + ~AIThreadSafeBits() { ptr()->~T(); } + + // Only for use by AITHREADSAFE, see below. + void* memory() const { return const_cast(&mMemory[0]); } + +protected: + // Accessors. + T const* ptr() const { return reinterpret_cast(mMemory); } + T* ptr() { return reinterpret_cast(mMemory); } + +#if AI_NEED_ACCESS_CC + int mAccessCopyCount; +#endif +}; + +/** + * @brief A wrapper class for objects that need to be accessed by more than one thread, allowing concurrent readers. + * + * Use AITHREADSAFE to define instances of any type, and use AIReadAccessConst, + * AIReadAccess and AIWriteAccess to get access to the instance. + * + * For example, + * + * + * class Foo { public: Foo(int, int); }; + * + * AITHREADSAFE(Foo, foo, (2, 3)); + * + * AIReadAccess foo_r(foo); + * // Use foo_r-> for read access. + * + * AIWriteAccess foo_w(foo); + * // Use foo_w-> for write access. + * + * + * If foo is constant, you have to use AIReadAccessConst. + * + * It is possible to pass access objects to a function that + * downgrades the access, for example: + * + * + * void readfunc(AIReadAccess const& access); + * + * AIWriteAccess foo_w(foo); + * readfunc(foo_w); // readfunc will perform read access to foo_w. + * + * + * If AIReadAccess is non-const, you can upgrade the access by creating + * an AIWriteAccess object from it. For example: + * + * + * AIWriteAccess foo_w(foo_r); + * + * + * This API is Robust(tm). If you try anything that could result in problems, + * it simply won't compile. The only mistake you can still easily make is + * to obtain write access to an object when it is not needed, or to unlock + * an object in between accesses while the state of the object should be + * preserved. For example: + * + * + * // This resets foo to point to the first file and then returns that. + * std::string filename = AIWriteAccess(foo)->get_first_filename(); + * + * // WRONG! The state between calling get_first_filename and get_next_filename should be preserved! + * + * AIWriteAccess foo_w(foo); // Wrong. The code below only needs read-access. + * while (!filename.empty()) + * { + * something(filename); + * filename = foo_w->next_filename(); + * } + * + * + * Correct would be + * + * + * AIReadAccess foo_r(foo); + * std::string filename = AIWriteAccess(foo_r)->get_first_filename(); + * while (!filename.empty()) + * { + * something(filename); + * filename = foo_r->next_filename(); + * } + * + * + */ +template +class AIThreadSafe : public AIThreadSafeBits +{ +protected: + // Only these may access the object (through ptr()). + friend struct AIReadAccessConst; + friend struct AIReadAccess; + friend struct AIWriteAccess; + + // Locking control. + AIRWLock mRWLock; + + // For use by AIThreadSafeDC + AIThreadSafe(void) { } + AIThreadSafe(AIAPRPool& parent) : mRWLock(parent) { } + +public: + // Only for use by AITHREADSAFE, see below. + AIThreadSafe(T* object) { llassert(object == AIThreadSafeBits::ptr()); } +}; + +/** + * @brief Instantiate an static, global or local object of a given type wrapped in AIThreadSafe, using an arbitrary constructor. + * + * For example, instead of doing + * + * + * Foo foo(x, y); + * static Bar bar; + * + * + * One can instantiate a thread-safe instance with + * + * + * AITHREADSAFE(Foo, foo, (x, y)); + * static AITHREADSAFE(Bar, bar, ); + * + * + * Note: This macro does not allow to allocate such object on the heap. + * If that is needed, have a look at AIThreadSafeDC. + */ +#define AITHREADSAFE(type, var, paramlist) AIThreadSafe var(new (var.memory()) type paramlist) + +/** + * @brief A wrapper class for objects that need to be accessed by more than one thread. + * + * This class is the same as an AIThreadSafe wrapper, except that it can only + * be used for default constructed objects. + * + * For example, instead of + * + * + * Foo foo; + * + * + * One would use + * + * + * AIThreadSafeDC foo; + * + * + * The advantage over AITHREADSAFE is that this object can be allocated with + * new on the heap. For example: + * + * + * AIThreadSafeDC* ptr = new AIThreadSafeDC; + * + * + * which is not possible with AITHREADSAFE. + */ +template +class AIThreadSafeDC : public AIThreadSafe +{ +public: + // Construct a wrapper around a default constructed object. + AIThreadSafeDC(void) { new (AIThreadSafe::ptr()) T; } +}; + +/** + * @brief Read lock object and provide read access. + */ +template +struct AIReadAccessConst +{ + //! Internal enum for the lock-type of the AI*Access object. + enum state_type + { + readlocked, //!< A AIReadAccessConst or AIReadAccess. + read2writelocked, //!< A AIWriteAccess constructed from a AIReadAccess. + writelocked, //!< A AIWriteAccess constructed from a AIThreadSafe. + write2writelocked //!< A AIWriteAccess constructed from (the AIReadAccess base class of) a AIWriteAccess. + }; + + //! Construct a AIReadAccessConst from a constant AIThreadSafe. + AIReadAccessConst(AIThreadSafe const& wrapper) + : mWrapper(const_cast&>(wrapper)), + mState(readlocked) + { + mWrapper.mRWLock.rdlock(); +#if AI_NEED_ACCESS_CC + mWrapper.mAccessCopyCount = 1; +#endif + } + + //! Destruct the AI*Access object. + // These should never be dynamically allocated, so there is no need to make this virtual. + ~AIReadAccessConst() + { +#if AI_NEED_ACCESS_CC + if (--(this->mWrapper.mAccessCopyCount) > 0) return; +#endif + if (mState == readlocked) + mWrapper.mRWLock.rdunlock(); + else if (mState == writelocked) + mWrapper.mRWLock.wrunlock(); + else if (mState == read2writelocked) + mWrapper.mRWLock.wr2rdlock(); + } + + //! Access the underlaying object for read access. + T const* operator->() const { return mWrapper.ptr(); } + + //! Access the underlaying object for read access. + T const& operator*() const { return *mWrapper.ptr(); } + +protected: + //! Constructor used by AIReadAccess. + AIReadAccessConst(AIThreadSafe& wrapper, state_type state) + : mWrapper(wrapper), mState(state) { } + + AIThreadSafe& mWrapper; //!< Reference to the object that we provide access to. + state_type const mState; //!< The lock state that mWrapper is in. + +#if !AI_NEED_ACCESS_CC +private: + // Disallow copy constructing directly. + AIReadAccessConst(AIReadAccessConst const&); +#else +public: + AIReadAccessConst(AIReadAccessConst const& orig) : mWrapper(orig.mWrapper), mState(orig.mState) { mWrapper.mAccessCopyCount++; } +#endif +}; + +/** + * @brief Read lock object and provide read access, with possible promotion to write access. + */ +template +struct AIReadAccess : public AIReadAccessConst +{ + typedef typename AIReadAccessConst::state_type state_type; + using AIReadAccessConst::readlocked; + + //! Construct a AIReadAccess from a non-constant AIThreadSafe. + AIReadAccess(AIThreadSafe& wrapper) : AIReadAccessConst(wrapper, readlocked) { this->mWrapper.mRWLock.rdlock(); } + +protected: + //! Constructor used by AIWriteAccess. + AIReadAccess(AIThreadSafe& wrapper, state_type state) : AIReadAccessConst(wrapper, state) { } + + friend struct AIWriteAccess; +}; + +/** + * @brief Write lock object and provide read/write access. + */ +template +struct AIWriteAccess : public AIReadAccess +{ + using AIReadAccessConst::readlocked; + using AIReadAccessConst::read2writelocked; + using AIReadAccessConst::writelocked; + using AIReadAccessConst::write2writelocked; + + //! Construct a AIWriteAccess from a non-constant AIThreadSafe. + AIWriteAccess(AIThreadSafe& wrapper) : AIReadAccess(wrapper, writelocked) { this->mWrapper.mRWLock.wrlock();} + + //! Promote read access to write access. + explicit AIWriteAccess(AIReadAccess& access) + : AIReadAccess(access.mWrapper, (access.mState == readlocked) ? read2writelocked : write2writelocked) + { + if (this->mState == read2writelocked) + { + this->mWrapper.mRWLock.rd2wrlock(); + } + } + + //! Access the underlaying object for (read and) write access. + T* operator->() const { return this->mWrapper.ptr(); } + + //! Access the underlaying object for (read and) write access. + T& operator*() const { return *this->mWrapper.ptr(); } +}; + +/** + * @brief A wrapper class for objects that need to be accessed by more than one thread. + * + * Use AITHREADSAFESIMPLE to define instances of any type, and use AIAccess + * to get access to the instance. + * + * For example, + * + * + * class Foo { public: Foo(int, int); }; + * + * AITHREADSAFESIMPLE(Foo, foo, (2, 3)); + * + * AIAccess foo_w(foo); + * // Use foo_w-> for read and write access. + * + * See also AIThreadSafe + */ +template +class AIThreadSafeSimple : public AIThreadSafeBits +{ +protected: + // Only this one may access the object (through ptr()). + friend struct AIAccess; + + // Locking control. + LLMutex mMutex; + + // For use by AIThreadSafeSimpleDC + AIThreadSafeSimple(void) { } + AIThreadSafeSimple(AIAPRPool& parent) : mMutex(parent) { } + +public: + // Only for use by AITHREADSAFESIMPLE, see below. + AIThreadSafeSimple(T* object) { llassert(object == AIThreadSafeBits::ptr()); } +}; + +/** + * @brief Instantiate an static, global or local object of a given type wrapped in AIThreadSafeSimple, using an arbitrary constructor. + * + * For example, instead of doing + * + * + * Foo foo(x, y); + * static Bar bar; + * + * + * One can instantiate a thread-safe instance with + * + * + * AITHREADSAFESIMPLE(Foo, foo, (x, y)); + * static AITHREADSAFESIMPLE(Bar, bar, ); + * + * + * Note: This macro does not allow to allocate such object on the heap. + * If that is needed, have a look at AIThreadSafeSimpleDC. + */ +#define AITHREADSAFESIMPLE(type, var, paramlist) AIThreadSafeSimple var(new (var.memory()) type paramlist) + +/** + * @brief A wrapper class for objects that need to be accessed by more than one thread. + * + * This class is the same as an AIThreadSafeSimple wrapper, except that it can only + * be used for default constructed objects. + * + * For example, instead of + * + * + * Foo foo; + * + * + * One would use + * + * + * AIThreadSafeSimpleDC foo; + * + * + * The advantage over AITHREADSAFESIMPLE is that this object can be allocated with + * new on the heap. For example: + * + * + * AIThreadSafeSimpleDC* ptr = new AIThreadSafeSimpleDC; + * + * + * which is not possible with AITHREADSAFESIMPLE. + */ +template +class AIThreadSafeSimpleDC : public AIThreadSafeSimple +{ +public: + // Construct a wrapper around a default constructed object. + AIThreadSafeSimpleDC(void) { new (AIThreadSafeSimple::ptr()) T; } + +protected: + // For use by AIThreadSafeSimpleDCRootPool + AIThreadSafeSimpleDC(AIAPRPool& parent) : AIThreadSafeSimple(parent) { new (AIThreadSafeSimple::ptr()) T; } +}; + +// Helper class for AIThreadSafeSimpleDCRootPool to assure initialization of +// the root pool before constructing AIThreadSafeSimpleDC. +class AIThreadSafeSimpleDCRootPool_pbase +{ +protected: + AIAPRRootPool mRootPool; + +private: + template friend class AIThreadSafeSimpleDCRootPool; + AIThreadSafeSimpleDCRootPool_pbase(void) { } +}; + +/** + * @brief A wrapper class for objects that need to be accessed by more than one thread. + * + * The same as AIThreadSafeSimpleDC except that this class creates its own AIAPRRootPool + * for the internally used mutexes and condition, instead of using the current threads + * root pool. The advantage of this is that it can be used for objects that need to + * be accessed from the destructors of global objects (after main). The disadvantage + * is that it's less efficient to use your own root pool, therefore it's use should be + * restricted to those cases where it is absolutely necessary. + */ +template +class AIThreadSafeSimpleDCRootPool : private AIThreadSafeSimpleDCRootPool_pbase, public AIThreadSafeSimpleDC +{ +public: + // Construct a wrapper around a default constructed object, using memory allocated + // from the operating system for the internal APR objects (mutexes and conditional), + // as opposed to allocated from the current threads root pool. + AIThreadSafeSimpleDCRootPool(void) : + AIThreadSafeSimpleDCRootPool_pbase(), + AIThreadSafeSimpleDC(mRootPool) { } +}; + +/** + * @brief Write lock object and provide read/write access. + */ +template +struct AIAccess +{ + //! Construct a AIAccess from a non-constant AIThreadSafeSimple. + AIAccess(AIThreadSafeSimple& wrapper) : mWrapper(wrapper) + { + this->mWrapper.mMutex.lock(); +#if AI_NEED_ACCESS_CC + this->mWrapper.mAccessCopyCount = 1; +#endif + } + + //! Access the underlaying object for (read and) write access. + T* operator->() const { return this->mWrapper.ptr(); } + + //! Access the underlaying object for (read and) write access. + T& operator*() const { return *this->mWrapper.ptr(); } + + ~AIAccess() + { +#if AI_NEED_ACCESS_CC + if (--(this->mWrapper.mAccessCopyCount) > 0) return; +#endif + this->mWrapper.mMutex.unlock(); + } + +protected: + AIThreadSafeSimple& mWrapper; //!< Reference to the object that we provide access to. + +#if !AI_NEED_ACCESS_CC +private: + // Disallow copy constructing directly. + AIAccess(AIAccess const&); +#else +public: + AIAccess(AIAccess const& orig) : mWrapper(orig.mWrapper) { this->mWrapper.mAccessCopyCount++; } +#endif +}; + +#endif diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index fb2fdd814..3bb833a94 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -95,7 +95,6 @@ LLAppChildCallback LLApp::sDefaultChildCallback = NULL; LLApp::LLApp() : mThreadErrorp(NULL) { commonCtor(); - startErrorThread(); } void LLApp::commonCtor() @@ -123,13 +122,8 @@ void LLApp::commonCtor() mOptions.append(sd); } - // Make sure we clean up APR when we exit - // Don't need to do this if we're cleaning up APR in the destructor - //atexit(ll_cleanup_apr); - // Set the application to this instance. sApplication = this; - } LLApp::LLApp(LLErrorThread *error_thread) : diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index 77cb17c1a..d5cf6ea93 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -256,9 +256,12 @@ protected: */ void stepFrame(); -private: + /** + * @ brief This method is called once as soon as logging is initialized. + */ void startErrorThread(); - + +private: void setupErrorHandling(); // Do platform-specific error-handling setup (signals, structured exceptions) static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred. static void runSyncErrorHandler(); // run IMMEDIATELY when we get an error, ran in the context of the faulting thread. diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index 7210bd2b1..9595707cb 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -34,219 +34,7 @@ #include "linden_common.h" #include "llapr.h" - -apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool -apr_thread_mutex_t *gLogMutexp = NULL; -apr_thread_mutex_t *gCallStacksLogMutexp = NULL; - -const S32 FULL_VOLATILE_APR_POOL = 1024 ; //number of references to LLVolatileAPRPool - -void ll_init_apr() -{ - if (!gAPRPoolp) - { - // Initialize APR and create the global pool - apr_initialize(); - apr_pool_create(&gAPRPoolp, NULL); - - // Initialize the logging mutex - apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp); - apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp); - - // Initialize thread-local APR pool support. - LLVolatileAPRPool::initLocalAPRFilePool(); - } -} - - -void ll_cleanup_apr() -{ - LL_INFOS("APR") << "Cleaning up APR" << LL_ENDL; - - if (gLogMutexp) - { - // Clean up the logging mutex - - // All other threads NEED to be done before we clean up APR, so this is okay. - apr_thread_mutex_destroy(gLogMutexp); - gLogMutexp = NULL; - } - if (gCallStacksLogMutexp) - { - // Clean up the logging mutex - - // All other threads NEED to be done before we clean up APR, so this is okay. - apr_thread_mutex_destroy(gCallStacksLogMutexp); - gCallStacksLogMutexp = NULL; - } - if (gAPRPoolp) - { - apr_pool_destroy(gAPRPoolp); - gAPRPoolp = NULL; - } - apr_terminate(); -} - -// -// -//LLAPRPool -// -LLAPRPool::LLAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag) - : mParent(parent), - mReleasePoolFlag(releasePoolFlag), - mMaxSize(size), - mPool(NULL) -{ - createAPRPool() ; -} - -LLAPRPool::~LLAPRPool() -{ - releaseAPRPool() ; -} - -void LLAPRPool::createAPRPool() -{ - if(mPool) - { - return ; - } - - mStatus = apr_pool_create(&mPool, mParent); - ll_apr_warn_status(mStatus) ; - - if(mMaxSize > 0) //size is the number of blocks (which is usually 4K), NOT bytes. - { - apr_allocator_t *allocator = apr_pool_allocator_get(mPool); - if (allocator) - { - apr_allocator_max_free_set(allocator, mMaxSize) ; - } - } -} - -void LLAPRPool::releaseAPRPool() -{ - if(!mPool) - { - return ; - } - - if(!mParent || mReleasePoolFlag) - { - apr_pool_destroy(mPool) ; - mPool = NULL ; - } -} - -apr_pool_t* LLAPRPool::getAPRPool() -{ - if(!mPool) - { - createAPRPool() ; - } - - return mPool ; -} -LLVolatileAPRPool::LLVolatileAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag) - : LLAPRPool(parent, size, releasePoolFlag) -{ - mNumActiveRef = 0 ; - mNumTotalRef = 0 ; -} - -apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool() -{ - mNumTotalRef++ ; - mNumActiveRef++ ; - return getAPRPool() ; -} - -void LLVolatileAPRPool::clearVolatileAPRPool() -{ - if(mNumActiveRef > 0) - { - mNumActiveRef--; - if(mNumActiveRef < 1) - { - if(isFull()) - { - mNumTotalRef = 0 ; - - //destroy the apr_pool. - releaseAPRPool() ; - } - else - { - //This does not actually free the memory, - //it just allows the pool to re-use this memory for the next allocation. - apr_pool_clear(mPool) ; - } - } - } - else - { - llassert_always(mNumActiveRef > 0) ; - } - - //paranoia check if the pool is jammed. - //will remove the check before going to release. - llassert_always(mNumTotalRef < (FULL_VOLATILE_APR_POOL << 2)) ; -} - -BOOL LLVolatileAPRPool::isFull() -{ - return mNumTotalRef > FULL_VOLATILE_APR_POOL ; -} - -#ifdef SHOW_ASSERT -// This allows the use of llassert(is_main_thread()) to assure the current thread is the main thread. -static void* gIsMainThread; -bool is_main_thread() { return gIsMainThread == LLVolatileAPRPool::getLocalAPRFilePool(); } -#endif - -// The thread private handle to access the LocalAPRFilePool. -apr_threadkey_t* LLVolatileAPRPool::sLocalAPRFilePoolKey; - -// This should be called exactly once, before the first call to createLocalAPRFilePool. -// static -void LLVolatileAPRPool::initLocalAPRFilePool() -{ - apr_status_t status = apr_threadkey_private_create(&sLocalAPRFilePoolKey, &destroyLocalAPRFilePool, gAPRPoolp); - ll_apr_assert_status(status); // Or out of memory, or system-imposed limit on the - // total number of keys per process {PTHREAD_KEYS_MAX} - // has been exceeded. - // Create the thread-local pool for the main thread (this function is called by the main thread). - createLocalAPRFilePool(); -#ifdef SHOW_ASSERT - gIsMainThread = getLocalAPRFilePool(); -#endif -} - -// This should be called once for every thread, before it uses getLocalAPRFilePool. -// static -void LLVolatileAPRPool::createLocalAPRFilePool() -{ - void* thread_local_data = new LLVolatileAPRPool; - apr_status_t status = apr_threadkey_private_set(thread_local_data, sLocalAPRFilePoolKey); - llassert_always(status == APR_SUCCESS); -} - -// This is called once for every thread when the thread is destructed. -// static -void LLVolatileAPRPool::destroyLocalAPRFilePool(void* thread_local_data) -{ - delete reinterpret_cast(thread_local_data); -} - -// static -LLVolatileAPRPool* LLVolatileAPRPool::getLocalAPRFilePool() -{ - void* thread_local_data; - apr_status_t status = apr_threadkey_private_get(&thread_local_data, sLocalAPRFilePoolKey); - llassert_always(status == APR_SUCCESS); - return reinterpret_cast(thread_local_data); -} +#include "llscopedvolatileaprpool.h" //--------------------------------------------------------------------- // @@ -309,13 +97,15 @@ void ll_apr_assert_status(apr_status_t status) // LLAPRFile::LLAPRFile() : mFile(NULL), - mCurrentFilePoolp(NULL) + mVolatileFilePoolp(NULL), + mRegularFilePoolp(NULL) { } LLAPRFile::LLAPRFile(const std::string& filename, apr_int32_t flags, access_t access_type) : mFile(NULL), - mCurrentFilePoolp(NULL) + mVolatileFilePoolp(NULL), + mRegularFilePoolp(NULL) { open(filename, flags, access_type); } @@ -334,10 +124,16 @@ apr_status_t LLAPRFile::close() mFile = NULL ; } - if(mCurrentFilePoolp) + if (mVolatileFilePoolp) { - mCurrentFilePoolp->clearVolatileAPRPool() ; - mCurrentFilePoolp = NULL ; + mVolatileFilePoolp->clearVolatileAPRPool() ; + mVolatileFilePoolp = NULL ; + } + + if (mRegularFilePoolp) + { + delete mRegularFilePoolp; + mRegularFilePoolp = NULL; } return ret ; @@ -346,25 +142,28 @@ apr_status_t LLAPRFile::close() apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, access_t access_type, S32* sizep) { llassert_always(!mFile); - llassert_always(!mCurrentFilePoolp); + llassert_always(!mVolatileFilePoolp && !mRegularFilePoolp); - // Access the pool and increment it's reference count. - // The reference count of LLVolatileAPRPool objects will be decremented - // again in LLAPRFile::close by calling mCurrentFilePoolp->clearVolatileAPRPool(). - apr_pool_t* pool; - if (access_type == local) + apr_status_t status; { - // Use a "volatile" thread-local pool. - mCurrentFilePoolp = LLVolatileAPRPool::getLocalAPRFilePool(); - pool = mCurrentFilePoolp->getVolatileAPRPool(); + apr_pool_t* apr_file_open_pool; + if (access_type == local) + { + // Use a "volatile" thread-local pool. + mVolatileFilePoolp = &AIThreadLocalData::tldata().mVolatileAPRPool; + // Access the pool and increment it's reference count. + // The reference count of AIVolatileAPRPool objects will be decremented + // again in LLAPRFile::close by calling mVolatileFilePoolp->clearVolatileAPRPool(). + apr_file_open_pool = mVolatileFilePoolp->getVolatileAPRPool(); + } + else + { + mRegularFilePoolp = new AIAPRPool(AIThreadLocalData::tldata().mRootPool); + apr_file_open_pool = (*mRegularFilePoolp)(); + } + status = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, apr_file_open_pool); } - else - { - llassert(is_main_thread()); - pool = gAPRPoolp; - } - apr_status_t s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, pool); - if (s != APR_SUCCESS || !mFile) + if (status != APR_SUCCESS || !mFile) { mFile = NULL ; close() ; @@ -372,7 +171,7 @@ apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, acc { *sizep = 0; } - return s; + return status; } if (sizep) @@ -389,7 +188,7 @@ apr_status_t LLAPRFile::open(std::string const& filename, apr_int32_t flags, acc *sizep = file_size; } - return s; + return status; } // File I/O @@ -449,17 +248,6 @@ S32 LLAPRFile::seek(apr_seek_where_t where, S32 offset) //static components of LLAPRFile // -// Used in the static functions below. -class LLScopedVolatileAPRFilePool { -private: - LLVolatileAPRPool* mPool; - apr_pool_t* apr_pool; -public: - LLScopedVolatileAPRFilePool() : mPool(LLVolatileAPRPool::getLocalAPRFilePool()), apr_pool(mPool->getVolatileAPRPool()) { } - ~LLScopedVolatileAPRFilePool() { mPool->clearVolatileAPRPool(); } - operator apr_pool_t*() const { return apr_pool; } -}; - //static S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset) { @@ -496,7 +284,7 @@ S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset) S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes) { apr_file_t* file_handle; - LLScopedVolatileAPRFilePool pool; + LLScopedVolatileAPRPool pool; apr_status_t s = apr_file_open(&file_handle, filename.c_str(), APR_READ|APR_BINARY, APR_OS_DEFAULT, pool); if (s != APR_SUCCESS || !file_handle) { @@ -548,7 +336,7 @@ S32 LLAPRFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 n } apr_file_t* file_handle; - LLScopedVolatileAPRFilePool pool; + LLScopedVolatileAPRPool pool; apr_status_t s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool); if (s != APR_SUCCESS || !file_handle) { @@ -593,7 +381,7 @@ bool LLAPRFile::remove(const std::string& filename) { apr_status_t s; - LLScopedVolatileAPRFilePool pool; + LLScopedVolatileAPRPool pool; s = apr_file_remove(filename.c_str(), pool); if (s != APR_SUCCESS) @@ -613,7 +401,7 @@ bool LLAPRFile::rename(const std::string& filename, const std::string& newname) { apr_status_t s; - LLScopedVolatileAPRFilePool pool; + LLScopedVolatileAPRPool pool; s = apr_file_rename(filename.c_str(), newname.c_str(), pool); if (s != APR_SUCCESS) @@ -631,7 +419,7 @@ bool LLAPRFile::isExist(const std::string& filename, apr_int32_t flags) apr_file_t* file_handle; apr_status_t s; - LLScopedVolatileAPRFilePool pool; + LLScopedVolatileAPRPool pool; s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool); if (s != APR_SUCCESS || !file_handle) @@ -652,7 +440,7 @@ S32 LLAPRFile::size(const std::string& filename) apr_finfo_t info; apr_status_t s; - LLScopedVolatileAPRFilePool pool; + LLScopedVolatileAPRPool pool; s = apr_file_open(&file_handle, filename.c_str(), APR_READ, APR_OS_DEFAULT, pool); if (s != APR_SUCCESS || !file_handle) @@ -681,7 +469,7 @@ bool LLAPRFile::makeDir(const std::string& dirname) { apr_status_t s; - LLScopedVolatileAPRFilePool pool; + LLScopedVolatileAPRPool pool; s = apr_dir_make(dirname.c_str(), APR_FPROT_OS_DEFAULT, pool); if (s != APR_SUCCESS) @@ -698,7 +486,7 @@ bool LLAPRFile::removeDir(const std::string& dirname) { apr_status_t s; - LLScopedVolatileAPRFilePool pool; + LLScopedVolatileAPRPool pool; s = apr_file_remove(dirname.c_str(), pool); if (s != APR_SUCCESS) diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h index 2aed51511..ded15f531 100644 --- a/indra/llcommon/llapr.h +++ b/indra/llcommon/llapr.h @@ -48,73 +48,8 @@ #include "apr_atomic.h" #include "llstring.h" -extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp; - -/** - * @brief initialize the common apr constructs -- apr itself, the - * global pool, and a mutex. - */ -void LL_COMMON_API ll_init_apr(); - -/** - * @brief Cleanup those common apr constructs. - */ -void LL_COMMON_API ll_cleanup_apr(); - -// -//LL apr_pool -//manage apr_pool_t, destroy allocated apr_pool in the destruction function. -// -class LL_COMMON_API LLAPRPool -{ -public: - LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ; - ~LLAPRPool() ; - - apr_pool_t* getAPRPool() ; - apr_status_t getStatus() {return mStatus ; } - -protected: - void releaseAPRPool() ; - void createAPRPool() ; - -protected: - apr_pool_t* mPool ; //pointing to an apr_pool - apr_pool_t* mParent ; //parent pool - apr_size_t mMaxSize ; //max size of mPool, mPool should return memory to system if allocated memory beyond this limit. However it seems not to work. - apr_status_t mStatus ; //status when creating the pool - BOOL mReleasePoolFlag ; //if set, mPool is destroyed when LLAPRPool is deleted. default value is true. -}; - -// -//volatile LL apr_pool -//which clears memory automatically. -//so it can not hold static data or data after memory is cleared -// -class LL_COMMON_API LLVolatileAPRPool : protected LLAPRPool -{ -public: - LLVolatileAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE); - ~LLVolatileAPRPool(){} - - apr_pool_t* getVolatileAPRPool() ; - - void clearVolatileAPRPool() ; - - BOOL isFull() ; - BOOL isEmpty() {return !mNumActiveRef ;} - - static void initLocalAPRFilePool(); - static void createLocalAPRFilePool(); - static void destroyLocalAPRFilePool(void* thread_local_data); - static LLVolatileAPRPool* getLocalAPRFilePool(); - -private: - S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool. - S32 mNumTotalRef ; //number of total pointers pointing to the apr_pool since last creating. - - static apr_threadkey_t* sLocalAPRFilePoolKey; -} ; +class AIAPRPool; +class AIVolatileAPRPool; /** * @class LLScopedLock @@ -205,7 +140,8 @@ class LL_COMMON_API LLAPRFile : boost::noncopyable // make this non copyable since a copy closes the file private: apr_file_t* mFile ; - LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool. + AIVolatileAPRPool* mVolatileFilePoolp; // (Thread local) APR pool currently in use. + AIAPRPool* mRegularFilePoolp; // ...or a regular pool. public: enum access_t { @@ -260,6 +196,4 @@ bool LL_COMMON_API ll_apr_warn_status(apr_status_t status); void LL_COMMON_API ll_apr_assert_status(apr_status_t status); -extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool - #endif // LL_LLAPR_H diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp index 2cbb71855..298dd4695 100644 --- a/indra/llcommon/llcommon.cpp +++ b/indra/llcommon/llcommon.cpp @@ -34,18 +34,10 @@ #include "llcommon.h" #include "llthread.h" -//static -BOOL LLCommon::sAprInitialized = FALSE; - //static void LLCommon::initClass() { LLMemory::initClass(); - if (!sAprInitialized) - { - ll_init_apr(); - sAprInitialized = TRUE; - } LLTimer::initClass(); LLThreadSafeRefCount::initThreadSafeRefCount(); // LLWorkerThread::initClass(); @@ -59,10 +51,5 @@ void LLCommon::cleanupClass() // LLWorkerThread::cleanupClass(); LLThreadSafeRefCount::cleanupThreadSafeRefCount(); LLTimer::cleanupClass(); - if (sAprInitialized) - { - ll_cleanup_apr(); - sAprInitialized = FALSE; - } LLMemory::cleanupClass(); } diff --git a/indra/llcommon/llcommon.h b/indra/llcommon/llcommon.h index 851d4ac2d..300ebe2b2 100644 --- a/indra/llcommon/llcommon.h +++ b/indra/llcommon/llcommon.h @@ -43,8 +43,6 @@ class LL_COMMON_API LLCommon public: static void initClass(); static void cleanupClass(); -private: - static BOOL sAprInitialized; }; #endif diff --git a/indra/llcommon/lldictionary.cpp b/indra/llcommon/lldictionary.cpp new file mode 100644 index 000000000..e85c26877 --- /dev/null +++ b/indra/llcommon/lldictionary.cpp @@ -0,0 +1,54 @@ +/** + * @file lldictionary.cpp + * @brief Lldictionary class header file + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + */ + +#include "linden_common.h" + +#include "lldictionary.h" + +#include "llstring.h" + +// Define in .cpp file to prevent header include of llstring.h +LLDictionaryEntry::LLDictionaryEntry(const std::string &name) +: mName(name) +{ + mNameCapitalized = mName; + LLStringUtil::replaceChar(mNameCapitalized, '-', ' '); + LLStringUtil::replaceChar(mNameCapitalized, '_', ' '); + for (U32 i=0; i < mNameCapitalized.size(); i++) + { + if (i == 0 || mNameCapitalized[i-1] == ' ') // don't change ordering of this statement or crash + { + mNameCapitalized[i] = toupper(mNameCapitalized[i]); + } + } +} diff --git a/indra/llcommon/lldictionary.h b/indra/llcommon/lldictionary.h new file mode 100644 index 000000000..7530b4fa7 --- /dev/null +++ b/indra/llcommon/lldictionary.h @@ -0,0 +1,103 @@ +/** + * @file lldictionary.h + * @brief Lldictionary class header file + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + */ + +#ifndef LL_LLDICTIONARY_H +#define LL_LLDICTIONARY_H + +#include +#include + +struct LL_COMMON_API LLDictionaryEntry +{ + LLDictionaryEntry(const std::string &name); + virtual ~LLDictionaryEntry() {} + const std::string mName; + std::string mNameCapitalized; +}; + +template +class LLDictionary : public std::map +{ +public: + typedef std::map map_t; + typedef typename map_t::iterator iterator_t; + typedef typename map_t::const_iterator const_iterator_t; + + LLDictionary() {} + virtual ~LLDictionary() + { + for (iterator_t iter = map_t::begin(); iter != map_t::end(); ++iter) + delete (iter->second); + } + + const Entry *lookup(Index index) const + { + const_iterator_t dictionary_iter = map_t::find(index); + if (dictionary_iter == map_t::end()) return NULL; + return dictionary_iter->second; + } + const Index lookup(const std::string &name) const + { + for (const_iterator_t dictionary_iter = map_t::begin(); + dictionary_iter != map_t::end(); + dictionary_iter++) + { + const Entry *entry = dictionary_iter->second; + if (entry->mName == name) + { + return dictionary_iter->first; + } + } + return notFound(); + } + +protected: + virtual Index notFound() const + { + // default is to assert + // don't assert -- makes it impossible to work on mesh-development and viewer-development simultaneously + // -- davep 2010.10.29 + //llassert(false); + return Index(-1); + } + void addEntry(Index index, Entry *entry) + { + if (lookup(index)) + { + llerrs << "Dictionary entry already added (attempted to add duplicate entry)" << llendl; + } + (*this)[index] = entry; + } +}; + +#endif // LL_LLDICTIONARY_H diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index e549979f0..4cdfe097d 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -55,6 +55,7 @@ #include "llsdserialize.h" #include "llstl.h" #include "lltimer.h" +#include "aithreadsafe.h" extern apr_thread_mutex_t* gCallStacksLogMutexp; @@ -357,12 +358,15 @@ namespace void addCallSite(LLError::CallSite&); void invalidateCallSites(); - static Globals& get(); + static AIThreadSafeSimple& get(); // return the one instance of the globals private: CallSiteVector callSites; + friend class AIThreadSafeSimpleDC; // Calls constructor. + friend class AIThreadSafeSimple; // Calls destructor. + Globals() : messageStreamInUse(false) { } @@ -386,7 +390,7 @@ namespace callSites.clear(); } - Globals& Globals::get() + AIThreadSafeSimple& Globals::get() { /* This pattern, of returning a reference to a static function variable, is to ensure that this global is constructed before @@ -394,8 +398,8 @@ namespace is. See C++ FAQ Lite, sections 10.12 through 10.14 */ - static Globals* globals = new Globals; - return *globals; + static AIThreadSafeSimpleDCRootPool* ts_globals_ptr = new AIThreadSafeSimpleDCRootPool; + return *ts_globals_ptr; } } @@ -424,13 +428,16 @@ namespace LLError int shouldLogCallCounter; - static Settings& get(); + static AIThreadSafeSimple& get(); static void reset(); - static Settings* saveAndReset(); - static void restore(Settings*); + static AIThreadSafeSimple* saveAndReset(); + static void restore(AIThreadSafeSimple*); private: + friend class AIThreadSafeBits; // Calls destructor. + friend class AIThreadSafeSimpleDC; // Calls constructor. + Settings() : printLocation(false), defaultLevel(LLError::LEVEL_DEBUG), @@ -446,53 +453,42 @@ namespace LLError for_each(recorders.begin(), recorders.end(), DeletePointer()); } - - static Settings*& getPtr(); + + static AIThreadSafeSimple* sSettings; }; + + // Pointer to current AIThreadSafeSimple object if any (NULL otherwise). + AIThreadSafeSimple* Settings::sSettings; - Settings& Settings::get() + AIThreadSafeSimple& Settings::get() { - Settings* p = getPtr(); - if (!p) + if (!sSettings) { reset(); - p = getPtr(); } - return *p; + return *sSettings; } void Settings::reset() { - Globals::get().invalidateCallSites(); - - Settings*& p = getPtr(); - delete p; - p = new Settings(); + AIAccess(Globals::get())->invalidateCallSites(); + delete sSettings; + sSettings = new AIThreadSafeSimpleDC; } - Settings* Settings::saveAndReset() + AIThreadSafeSimple* Settings::saveAndReset() { - Globals::get().invalidateCallSites(); - - Settings*& p = getPtr(); - Settings* originalSettings = p; - p = new Settings(); + AIAccess(Globals::get())->invalidateCallSites(); + AIThreadSafeSimple* originalSettings = sSettings; + sSettings = new AIThreadSafeSimpleDC; return originalSettings; } - void Settings::restore(Settings* originalSettings) + void Settings::restore(AIThreadSafeSimple* originalSettings) { - Globals::get().invalidateCallSites(); - - Settings*& p = getPtr(); - delete p; - p = originalSettings; - } - - Settings*& Settings::getPtr() - { - static Settings* currentSettings = NULL; - return currentSettings; + AIAccess(Globals::get())->invalidateCallSites(); + delete sSettings; + sSettings = originalSettings; } } @@ -596,68 +592,64 @@ namespace LLError commonInit(dir); } + void setPrintLocation(AIAccess const& settings_w, bool print) + { + settings_w->printLocation = print; + } + void setPrintLocation(bool print) { - Settings& s = Settings::get(); - s.printLocation = print; + setPrintLocation(AIAccess(Settings::get()), print); } void setFatalFunction(const FatalFunction& f) { - Settings& s = Settings::get(); - s.crashFunction = f; + AIAccess(Settings::get())->crashFunction = f; } FatalFunction getFatalFunction() { - Settings& s = Settings::get(); - return s.crashFunction; + return AIAccess(Settings::get())->crashFunction; } void setTimeFunction(TimeFunction f) { - Settings& s = Settings::get(); - s.timeFunction = f; + AIAccess(Settings::get())->timeFunction = f; + } + + void setDefaultLevel(AIAccess const& settings_w, ELevel level) + { + AIAccess(Globals::get())->invalidateCallSites(); + settings_w->defaultLevel = level; } void setDefaultLevel(ELevel level) { - Globals& g = Globals::get(); - Settings& s = Settings::get(); - g.invalidateCallSites(); - s.defaultLevel = level; + setDefaultLevel(AIAccess(Settings::get()), level); } void setFunctionLevel(const std::string& function_name, ELevel level) { - Globals& g = Globals::get(); - Settings& s = Settings::get(); - g.invalidateCallSites(); - s.functionLevelMap[function_name] = level; + AIAccess(Globals::get())->invalidateCallSites(); + AIAccess(Settings::get())->functionLevelMap[function_name] = level; } void setClassLevel(const std::string& class_name, ELevel level) { - Globals& g = Globals::get(); - Settings& s = Settings::get(); - g.invalidateCallSites(); - s.classLevelMap[class_name] = level; + AIAccess(Globals::get())->invalidateCallSites(); + AIAccess(Settings::get())->classLevelMap[class_name] = level; } void setFileLevel(const std::string& file_name, ELevel level) { - Globals& g = Globals::get(); - Settings& s = Settings::get(); - g.invalidateCallSites(); - s.fileLevelMap[file_name] = level; + AIAccess(Globals::get())->invalidateCallSites(); + AIAccess(Settings::get())->fileLevelMap[file_name] = level; } void setTagLevel(const std::string& tag_name, ELevel level) { - Globals& g = Globals::get(); - Settings& s = Settings::get(); - g.invalidateCallSites(); - s.tagLevelMap[tag_name] = level; + AIAccess(Globals::get())->invalidateCallSites(); + AIAccess(Settings::get())->tagLevelMap[tag_name] = level; } } @@ -701,18 +693,16 @@ namespace LLError { void configure(const LLSD& config) { - Globals& g = Globals::get(); - Settings& s = Settings::get(); + AIAccess settings_w(Settings::get()); + AIAccess(Globals::get())->invalidateCallSites(); + settings_w->functionLevelMap.clear(); + settings_w->classLevelMap.clear(); + settings_w->fileLevelMap.clear(); + settings_w->tagLevelMap.clear(); + settings_w->uniqueLogMessages.clear(); - g.invalidateCallSites(); - s.functionLevelMap.clear(); - s.classLevelMap.clear(); - s.fileLevelMap.clear(); - s.tagLevelMap.clear(); - s.uniqueLogMessages.clear(); - - setPrintLocation(config["print-location"]); - setDefaultLevel(decodeLevel(config["default-level"])); + setPrintLocation(settings_w, config["print-location"]); + setDefaultLevel(settings_w, decodeLevel(config["default-level"])); LLSD sets = config["settings"]; LLSD::array_const_iterator a, end; @@ -722,10 +712,10 @@ namespace LLError ELevel level = decodeLevel(entry["level"]); - setLevels(s.functionLevelMap, entry["functions"], level); - setLevels(s.classLevelMap, entry["classes"], level); - setLevels(s.fileLevelMap, entry["files"], level); - setLevels(s.tagLevelMap, entry["tags"], level); + setLevels(settings_w->functionLevelMap, entry["functions"], level); + setLevels(settings_w->classLevelMap, entry["classes"], level); + setLevels(settings_w->fileLevelMap, entry["files"], level); + setLevels(settings_w->tagLevelMap, entry["tags"], level); } } } @@ -742,26 +732,34 @@ namespace LLError - void addRecorder(Recorder* recorder) + void addRecorder(AIAccess const& settings_w, Recorder* recorder) { if (recorder == NULL) { return; } - Settings& s = Settings::get(); - s.recorders.push_back(recorder); + settings_w->recorders.push_back(recorder); + } + + void addRecorder(Recorder* recorder) + { + addRecorder(AIAccess(Settings::get()), recorder); + } + + void removeRecorder(AIAccess const& settings_w, Recorder* recorder) + { + if (recorder == NULL) + { + return; + } + settings_w->recorders.erase( + std::remove(settings_w->recorders.begin(), settings_w->recorders.end(), recorder), + settings_w->recorders.end()); } void removeRecorder(Recorder* recorder) { - if (recorder == NULL) - { - return; - } - Settings& s = Settings::get(); - s.recorders.erase( - std::remove(s.recorders.begin(), s.recorders.end(), recorder), - s.recorders.end()); + removeRecorder(AIAccess(Settings::get()), recorder); } } @@ -769,12 +767,12 @@ namespace LLError { void logToFile(const std::string& file_name) { - LLError::Settings& s = LLError::Settings::get(); + AIAccess settings_w(Settings::get()); - removeRecorder(s.fileRecorder); - delete s.fileRecorder; - s.fileRecorder = NULL; - s.fileRecorderFileName.clear(); + removeRecorder(settings_w, settings_w->fileRecorder); + delete settings_w->fileRecorder; + settings_w->fileRecorder = NULL; + settings_w->fileRecorderFileName.clear(); if (file_name.empty()) { @@ -788,54 +786,51 @@ namespace LLError return; } - s.fileRecorderFileName = file_name; - s.fileRecorder = f; - addRecorder(f); + settings_w->fileRecorderFileName = file_name; + settings_w->fileRecorder = f; + addRecorder(settings_w, f); } void logToFixedBuffer(LLLineBuffer* fixedBuffer) { - LLError::Settings& s = LLError::Settings::get(); + AIAccess settings_w(Settings::get()); - removeRecorder(s.fixedBufferRecorder); - delete s.fixedBufferRecorder; - s.fixedBufferRecorder = NULL; + removeRecorder(settings_w, settings_w->fixedBufferRecorder); + delete settings_w->fixedBufferRecorder; + settings_w->fixedBufferRecorder = NULL; if (!fixedBuffer) { return; } - s.fixedBufferRecorder = new RecordToFixedBuffer(fixedBuffer); - addRecorder(s.fixedBufferRecorder); + settings_w->fixedBufferRecorder = new RecordToFixedBuffer(fixedBuffer); + addRecorder(settings_w, settings_w->fixedBufferRecorder); } std::string logFileName() { - LLError::Settings& s = LLError::Settings::get(); - return s.fileRecorderFileName; + return AIAccess(Settings::get())->fileRecorderFileName; } } namespace { - void writeToRecorders(LLError::ELevel level, const std::string& message) + void writeToRecorders(AIAccess const& settings_w, LLError::ELevel level, const std::string& message) { - LLError::Settings& s = LLError::Settings::get(); - std::string messageWithTime; - - for (Recorders::const_iterator i = s.recorders.begin(); - i != s.recorders.end(); + + for (Recorders::const_iterator i = settings_w->recorders.begin(); + i != settings_w->recorders.end(); ++i) { LLError::Recorder* r = *i; - if (r->wantsTime() && s.timeFunction != NULL) + if (r->wantsTime() && settings_w->timeFunction != NULL) { if (messageWithTime.empty()) { - messageWithTime = s.timeFunction() + " " + message; + messageWithTime = settings_w->timeFunction() + " " + message; } r->recordMessage(level, messageWithTime); @@ -877,6 +872,9 @@ You get: */ +apr_thread_mutex_t* gLogMutexp; +apr_thread_mutex_t* gCallStacksLogMutexp; + namespace { bool checkLevelMap(const LevelMap& map, const std::string& key, LLError::ELevel& level) @@ -952,10 +950,9 @@ namespace LLError return false; } - Globals& g = Globals::get(); - Settings& s = Settings::get(); + AIAccess settings_w(Settings::get()); - s.shouldLogCallCounter += 1; + settings_w->shouldLogCallCounter += 1; std::string class_name = className(site.mClassInfo); std::string function_name = functionName(site.mFunction); @@ -964,20 +961,20 @@ namespace LLError function_name = class_name + "::" + function_name; } - ELevel compareLevel = s.defaultLevel; + ELevel compareLevel = settings_w->defaultLevel; // The most specific match found will be used as the log level, // since the computation short circuits. // So, in increasing order of importance: // Default < Broad Tag < File < Class < Function < Narrow Tag - ((site.mNarrowTag != NULL) ? checkLevelMap(s.tagLevelMap, site.mNarrowTag, compareLevel) : false) - || checkLevelMap(s.functionLevelMap, function_name, compareLevel) - || checkLevelMap(s.classLevelMap, class_name, compareLevel) - || checkLevelMap(s.fileLevelMap, abbreviateFile(site.mFile), compareLevel) - || ((site.mBroadTag != NULL) ? checkLevelMap(s.tagLevelMap, site.mBroadTag, compareLevel) : false); + ((site.mNarrowTag != NULL) ? checkLevelMap(settings_w->tagLevelMap, site.mNarrowTag, compareLevel) : false) + || checkLevelMap(settings_w->functionLevelMap, function_name, compareLevel) + || checkLevelMap(settings_w->classLevelMap, class_name, compareLevel) + || checkLevelMap(settings_w->fileLevelMap, abbreviateFile(site.mFile), compareLevel) + || ((site.mBroadTag != NULL) ? checkLevelMap(settings_w->tagLevelMap, site.mBroadTag, compareLevel) : false); site.mCached = true; - g.addCallSite(site); + AIAccess(Globals::get())->addCallSite(site); return site.mShouldLog = site.mLevel >= compareLevel; } @@ -987,16 +984,16 @@ namespace LLError LogLock lock; if (lock.ok()) { - Globals& g = Globals::get(); + AIAccess globals(Globals::get()); - if (!g.messageStreamInUse) + if (!globals->messageStreamInUse) { - g.messageStreamInUse = true; - return &g.messageStream; + globals->messageStreamInUse = true; + return &globals->messageStream; // Returns pointer to member of unlocked object, apparently "protected" by having set globals->messageStreamInUse. } } - return new std::ostringstream; + return new std::ostringstream; // Holy memory leak. } void Log::flush(std::ostringstream* out, char* message) @@ -1017,12 +1014,12 @@ namespace LLError message[127] = '\0' ; } - Globals& g = Globals::get(); - if (out == &g.messageStream) + AIAccess globals(Globals::get()); + if (out == &globals->messageStream) { - g.messageStream.clear(); - g.messageStream.str(""); - g.messageStreamInUse = false; + globals->messageStream.clear(); + globals->messageStream.str(""); + globals->messageStreamInUse = false; } else { @@ -1039,28 +1036,31 @@ namespace LLError return; } - Globals& g = Globals::get(); - Settings& s = Settings::get(); - std::string message = out->str(); - if (out == &g.messageStream) + { - g.messageStream.clear(); - g.messageStream.str(""); - g.messageStreamInUse = false; - } - else - { - delete out; + AIAccess globals(Globals::get()); + if (out == &globals->messageStream) + { + globals->messageStream.clear(); + globals->messageStream.str(""); + globals->messageStreamInUse = false; + } + else + { + delete out; + } } + AIAccess settings_w(Settings::get()); + if (site.mLevel == LEVEL_ERROR) { std::ostringstream fatalMessage; fatalMessage << abbreviateFile(site.mFile) << "(" << site.mLine << ") : error"; - writeToRecorders(site.mLevel, fatalMessage.str()); + writeToRecorders(settings_w, site.mLevel, fatalMessage.str()); } @@ -1075,7 +1075,7 @@ namespace LLError default: prefix << "XXX: "; break; }; - if (s.printLocation) + if (settings_w->printLocation) { prefix << abbreviateFile(site.mFile) << "(" << site.mLine << ") : "; @@ -1093,8 +1093,8 @@ namespace LLError if (site.mPrintOnce) { - std::map::iterator messageIter = s.uniqueLogMessages.find(message); - if (messageIter != s.uniqueLogMessages.end()) + std::map::iterator messageIter = settings_w->uniqueLogMessages.find(message); + if (messageIter != settings_w->uniqueLogMessages.end()) { messageIter->second++; unsigned int num_messages = messageIter->second; @@ -1110,14 +1110,14 @@ namespace LLError else { prefix << "ONCE: "; - s.uniqueLogMessages[message] = 1; + settings_w->uniqueLogMessages[message] = 1; } } if (site.mPrintOnce) { - std::map::iterator messageIter = s.uniqueLogMessages.find(message); - if (messageIter != s.uniqueLogMessages.end()) + std::map::iterator messageIter = settings_w->uniqueLogMessages.find(message); + if (messageIter != settings_w->uniqueLogMessages.end()) { messageIter->second++; unsigned int num_messages = messageIter->second; @@ -1133,18 +1133,18 @@ namespace LLError else { prefix << "ONCE: "; - s.uniqueLogMessages[message] = 1; + settings_w->uniqueLogMessages[message] = 1; } } prefix << message; message = prefix.str(); - writeToRecorders(site.mLevel, message); + writeToRecorders(settings_w, site.mLevel, message); - if (site.mLevel == LEVEL_ERROR && s.crashFunction) + if (site.mLevel == LEVEL_ERROR && settings_w->crashFunction) { - s.crashFunction(message); + settings_w->crashFunction(message); } } } @@ -1154,14 +1154,16 @@ namespace LLError namespace LLError { - Settings* saveAndResetSettings() + class ThreadSafeSettings { }; + + ThreadSafeSettings* saveAndResetSettings() { - return Settings::saveAndReset(); + return reinterpret_cast(Settings::saveAndReset()); } - void restoreSettings(Settings* s) + void restoreSettings(ThreadSafeSettings* s) { - return Settings::restore(s); + Settings::restore(reinterpret_cast*>(s)); } std::string removePrefix(std::string& s, const std::string& p) @@ -1207,8 +1209,7 @@ namespace LLError int shouldLogCallCount() { - Settings& s = Settings::get(); - return s.shouldLogCallCounter; + return AIAccess(Settings::get())->shouldLogCallCounter; } #if LL_WINDOWS diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h index f841637b3..60f3bfad1 100644 --- a/indra/llcommon/llerror.h +++ b/indra/llcommon/llerror.h @@ -303,7 +303,7 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG; */ #ifdef SHOW_ASSERT -extern bool is_main_thread(); +extern LL_COMMON_API bool is_main_thread(); #endif #endif // LL_LLERROR_H diff --git a/indra/llcommon/llerrorcontrol.h b/indra/llcommon/llerrorcontrol.h index 2a7c500db..c6eb39cae 100644 --- a/indra/llcommon/llerrorcontrol.h +++ b/indra/llcommon/llerrorcontrol.h @@ -167,9 +167,9 @@ namespace LLError Utilities for use by the unit tests of LLError itself. */ - class Settings; - LL_COMMON_API Settings* saveAndResetSettings(); - LL_COMMON_API void restoreSettings(Settings *); + class ThreadSafeSettings; + LL_COMMON_API ThreadSafeSettings* saveAndResetSettings(); + LL_COMMON_API void restoreSettings(ThreadSafeSettings *); LL_COMMON_API std::string abbreviateFile(const std::string& filePath); LL_COMMON_API int shouldLogCallCount(); diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h index 602a2f7c7..898ed496b 100644 --- a/indra/llcommon/llfasttimer.h +++ b/indra/llcommon/llfasttimer.h @@ -54,6 +54,7 @@ public: // common messaging components FTM_PUMP, FTM_CURL, + FTM_PUMPIO, // common simulation components FTM_UPDATE_ANIMATION, diff --git a/indra/llcommon/llfixedbuffer.cpp b/indra/llcommon/llfixedbuffer.cpp index 1f6a06c24..08be3e259 100644 --- a/indra/llcommon/llfixedbuffer.cpp +++ b/indra/llcommon/llfixedbuffer.cpp @@ -36,8 +36,7 @@ LLFixedBuffer::LLFixedBuffer(const U32 max_lines) : LLLineBuffer(), - mMaxLines(max_lines), - mMutex(NULL) + mMaxLines(max_lines) { mTimer.reset(); } diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h index 3af4ae89d..df49757a6 100644 --- a/indra/llcommon/llpreprocessor.h +++ b/indra/llcommon/llpreprocessor.h @@ -1,185 +1,170 @@ -/** - * @file llpreprocessor.h - * @brief This file should be included in all Linden Lab files and - * should only contain special preprocessor directives - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LLPREPROCESSOR_H -#define LLPREPROCESSOR_H - -// Figure out endianness of platform -#ifdef LL_LINUX -#define __ENABLE_WSTRING -#include -#endif // LL_LINUX - -#if LL_SOLARIS -# ifdef __sparc // Since we're talking Solaris 10 and up, only 64 bit is supported. -# define LL_BIG_ENDIAN 1 -# define LL_SOLARIS_ALIGNED_CPU 1 // used to designate issues where SPARC alignment is addressed -# define LL_SOLARIS_NON_MESA_GL 1 // The SPARC GL does not provide a MESA-based GL API -# endif -# include // ensure we know which end is up -#endif // LL_SOLARIS - -#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386))) -#define LL_LITTLE_ENDIAN 1 -#else -#define LL_BIG_ENDIAN 1 -#endif - - -// Per-compiler switches - -#ifdef __GNUC__ -#define LL_FORCE_INLINE inline __attribute__((always_inline)) -#else -#define LL_FORCE_INLINE __forceinline -#endif - -// Mark-up expressions with branch prediction hints. Do NOT use -// this with reckless abandon - it's an obfuscating micro-optimization -// outside of inner loops or other places where you are OVERWHELMINGLY -// sure which way an expression almost-always evaluates. -#if __GNUC__ >= 3 -# define LL_LIKELY(EXPR) __builtin_expect (!!(EXPR), true) -# define LL_UNLIKELY(EXPR) __builtin_expect (!!(EXPR), false) -#else -# define LL_LIKELY(EXPR) (EXPR) -# define LL_UNLIKELY(EXPR) (EXPR) -#endif - - -// Figure out differences between compilers -#if defined(__GNUC__) - #define GCC_VERSION (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) - #ifndef LL_GNUC - #define LL_GNUC 1 - #endif -#elif defined(__MSVC_VER__) || defined(_MSC_VER) - #ifndef LL_MSVC - #define LL_MSVC 1 - #endif - #if _MSC_VER < 1400 - #define LL_MSVC7 //Visual C++ 2003 or earlier - #endif -#endif - -// Deal with minor differences on Unixy OSes. -#if LL_DARWIN || LL_LINUX - // Different name, same functionality. - #define stricmp strcasecmp - #define strnicmp strncasecmp - - // Not sure why this is different, but... - #ifndef MAX_PATH - #define MAX_PATH PATH_MAX - #endif // not MAX_PATH - -#endif - -// Static linking with apr on windows needs to be declared. -#ifdef LL_WINDOWS -#ifndef APR_DECLARE_STATIC -#define APR_DECLARE_STATIC // For APR on Windows -#endif -#ifndef APU_DECLARE_STATIC -#define APU_DECLARE_STATIC // For APR util on Windows -#endif -#endif - -// Deal with the differeneces on Windows -#if defined(LL_WINDOWS) -#define BOOST_REGEX_NO_LIB 1 -#define CURL_STATICLIB 1 -#ifndef XML_STATIC -#define XML_STATIC -#endif -#endif // LL_WINDOWS - -// Deal with VC6 problems -#if LL_MSVC -#pragma warning( 3 : 4701 ) // "local variable used without being initialized" Treat this as level 3, not level 4. -#pragma warning( 3 : 4702 ) // "unreachable code" Treat this as level 3, not level 4. -#pragma warning( 3 : 4189 ) // "local variable initialized but not referenced" Treat this as level 3, not level 4. -//#pragma warning( 3 : 4018 ) // "signed/unsigned mismatch" Treat this as level 3, not level 4. -#pragma warning( 3 : 4263 ) // 'function' : member function does not override any base class virtual member function -#pragma warning( 3 : 4264 ) // "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden" -#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual" -#pragma warning( 3 : 4266 ) // 'function' : no override available for virtual member function from base 'type'; function is hidden -#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored -#pragma warning( disable : 4284 ) // silly MS warning deep inside their include file -#pragma warning( disable : 4503 ) // 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation. -#pragma warning( disable : 4800 ) // 'BOOL' : forcing value to bool 'true' or 'false' (performance warning) -#pragma warning( disable : 4996 ) // warning: deprecated - -// Linker optimization with "extern template" generates these warnings -#pragma warning( disable : 4231 ) // nonstandard extension used : 'extern' before template explicit instantiation -#pragma warning( disable : 4506 ) // no definition for inline function - -// level 4 warnings that we need to disable: -#pragma warning (disable : 4100) // unreferenced formal parameter -#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) ) -#pragma warning (disable : 4244) // possible loss of data on conversions -#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template -#pragma warning (disable : 4512) // assignment operator could not be generated -#pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) ) - -#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class -#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class -#endif // LL_MSVC - -#if LL_WINDOWS -#define LL_DLLEXPORT __declspec(dllexport) -#define LL_DLLIMPORT __declspec(dllimport) -#elif LL_LINUX -#define LL_DLLEXPORT __attribute__ ((visibility("default"))) -#define LL_DLLIMPORT -#else -#define LL_DLLEXPORT -#define LL_DLLIMPORT -#endif // LL_WINDOWS - -/* -#ifdef llcommon_EXPORTS -// Compiling llcommon (shared) -#define LL_COMMON_API LL_DLLEXPORT -#else // llcommon_EXPORTS -// Using llcommon (shared) -#define LL_COMMON_API LL_DLLIMPORT -#endif // llcommon_EXPORTS -*/ - -//I hate DLLs -SG -#define LL_COMMON_API - -#endif // not LL_LINDEN_PREPROCESSOR_H +/** + * @file llpreprocessor.h + * @brief This file should be included in all Linden Lab files and + * should only contain special preprocessor directives + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LLPREPROCESSOR_H +#define LLPREPROCESSOR_H + +// Figure out endianness of platform +#ifdef LL_LINUX +#define __ENABLE_WSTRING +#include +#endif // LL_LINUX + +#if LL_SOLARIS +# ifdef __sparc // Since we're talking Solaris 10 and up, only 64 bit is supported. +# define LL_BIG_ENDIAN 1 +# define LL_SOLARIS_ALIGNED_CPU 1 // used to designate issues where SPARC alignment is addressed +# define LL_SOLARIS_NON_MESA_GL 1 // The SPARC GL does not provide a MESA-based GL API +# endif +# include // ensure we know which end is up +#endif // LL_SOLARIS + +#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386))) +#define LL_LITTLE_ENDIAN 1 +#else +#define LL_BIG_ENDIAN 1 +#endif + + +// Per-compiler switches + +#ifdef __GNUC__ +#define LL_FORCE_INLINE inline __attribute__((always_inline)) +#else +#define LL_FORCE_INLINE __forceinline +#endif + +// Mark-up expressions with branch prediction hints. Do NOT use +// this with reckless abandon - it's an obfuscating micro-optimization +// outside of inner loops or other places where you are OVERWHELMINGLY +// sure which way an expression almost-always evaluates. +#if __GNUC__ >= 3 +# define LL_LIKELY(EXPR) __builtin_expect (!!(EXPR), true) +# define LL_UNLIKELY(EXPR) __builtin_expect (!!(EXPR), false) +#else +# define LL_LIKELY(EXPR) (EXPR) +# define LL_UNLIKELY(EXPR) (EXPR) +#endif + + +// Figure out differences between compilers +#if defined(__GNUC__) + #define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) + #ifndef LL_GNUC + #define LL_GNUC 1 + #endif +#elif defined(__MSVC_VER__) || defined(_MSC_VER) + #ifndef LL_MSVC + #define LL_MSVC 1 + #endif + #if _MSC_VER < 1400 + #define LL_MSVC7 //Visual C++ 2003 or earlier + #endif +#endif + +// Deal with minor differences on Unixy OSes. +#if LL_DARWIN || LL_LINUX + // Different name, same functionality. + #define stricmp strcasecmp + #define strnicmp strncasecmp + + // Not sure why this is different, but... + #ifndef MAX_PATH + #define MAX_PATH PATH_MAX + #endif // not MAX_PATH + +#endif + +// Deal with the differences on Windows +#if defined(LL_WINDOWS) +#define BOOST_REGEX_NO_LIB 1 +#define CURL_STATICLIB 1 +#ifndef XML_STATIC +#define XML_STATIC +#endif +#endif // LL_WINDOWS + +// Deal with VC6 problems +#if LL_MSVC +#pragma warning( 3 : 4701 ) // "local variable used without being initialized" Treat this as level 3, not level 4. +#pragma warning( 3 : 4702 ) // "unreachable code" Treat this as level 3, not level 4. +#pragma warning( 3 : 4189 ) // "local variable initialized but not referenced" Treat this as level 3, not level 4. +//#pragma warning( 3 : 4018 ) // "signed/unsigned mismatch" Treat this as level 3, not level 4. +#pragma warning( 3 : 4263 ) // 'function' : member function does not override any base class virtual member function +#pragma warning( 3 : 4264 ) // "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden" +#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual" +#pragma warning( 3 : 4266 ) // 'function' : no override available for virtual member function from base 'type'; function is hidden +#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored +#pragma warning( disable : 4284 ) // silly MS warning deep inside their include file +#pragma warning( disable : 4503 ) // 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation. +#pragma warning( disable : 4800 ) // 'BOOL' : forcing value to bool 'true' or 'false' (performance warning) +#pragma warning( disable : 4996 ) // warning: deprecated + +// Linker optimization with "extern template" generates these warnings +#pragma warning( disable : 4231 ) // nonstandard extension used : 'extern' before template explicit instantiation +#pragma warning( disable : 4506 ) // no definition for inline function + +// level 4 warnings that we need to disable: +#pragma warning (disable : 4100) // unreferenced formal parameter +#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) ) +#pragma warning (disable : 4244) // possible loss of data on conversions +#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template +#pragma warning (disable : 4512) // assignment operator could not be generated +#pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) ) + +#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class +#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class +#endif // LL_MSVC + +#if LL_WINDOWS +#define LL_DLLEXPORT __declspec(dllexport) +#define LL_DLLIMPORT __declspec(dllimport) +#elif LL_LINUX +#define LL_DLLEXPORT __attribute__ ((visibility("default"))) +#define LL_DLLIMPORT +#else +#define LL_DLLEXPORT +#define LL_DLLIMPORT +#endif // LL_WINDOWS + +#ifdef llcommon_EXPORTS +// Compiling llcommon (shared) +#define LL_COMMON_API LL_DLLEXPORT +#else // llcommon_EXPORTS +// Using llcommon (shared) +#define LL_COMMON_API LL_DLLIMPORT +#endif // llcommon_EXPORTS + +#endif // not LL_LINDEN_PREPROCESSOR_H diff --git a/indra/llcommon/llscopedvolatileaprpool.h b/indra/llcommon/llscopedvolatileaprpool.h new file mode 100644 index 000000000..724dc7f05 --- /dev/null +++ b/indra/llcommon/llscopedvolatileaprpool.h @@ -0,0 +1,58 @@ +/** + * @file llscopedvolatileaprpool.h + * @brief Implementation of LLScopedVolatileAPRPool + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSCOPEDVOLATILEAPRPOOL_H +#define LL_LLSCOPEDVOLATILEAPRPOOL_H + +#include "llthread.h" + +//! Scoped volatile memory pool. +// +// As the AIVolatileAPRPool should never keep allocations very +// long, it's most common use is for allocations with a lifetime +// equal to it's scope. +// +// This is a convenience class that makes just a little easier to type. +// +class LLScopedVolatileAPRPool +{ +private: + AIVolatileAPRPool& mPool; + apr_pool_t* mScopedAPRpool; +public: + LLScopedVolatileAPRPool() : mPool(AIThreadLocalData::tldata().mVolatileAPRPool), mScopedAPRpool(mPool.getVolatileAPRPool()) { } + ~LLScopedVolatileAPRPool() { mPool.clearVolatileAPRPool(); } + // Only use this to pass the pointer to a libapr-1 function that requires it. + operator apr_pool_t*() const { return mScopedAPRpool; } +}; + +#endif diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 6b1115a54..171747921 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -36,6 +36,7 @@ #include #include #include +#include #if LL_LINUX || LL_SOLARIS #include @@ -212,7 +213,7 @@ public: ///////////////////////////////////////////////////////////////////////////////////////// // Static Utility functions that operate on std::strings - static std::basic_string null; + static std::basic_string const null; typedef std::map format_map_t; static S32 format(std::basic_string& s, const format_map_t& fmt_map); @@ -303,7 +304,7 @@ public: }; -template std::basic_string LLStringUtilBase::null; +template std::basic_string const LLStringUtilBase::null; typedef LLStringUtilBase LLStringUtil; typedef LLStringUtilBase LLWStringUtil; diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index d729d9883..bde0cbd6e 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -74,7 +74,7 @@ extern int errno; static const S32 CPUINFO_BUFFER_SIZE = 16383; -LLCPUInfo gSysCPU; +LL_COMMON_API LLCPUInfo gSysCPU; #if LL_WINDOWS #ifndef DLLVERSIONINFO diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 9b74e1d1d..7ced30939 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -72,8 +72,8 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap // Set thread state to running threadp->mStatus = RUNNING; - // Create a thread local APRFile pool. - LLVolatileAPRPool::createLocalAPRFilePool(); + // Create a thread local data. + AIThreadLocalData::create(threadp); // Run the user supplied function threadp->run(); @@ -87,24 +87,14 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap } -LLThread::LLThread(const std::string& name, apr_pool_t *poolp) : +LLThread::LLThread(std::string const& name) : mPaused(FALSE), mName(name), mAPRThreadp(NULL), - mStatus(STOPPED) + mStatus(STOPPED), + mThreadLocalData(NULL) { - // Thread creation probably CAN be paranoid about APR being initialized, if necessary - if (poolp) - { - mIsLocalPool = FALSE; - mAPRPoolp = poolp; - } - else - { - mIsLocalPool = TRUE; - apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread - } - mRunCondition = new LLCondition(mAPRPoolp); + mRunCondition = new LLCondition; } @@ -147,24 +137,18 @@ void LLThread::shutdown() if (!isStopped()) { // This thread just wouldn't stop, even though we gave it time - llwarns << "LLThread::~LLThread() exiting thread before clean exit!" << llendl; + llwarns << "LLThread::shutdown() exiting thread before clean exit!" << llendl; return; } mAPRThreadp = NULL; } delete mRunCondition; - - if (mIsLocalPool) - { - apr_pool_destroy(mAPRPoolp); - } } - void LLThread::start() { - apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, mAPRPoolp); + apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, tldata().mRootPool()); // We won't bother joining apr_thread_detach(mAPRThreadp); @@ -265,38 +249,72 @@ void LLThread::wakeLocked() } } +#ifdef SHOW_ASSERT +// This allows the use of llassert(is_main_thread()) to assure the current thread is the main thread. +static apr_os_thread_t main_thread_id; +LL_COMMON_API bool is_main_thread() { return apr_os_thread_equal(main_thread_id, apr_os_thread_current()); } +#endif + +// The thread private handle to access the AIThreadLocalData instance. +apr_threadkey_t* AIThreadLocalData::sThreadLocalDataKey; + +//static +void AIThreadLocalData::init(void) +{ + // Only do this once. + if (sThreadLocalDataKey) + { + return; + } + + apr_status_t status = apr_threadkey_private_create(&sThreadLocalDataKey, &AIThreadLocalData::destroy, AIAPRRootPool::get()()); + ll_apr_assert_status(status); // Or out of memory, or system-imposed limit on the + // total number of keys per process {PTHREAD_KEYS_MAX} + // has been exceeded. + + // Create the thread-local data for the main thread (this function is called by the main thread). + AIThreadLocalData::create(NULL); + +#ifdef SHOW_ASSERT + // This function is called by the main thread. + main_thread_id = apr_os_thread_current(); +#endif +} + +// This is called once for every thread when the thread is destructed. +//static +void AIThreadLocalData::destroy(void* thread_local_data) +{ + delete reinterpret_cast(thread_local_data); +} + +//static +void AIThreadLocalData::create(LLThread* threadp) +{ + AIThreadLocalData* new_tld = new AIThreadLocalData; + if (threadp) + { + threadp->mThreadLocalData = new_tld; + } + apr_status_t status = apr_threadkey_private_set(new_tld, sThreadLocalDataKey); + llassert_always(status == APR_SUCCESS); +} + +//static +AIThreadLocalData& AIThreadLocalData::tldata(void) +{ + if (!sThreadLocalDataKey) + AIThreadLocalData::init(); + + void* data; + apr_status_t status = apr_threadkey_private_get(&data, sThreadLocalDataKey); + llassert_always(status == APR_SUCCESS); + return *static_cast(data); +} + //============================================================================ -LLMutex::LLMutex(apr_pool_t *poolp) : - mAPRMutexp(NULL) -{ - //if (poolp) - //{ - // mIsLocalPool = FALSE; - // mAPRPoolp = poolp; - //} - //else - { - mIsLocalPool = TRUE; - apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread - } - apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mAPRPoolp); -} - -LLMutex::~LLMutex() -{ -#if _DEBUG - llassert(!isLocked()); // better not be locked! -#endif - apr_thread_mutex_destroy(mAPRMutexp); - mAPRMutexp = NULL; - if (mIsLocalPool) - { - apr_pool_destroy(mAPRPoolp); - } -} - -bool LLMutex::isLocked() +bool LLMutexBase::isLocked() { if (!tryLock()) { @@ -308,12 +326,9 @@ bool LLMutex::isLocked() //============================================================================ -LLCondition::LLCondition(apr_pool_t *poolp) : - LLMutex(poolp) +LLCondition::LLCondition(AIAPRPool& parent) : LLMutex(parent) { - // base class (LLMutex) has already ensured that mAPRPoolp is set up. - - apr_thread_cond_create(&mAPRCondp, mAPRPoolp); + apr_thread_cond_create(&mAPRCondp, mPool()); } LLCondition::~LLCondition() @@ -349,7 +364,7 @@ void LLThreadSafeRefCount::initThreadSafeRefCount() { if (!sMutex) { - sMutex = new LLMutex(0); + sMutex = new LLMutex; } } diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index 399f0f741..fa003afdd 100644 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -38,11 +38,32 @@ #include "llmemory.h" #include "apr_thread_cond.h" +#include "aiaprpool.h" + +#ifdef SHOW_ASSERT +extern LL_COMMON_API bool is_main_thread(void); +#endif class LLThread; class LLMutex; class LLCondition; +class LL_COMMON_API AIThreadLocalData +{ +private: + static apr_threadkey_t* sThreadLocalDataKey; + +public: + // Thread-local memory pool. + AIAPRRootPool mRootPool; + AIVolatileAPRPool mVolatileAPRPool; + + static void init(void); + static void destroy(void* thread_local_data); + static void create(LLThread* pthread); + static AIThreadLocalData& tldata(void); +}; + class LL_COMMON_API LLThread { public: @@ -53,7 +74,7 @@ public: QUITTING= 2 // Someone wants this thread to quit } EThreadStatus; - LLThread(const std::string& name, apr_pool_t *poolp = NULL); + LLThread(std::string const& name); virtual ~LLThread(); // Warning! You almost NEVER want to destroy a thread unless it's in the STOPPED state. virtual void shutdown(); // stops the thread @@ -82,7 +103,8 @@ public: // this kicks off the apr thread void start(void); - apr_pool_t *getAPRPool() { return mAPRPoolp; } + // Return thread-local data for the current thread. + static AIThreadLocalData& tldata(void) { return AIThreadLocalData::tldata(); } private: BOOL mPaused; @@ -95,10 +117,11 @@ protected: LLCondition* mRunCondition; apr_thread_t *mAPRThreadp; - apr_pool_t *mAPRPoolp; - BOOL mIsLocalPool; EThreadStatus mStatus; + friend void AIThreadLocalData::create(LLThread* threadp); + AIThreadLocalData* mThreadLocalData; + void setQuitting(); // virtual function overridden by subclass -- this will be called when the thread runs @@ -125,12 +148,9 @@ protected: //============================================================================ -class LL_COMMON_API LLMutex +class LL_COMMON_API LLMutexBase { public: - LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex - ~LLMutex(); - void lock() { apr_thread_mutex_lock(mAPRMutexp); } void unlock() { apr_thread_mutex_unlock(mAPRMutexp); } // Returns true if lock was obtained successfully. @@ -139,16 +159,60 @@ public: bool isLocked(); // non-blocking, but does do a lock/unlock so not free protected: - apr_thread_mutex_t *mAPRMutexp; - apr_pool_t *mAPRPoolp; - BOOL mIsLocalPool; + // mAPRMutexp is initialized and uninitialized in the derived class. + apr_thread_mutex_t* mAPRMutexp; }; +class LL_COMMON_API LLMutex : public LLMutexBase +{ +public: + LLMutex(AIAPRPool& parent = LLThread::tldata().mRootPool) : mPool(parent) + { + apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mPool()); + } + ~LLMutex() + { + llassert(!isLocked()); // better not be locked! + apr_thread_mutex_destroy(mAPRMutexp); + mAPRMutexp = NULL; + } + +protected: + AIAPRPool mPool; +}; + +#if APR_HAS_THREADS +// No need to use a root pool in this case. +typedef LLMutex LLMutexRootPool; +#else // APR_HAS_THREADS +class LL_COMMON_API LLMutexRootPool : public LLMutexBase +{ +public: + LLMutexRootPool(void) + { + apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mRootPool()); + } + ~LLMutexRootPool() + { +#if APR_POOL_DEBUG + // It is allowed to destruct root pools from a different thread. + mRootPool.grab_ownership(); +#endif + llassert(!isLocked()); // better not be locked! + apr_thread_mutex_destroy(mAPRMutexp); + mAPRMutexp = NULL; + } + +protected: + AIAPRRootPool mRootPool; +}; +#endif // APR_HAS_THREADS + // Actually a condition/mutex pair (since each condition needs to be associated with a mutex). class LL_COMMON_API LLCondition : public LLMutex { public: - LLCondition(apr_pool_t *apr_poolp); // Defaults to global pool, could use the thread pool as well. + LLCondition(AIAPRPool& parent = LLThread::tldata().mRootPool); ~LLCondition(); void wait(); // blocks @@ -162,7 +226,7 @@ protected: class LL_COMMON_API LLMutexLock { public: - LLMutexLock(LLMutex* mutex) + LLMutexLock(LLMutexBase* mutex) { mMutex = mutex; mMutex->lock(); @@ -172,7 +236,102 @@ public: mMutex->unlock(); } private: - LLMutex* mMutex; + LLMutexBase* mMutex; +}; + +class AIRWLock +{ +public: + AIRWLock(AIAPRPool& parent = LLThread::tldata().mRootPool) : + mWriterWaitingMutex(parent), mNoHoldersCondition(parent), mHoldersCount(0), mWriterIsWaiting(false) { } + +private: + LLMutex mWriterWaitingMutex; //!< This mutex is locked while some writer is waiting for access. + LLCondition mNoHoldersCondition; //!< Access control for mHoldersCount. Condition true when there are no more holders. + int mHoldersCount; //!< Number of readers or -1 if a writer locked this object. + // This is volatile because we read it outside the critical area of mWriterWaitingMutex, at [1]. + // That means that other threads can change it while we are already in the (inlined) function rdlock. + // Without volatile, the following assembly would fail: + // register x = mWriterIsWaiting; + // /* some thread changes mWriterIsWaiting */ + // if (x ... + // However, because the function is fuzzy to begin with (we don't mind that this race + // condition exists) it would work fine without volatile. So, basically it's just here + // out of principle ;). -- Aleric + bool volatile mWriterIsWaiting; //!< True when there is a writer waiting for write access. + +public: + void rdlock(bool high_priority = false) + { + // Give a writer a higher priority (kinda fuzzy). + if (mWriterIsWaiting && !high_priority) // [1] If there is a writer interested, + { + mWriterWaitingMutex.lock(); // [2] then give it precedence and wait here. + // If we get here then the writer got it's access; mHoldersCount == -1. + mWriterWaitingMutex.unlock(); + } + mNoHoldersCondition.lock(); // [3] Get exclusive access to mHoldersCount. + while (mHoldersCount == -1) // [4] + { + mNoHoldersCondition.wait(); // [5] Wait till mHoldersCount is (or just was) 0. + } + ++mHoldersCount; // One more reader. + mNoHoldersCondition.unlock(); // Release lock on mHoldersCount. + } + void rdunlock(void) + { + mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount. + if (--mHoldersCount == 0) // Was this the last reader? + { + mNoHoldersCondition.signal(); // Tell waiting threads, see [5], [6] and [7]. + } + mNoHoldersCondition.unlock(); // Release lock on mHoldersCount. + } + void wrlock(void) + { + mWriterWaitingMutex.lock(); // Block new readers, see [2], + mWriterIsWaiting = true; // from this moment on, see [1]. + mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount. + while (mHoldersCount != 0) // Other readers or writers have this lock? + { + mNoHoldersCondition.wait(); // [6] Wait till mHoldersCount is (or just was) 0. + } + mWriterIsWaiting = false; // Stop checking the lock for new readers, see [1]. + mWriterWaitingMutex.unlock(); // Release blocked readers, they will still hang at [3]. + mHoldersCount = -1; // We are a writer now (will cause a hang at [5], see [4]). + mNoHoldersCondition.unlock(); // Release lock on mHolders (readers go from [3] to [5]). + } + void wrunlock(void) + { + mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount. + mHoldersCount = 0; // We have no writer anymore. + mNoHoldersCondition.signal(); // Tell waiting threads, see [5], [6] and [7]. + mNoHoldersCondition.unlock(); // Release lock on mHoldersCount. + } + void rd2wrlock(void) + { + mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount. Blocks new readers at [3]. + if (--mHoldersCount > 0) // Any other reads left? + { + mWriterWaitingMutex.lock(); // Block new readers, see [2], + mWriterIsWaiting = true; // from this moment on, see [1]. + while (mHoldersCount != 0) // Other readers (still) have this lock? + { + mNoHoldersCondition.wait(); // [7] Wait till mHoldersCount is (or just was) 0. + } + mWriterIsWaiting = false; // Stop checking the lock for new readers, see [1]. + mWriterWaitingMutex.unlock(); // Release blocked readers, they will still hang at [3]. + } + mHoldersCount = -1; // We are a writer now (will cause a hang at [5], see [4]). + mNoHoldersCondition.unlock(); // Release lock on mHolders (readers go from [3] to [5]). + } + void wr2rdlock(void) + { + mNoHoldersCondition.lock(); // Get exclusive access to mHoldersCount. + mHoldersCount = 1; // Turn writer into a reader. + mNoHoldersCondition.signal(); // Tell waiting readers, see [5]. + mNoHoldersCondition.unlock(); // Release lock on mHoldersCount. + } }; //============================================================================ @@ -187,7 +346,6 @@ void LLThread::unlockData() mRunCondition->unlock(); } - //============================================================================ // see llmemory.h for LLPointer<> definition diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 7f5c065ea..071f441e7 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -1,47 +1,47 @@ -/** - * @file llversionviewer.h - * @brief - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLVERSIONVIEWER_H -#define LL_LLVERSIONVIEWER_H - -const S32 LL_VERSION_MAJOR = 1; -const S32 LL_VERSION_MINOR = 5; -const S32 LL_VERSION_PATCH = 6; -const S32 LL_VERSION_BUILD = 1; - -const char * const LL_CHANNEL = "Singularity"; - -#if LL_DARWIN -const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.snowglobe.viewer"; -#endif - -#endif +/** + * @file llversionviewer.h + * @brief + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLVERSIONVIEWER_H +#define LL_LLVERSIONVIEWER_H + +const S32 LL_VERSION_MAJOR = 1; +const S32 LL_VERSION_MINOR = 5; +const S32 LL_VERSION_PATCH = 7; +const S32 LL_VERSION_BUILD = 1; + +const char * const LL_CHANNEL = "Singularity"; + +#if LL_DARWIN +const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.snowglobe.viewer"; +#endif + +#endif diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp index c4be02818..65f27095b 100644 --- a/indra/llcommon/llworkerthread.cpp +++ b/indra/llcommon/llworkerthread.cpp @@ -43,7 +43,7 @@ LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded) : LLQueuedThread(name, threaded) { - mDeleteMutex = new LLMutex(NULL); + mDeleteMutex = new LLMutex; } LLWorkerThread::~LLWorkerThread() @@ -205,7 +205,6 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na mRequestPriority(LLWorkerThread::PRIORITY_NORMAL), mWorkerClassName(name), mRequestHandle(LLWorkerThread::nullHandle()), - mMutex(NULL), mWorkFlags(0) { if (!mWorkerThread) diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h index 3d761dc87..117dc05cc 100644 --- a/indra/llcommon/llworkerthread.h +++ b/indra/llcommon/llworkerthread.h @@ -200,7 +200,7 @@ protected: U32 mRequestPriority; // last priority set private: - LLMutex mMutex; + LLMutexRootPool mMutex; // Use LLMutexRootPool since this object is created and destructed by multiple threads. LLAtomicU32 mWorkFlags; }; diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp old mode 100755 new mode 100644 index 804c51274..3dc41e897 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -387,8 +387,7 @@ bool LLCrashLogger::init() return false; } - gServicePump = new LLPumpIO(gAPRPoolp); - gServicePump->prime(gAPRPoolp); + gServicePump = new LLPumpIO; LLHTTPClient::setPump(*gServicePump); //If we've opened the crash logger, assume we can delete the marker file if it exists diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h old mode 100755 new mode 100644 diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 8974f3eee..3f3dbc87c 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -57,7 +57,7 @@ LLMutex* LLImage::sMutex = NULL; //static void LLImage::initClass() { - sMutex = new LLMutex(NULL); + sMutex = new LLMutex; LLImageJ2C::openDSO(); } @@ -248,16 +248,17 @@ U8* LLImageBase::allocateDataSize(S32 width, S32 height, S32 ncomponents, S32 si S32 LLImageRaw::sGlobalRawMemory = 0; S32 LLImageRaw::sRawImageCount = 0; +S32 LLImageRaw::sRawImageCachedCount = 0; LLImageRaw::LLImageRaw() - : LLImageBase() + : LLImageBase(), mCacheEntries(0) { mMemType = LLMemType::MTYPE_IMAGERAW; ++sRawImageCount; } LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components) - : LLImageBase() + : LLImageBase(), mCacheEntries(0) { mMemType = LLMemType::MTYPE_IMAGERAW; llassert( S32(width) * S32(height) * S32(components) <= MAX_IMAGE_DATA_SIZE ); @@ -266,7 +267,7 @@ LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components) } LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components) - : LLImageBase() + : LLImageBase(), mCacheEntries(0) { mMemType = LLMemType::MTYPE_IMAGERAW; if(allocateDataSize(width, height, components) && data) @@ -277,7 +278,7 @@ LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components) } LLImageRaw::LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only) - : LLImageBase() + : LLImageBase(), mCacheEntries(0) { createFromFile(filename, j2c_lowest_mip_only); } @@ -288,6 +289,7 @@ LLImageRaw::~LLImageRaw() // NOT LLImageRaw::deleteData() deleteData(); --sRawImageCount; + setInCache(false); } // virtual diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index f74c5901d..9f0cfa87d 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -243,6 +243,24 @@ protected: public: static S32 sGlobalRawMemory; static S32 sRawImageCount; + + static S32 sRawImageCachedCount; + S32 mCacheEntries; + void setInCache(bool in_cache) + { + if(in_cache) + { + if(!mCacheEntries) + sRawImageCachedCount++; + mCacheEntries++; + } + else if(mCacheEntries) + { + mCacheEntries--; + if(!mCacheEntries) + sRawImageCachedCount--; + } + } }; // Compressed representation of image. diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 08bcde633..e01e3adce 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -34,6 +34,7 @@ #include "apr_dso.h" #include "lldir.h" +#include "../llxml/llcontrol.h" #include "llimagej2c.h" #include "llmemtype.h" @@ -46,7 +47,7 @@ typedef const char* (*EngineInfoLLImageJ2CFunction)(); CreateLLImageJ2CFunction j2cimpl_create_func; DestroyLLImageJ2CFunction j2cimpl_destroy_func; EngineInfoLLImageJ2CFunction j2cimpl_engineinfo_func; -apr_pool_t *j2cimpl_dso_memory_pool; +AIAPRPool j2cimpl_dso_memory_pool; apr_dso_handle_t *j2cimpl_dso_handle; //Declare the prototype for theses functions here, their functionality @@ -81,13 +82,12 @@ void LLImageJ2C::openDSO() gDirUtilp->getExecutableDir()); j2cimpl_dso_handle = NULL; - j2cimpl_dso_memory_pool = NULL; + j2cimpl_dso_memory_pool.create(); //attempt to load the shared library - apr_pool_create(&j2cimpl_dso_memory_pool, NULL); rv = apr_dso_load(&j2cimpl_dso_handle, dso_path.c_str(), - j2cimpl_dso_memory_pool); + j2cimpl_dso_memory_pool()); //now, check for success if ( rv == APR_SUCCESS ) @@ -151,11 +151,7 @@ void LLImageJ2C::openDSO() j2cimpl_dso_handle = NULL; } - if ( j2cimpl_dso_memory_pool ) - { - apr_pool_destroy(j2cimpl_dso_memory_pool); - j2cimpl_dso_memory_pool = NULL; - } + j2cimpl_dso_memory_pool.destroy(); } } @@ -163,7 +159,7 @@ void LLImageJ2C::openDSO() void LLImageJ2C::closeDSO() { if ( j2cimpl_dso_handle ) apr_dso_unload(j2cimpl_dso_handle); - if (j2cimpl_dso_memory_pool) apr_pool_destroy(j2cimpl_dso_memory_pool); + j2cimpl_dso_memory_pool.destroy(); } //static @@ -382,6 +378,12 @@ S32 LLImageJ2C::calcHeaderSize() // to load discard_level (including header and higher discard levels) S32 LLImageJ2C::calcDataSize(S32 discard_level) { + static const LLCachedControl legacy_size("SianaLegacyJ2CSize", false); + + if (legacy_size) { + return calcDataSizeJ2C(getWidth(), getHeight(), getComponents(), discard_level, mRate); + } + discard_level = llclamp(discard_level, 0, MAX_DISCARD_LEVEL); if ( mAreaUsedForDataSizeCalcs != (getHeight() * getWidth()) diff --git a/indra/llimage/llimagejpeg.h b/indra/llimage/llimagejpeg.h index abeaf84ce..884d07116 100644 --- a/indra/llimage/llimagejpeg.h +++ b/indra/llimage/llimagejpeg.h @@ -35,6 +35,8 @@ #include +#include "llimage.h" + extern "C" { #ifdef LL_STANDALONE # include @@ -45,8 +47,6 @@ extern "C" { #endif } -#include "llimage.h" - class LLImageJPEG : public LLImageFormatted { protected: diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp index 2518dbe8f..33b1ab181 100644 --- a/indra/llimage/llimagepng.cpp +++ b/indra/llimage/llimagepng.cpp @@ -131,6 +131,7 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time) if (! pngWrapper.writePng(raw_image, getData())) { setLastError(pngWrapper.getErrorMessage()); + deleteData(); return FALSE; } @@ -138,6 +139,7 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time) if(!reallocateData(pngWrapper.getFinalSize())) //Shrink. Returns NULL on failure. { setLastError("LLImagePNG::encode failed reallocateData"); + deleteData(); return FALSE; } return TRUE; diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp index aceebf781..79353d55b 100644 --- a/indra/llimage/llimageworker.cpp +++ b/indra/llimage/llimageworker.cpp @@ -41,20 +41,13 @@ LLImageDecodeThread::LLImageDecodeThread(bool threaded) : LLQueuedThread("imagedecode", threaded) { - mCreationMutex = new LLMutex(getAPRPool()); -} - -//virtual -LLImageDecodeThread::~LLImageDecodeThread() -{ - delete mCreationMutex ; } // MAIN THREAD // virtual S32 LLImageDecodeThread::update(U32 max_time_ms) { - LLMutexLock lock(mCreationMutex); + LLMutexLock lock(&mCreationMutex); for (creation_list_t::iterator iter = mCreationList.begin(); iter != mCreationList.end(); ++iter) { @@ -77,7 +70,7 @@ S32 LLImageDecodeThread::update(U32 max_time_ms) LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* image, U32 priority, S32 discard, BOOL needs_aux, Responder* responder) { - LLMutexLock lock(mCreationMutex); + LLMutexLock lock(&mCreationMutex); handle_t handle = generateHandle(); mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder)); return handle; @@ -87,7 +80,7 @@ LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* // Returns the size of the mutex guarded list as an indication of sanity S32 LLImageDecodeThread::tut_size() { - LLMutexLock lock(mCreationMutex); + LLMutexLock lock(&mCreationMutex); S32 res = mCreationList.size(); return res; } diff --git a/indra/llimage/llimageworker.h b/indra/llimage/llimageworker.h index 9a09f81bc..2703af497 100644 --- a/indra/llimage/llimageworker.h +++ b/indra/llimage/llimageworker.h @@ -78,8 +78,6 @@ public: public: LLImageDecodeThread(bool threaded = true); - virtual ~LLImageDecodeThread(); - handle_t decodeImage(LLImageFormatted* image, U32 priority, S32 discard, BOOL needs_aux, Responder* responder); @@ -103,7 +101,7 @@ private: }; typedef std::list creation_list_t; creation_list_t mCreationList; - LLMutex* mCreationMutex; + LLMutex mCreationMutex; }; #endif diff --git a/indra/llimage/llpngwrapper.cpp b/indra/llimage/llpngwrapper.cpp index 2274a38ea..0776e2ebd 100644 --- a/indra/llimage/llpngwrapper.cpp +++ b/indra/llimage/llpngwrapper.cpp @@ -213,7 +213,7 @@ void LLPngWrapper::normalizeImage() } if (mColorType == PNG_COLOR_TYPE_GRAY && mBitDepth < 8) { - png_set_gray_1_2_4_to_8(mReadPngPtr); + png_set_expand_gray_1_2_4_to_8(mReadPngPtr); } if (mColorType == PNG_COLOR_TYPE_GRAY || mColorType == PNG_COLOR_TYPE_GRAY_ALPHA) @@ -354,7 +354,7 @@ void LLPngWrapper::releaseResources() { if (mReadPngPtr || mReadInfoPtr) { - png_destroy_read_struct(&mReadPngPtr, &mReadInfoPtr, png_infopp_NULL); + png_destroy_read_struct(&mReadPngPtr, &mReadInfoPtr, NULL); mReadPngPtr = NULL; mReadInfoPtr = NULL; } diff --git a/indra/llimage/llpngwrapper.h b/indra/llimage/llpngwrapper.h index 0c3168cfd..eb47fdbdd 100644 --- a/indra/llimage/llpngwrapper.h +++ b/indra/llimage/llpngwrapper.h @@ -32,7 +32,11 @@ #ifndef LL_LLPNGWRAPPER_H #define LL_LLPNGWRAPPER_H +#if LL_WINDOWS +#include "libpng15/png.h" +#else #include "libpng12/png.h" +#endif #include "llimage.h" class LLPngWrapper diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt index ea89ffd09..afd5de34f 100644 --- a/indra/llinventory/CMakeLists.txt +++ b/indra/llinventory/CMakeLists.txt @@ -19,6 +19,7 @@ set(llinventory_SOURCE_FILES llcategory.cpp lleconomy.cpp llinventory.cpp + llinventorydefines.cpp llinventorytype.cpp lllandmark.cpp llnotecard.cpp @@ -35,6 +36,7 @@ set(llinventory_HEADER_FILES llcategory.h lleconomy.h llinventory.h + llinventorydefines.h llinventorytype.h lllandmark.h llnotecard.h diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index bb82966fd..977faa9ac 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -64,34 +64,27 @@ static const std::string INV_CREATION_DATE_LABEL("created_at"); // key used by agent-inventory-service static const std::string INV_ASSET_TYPE_LABEL_WS("type_default"); static const std::string INV_FOLDER_ID_LABEL_WS("category_id"); + ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- -const U8 TASK_INVENTORY_ITEM_KEY = 0; -const U8 TASK_INVENTORY_ASSET_KEY = 1; - const LLUUID MAGIC_ID("3c115e51-04f4-523c-9fa6-98aff1034730"); - ///---------------------------------------------------------------------------- /// Class LLInventoryObject ///---------------------------------------------------------------------------- -LLInventoryObject::LLInventoryObject( - const LLUUID& uuid, - const LLUUID& parent_uuid, - LLAssetType::EType type, - const std::string& name) : +LLInventoryObject::LLInventoryObject(const LLUUID& uuid, + const LLUUID& parent_uuid, + LLAssetType::EType type, + const std::string& name) : mUUID(uuid), mParentUUID(parent_uuid), mType(type), mName(name) { - LLStringUtil::replaceNonstandardASCII(mName, ' '); - LLStringUtil::replaceChar(mName, '|', ' '); - LLStringUtil::trim(mName); - LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN); + correctInventoryName(mName); } LLInventoryObject::LLInventoryObject() : @@ -99,7 +92,7 @@ LLInventoryObject::LLInventoryObject() : { } -LLInventoryObject::~LLInventoryObject( void ) +LLInventoryObject::~LLInventoryObject() { } @@ -158,12 +151,8 @@ void LLInventoryObject::setUUID(const LLUUID& new_uuid) void LLInventoryObject::rename(const std::string& n) { std::string new_name(n); - LLStringUtil::replaceNonstandardASCII(new_name, ' '); - LLStringUtil::replaceChar(new_name, '|', ' '); - LLStringUtil::trim(new_name); - LLStringUtil::truncate(new_name, DB_INV_ITEM_NAME_STR_LEN); - - if( new_name != mName ) + correctInventoryName(new_name); + if( !new_name.empty() && new_name != mName ) { mName = new_name; } @@ -224,10 +213,7 @@ BOOL LLInventoryObject::importLegacyStream(std::istream& input_stream) " %254s %254[^|]", keyword, valuestr); mName.assign(valuestr); - LLStringUtil::replaceNonstandardASCII(mName, ' '); - LLStringUtil::replaceChar(mName, '|', ' '); - LLStringUtil::trim(mName); - LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN); + correctInventoryName(mName); } else { @@ -287,23 +273,31 @@ void LLInventoryObject::updateServer(BOOL) const llwarns << "LLInventoryObject::updateServer() called. Doesn't do anything." << llendl; } +inline +void LLInventoryObject::correctInventoryName(std::string& name) +{ + LLStringUtil::replaceNonstandardASCII(name, ' '); + LLStringUtil::replaceChar(name, '|', ' '); + LLStringUtil::trim(name); + LLStringUtil::truncate(name, DB_INV_ITEM_NAME_STR_LEN); +} + ///---------------------------------------------------------------------------- /// Class LLInventoryItem ///---------------------------------------------------------------------------- -LLInventoryItem::LLInventoryItem( - const LLUUID& uuid, - const LLUUID& parent_uuid, - const LLPermissions& permissions, - const LLUUID& asset_uuid, - LLAssetType::EType type, - LLInventoryType::EType inv_type, - const std::string& name, - const std::string& desc, - const LLSaleInfo& sale_info, - U32 flags, - S32 creation_date_utc) : +LLInventoryItem::LLInventoryItem(const LLUUID& uuid, + const LLUUID& parent_uuid, + const LLPermissions& permissions, + const LLUUID& asset_uuid, + LLAssetType::EType type, + LLInventoryType::EType inv_type, + const std::string& name, + const std::string& desc, + const LLSaleInfo& sale_info, + U32 flags, + S32 creation_date_utc) : LLInventoryObject(uuid, parent_uuid, type, name), mPermissions(permissions), mAssetUUID(asset_uuid), @@ -315,6 +309,7 @@ LLInventoryItem::LLInventoryItem( { LLStringUtil::replaceNonstandardASCII(mDescription, ' '); LLStringUtil::replaceChar(mDescription, '|', ' '); + mPermissions.initMasks(inv_type); } LLInventoryItem::LLInventoryItem() : @@ -446,6 +441,9 @@ void LLInventoryItem::setDescription(const std::string& d) void LLInventoryItem::setPermissions(const LLPermissions& perm) { mPermissions = perm; + + // Override permissions to unrestricted if this is a landmark + mPermissions.initMasks(mInventoryType); } void LLInventoryItem::setInventoryType(LLInventoryType::EType inv_type) @@ -463,6 +461,46 @@ void LLInventoryItem::setCreationDate(time_t creation_date_utc) mCreationDate = creation_date_utc; } +// Currently only used in the Viewer to handle calling cards +// where the creator is actually used to store the target. +void LLInventoryItem::setCreator(const LLUUID& creator) +{ + mPermissions.setCreator(creator); +} + +void LLInventoryItem::accumulatePermissionSlamBits(const LLInventoryItem& old_item) +{ + // Remove any pre-existing II_FLAGS_PERM_OVERWRITE_MASK flags + // because we now detect when they should be set. + setFlags( old_item.getFlags() | (getFlags() & ~(LLInventoryItemFlags::II_FLAGS_PERM_OVERWRITE_MASK)) ); + + // Enforce the PERM_OVERWRITE flags for any masks that are different + // but only for AT_OBJECT's since that is the only asset type that can + // exist in-world (instead of only in-inventory or in-object-contents). + if (LLAssetType::AT_OBJECT == getType()) + { + LLPermissions old_permissions = old_item.getPermissions(); + U32 flags_to_be_set = 0; + if(old_permissions.getMaskNextOwner() != getPermissions().getMaskNextOwner()) + { + flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; + } + if(old_permissions.getMaskEveryone() != getPermissions().getMaskEveryone()) + { + flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + } + if(old_permissions.getMaskGroup() != getPermissions().getMaskGroup()) + { + flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + } + LLSaleInfo old_sale_info = old_item.getSaleInfo(); + if(old_sale_info != getSaleInfo()) + { + flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE; + } + setFlags(getFlags() | flags_to_be_set); + } +} const LLSaleInfo& LLInventoryItem::getSaleInfo() const { @@ -517,6 +555,7 @@ BOOL LLInventoryItem::unpackMessage(LLMessageSystem* msg, const char* block, S32 mType = static_cast(type); msg->getS8(block, "InvType", type, block_num); mInventoryType = static_cast(type); + mPermissions.initMasks(mInventoryType); msg->getU32Fast(block, _PREHASH_Flags, mFlags, block_num); @@ -707,6 +746,9 @@ BOOL LLInventoryItem::importFile(LLFILE* fp) lldebugs << "Resetting inventory type for " << mUUID << llendl; mInventoryType = LLInventoryType::defaultForAssetType(mType); } + + mPermissions.initMasks(mInventoryType); + return success; } @@ -746,8 +788,8 @@ BOOL LLInventoryItem::exportFile(LLFILE* fp, BOOL include_asset_key) const fprintf(fp, "\t\tasset_id\t%s\n", uuid_str.c_str()); } fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); - const char* inv_type_str = LLInventoryType::lookup(mInventoryType); - if(inv_type_str) fprintf(fp, "\t\tinv_type\t%s\n", inv_type_str); + const std::string inv_type_str = LLInventoryType::lookup(mInventoryType); + if(!inv_type_str.empty()) fprintf(fp, "\t\tinv_type\t%s\n", inv_type_str.c_str()); fprintf(fp, "\t\tflags\t%08x\n", mFlags); mSaleInfo.exportFile(fp); fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); @@ -910,6 +952,9 @@ BOOL LLInventoryItem::importLegacyStream(std::istream& input_stream) lldebugs << "Resetting inventory type for " << mUUID << llendl; mInventoryType = LLInventoryType::defaultForAssetType(mType); } + + mPermissions.initMasks(mInventoryType); + return success; } @@ -949,8 +994,8 @@ BOOL LLInventoryItem::exportLegacyStream(std::ostream& output_stream, BOOL inclu output_stream << "\t\tasset_id\t" << uuid_str << "\n"; } output_stream << "\t\ttype\t" << LLAssetType::lookup(mType) << "\n"; - const char* inv_type_str = LLInventoryType::lookup(mInventoryType); - if(inv_type_str) + const std::string inv_type_str = LLInventoryType::lookup(mInventoryType); + if(!inv_type_str.empty()) output_stream << "\t\tinv_type\t" << inv_type_str << "\n"; std::string buffer; buffer = llformat( "\t\tflags\t%08x\n", mFlags); @@ -966,6 +1011,12 @@ BOOL LLInventoryItem::exportLegacyStream(std::ostream& output_stream, BOOL inclu LLSD LLInventoryItem::asLLSD() const { LLSD sd = LLSD(); + asLLSD(sd); + return sd; +} + +void LLInventoryItem::asLLSD( LLSD& sd ) const +{ sd[INV_ITEM_ID_LABEL] = mUUID; sd[INV_PARENT_ID_LABEL] = mParentUUID; sd[INV_PERMISSIONS_LABEL] = ll_create_sd_from_permissions(mPermissions); @@ -986,8 +1037,8 @@ LLSD LLInventoryItem::asLLSD() const } sd[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(mType); sd[INV_INVENTORY_TYPE_LABEL] = mInventoryType; - const char* inv_type_str = LLInventoryType::lookup(mInventoryType); - if(inv_type_str) + const std::string inv_type_str = LLInventoryType::lookup(mInventoryType); + if(!inv_type_str.empty()) { sd[INV_INVENTORY_TYPE_LABEL] = inv_type_str; } @@ -997,11 +1048,9 @@ LLSD LLInventoryItem::asLLSD() const sd[INV_NAME_LABEL] = mName; sd[INV_DESC_LABEL] = mDescription; sd[INV_CREATION_DATE_LABEL] = (S32) mCreationDate; - - return sd; } -bool LLInventoryItem::fromLLSD(LLSD& sd) +bool LLInventoryItem::fromLLSD(const LLSD& sd) { mInventoryType = LLInventoryType::IT_NONE; mAssetUUID.setNull(); @@ -1128,6 +1177,8 @@ bool LLInventoryItem::fromLLSD(LLSD& sd) mInventoryType = LLInventoryType::defaultForAssetType(mType); } + mPermissions.initMasks(mInventoryType); + return true; fail: return false; @@ -1294,23 +1345,19 @@ void LLInventoryItem::unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size) // Early exit on an empty binary bucket. if (bin_bucket_size <= 1) return; - // Convert the bin_bucket into a string. - char* item_buffer = new char[bin_bucket_size+1]; - if ((item_buffer != NULL) && (bin_bucket != NULL)) + if (NULL == bin_bucket) { - memcpy(item_buffer, bin_bucket, bin_bucket_size); /* Flawfinder: ignore */ - } - else - { - llerrs << "unpackBinaryBucket failed. item_buffer or bin_bucket is Null." << llendl; - delete[] item_buffer; + llerrs << "unpackBinaryBucket failed. bin_bucket is NULL." << llendl; return; } - item_buffer[bin_bucket_size] = '\0'; - std::string str(item_buffer); - lldebugs << "item buffer: " << item_buffer << llendl; - delete[] item_buffer; + // Convert the bin_bucket into a string. + std::vector item_buffer(bin_bucket_size+1); + memcpy(&item_buffer[0], bin_bucket, bin_bucket_size); /* Flawfinder: ignore */ + item_buffer[bin_bucket_size] = '\0'; + std::string str(&item_buffer[0]); + + lldebugs << "item buffer: " << str << llendl; // Tokenize the string. typedef boost::tokenizer > tokenizer; @@ -1385,11 +1432,10 @@ BOOL item_date_sort( LLInventoryItem* a, LLInventoryItem* b ) /// Class LLInventoryCategory ///---------------------------------------------------------------------------- -LLInventoryCategory::LLInventoryCategory( - const LLUUID& uuid, - const LLUUID& parent_uuid, - LLAssetType::EType preferred_type, - const std::string& name) : +LLInventoryCategory::LLInventoryCategory(const LLUUID& uuid, + const LLUUID& parent_uuid, + LLAssetType::EType preferred_type, + const std::string& name) : LLInventoryObject(uuid, parent_uuid, LLAssetType::AT_CATEGORY, name), mPreferredType(preferred_type) { @@ -1451,7 +1497,7 @@ void LLInventoryCategory::packMessage(LLMessageSystem* msg) const msg->addStringFast(_PREHASH_Name, mName); } -bool LLInventoryCategory::fromLLSD(LLSD& sd) +bool LLInventoryCategory::fromLLSD(const LLSD& sd) { std::string w; diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index 982dad545..f28fcec47 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -33,180 +33,107 @@ #ifndef LL_LLINVENTORY_H #define LL_LLINVENTORY_H -#include - #include "llassetstorage.h" #include "lldarray.h" #include "llinventorytype.h" +#include "llinventorydefines.h" #include "llmemtype.h" #include "llpermissions.h" #include "llsaleinfo.h" #include "llsd.h" #include "lluuid.h" -#include "llxmlnode.h" - -// consts for Key field in the task inventory update message -extern const U8 TASK_INVENTORY_ITEM_KEY; -extern const U8 TASK_INVENTORY_ASSET_KEY; - -// anonymous enumeration to specify a max inventory buffer size for -// use in packBinaryBucket() -enum -{ - MAX_INVENTORY_BUFFER_SIZE = 1024 -}; - +class LLMessageSystem; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryObject // -// This is the base class for inventory objects that handles the -// common code between items and categories. The 'mParentUUID' member -// means the parent category since all inventory objects except each -// user's root category are in some category. Each user's root -// category will have mParentUUID==LLUUID::null. +// Base class for anything in the user's inventory. Handles the common code +// between items and categories. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLMessageSystem; - class LLInventoryObject : public LLRefCount { -protected: - LLUUID mUUID; - LLUUID mParentUUID; - LLAssetType::EType mType; - std::string mName; +public: + typedef std::list > object_list_t; -protected: - virtual ~LLInventoryObject( void ); - + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- public: MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY); - LLInventoryObject(const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType type, const std::string& name); LLInventoryObject(); + LLInventoryObject(const LLUUID& uuid, + const LLUUID& parent_uuid, + LLAssetType::EType type, + const std::string& name); void copyObject(const LLInventoryObject* other); // LLRefCount requires custom copy +protected: + virtual ~LLInventoryObject(); - // accessors - virtual const LLUUID& getUUID() const; + //-------------------------------------------------------------------- + // Accessors + //-------------------------------------------------------------------- +public: + virtual const LLUUID& getUUID() const; // inventoryID that this item points to + virtual const LLUUID& getLinkedUUID() const; // inventoryID that this item points to, else this item's inventoryID const LLUUID& getParentUUID() const; - virtual const LLUUID& getLinkedUUID() const; // get the inventoryID that this item points to, else this item's inventoryID virtual const std::string& getName() const; virtual LLAssetType::EType getType() const; LLAssetType::EType getActualType() const; // bypasses indirection for linked items BOOL getIsLinkType() const; - // mutators - will not call updateServer(); + + //-------------------------------------------------------------------- + // Mutators + // Will not call updateServer + //-------------------------------------------------------------------- +public: void setUUID(const LLUUID& new_uuid); virtual void rename(const std::string& new_name); void setParent(const LLUUID& new_parent); void setType(LLAssetType::EType type); - // file support - implemented here so that a minimal information - // set can be transmitted between simulator and viewer. -// virtual BOOL importFile(LLFILE* fp); - virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; +private: + // in place correction for inventory name string + void correctInventoryName(std::string& name); + //-------------------------------------------------------------------- + // File Support + // Implemented here so that a minimal information set can be transmitted + // between simulator and viewer. + //-------------------------------------------------------------------- +public: + // virtual BOOL importFile(LLFILE* fp); + virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; virtual BOOL importLegacyStream(std::istream& input_stream); virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; - // virtual methods virtual void removeFromServer(); virtual void updateParentOnServer(BOOL) const; virtual void updateServer(BOOL) const; + + //-------------------------------------------------------------------- + // Member Variables + //-------------------------------------------------------------------- +protected: + LLUUID mUUID; + LLUUID mParentUUID; // Parent category. Root categories have LLUUID::NULL. + LLAssetType::EType mType; + std::string mName; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryItem // -// An inventory item represents something that the current user has in -// their inventory. +// An item in the current user's inventory. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - class LLInventoryItem : public LLInventoryObject { public: typedef LLDynamicArray > item_array_t; - -protected: - LLPermissions mPermissions; - LLUUID mAssetUUID; - std::string mDescription; - LLSaleInfo mSaleInfo; - LLInventoryType::EType mInventoryType; - U32 mFlags; - time_t mCreationDate; // seconds from 1/1/1970, UTC - -public: - - /** - * Anonymous enumeration for specifying the inventory item flags. - */ - enum - { - // The shared flags at the top are shared among all inventory - // types. After that section, all values of flags are type - // dependent. The shared flags will start at 2^30 and work - // down while item type specific flags will start at 2^0 and - // work up. - II_FLAGS_NONE = 0, - - - // - // Shared flags - // - // - - // This value means that the asset has only one reference in - // the system. If the inventory item is deleted, or the asset - // id updated, then we can remove the old reference. - II_FLAGS_SHARED_SINGLE_REFERENCE = 0x40000000, - - - // - // Landmark flags - // - II_FLAGS_LANDMARK_VISITED = 1, - - // - // Object flags - // - - // flag to indicate that object permissions should have next - // owner perm be more restrictive on rez. We bump this into - // the second byte of the flags since the low byte is used to - // track attachment points. - II_FLAGS_OBJECT_SLAM_PERM = 0x100, - - // flag to indicate that the object sale information has been changed. - II_FLAGS_OBJECT_SLAM_SALE = 0x1000, - - // These flags specify which permissions masks to overwrite - // upon rez. Normally, if no permissions slam (above) or - // overwrite flags are set, the asset's permissions are - // used and the inventory's permissions are ignored. If - // any of these flags are set, the inventory's permissions - // take precedence. - II_FLAGS_OBJECT_PERM_OVERWRITE_BASE = 0x010000, - II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER = 0x020000, - II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP = 0x040000, - II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE = 0x080000, - II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER = 0x100000, - - // flag to indicate whether an object that is returned is composed - // of muiltiple items or not. - II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS = 0x200000, - - // - // wearables use the low order byte of flags to store the - // EWearableType enumeration found in newview/llwearable.h - // - II_FLAGS_WEARABLES_MASK = 0xff, - }; - -protected: - ~LLInventoryItem(); // ref counted + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- public: MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY); LLInventoryItem(const LLUUID& uuid, @@ -226,13 +153,19 @@ public: // is prohibited LLInventoryItem(const LLInventoryItem* other); virtual void copyItem(const LLInventoryItem* other); // LLRefCount requires custom copy - - // As a constructor alternative, the clone() method works like a + void generateUUID() { mUUID.generate(); } + + // As a constructor alternative, the clone() method works like a // copy constructor, but gens a new UUID. // It is up to the caller to delete (unref) the item. virtual void cloneItem(LLPointer& newitem) const; +protected: + ~LLInventoryItem(); // ref counted - // accessors + //-------------------------------------------------------------------- + // Accessors + //-------------------------------------------------------------------- +public: virtual const LLUUID& getLinkedUUID() const; virtual const LLPermissions& getPermissions() const; virtual const LLUUID& getCreatorUUID() const; @@ -244,8 +177,12 @@ public: virtual time_t getCreationDate() const; virtual U32 getCRC32() const; // really more of a checksum. - // mutators - will not call updateServer(), and will never fail - // (though it may correct to sane values) + //-------------------------------------------------------------------- + // Mutators + // Will not call updateServer and will never fail + // (though it may correct to sane values) + //-------------------------------------------------------------------- +public: void setAssetUUID(const LLUUID& asset_id); void setDescription(const std::string& new_desc); void setSaleInfo(const LLSaleInfo& sale_info); @@ -253,34 +190,56 @@ public: void setInventoryType(LLInventoryType::EType inv_type); void setFlags(U32 flags); void setCreationDate(time_t creation_date_utc); + void setCreator(const LLUUID& creator); // only used for calling cards - // Put this inventory item onto the current outgoing mesage. It - // assumes you have already called nextBlock(). + // Check for changes in permissions masks and sale info + // and set the corresponding bits in mFlags. + void accumulatePermissionSlamBits(const LLInventoryItem& old_item); + + // Put this inventory item onto the current outgoing mesage. + // Assumes you have already called nextBlock(). virtual void packMessage(LLMessageSystem* msg) const; // unpack returns TRUE if the inventory item came through the // network ok. It uses a simple crc check which is defeatable, but // we want to detect network mangling somehow. virtual BOOL unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); - // file support + + //-------------------------------------------------------------------- + // File Support + //-------------------------------------------------------------------- +public: virtual BOOL importFile(LLFILE* fp); virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; - virtual BOOL importLegacyStream(std::istream& input_stream); virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; virtual LLXMLNode *exportFileXML(BOOL include_asset_key = TRUE) const; BOOL importXML(LLXMLNode* node); - // helper functions + //-------------------------------------------------------------------- + // Helper Functions + //-------------------------------------------------------------------- +public: + // Pack all information needed to reconstruct this item into the given binary bucket. - // pack all information needed to reconstruct this item into the given binary bucket. - // perm_override is optional S32 packBinaryBucket(U8* bin_bucket, LLPermissions* perm_override = NULL) const; void unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size); LLSD asLLSD() const; - bool fromLLSD(LLSD& sd); + void asLLSD( LLSD& sd ) const; + bool fromLLSD(const LLSD& sd); + //-------------------------------------------------------------------- + // Member Variables + //-------------------------------------------------------------------- +protected: + LLPermissions mPermissions; + LLUUID mAssetUUID; + std::string mDescription; + LLSaleInfo mSaleInfo; + LLInventoryType::EType mInventoryType; + U32 mFlags; + time_t mCreationDate; // seconds from 1/1/1970, UTC }; BOOL item_dictionary_sort(LLInventoryItem* a,LLInventoryItem* b); @@ -300,9 +259,9 @@ class LLInventoryCategory : public LLInventoryObject public: typedef LLDynamicArray > cat_array_t; -protected: - ~LLInventoryCategory(); - + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- public: MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY); LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, @@ -311,29 +270,39 @@ public: LLInventoryCategory(); LLInventoryCategory(const LLInventoryCategory* other); void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy +protected: + ~LLInventoryCategory(); - // accessors and mutators + //-------------------------------------------------------------------- + // Accessors And Mutators + //-------------------------------------------------------------------- +public: LLAssetType::EType getPreferredType() const; void setPreferredType(LLAssetType::EType type); - // For messaging system support + LLSD asLLSD() const; + bool fromLLSD(const LLSD& sd); + + //-------------------------------------------------------------------- + // Messaging + //-------------------------------------------------------------------- +public: virtual void packMessage(LLMessageSystem* msg) const; virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); - LLSD asLLSD() const; - bool fromLLSD(LLSD& sd); - - // file support + //-------------------------------------------------------------------- + // File Support + //-------------------------------------------------------------------- +public: virtual BOOL importFile(LLFILE* fp); virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; - virtual BOOL importLegacyStream(std::istream& input_stream); virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; + //-------------------------------------------------------------------- + // Member Variables + //-------------------------------------------------------------------- protected: - // The type of asset that this category was "meant" to hold - // (although it may in fact hold any type). - LLAssetType::EType mPreferredType; - + LLAssetType::EType mPreferredType; // Type that this category was "meant" to hold (although it may hold any type). }; @@ -404,8 +373,8 @@ struct SetNotForSale if(LLAssetType::AT_OBJECT == item->getType()) { U32 flags = item->getFlags(); - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; item->setFlags(flags); } diff --git a/indra/llinventory/llinventorydefines.cpp b/indra/llinventory/llinventorydefines.cpp new file mode 100644 index 000000000..7def65a30 --- /dev/null +++ b/indra/llinventory/llinventorydefines.cpp @@ -0,0 +1,38 @@ +/** + * @file llinventorydefines.cpp + * @brief Implementation of the inventory defines. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + */ + +#include "linden_common.h" +#include "llinventorydefines.h" + +const U8 TASK_INVENTORY_ITEM_KEY = 0; +const U8 TASK_INVENTORY_ASSET_KEY = 1; diff --git a/indra/llinventory/llinventorydefines.h b/indra/llinventory/llinventorydefines.h new file mode 100644 index 000000000..fc81d1f72 --- /dev/null +++ b/indra/llinventory/llinventorydefines.h @@ -0,0 +1,107 @@ +/** + * @file llinventorydefines.h + * @brief LLInventoryDefines + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + */ + +#ifndef LL_LLINVENTORYDEFINES_H +#define LL_LLINVENTORYDEFINES_H + +// Consts for "key" field in the task inventory update message +extern const U8 TASK_INVENTORY_ITEM_KEY; +extern const U8 TASK_INVENTORY_ASSET_KEY; + +// Max inventory buffer size (for use in packBinaryBucket) +enum +{ + MAX_INVENTORY_BUFFER_SIZE = 1024 +}; + +//-------------------------------------------------------------------- +// Inventory item flags enums +// The shared flags at the top are shared among all inventory +// types. After that section, all values of flags are type +// dependent. The shared flags will start at 2^30 and work +// down while item type specific flags will start at 2^0 and work up. +//-------------------------------------------------------------------- +class LLInventoryItemFlags +{ +public: + enum EType + { + II_FLAGS_NONE = 0, + + II_FLAGS_SHARED_SINGLE_REFERENCE = 0x40000000, + // The asset has only one reference in the system. If the + // inventory item is deleted, or the assetid updated, then we + // can remove the old reference. + + II_FLAGS_LANDMARK_VISITED = 1, + + II_FLAGS_OBJECT_SLAM_PERM = 0x100, + // Object permissions should have next owner perm be more + // restrictive on rez. We bump this into the second byte of the + // flags since the low byte is used to track attachment points. + + II_FLAGS_OBJECT_SLAM_SALE = 0x1000, + // The object sale information has been changed. + + II_FLAGS_OBJECT_PERM_OVERWRITE_BASE = 0x010000, + II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER = 0x020000, + II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP = 0x040000, + II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE = 0x080000, + II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER = 0x100000, + // Specify which permissions masks to overwrite + // upon rez. Normally, if no permissions slam (above) or + // overwrite flags are set, the asset's permissions are + // used and the inventory's permissions are ignored. If + // any of these flags are set, the inventory's permissions + // take precedence. + + II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS = 0x200000, + // Whether a returned object is composed of multiple items. + + II_FLAGS_WEARABLES_MASK = 0xff, + // Wearables use the low order byte of flags to store the + // LLWearableType::EType enumeration found in newview/llwearable.h + + II_FLAGS_PERM_OVERWRITE_MASK = (II_FLAGS_OBJECT_SLAM_PERM | + II_FLAGS_OBJECT_SLAM_SALE | + II_FLAGS_OBJECT_PERM_OVERWRITE_BASE | + II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER | + II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP | + II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE | + II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER), + // These bits need to be cleared whenever the asset_id is updated + // on a pre-existing inventory item (DEV-28098 and DEV-30997) + }; +}; + +#endif // LL_LLINVENTORYDEFINES_H diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp index 3754a98b7..b2f0eb6c2 100644 --- a/indra/llinventory/llinventorytype.cpp +++ b/indra/llinventory/llinventorytype.cpp @@ -33,66 +33,64 @@ #include "linden_common.h" #include "llinventorytype.h" +#include "lldictionary.h" +#include "llmemory.h" + +static const std::string empty_string; ///---------------------------------------------------------------------------- /// Class LLInventoryType ///---------------------------------------------------------------------------- - -// Unlike asset type names, not limited to 8 characters. -// Need not match asset type names. -static const char* INVENTORY_TYPE_NAMES[LLInventoryType::IT_COUNT] = -{ - "texture", // 0 - "sound", - "callcard", - "landmark", - NULL, - NULL, // 5 - "object", - "notecard", - "category", - "root", - "script", // 10 - NULL, - NULL, - NULL, - NULL, - "snapshot", // 15 - NULL, - "attach", - "wearable", - "animation", - "gesture", // 20 +struct InventoryEntry : public LLDictionaryEntry +{ + InventoryEntry(const std::string &name, // unlike asset type names, not limited to 8 characters; need not match asset type names + const std::string &human_name, // for decoding to human readable form; put any and as many printable characters you want in each one. + int num_asset_types = 0, ...) + : + LLDictionaryEntry(name), + mHumanName(human_name) + { + va_list argp; + va_start(argp, num_asset_types); + // Read in local textures + for (U8 i=0; i < num_asset_types; i++) + { + LLAssetType::EType t = (LLAssetType::EType)va_arg(argp,int); + mAssetTypes.push_back(t); + } + } + + const std::string mHumanName; + typedef std::vector asset_vec_t; + asset_vec_t mAssetTypes; }; -// This table is meant for decoding to human readable form. Put any -// and as many printable characters you want in each one. -// See also LLAssetType::mAssetTypeHumanNames -static const char* INVENTORY_TYPE_HUMAN_NAMES[LLInventoryType::IT_COUNT] = -{ - "texture", // 0 - "sound", - "calling card", - "landmark", - NULL, - NULL, // 5 - "object", - "note card", - "folder", - "root", - "script", // 10 - NULL, - NULL, - NULL, - NULL, - "snapshot", // 15 - NULL, - "attachment", - "wearable", - "animation", - "gesture", // 20 +class LLInventoryDictionary : public LLSingleton, + public LLDictionary +{ +public: + LLInventoryDictionary(); }; +LLInventoryDictionary::LLInventoryDictionary() +{ + addEntry(LLInventoryType::IT_TEXTURE, new InventoryEntry("texture", "texture", 1, LLAssetType::AT_TEXTURE)); + addEntry(LLInventoryType::IT_SOUND, new InventoryEntry("sound", "sound", 1, LLAssetType::AT_SOUND)); + addEntry(LLInventoryType::IT_CALLINGCARD, new InventoryEntry("callcard", "calling card", 1, LLAssetType::AT_CALLINGCARD)); + addEntry(LLInventoryType::IT_LANDMARK, new InventoryEntry("landmark", "landmark", 1, LLAssetType::AT_LANDMARK)); + addEntry(LLInventoryType::IT_OBJECT, new InventoryEntry("object", "object", 1, LLAssetType::AT_OBJECT)); + addEntry(LLInventoryType::IT_NOTECARD, new InventoryEntry("notecard", "note card", 1, LLAssetType::AT_NOTECARD)); + addEntry(LLInventoryType::IT_CATEGORY, new InventoryEntry("category", "folder" )); + addEntry(LLInventoryType::IT_ROOT_CATEGORY, new InventoryEntry("root", "root" )); + addEntry(LLInventoryType::IT_LSL, new InventoryEntry("script", "script", 2, LLAssetType::AT_LSL_TEXT, LLAssetType::AT_LSL_BYTECODE)); + addEntry(LLInventoryType::IT_SNAPSHOT, new InventoryEntry("snapshot", "snapshot", 1, LLAssetType::AT_TEXTURE)); + addEntry(LLInventoryType::IT_ATTACHMENT, new InventoryEntry("attach", "attachment", 1, LLAssetType::AT_OBJECT)); + addEntry(LLInventoryType::IT_WEARABLE, new InventoryEntry("wearable", "wearable", 2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART)); + addEntry(LLInventoryType::IT_ANIMATION, new InventoryEntry("animation", "animation", 1, LLAssetType::AT_ANIMATION)); + addEntry(LLInventoryType::IT_GESTURE, new InventoryEntry("gesture", "gesture", 1, LLAssetType::AT_GESTURE)); +} + + // Maps asset types to the default inventory type for that kind of asset. // Thus, "Lost and Found" is a "Category" static const LLInventoryType::EType @@ -149,74 +147,28 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] = LLInventoryType::IT_NONE // AT_MY_OUTFITS }; -static const int MAX_POSSIBLE_ASSET_TYPES = 2; -static const LLAssetType::EType -INVENTORY_TO_ASSET_TYPE[LLInventoryType::IT_COUNT][MAX_POSSIBLE_ASSET_TYPES] = -{ - { LLAssetType::AT_TEXTURE, LLAssetType::AT_NONE }, // IT_TEXTURE - { LLAssetType::AT_SOUND, LLAssetType::AT_NONE }, // IT_SOUND - { LLAssetType::AT_CALLINGCARD, LLAssetType::AT_NONE }, // IT_CALLINGCARD - { LLAssetType::AT_LANDMARK, LLAssetType::AT_NONE }, // IT_LANDMARK - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, - { LLAssetType::AT_OBJECT, LLAssetType::AT_NONE }, // IT_OBJECT - { LLAssetType::AT_NOTECARD, LLAssetType::AT_NONE }, // IT_NOTECARD - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, // IT_CATEGORY - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, // IT_ROOT_CATEGORY - { LLAssetType::AT_LSL_TEXT, LLAssetType::AT_LSL_BYTECODE }, // IT_LSL - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, - { LLAssetType::AT_TEXTURE, LLAssetType::AT_NONE }, // IT_SNAPSHOT - { LLAssetType::AT_NONE, LLAssetType::AT_NONE }, - { LLAssetType::AT_OBJECT, LLAssetType::AT_NONE }, // IT_ATTACHMENT - { LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART }, // IT_WEARABLE - { LLAssetType::AT_ANIMATION, LLAssetType::AT_NONE }, // IT_ANIMATION - { LLAssetType::AT_GESTURE, LLAssetType::AT_NONE }, // IT_GESTURE -}; - // static -const char* LLInventoryType::lookup(EType type) +const std::string &LLInventoryType::lookup(EType type) { - if((type >= 0) && (type < IT_COUNT)) - { - return INVENTORY_TYPE_NAMES[S32(type)]; - } - else - { - return NULL; - } + const InventoryEntry *entry = LLInventoryDictionary::getInstance()->lookup(type); + if (!entry) return empty_string; + return entry->mName; } // static LLInventoryType::EType LLInventoryType::lookup(const std::string& name) { - for(S32 i = 0; i < IT_COUNT; ++i) - { - if((INVENTORY_TYPE_NAMES[i]) - && (name == INVENTORY_TYPE_NAMES[i])) - { - // match - return (EType)i; - } - } - return IT_NONE; + return LLInventoryDictionary::getInstance()->lookup(name); } // XUI:translate // translation from a type to a human readable form. // static -const char* LLInventoryType::lookupHumanReadable(EType type) +const std::string &LLInventoryType::lookupHumanReadable(EType type) { - if((type >= 0) && (type < IT_COUNT)) - { - return INVENTORY_TYPE_HUMAN_NAMES[S32(type)]; - } - else - { - return NULL; - } + const InventoryEntry *entry = LLInventoryDictionary::getInstance()->lookup(type); + if (!entry) return empty_string; + return entry->mHumanName; } // return the default inventory for the given asset type. @@ -233,21 +185,40 @@ LLInventoryType::EType LLInventoryType::defaultForAssetType(LLAssetType::EType a } } -bool inventory_and_asset_types_match( - LLInventoryType::EType inventory_type, - LLAssetType::EType asset_type) + +// add any types that we don't want the user to be able to change permissions on. +// static +bool LLInventoryType::cannotRestrictPermissions(LLInventoryType::EType type) { - bool rv = false; - if((inventory_type >= 0) && (inventory_type < LLInventoryType::IT_COUNT)) + switch(type) { - for(S32 i = 0; i < MAX_POSSIBLE_ASSET_TYPES; ++i) + case IT_CALLINGCARD: + case IT_LANDMARK: + return true; + default: + return false; + } +} + +bool inventory_and_asset_types_match(LLInventoryType::EType inventory_type, + LLAssetType::EType asset_type) +{ + // Links can be of any inventory type. + if (LLAssetType::lookupIsLinkType(asset_type)) + return true; + + const InventoryEntry *entry = LLInventoryDictionary::getInstance()->lookup(inventory_type); + if (!entry) return false; + + for (InventoryEntry::asset_vec_t::const_iterator iter = entry->mAssetTypes.begin(); + iter != entry->mAssetTypes.end(); + iter++) + { + const LLAssetType::EType type = (*iter); + if(type == asset_type) { - if(INVENTORY_TO_ASSET_TYPE[inventory_type][i] == asset_type) - { - rv = true; - break; - } + return true; } } - return rv; + return false; } diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h index d3effc0e6..f4ab79d03 100644 --- a/indra/llinventory/llinventorytype.h +++ b/indra/llinventory/llinventorytype.h @@ -74,14 +74,16 @@ public: // machine transation between type and strings static EType lookup(const std::string& name); - static const char* lookup(EType type); - + static const std::string &lookup(EType type); // translation from a type to a human readable form. - static const char* lookupHumanReadable(EType type); + static const std::string &lookupHumanReadable(EType type); // return the default inventory for the given asset type. static EType defaultForAssetType(LLAssetType::EType asset_type); + // true if this type cannot have restricted permissions. + static bool cannotRestrictPermissions(EType type); + private: // don't instantiate or derive one of these objects LLInventoryType( void ); @@ -91,8 +93,7 @@ private: // helper function which returns true if inventory type and asset type // are potentially compatible. For example, an attachment must be an // object, but a wearable can be a bodypart or clothing asset. -bool inventory_and_asset_types_match( - LLInventoryType::EType inventory_type, - LLAssetType::EType asset_type); +bool inventory_and_asset_types_match(LLInventoryType::EType inventory_type, + LLAssetType::EType asset_type); #endif diff --git a/indra/llinventory/lllandmark.cpp b/indra/llinventory/lllandmark.cpp index 13a63bc7d..83b6392ca 100644 --- a/indra/llinventory/lllandmark.cpp +++ b/indra/llinventory/lllandmark.cpp @@ -40,7 +40,7 @@ std::pair LLLandmark::mLocalRegion; LLLandmark::region_map_t LLLandmark::mRegions; -LLLandmark::region_callback_t LLLandmark::mRegionCallback; +LLLandmark::region_callback_map_t LLLandmark::sRegionCallbackMap; LLLandmark::LLLandmark() : mGlobalPositionKnown(false) @@ -177,7 +177,7 @@ void LLLandmark::requestRegionHandle( LLMessageSystem* msg, const LLHost& upstream_host, const LLUUID& region_id, - LLRegionHandleCallback* callback) + region_handle_callback_t callback) { if(region_id.isNull()) { @@ -186,7 +186,7 @@ void LLLandmark::requestRegionHandle( if(callback) { const U64 U64_ZERO = 0; - callback->dataReady(region_id, U64_ZERO); + callback(region_id, U64_ZERO); } } else @@ -196,7 +196,7 @@ void LLLandmark::requestRegionHandle( lldebugs << "requestRegionHandle: local" << llendl; if(callback) { - callback->dataReady(region_id, mLocalRegion.second); + callback(region_id, mLocalRegion.second); } } else @@ -207,8 +207,8 @@ void LLLandmark::requestRegionHandle( lldebugs << "requestRegionHandle: upstream" << llendl; if(callback) { - region_callback_t::value_type vt(region_id, callback); - mRegionCallback.insert(vt); + region_callback_map_t::value_type vt(region_id, callback); + sRegionCallbackMap.insert(vt); } lldebugs << "Landmark requesting information about: " << region_id << llendl; @@ -221,7 +221,7 @@ void LLLandmark::requestRegionHandle( { // we have the answer locally - just call the callack. lldebugs << "requestRegionHandle: ready" << llendl; - callback->dataReady(region_id, (*it).second.mRegionHandle); + callback(region_id, (*it).second.mRegionHandle); } } } @@ -259,11 +259,11 @@ void LLLandmark::processRegionIDAndHandle(LLMessageSystem* msg, void**) #endif // make all the callbacks here. - region_callback_t::iterator it; - while((it = mRegionCallback.find(region_id)) != mRegionCallback.end()) + region_callback_map_t::iterator it; + while((it = sRegionCallbackMap.find(region_id)) != sRegionCallbackMap.end()) { - (*it).second->dataReady(region_id, info.mRegionHandle); - mRegionCallback.erase(it); + (*it).second(region_id, info.mRegionHandle); + sRegionCallbackMap.erase(it); } } diff --git a/indra/llinventory/lllandmark.h b/indra/llinventory/lllandmark.h index cb0c11ab8..feaf1a0e9 100644 --- a/indra/llinventory/lllandmark.h +++ b/indra/llinventory/lllandmark.h @@ -35,6 +35,7 @@ #define LL_LLLANDMARK_H #include +#include #include "llframetimer.h" #include "lluuid.h" #include "v3dmath.h" @@ -42,24 +43,12 @@ class LLMessageSystem; class LLHost; -// virutal base class used for calling back interested parties when a -// region handle comes back. -class LLRegionHandleCallback -{ -public: - LLRegionHandleCallback() {} - virtual ~LLRegionHandleCallback() {} - virtual bool dataReady( - const LLUUID& region_id, - const U64& region_handle) - { - return true; - } -}; - class LLLandmark { public: + // for calling back interested parties when a region handle comes back. + typedef boost::function region_handle_callback_t; + ~LLLandmark() {} // returns true if the position is known. @@ -90,7 +79,7 @@ public: LLMessageSystem* msg, const LLHost& upstream_host, const LLUUID& region_id, - LLRegionHandleCallback* callback); + region_handle_callback_t callback); // Call this method to create a lookup for this region. This // simplifies a lot of the code. @@ -118,8 +107,8 @@ private: static std::pair mLocalRegion; typedef std::map region_map_t; static region_map_t mRegions; - typedef std::multimap region_callback_t; - static region_callback_t mRegionCallback; + typedef std::multimap region_callback_map_t; + static region_callback_map_t sRegionCallbackMap; }; #endif diff --git a/indra/llinventory/llnotecard.cpp b/indra/llinventory/llnotecard.cpp index 9e7e04376..13ac4c9f0 100644 --- a/indra/llinventory/llnotecard.cpp +++ b/indra/llinventory/llnotecard.cpp @@ -35,7 +35,9 @@ #include "llstreamtools.h" LLNotecard::LLNotecard(S32 max_text) -: mMaxText(max_text) + : mMaxText(max_text), + mVersion(0), + mEmbeddedVersion(0) { } @@ -203,7 +205,7 @@ bool LLNotecard::importStream(std::istream& str) return FALSE; } - if(text_len > mMaxText) + if(text_len > mMaxText || text_len < 0) { llwarns << "Invalid Linden text length: " << text_len << llendl; return FALSE; diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index 0144ffa00..13c062e38 100644 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -79,23 +79,25 @@ static const std::string PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] = "shopping", "stage", "other", + "rental" }; static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] = { "None", "Linden Location", "Adult", - "Arts & Culture", + "Arts and Culture", "Business", "Educational", "Gaming", "Hangout", "Newcomer Friendly", - "Parks & Nature", + "Parks and Nature", "Residential", "Shopping", "Stage", "Other", + "Rental", "Any", // valid string for parcel searches }; @@ -690,8 +692,8 @@ void LLParcel::packMessage(LLSD& msg) msg["auto_scale"] = getMediaAutoScale(); msg["media_loop"] = getMediaLoop(); msg["media_current_url"] = getMediaCurrentURL(); - msg["obscure_media"] = FALSE; // OBSOLETE - no longer used - msg["obscure_music"] = FALSE; // OBSOLETE - no longer used + msg["obscure_media"] = false; // OBSOLETE - no longer used + msg["obscure_music"] = false; // OBSOLETE - no longer used msg["media_id"] = getMediaID(); msg["media_allow_navigate"] = getMediaAllowNavigate(); msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom(); diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h index fcbd01b9a..eb9c44e53 100644 --- a/indra/llinventory/llparcel.h +++ b/indra/llinventory/llparcel.h @@ -170,6 +170,7 @@ public: C_SHOPPING, C_STAGE, C_OTHER, + C_RENTAL, C_COUNT, C_ANY = -1 // only useful in queries }; @@ -534,7 +535,7 @@ public: static bool isAgentBlockedFromParcel(LLParcel* parcelp, const LLUUID& agent_id, - const std::vector& group_ids, + const uuid_vec_t& group_ids, const BOOL is_agent_identified, const BOOL is_agent_transacted, const BOOL is_agent_ageverified); diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp index c22564d95..718dd354a 100644 --- a/indra/llinventory/llpermissions.cpp +++ b/indra/llinventory/llpermissions.cpp @@ -83,6 +83,17 @@ void LLPermissions::initMasks(PermissionMask base, PermissionMask owner, fix(); } +// ! BACKWARDS COMPATIBILITY ! Override masks for inventory types that +// no longer can have restricted permissions. This takes care of previous +// version landmarks that could have had no copy/mod/transfer bits set. +void LLPermissions::initMasks(LLInventoryType::EType type) +{ + if (LLInventoryType::cannotRestrictPermissions(type)) + { + initMasks(PERM_ALL, PERM_ALL, PERM_ALL, PERM_ALL, PERM_ALL); + } +} + BOOL LLPermissions::getOwnership(LLUUID& owner_id, BOOL& is_group_owned) const { if(mOwner.notNull()) @@ -277,6 +288,17 @@ BOOL LLPermissions::setOwnerAndGroup( return allowed; } +//Fix for DEV-33917, last owner isn't used much and has little impact on +//permissions so it's reasonably safe to do this, however, for now, +//limiting the functionality of this routine to objects which are +//group owned. +void LLPermissions::setLastOwner(const LLUUID& last_owner) +{ + if (isGroupOwned()) + mLastOwner = last_owner; +} + + // only call this if you know what you're doing // there are usually perm-bit consequences when the // ownerhsip changes @@ -457,7 +479,7 @@ BOOL LLPermissions::setNextOwnerBits(const LLUUID& agent, const LLUUID& group, B return ownership; } -BOOL LLPermissions::allowOperationBy(PermissionBit op, const LLUUID& requester, const LLUUID& group) const +bool LLPermissions::allowOperationBy(PermissionBit op, const LLUUID& requester, const LLUUID& group) const { if(requester.isNull()) { diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h index 5587f8c3c..9143fdf30 100644 --- a/indra/llinventory/llpermissions.h +++ b/indra/llinventory/llpermissions.h @@ -38,6 +38,7 @@ #include "lluuid.h" #include "llxmlnode.h" #include "reflective.h" +#include "llinventorytype.h" // prototypes class LLMessageSystem; @@ -129,6 +130,8 @@ public: void initMasks(PermissionMask base, PermissionMask owner, PermissionMask everyone, PermissionMask group, PermissionMask next); + // adjust permissions based on inventory type. + void initMasks(LLInventoryType::EType type); // // ACCESSORS @@ -229,6 +232,9 @@ public: // ownerhsip changes void yesReallySetOwner(const LLUUID& owner, bool group_owned); + // Last owner doesn't have much in the way of permissions so it's + //not too dangerous to do this. + void setLastOwner(const LLUUID& last_owner); // saves last owner, sets owner to uuid null, sets group // owned. group_id must be the group of the object (that's who it // is being deeded to) and the object must be group @@ -249,7 +255,11 @@ public: BOOL setGroupBits( const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits); BOOL setEveryoneBits(const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits); BOOL setNextOwnerBits(const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits); - + + // This is currently only used in the Viewer to handle calling cards + // where the creator is actually used to store the target. Use with care. + void setCreator(const LLUUID& creator) { mCreator = creator; } + // // METHODS // @@ -261,18 +271,18 @@ public: // They also return true if the object isn't owned, or the // requesting agent is a system agent. See llpermissionsflags.h // for bits. - BOOL allowOperationBy(PermissionBit op, const LLUUID& agent, const LLUUID& group = LLUUID::null) const; + bool allowOperationBy(PermissionBit op, const LLUUID& agent, const LLUUID& group = LLUUID::null) const; - inline BOOL allowModifyBy(const LLUUID &agent_id) const; - inline BOOL allowCopyBy(const LLUUID& agent_id) const; - inline BOOL allowMoveBy(const LLUUID& agent_id) const; - inline BOOL allowModifyBy(const LLUUID &agent_id, const LLUUID& group) const; - inline BOOL allowCopyBy(const LLUUID& agent_id, const LLUUID& group) const; - inline BOOL allowMoveBy(const LLUUID &agent_id, const LLUUID &group) const; + inline bool allowModifyBy(const LLUUID &agent_id) const; + inline bool allowCopyBy(const LLUUID& agent_id) const; + inline bool allowMoveBy(const LLUUID& agent_id) const; + inline bool allowModifyBy(const LLUUID &agent_id, const LLUUID& group) const; + inline bool allowCopyBy(const LLUUID& agent_id, const LLUUID& group) const; + inline bool allowMoveBy(const LLUUID &agent_id, const LLUUID &group) const; // This somewhat specialized function is meant for testing if the // current owner is allowed to transfer to the specified agent id. - inline BOOL allowTransferTo(const LLUUID &agent_id) const; + inline bool allowTransferTo(const LLUUID &agent_id) const; // // DEPRECATED. @@ -328,38 +338,38 @@ public: }; // Inlines -BOOL LLPermissions::allowModifyBy(const LLUUID& agent, const LLUUID& group) const +bool LLPermissions::allowModifyBy(const LLUUID& agent, const LLUUID& group) const { return allowOperationBy(PERM_MODIFY, agent, group); } -BOOL LLPermissions::allowCopyBy(const LLUUID& agent, const LLUUID& group) const +bool LLPermissions::allowCopyBy(const LLUUID& agent, const LLUUID& group) const { return allowOperationBy(PERM_COPY, agent, group); } -BOOL LLPermissions::allowMoveBy(const LLUUID& agent, const LLUUID& group) const +bool LLPermissions::allowMoveBy(const LLUUID& agent, const LLUUID& group) const { return allowOperationBy(PERM_MOVE, agent, group); } -BOOL LLPermissions::allowModifyBy(const LLUUID& agent) const +bool LLPermissions::allowModifyBy(const LLUUID& agent) const { return allowOperationBy(PERM_MODIFY, agent, LLUUID::null); } -BOOL LLPermissions::allowCopyBy(const LLUUID& agent) const +bool LLPermissions::allowCopyBy(const LLUUID& agent) const { return allowOperationBy(PERM_COPY, agent, LLUUID::null); } -BOOL LLPermissions::allowMoveBy(const LLUUID& agent) const +bool LLPermissions::allowMoveBy(const LLUUID& agent) const { return allowOperationBy(PERM_MOVE, agent, LLUUID::null); } -BOOL LLPermissions::allowTransferTo(const LLUUID &agent_id) const +bool LLPermissions::allowTransferTo(const LLUUID &agent_id) const { if (mIsGroupOwned) { diff --git a/indra/llinventory/llsaleinfo.cpp b/indra/llinventory/llsaleinfo.cpp index 11709bc59..b7afb28ad 100644 --- a/indra/llinventory/llsaleinfo.cpp +++ b/indra/llinventory/llsaleinfo.cpp @@ -111,7 +111,7 @@ LLSD LLSaleInfo::asLLSD() const return sd; } -bool LLSaleInfo::fromLLSD(LLSD& sd, BOOL& has_perm_mask, U32& perm_mask) +bool LLSaleInfo::fromLLSD(const LLSD& sd, BOOL& has_perm_mask, U32& perm_mask) { const char *w; diff --git a/indra/llinventory/llsaleinfo.h b/indra/llinventory/llsaleinfo.h index 07f440527..d546c49fd 100644 --- a/indra/llinventory/llsaleinfo.h +++ b/indra/llinventory/llsaleinfo.h @@ -98,7 +98,7 @@ public: BOOL exportLegacyStream(std::ostream& output_stream) const; LLSD asLLSD() const; operator LLSD() const { return asLLSD(); } - bool fromLLSD(LLSD& sd, BOOL& has_perm_mask, U32& perm_mask); + bool fromLLSD(const LLSD& sd, BOOL& has_perm_mask, U32& perm_mask); BOOL importLegacyStream(std::istream& input_stream, BOOL& has_perm_mask, U32& perm_mask); LLXMLNode *exportFileXML() const; diff --git a/indra/llinventory/lltransactiontypes.h b/indra/llinventory/lltransactiontypes.h index d70109804..7f49c763c 100644 --- a/indra/llinventory/lltransactiontypes.h +++ b/indra/llinventory/lltransactiontypes.h @@ -45,6 +45,7 @@ // Money transaction failure codes const U8 TRANS_FAIL_SIMULATOR_TIMEOUT = 1; const U8 TRANS_FAIL_DATASERVER_TIMEOUT = 2; +const U8 TRANS_FAIL_APPLICATION = 3; // Codes up to 999 for error conditions const S32 TRANS_NULL = 0; @@ -68,6 +69,11 @@ const S32 TRANS_PARCEL_DIR_FEE = 2003; const S32 TRANS_GROUP_TAX = 2004; // Taxes incurred as part of group membership const S32 TRANS_CLASSIFIED_RENEW = 2005; +// Codes 2100-2999 reserved for recurring billing services +// New codes can be created through an admin interface so may not +// automatically end up in the list below :-( +// So make sure you check the transaction_description table +const S32 TRANS_RECURRING_GENERIC = 2100; // Codes 3000-3999 reserved for inventory transactions const S32 TRANS_GIVE_INVENTORY = 3000; @@ -83,6 +89,12 @@ const S32 TRANS_DWELL_BONUS = 5007; const S32 TRANS_PAY_OBJECT = 5008; const S32 TRANS_OBJECT_PAYS = 5009; +// Codes 5100-5999 reserved for recurring billing transfers between users +// New codes can be created through an admin interface so may not +// automatically end up in the list below :-( +// So make sure you check the transaction_description table +const S32 TRANS_RECURRING_GENERIC_USER = 5100; + // Codes 6000-6999 reserved for group transactions //const S32 TRANS_GROUP_JOIN = 6000; //reserved for future use const S32 TRANS_GROUP_LAND_DEED = 6001; diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index c065cd9c1..bc1a4fa9f 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -3391,7 +3391,8 @@ void LLVolume::generateSilhouetteVertices(std::vector &vertices, std::vector &segments, const LLVector3& obj_cam_vec, const LLMatrix4& mat, - const LLMatrix3& norm_mat) + const LLMatrix3& norm_mat, + S32 face_mask) { LLMemType m1(LLMemType::MTYPE_VOLUME); @@ -3399,12 +3400,17 @@ void LLVolume::generateSilhouetteVertices(std::vector &vertices, normals.clear(); segments.clear(); + S32 cur_index = 0; //for each face for (face_list_t::iterator iter = mVolumeFaces.begin(); iter != mVolumeFaces.end(); ++iter) { const LLVolumeFace& face = *iter; + if (!(face_mask & (0x1 << cur_index++))) + { + continue; + } if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) { } diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index 41a15d579..ddfac18cd 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -909,7 +909,8 @@ public: std::vector &segments, const LLVector3& view_vec, const LLMatrix4& mat, - const LLMatrix3& norm_mat); + const LLMatrix3& norm_mat, + S32 face_index); //get the face index of the face that intersects with the given line segment at the point //closest to start. Moves end to the point of intersection. Returns -1 if no intersection. diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp index 53641fcea..8bfebcb42 100644 --- a/indra/llmath/llvolumemgr.cpp +++ b/indra/llmath/llvolumemgr.cpp @@ -55,7 +55,7 @@ LLVolumeMgr::LLVolumeMgr() { // the LLMutex magic interferes with easy unit testing, // so you now must manually call useMutex() to use it - //mDataMutex = new LLMutex(gAPRPoolp); + //mDataMutex = new LLMutex; } LLVolumeMgr::~LLVolumeMgr() @@ -222,7 +222,7 @@ void LLVolumeMgr::useMutex() { if (!mDataMutex) { - mDataMutex = new LLMutex(gAPRPoolp); + mDataMutex = new LLMutex; } } diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp index 7a2dc6cc3..93079f537 100644 --- a/indra/llmessage/llares.cpp +++ b/indra/llmessage/llares.cpp @@ -44,6 +44,7 @@ #include "llapr.h" #define CARES_STATICLIB #include "llares.h" +#include "llscopedvolatileaprpool.h" #if defined(LL_WINDOWS) # define ns_c_in 1 @@ -467,11 +468,6 @@ void LLAres::search(const std::string &query, LLResType type, bool LLAres::process(U64 timeout) { - if (!gAPRPoolp) - { - ll_init_apr(); - } - ares_socket_t socks[ARES_GETSOCK_MAXNUM]; apr_pollfd_t aprFds[ARES_GETSOCK_MAXNUM]; apr_int32_t nsds = 0; @@ -485,10 +481,7 @@ bool LLAres::process(U64 timeout) return nsds > 0; } - apr_status_t status; - LLAPRPool pool; - status = pool.getStatus() ; - ll_apr_assert_status(status); + LLScopedVolatileAPRPool scoped_pool; for (int i = 0; i < ARES_GETSOCK_MAXNUM; i++) { @@ -505,7 +498,7 @@ bool LLAres::process(U64 timeout) apr_socket_t *aprSock = NULL; - status = apr_os_sock_put(&aprSock, (apr_os_sock_t *) &socks[i], pool.getAPRPool()); + apr_status_t status = apr_os_sock_put(&aprSock, (apr_os_sock_t *) &socks[i], scoped_pool); if (status != APR_SUCCESS) { ll_apr_warn_status(status); @@ -514,7 +507,7 @@ bool LLAres::process(U64 timeout) aprFds[nactive].desc.s = aprSock; aprFds[nactive].desc_type = APR_POLL_SOCKET; - aprFds[nactive].p = pool.getAPRPool(); + aprFds[nactive].p = scoped_pool; aprFds[nactive].rtnevents = 0; aprFds[nactive].client_data = &socks[i]; @@ -523,7 +516,7 @@ bool LLAres::process(U64 timeout) if (nactive > 0) { - status = apr_poll(aprFds, nactive, &nsds, timeout); + apr_status_t status = apr_poll(aprFds, nactive, &nsds, timeout); if (status != APR_SUCCESS && status != APR_TIMEUP) { diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 523aa0e54..fcc01990f 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -334,14 +334,14 @@ void LLAvatarNameCache::processName(const LLUUID& agent_id, { if (add_to_cache) { - // sCache[agent_id] = av_name; - // [SL:KB] - Patch: Agent-DisplayNames | Checked: 2010-12-28 (Catznip-2.4.0h) | Added: Catznip-2.4.0h - // Don't replace existing entries with dummies - cache_t::iterator itName = (av_name.mIsDummy) ? sCache.find(agent_id) : sCache.end(); - if (sCache.end() != itName) - itName->second.mExpires = av_name.mExpires; - else - sCache[agent_id] = av_name; + // sCache[agent_id] = av_name; + // [SL:KB] - Patch: Agent-DisplayNames | Checked: 2010-12-28 (Catznip-2.4.0h) | Added: Catznip-2.4.0h + // Don't replace existing entries with dummies + cache_t::iterator itName = (av_name.mIsDummy) ? sCache.find(agent_id) : sCache.end(); + if (sCache.end() != itName) + itName->second.mExpires = av_name.mExpires; + else + sCache[agent_id] = av_name; // [/SL:KB] } @@ -562,14 +562,13 @@ void LLAvatarNameCache::idle() bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id) { const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0; - F64 now = LLFrameTimer::getTotalSeconds(); - F64 expire_time = now - PENDING_TIMEOUT_SECS; pending_queue_t::const_iterator it = sPendingQueue.find(agent_id); if (it != sPendingQueue.end()) { - bool request_expired = (it->second < expire_time); - return !request_expired; + // in the list of requests in flight, retry if too old + F64 expire_time = LLFrameTimer::getTotalSeconds() - PENDING_TIMEOUT_SECS; + return it->second > expire_time; } return false; } @@ -578,14 +577,16 @@ void LLAvatarNameCache::eraseExpired() { F64 now = LLFrameTimer::getTotalSeconds(); cache_t::iterator it = sCache.begin(); - while (it != sCache.end()) + for (cache_t::iterator it = sCache.begin(); it != sCache.end();) { - cache_t::iterator cur = it; - ++it; - const LLAvatarName& av_name = cur->second; + const LLAvatarName& av_name = it->second; if (av_name.mExpires < now) { - sCache.erase(cur); + sCache.erase(it++); + } + else + { + ++it; } } } diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index f43bafd45..38b2bea1b 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -1082,7 +1082,7 @@ void LLCurl::initClass() S32 mutex_count = CRYPTO_num_locks(); for (S32 i=0; i factory_ptr(factory); - LLIOServerSocket* server = new LLIOServerSocket(pool, socket, factory_ptr); + LLIOServerSocket* server = new LLIOServerSocket(socket, factory_ptr); LLPumpIO::chain_t chain; chain.push_back(LLIOPipe::ptr_t(server)); diff --git a/indra/llmessage/lliohttpserver.h b/indra/llmessage/lliohttpserver.h index e8e390f29..66e763444 100644 --- a/indra/llmessage/lliohttpserver.h +++ b/indra/llmessage/lliohttpserver.h @@ -56,7 +56,7 @@ class LLIOHTTPServer public: typedef void (*timing_callback_t)(const char* hashed_name, F32 time, void* data); - static LLHTTPNode& create(apr_pool_t* pool, LLPumpIO& pump, U16 port); + static LLHTTPNode& create(LLPumpIO& pump, U16 port); /**< Creates an HTTP wire server on the pump for the given TCP port. * * Returns the root node of the new server. Add LLHTTPNode instances diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp index 7ec577c7b..686c03742 100644 --- a/indra/llmessage/lliosocket.cpp +++ b/indra/llmessage/lliosocket.cpp @@ -41,6 +41,7 @@ #include "llhost.h" #include "llmemtype.h" #include "llpumpio.h" +#include "llthread.h" // // constants @@ -104,51 +105,31 @@ void ll_debug_socket(const char* msg, apr_socket_t* apr_sock) /// // static -LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) +LLSocket::ptr_t LLSocket::create(EType type, U16 port) { LLMemType m1(LLMemType::MTYPE_IO_TCP); - LLSocket::ptr_t rv; - apr_socket_t* socket = NULL; - apr_pool_t* new_pool = NULL; apr_status_t status = APR_EGENERAL; - - // create a pool for the socket - status = apr_pool_create(&new_pool, pool); - if(ll_apr_warn_status(status)) - { - if(new_pool) apr_pool_destroy(new_pool); - return rv; - } + LLSocket::ptr_t rv(new LLSocket); if(STREAM_TCP == type) { - status = apr_socket_create( - &socket, - APR_INET, - SOCK_STREAM, - APR_PROTO_TCP, - new_pool); + status = apr_socket_create(&rv->mSocket, APR_INET, SOCK_STREAM, APR_PROTO_TCP, rv->mPool()); } else if(DATAGRAM_UDP == type) { - status = apr_socket_create( - &socket, - APR_INET, - SOCK_DGRAM, - APR_PROTO_UDP, - new_pool); + status = apr_socket_create(&rv->mSocket, APR_INET, SOCK_DGRAM, APR_PROTO_UDP, rv->mPool()); } else { - if(new_pool) apr_pool_destroy(new_pool); + rv.reset(); return rv; } if(ll_apr_warn_status(status)) { - if(new_pool) apr_pool_destroy(new_pool); + rv->mSocket = NULL; + rv.reset(); return rv; } - rv = ptr_t(new LLSocket(socket, new_pool)); if(port > 0) { apr_sockaddr_t* sa = NULL; @@ -158,7 +139,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) APR_UNSPEC, port, 0, - new_pool); + rv->mPool()); if(ll_apr_warn_status(status)) { rv.reset(); @@ -166,8 +147,8 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) } // This allows us to reuse the address on quick down/up. This // is unlikely to create problems. - ll_apr_warn_status(apr_socket_opt_set(socket, APR_SO_REUSEADDR, 1)); - status = apr_socket_bind(socket, sa); + ll_apr_warn_status(apr_socket_opt_set(rv->mSocket, APR_SO_REUSEADDR, 1)); + status = apr_socket_bind(rv->mSocket, sa); if(ll_apr_warn_status(status)) { rv.reset(); @@ -181,7 +162,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) // to keep a queue of incoming connections for ACCEPT. lldebugs << "Setting listen state for socket." << llendl; status = apr_socket_listen( - socket, + rv->mSocket, LL_DEFAULT_LISTEN_BACKLOG); if(ll_apr_warn_status(status)) { @@ -202,21 +183,28 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) } // static -LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool) +LLSocket::ptr_t LLSocket::create(apr_status_t& status, LLSocket::ptr_t& listen_socket) { LLMemType m1(LLMemType::MTYPE_IO_TCP); - LLSocket::ptr_t rv; - if(!socket) + if (!listen_socket->getSocket()) { + status = APR_ENOSOCKET; + return LLSocket::ptr_t(); + } + LLSocket::ptr_t rv(new LLSocket); + lldebugs << "accepting socket" << llendl; + status = apr_socket_accept(&rv->mSocket, listen_socket->getSocket(), rv->mPool()); + if (status != APR_SUCCESS) + { + rv->mSocket = NULL; + rv.reset(); return rv; } - rv = ptr_t(new LLSocket(socket, pool)); rv->mPort = PORT_EPHEMERAL; rv->setOptions(); return rv; } - bool LLSocket::blockingConnect(const LLHost& host) { if(!mSocket) return false; @@ -229,7 +217,7 @@ bool LLSocket::blockingConnect(const LLHost& host) APR_UNSPEC, host.getPort(), 0, - mPool))) + mPool()))) { return false; } @@ -240,13 +228,11 @@ bool LLSocket::blockingConnect(const LLHost& host) return true; } -LLSocket::LLSocket(apr_socket_t* socket, apr_pool_t* pool) : - mSocket(socket), - mPool(pool), +LLSocket::LLSocket() : + mSocket(NULL), + mPool(LLThread::tldata().mRootPool), mPort(PORT_INVALID) { - ll_debug_socket("Constructing wholely formed socket", mSocket); - LLMemType m1(LLMemType::MTYPE_IO_TCP); } LLSocket::~LLSocket() @@ -258,10 +244,6 @@ LLSocket::~LLSocket() ll_debug_socket("Destroying socket", mSocket); apr_socket_close(mSocket); } - if(mPool) - { - apr_pool_destroy(mPool); - } } void LLSocket::setOptions() @@ -522,10 +504,8 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl( /// LLIOServerSocket::LLIOServerSocket( - apr_pool_t* pool, LLIOServerSocket::socket_t listener, factory_t factory) : - mPool(pool), mListenSocket(listener), mReactor(factory), mInitialized(false), @@ -585,21 +565,15 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl( lldebugs << "accepting socket" << llendl; PUMP_DEBUG; - apr_pool_t* new_pool = NULL; - apr_status_t status = apr_pool_create(&new_pool, mPool); - apr_socket_t* socket = NULL; - status = apr_socket_accept( - &socket, - mListenSocket->getSocket(), - new_pool); - LLSocket::ptr_t llsocket(LLSocket::create(socket, new_pool)); + apr_status_t status; + LLSocket::ptr_t llsocket(LLSocket::create(status, mListenSocket)); //EStatus rv = STATUS_ERROR; - if(llsocket) + if(llsocket && status == APR_SUCCESS) { PUMP_DEBUG; apr_sockaddr_t* remote_addr; - apr_socket_addr_get(&remote_addr, APR_REMOTE, socket); + apr_socket_addr_get(&remote_addr, APR_REMOTE, llsocket->getSocket()); char* remote_host_string; apr_sockaddr_ip_get(&remote_host_string, remote_addr); @@ -614,7 +588,6 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl( { chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(llsocket))); pump->addChain(chain, mResponseTimeout); - status = STATUS_OK; } else { @@ -623,7 +596,8 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl( } else { - llwarns << "Unable to create linden socket." << llendl; + char buf[256]; + llwarns << "Unable to accept linden socket: " << apr_strerror(status, buf, sizeof(buf)) << llendl; } PUMP_DEBUG; @@ -636,11 +610,10 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl( #if 0 LLIODataSocket::LLIODataSocket( U16 suggested_port, - U16 start_discovery_port, - apr_pool_t* pool) : + U16 start_discovery_port) : mSocket(NULL) { - if(!pool || (PORT_INVALID == suggested_port)) return; + if(PORT_INVALID == suggested_port) return; if(ll_apr_warn_status(apr_socket_create(&mSocket, APR_INET, SOCK_DGRAM, APR_PROTO_UDP, pool))) return; apr_sockaddr_t* sa = NULL; if(ll_apr_warn_status(apr_sockaddr_info_get(&sa, APR_ANYADDR, APR_UNSPEC, suggested_port, 0, pool))) return; diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h index ec09ad8ba..5ad75e909 100644 --- a/indra/llmessage/lliosocket.h +++ b/indra/llmessage/lliosocket.h @@ -44,7 +44,6 @@ */ #include "lliopipe.h" -#include "apr_pools.h" #include "apr_network_io.h" #include "llchainio.h" @@ -94,34 +93,22 @@ public: * socket. If you intend the socket to be known to external * clients without prior port notification, do not use * PORT_EPHEMERAL. - * @param pool The apr pool to use. A child pool will be created - * and associated with the socket. * @param type The type of socket to create * @param port The port for the socket * @return A valid socket shared pointer if the call worked. */ static ptr_t create( - apr_pool_t* pool, EType type, U16 port = PORT_EPHEMERAL); /** - * @brief Create a LLSocket when you already have an apr socket. + * @brief Create a LLSocket by accepting a connection from a listen socket. * - * This method assumes an ephemeral port. This is typically used - * by calls which spawn a socket such as a call to - * accept() as in the server socket. This call should - * not fail if you have a valid apr socket. - * Because of the nature of how accept() works, you are expected - * to create a new pool for the socket, use that pool for the - * accept, and pass it in here where it will be bound with the - * socket and destroyed at the same time. - * @param socket The apr socket to use - * @param pool The pool used to create the socket. *NOTE: The pool - * passed in will be DESTROYED. + * @param status Output. Status of the accept if a valid listen socket was passed. + * @param listen_socket The listen socket to use. * @return A valid socket shared pointer if the call worked. */ - static ptr_t create(apr_socket_t* socket, apr_pool_t* pool); + static ptr_t create(apr_status_t& status, ptr_t& listen_socket); /** * @brief Perform a blocking connect to a host. Do not use in production. @@ -156,7 +143,7 @@ protected: * @brief Protected constructor since should only make sockets * with one of the two create() calls. */ - LLSocket(apr_socket_t* socket, apr_pool_t* pool); + LLSocket(void); /** * @brief Set default socket options. @@ -173,8 +160,8 @@ protected: // The apr socket. apr_socket_t* mSocket; - // our memory pool - apr_pool_t* mPool; + // Our memory pool. + AIAPRPool mPool; // The port if we know it. U16 mPort; @@ -299,7 +286,7 @@ class LLIOServerSocket : public LLIOPipe public: typedef LLSocket::ptr_t socket_t; typedef boost::shared_ptr factory_t; - LLIOServerSocket(apr_pool_t* pool, socket_t listener, factory_t reactor); + LLIOServerSocket(socket_t listener, factory_t reactor); virtual ~LLIOServerSocket(); /** @@ -331,7 +318,6 @@ protected: //@} protected: - apr_pool_t* mPool; socket_t mListenSocket; factory_t mReactor; bool mInitialized; @@ -365,8 +351,7 @@ public: */ LLIODataSocket( U16 suggested_port, - U16 start_discovery_port, - apr_pool_t* pool); + U16 start_discovery_port); virtual ~LLIODataSocket(); protected: diff --git a/indra/llmessage/llmail.cpp b/indra/llmessage/llmail.cpp index ce206d8d7..e55a1bb41 100644 --- a/indra/llmessage/llmail.cpp +++ b/indra/llmessage/llmail.cpp @@ -56,6 +56,7 @@ #include "llstring.h" #include "lluuid.h" #include "net.h" +#include "aiaprpool.h" // // constants @@ -63,7 +64,7 @@ const size_t LL_MAX_KNOWN_GOOD_MAIL_SIZE = 4096; static bool gMailEnabled = true; -static apr_pool_t* gMailPool; +static AIAPRPool gMailPool; static apr_sockaddr_t* gSockAddr; static apr_socket_t* gMailSocket; @@ -88,7 +89,7 @@ bool connect_smtp() gSockAddr->sa.sin.sin_family, SOCK_STREAM, APR_PROTO_TCP, - gMailPool); + gMailPool()); if(ll_apr_warn_status(status)) return false; status = apr_socket_connect(gMailSocket, gSockAddr); if(ll_apr_warn_status(status)) @@ -145,19 +146,19 @@ BOOL LLMail::send( } // static -void LLMail::init(const std::string& hostname, apr_pool_t* pool) +void LLMail::init(const std::string& hostname) { gMailSocket = NULL; - if(hostname.empty() || !pool) + if (hostname.empty()) { - gMailPool = NULL; gSockAddr = NULL; + gMailPool.destroy(); } else { - gMailPool = pool; + gMailPool.create(); - // collect all the information into a socaddr sturcture. the + // Collect all the information into a sockaddr structure. the // documentation is a bit unclear, but I either have to // specify APR_UNSPEC or not specify any flags. I am not sure // which option is better. @@ -167,7 +168,7 @@ void LLMail::init(const std::string& hostname, apr_pool_t* pool) APR_UNSPEC, 25, APR_IPV4_ADDR_OK, - gMailPool); + gMailPool()); ll_apr_warn_status(status); } } diff --git a/indra/llmessage/llmail.h b/indra/llmessage/llmail.h index 7effb847a..7026d93b3 100644 --- a/indra/llmessage/llmail.h +++ b/indra/llmessage/llmail.h @@ -33,15 +33,13 @@ #ifndef LL_LLMAIL_H #define LL_LLMAIL_H -typedef struct apr_pool_t apr_pool_t; - #include "llsd.h" class LLMail { public: // if hostname is NULL, then the host is resolved as 'mail' - static void init(const std::string& hostname, apr_pool_t* pool); + static void init(const std::string& hostname); // Allow all email transmission to be disabled/enabled. static void enable(bool mail_enabled); diff --git a/indra/llmessage/llnetcanary.cpp b/indra/llmessage/llnetcanary.cpp index 9b2258ed2..a714c60f2 100644 --- a/indra/llmessage/llnetcanary.cpp +++ b/indra/llmessage/llnetcanary.cpp @@ -1,149 +1,149 @@ -// -#include "llnetcanary.h" +// +#include "llnetcanary.h" #include "linden_common.h" -#include "llerror.h" -#ifdef _MSC_VER -#include -static WSADATA trapWSAData; -#define socklen_t int -#else -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if LL_DARWIN -#ifndef _SOCKLEN_T -#define _SOCKLEN_T -typedef int socklen_t; -#endif -#endif - -extern int errno; //error number -#define SOCKADDR_IN struct sockaddr_in -#define SOCKADDR struct sockaddr -#define SOCKET int -#define INVALID_SOCKET -1 -#define SOCKET_ERROR -1 -#define SD_BOTH 2 -#define closesocket close -#endif -SOCKADDR_IN trapLclAddr; -LLNetCanary::LLNetCanary(int requested_port) -{ - mGood = TRUE; - int nRet; - int hSocket; - int snd_size = 400000; - int rec_size = 400000; - int buff_size = 4; -#ifdef _MSC_VER - if(WSAStartup(0x0202, &trapWSAData)) - { - S32 err = WSAGetLastError(); - WSACleanup(); - llwarns << "WSAStartup() failure: " << err << llendl; - mGood = FALSE; - return; - } -#endif - // Get a datagram socket - hSocket = (int)socket(AF_INET, SOCK_DGRAM, 0); - if (hSocket == INVALID_SOCKET) - { -#ifdef _MSC_VER - S32 err = WSAGetLastError(); - WSACleanup(); -#else - S32 err = errno; -#endif - mGood = FALSE; - llwarns << "socket() failure: " << err << llendl; - return; - } - - // Name the socket (assign the local port number to receive on) - trapLclAddr.sin_family = AF_INET; - trapLclAddr.sin_addr.s_addr = htonl(INADDR_ANY); - trapLclAddr.sin_port = htons(requested_port); - //llinfos << "bind() port: " << requested_port << llendl; - nRet = bind(hSocket, (struct sockaddr*) &trapLclAddr, sizeof(trapLclAddr)); - if (nRet == SOCKET_ERROR) - { -#ifdef _MSC_VER - S32 err = WSAGetLastError(); - WSACleanup(); -#else - S32 err = errno; -#endif - mGood = FALSE; - llwarns << "bind() failed: " << err << llendl; - return; - } - - // Find out what address we got - SOCKADDR_IN socket_address; - socklen_t socket_address_size = sizeof(socket_address); - getsockname(hSocket, (SOCKADDR*) &socket_address, &socket_address_size); - mPort = ntohs(socket_address.sin_port); - //llinfos << "got port " << mPort << llendl; - - // Set socket to be non-blocking -#ifdef _MSC_VER - unsigned long argp = 1; - nRet = ioctlsocket (hSocket, FIONBIO, &argp); -#else - nRet = fcntl(hSocket, F_SETFL, O_NONBLOCK); -#endif - if (nRet == SOCKET_ERROR) - { -#ifdef _MSC_VER - S32 err = WSAGetLastError(); - WSACleanup(); -#else - S32 err = errno; -#endif - mGood = FALSE; - llwarns << "Failed to set socket non-blocking, Err: " << err << llendl; - return; - } - - // set a large receive buffer - nRet = setsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, (char *)&rec_size, buff_size); - if (nRet) - { - llinfos << "Can't set receive buffer size!" << llendl; - } - // set a large send buffer - nRet = setsockopt(hSocket, SOL_SOCKET, SO_SNDBUF, (char *)&snd_size, buff_size); - if (nRet) - { - llinfos << "Can't set send buffer size!" << llendl; - } - //getsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, (char *)&rec_size, &buff_size); - //getsockopt(hSocket, SOL_SOCKET, SO_SNDBUF, (char *)&snd_size, &buff_size); - //LL_DEBUGS("AppInit") << "startNet - receive buffer size : " << rec_size << LL_ENDL; - //LL_DEBUGS("AppInit") << "startNet - send buffer size : " << snd_size << LL_ENDL; - - mSocket = hSocket; -} -LLNetCanary::~LLNetCanary() -{ - if(mGood) - { - if(mSocket) - { - shutdown(mSocket, SD_BOTH); - closesocket(mSocket); - } -#ifdef _MSC_VER - WSACleanup(); -#endif - } -} -// +#include "llerror.h" +#ifdef _MSC_VER +#include +static WSADATA trapWSAData; +#define socklen_t int +#else +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if LL_DARWIN +#ifndef _SOCKLEN_T +#define _SOCKLEN_T +typedef int socklen_t; +#endif +#endif + +extern int errno; //error number +#define SOCKADDR_IN struct sockaddr_in +#define SOCKADDR struct sockaddr +#define SOCKET int +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 +#define SD_BOTH 2 +#define closesocket close +#endif +SOCKADDR_IN trapLclAddr; +LLNetCanary::LLNetCanary(int requested_port) +{ + mGood = TRUE; + int nRet; + int hSocket; + int snd_size = 400000; + int rec_size = 400000; + int buff_size = 4; +#ifdef _MSC_VER + if(WSAStartup(0x0202, &trapWSAData)) + { + S32 err = WSAGetLastError(); + WSACleanup(); + llwarns << "WSAStartup() failure: " << err << llendl; + mGood = FALSE; + return; + } +#endif + // Get a datagram socket + hSocket = (int)socket(AF_INET, SOCK_DGRAM, 0); + if (hSocket == INVALID_SOCKET) + { +#ifdef _MSC_VER + S32 err = WSAGetLastError(); + WSACleanup(); +#else + S32 err = errno; +#endif + mGood = FALSE; + llwarns << "socket() failure: " << err << llendl; + return; + } + + // Name the socket (assign the local port number to receive on) + trapLclAddr.sin_family = AF_INET; + trapLclAddr.sin_addr.s_addr = htonl(INADDR_ANY); + trapLclAddr.sin_port = htons(requested_port); + //llinfos << "bind() port: " << requested_port << llendl; + nRet = bind(hSocket, (struct sockaddr*) &trapLclAddr, sizeof(trapLclAddr)); + if (nRet == SOCKET_ERROR) + { +#ifdef _MSC_VER + S32 err = WSAGetLastError(); + WSACleanup(); +#else + S32 err = errno; +#endif + mGood = FALSE; + llwarns << "bind() failed: " << err << llendl; + return; + } + + // Find out what address we got + SOCKADDR_IN socket_address; + socklen_t socket_address_size = sizeof(socket_address); + getsockname(hSocket, (SOCKADDR*) &socket_address, &socket_address_size); + mPort = ntohs(socket_address.sin_port); + //llinfos << "got port " << mPort << llendl; + + // Set socket to be non-blocking +#ifdef _MSC_VER + unsigned long argp = 1; + nRet = ioctlsocket (hSocket, FIONBIO, &argp); +#else + nRet = fcntl(hSocket, F_SETFL, O_NONBLOCK); +#endif + if (nRet == SOCKET_ERROR) + { +#ifdef _MSC_VER + S32 err = WSAGetLastError(); + WSACleanup(); +#else + S32 err = errno; +#endif + mGood = FALSE; + llwarns << "Failed to set socket non-blocking, Err: " << err << llendl; + return; + } + + // set a large receive buffer + nRet = setsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, (char *)&rec_size, buff_size); + if (nRet) + { + llinfos << "Can't set receive buffer size!" << llendl; + } + // set a large send buffer + nRet = setsockopt(hSocket, SOL_SOCKET, SO_SNDBUF, (char *)&snd_size, buff_size); + if (nRet) + { + llinfos << "Can't set send buffer size!" << llendl; + } + //getsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, (char *)&rec_size, &buff_size); + //getsockopt(hSocket, SOL_SOCKET, SO_SNDBUF, (char *)&snd_size, &buff_size); + //LL_DEBUGS("AppInit") << "startNet - receive buffer size : " << rec_size << LL_ENDL; + //LL_DEBUGS("AppInit") << "startNet - send buffer size : " << snd_size << LL_ENDL; + + mSocket = hSocket; +} +LLNetCanary::~LLNetCanary() +{ + if(mGood) + { + if(mSocket) + { + shutdown(mSocket, SD_BOTH); + closesocket(mSocket); + } +#ifdef _MSC_VER + WSACleanup(); +#endif + } +} +// diff --git a/indra/llmessage/llnetcanary.h b/indra/llmessage/llnetcanary.h index a5a5d6b4e..0061b5101 100644 --- a/indra/llmessage/llnetcanary.h +++ b/indra/llmessage/llnetcanary.h @@ -1,25 +1,25 @@ -// -#ifndef LL_LLNETCANARY_H -#define LL_LLNETCANARY_H -#include "stdtypes.h" -#include -class LLNetCanary -{ -public: - LLNetCanary(int requested_port); - ~LLNetCanary(); - BOOL mGood; - S32 mSocket; - U16 mPort; - U8 mBuffer[8192]; - typedef struct - { - F64 time; // LLTimer::getElapsedSeconds(); - //U8 message[4]; - U32 message; - U32 points; - std::string name; - } entry; -}; -#endif -// +// +#ifndef LL_LLNETCANARY_H +#define LL_LLNETCANARY_H +#include "stdtypes.h" +#include +class LLNetCanary +{ +public: + LLNetCanary(int requested_port); + ~LLNetCanary(); + BOOL mGood; + S32 mSocket; + U16 mPort; + U8 mBuffer[8192]; + typedef struct + { + F64 time; // LLTimer::getElapsedSeconds(); + //U8 message[4]; + U32 message; + U32 points; + std::string name; + } entry; +}; +#endif +// diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp index b8c6b1652..c50dcc876 100644 --- a/indra/llmessage/llpumpio.cpp +++ b/indra/llmessage/llpumpio.cpp @@ -43,6 +43,7 @@ #include "llmemtype.h" #include "llstl.h" #include "llstat.h" +#include "llthread.h" #include "llfasttimer.h" #include //VS2010 @@ -170,14 +171,12 @@ struct ll_delete_apr_pollset_fd_client_data /** * LLPumpIO */ -LLPumpIO::LLPumpIO(apr_pool_t* pool) : +LLPumpIO::LLPumpIO(void) : mState(LLPumpIO::NORMAL), mRebuildPollset(false), mPollset(NULL), mPollsetClientID(0), mNextLock(0), - mPool(NULL), - mCurrentPool(NULL), mCurrentPoolReallocCount(0), mChainsMutex(NULL), mCallbackMutex(NULL), @@ -186,21 +185,24 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) : mCurrentChain = mRunningChains.end(); LLMemType m1(LLMemType::MTYPE_IO_PUMP); - initialize(pool); + initialize(); } LLPumpIO::~LLPumpIO() { LLMemType m1(LLMemType::MTYPE_IO_PUMP); - cleanup(); -} - -bool LLPumpIO::prime(apr_pool_t* pool) -{ - LLMemType m1(LLMemType::MTYPE_IO_PUMP); - cleanup(); - initialize(pool); - return ((pool == NULL) ? false : true); +#if LL_THREADS_APR + if (mChainsMutex) apr_thread_mutex_destroy(mChainsMutex); + if (mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex); +#endif + mChainsMutex = NULL; + mCallbackMutex = NULL; + if(mPollset) + { +// lldebugs << "cleaning up pollset" << llendl; + apr_pollset_destroy(mPollset); + mPollset = NULL; + } } bool LLPumpIO::addChain(const chain_t& chain, F32 timeout) @@ -360,8 +362,7 @@ bool LLPumpIO::setConditional(LLIOPipe* pipe, const apr_pollfd_t* poll) { // each fd needs a pool to work with, so if one was // not specified, use this pool. - // *FIX: Should it always be this pool? - value.second.p = mPool; + value.second.p = (*mCurrentChain).mDescriptorsPool->operator()(); } value.second.client_data = new S32(++mPollsetClientID); (*mCurrentChain).mDescriptors.push_back(value); @@ -450,7 +451,7 @@ void LLPumpIO::pump() void LLPumpIO::pump(const S32& poll_timeout) { LLMemType m1(LLMemType::MTYPE_IO_PUMP); - LLFastTimer t1(LLFastTimer::FTM_PUMP); + LLFastTimer t1(LLFastTimer::FTM_PUMPIO); //llinfos << "LLPumpIO::pump()" << llendl; // Run any pending runners. @@ -828,39 +829,15 @@ void LLPumpIO::control(LLPumpIO::EControl op) } } -void LLPumpIO::initialize(apr_pool_t* pool) +void LLPumpIO::initialize(void) { LLMemType m1(LLMemType::MTYPE_IO_PUMP); - if(!pool) return; + mPool.create(); #if LL_THREADS_APR // SJB: Windows defaults to NESTED and OSX defaults to UNNESTED, so use UNNESTED explicitly. - apr_thread_mutex_create(&mChainsMutex, APR_THREAD_MUTEX_UNNESTED, pool); - apr_thread_mutex_create(&mCallbackMutex, APR_THREAD_MUTEX_UNNESTED, pool); + apr_thread_mutex_create(&mChainsMutex, APR_THREAD_MUTEX_UNNESTED, mPool()); + apr_thread_mutex_create(&mCallbackMutex, APR_THREAD_MUTEX_UNNESTED, mPool()); #endif - mPool = pool; -} - -void LLPumpIO::cleanup() -{ - LLMemType m1(LLMemType::MTYPE_IO_PUMP); -#if LL_THREADS_APR - if(mChainsMutex) apr_thread_mutex_destroy(mChainsMutex); - if(mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex); -#endif - mChainsMutex = NULL; - mCallbackMutex = NULL; - if(mPollset) - { -// lldebugs << "cleaning up pollset" << llendl; - apr_pollset_destroy(mPollset); - mPollset = NULL; - } - if(mCurrentPool) - { - apr_pool_destroy(mCurrentPool); - mCurrentPool = NULL; - } - mPool = NULL; } void LLPumpIO::rebuildPollset() @@ -888,21 +865,19 @@ void LLPumpIO::rebuildPollset() if(mCurrentPool && (0 == (++mCurrentPoolReallocCount % POLLSET_POOL_RECYCLE_COUNT))) { - apr_pool_destroy(mCurrentPool); - mCurrentPool = NULL; + mCurrentPool.destroy(); mCurrentPoolReallocCount = 0; } if(!mCurrentPool) { - apr_status_t status = apr_pool_create(&mCurrentPool, mPool); - (void)ll_apr_warn_status(status); + mCurrentPool.create(mPool); } // add all of the file descriptors run_it = mRunningChains.begin(); LLChainInfo::conditionals_t::iterator fd_it; LLChainInfo::conditionals_t::iterator fd_end; - apr_pollset_create(&mPollset, size, mCurrentPool, 0); + apr_pollset_create(&mPollset, size, mCurrentPool(), 0); for(; run_it != run_end; ++run_it) { fd_it = (*run_it).mDescriptors.begin(); @@ -1160,7 +1135,8 @@ bool LLPumpIO::handleChainError( LLPumpIO::LLChainInfo::LLChainInfo() : mInit(false), mLock(0), - mEOS(false) + mEOS(false), + mDescriptorsPool(new AIAPRPool(LLThread::tldata().mRootPool)) { LLMemType m1(LLMemType::MTYPE_IO_PUMP); mTimer.setTimerExpirySec(DEFAULT_CHAIN_EXPIRY_SECS); diff --git a/indra/llmessage/llpumpio.h b/indra/llmessage/llpumpio.h index fc0bfabaa..2666be04a 100644 --- a/indra/llmessage/llpumpio.h +++ b/indra/llmessage/llpumpio.h @@ -36,11 +36,12 @@ #define LL_LLPUMPIO_H #include +#include #if LL_LINUX // needed for PATH_MAX in APR. #include #endif -#include "apr_pools.h" +#include "aiaprpool.h" #include "llbuffer.h" #include "llframetimer.h" #include "lliopipe.h" @@ -64,9 +65,8 @@ extern const F32 NEVER_CHAIN_EXPIRY_SECS; * pump() on a thread used for IO and call * respond() on a thread that is expected to do higher * level processing. You can call almost any other method from any - * thread - see notes for each method for details. In order for the - * threading abstraction to work, you need to call prime() - * with a valid apr pool. + * thread - see notes for each method for details. + * * A pump instance manages much of the state for the pipe, including * the list of pipes in the chain, the channel for each element in the * chain, the buffer, and if any pipe has marked the stream or process @@ -85,24 +85,13 @@ public: /** * @brief Constructor. */ - LLPumpIO(apr_pool_t* pool); + LLPumpIO(void); /** * @brief Destructor. */ ~LLPumpIO(); - /** - * @brief Prepare this pump for usage. - * - * If you fail to call this method prior to use, the pump will - * try to work, but will not come with any thread locking - * mechanisms. - * @param pool The apr pool to use. - * @return Returns true if the pump is primed. - */ - bool prime(apr_pool_t* pool); - /** * @brief Typedef for having a chain of pipes. */ @@ -374,6 +363,7 @@ protected: typedef std::pair pipe_conditional_t; typedef std::vector conditionals_t; conditionals_t mDescriptors; + boost::shared_ptr mDescriptorsPool; }; // All the running chains & info @@ -392,9 +382,9 @@ protected: callbacks_t mPendingCallbacks; callbacks_t mCallbacks; - // memory allocator for pollsets & mutexes. - apr_pool_t* mPool; - apr_pool_t* mCurrentPool; + // Memory pool for pollsets & mutexes. + AIAPRPool mPool; + AIAPRPool mCurrentPool; S32 mCurrentPoolReallocCount; #if LL_THREADS_APR @@ -406,8 +396,7 @@ protected: #endif protected: - void initialize(apr_pool_t* pool); - void cleanup(); + void initialize(); /** * @brief Given the internal state of the chains, rebuild the pollset diff --git a/indra/llmessage/llsdmessagebuilder.cpp b/indra/llmessage/llsdmessagebuilder.cpp old mode 100755 new mode 100644 diff --git a/indra/llmessage/llsdmessagebuilder.h b/indra/llmessage/llsdmessagebuilder.h old mode 100755 new mode 100644 diff --git a/indra/llmessage/llsdmessagereader.cpp b/indra/llmessage/llsdmessagereader.cpp old mode 100755 new mode 100644 diff --git a/indra/llmessage/llsdmessagereader.h b/indra/llmessage/llsdmessagereader.h old mode 100755 new mode 100644 diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp index 46e976fe3..87f011643 100644 --- a/indra/llmessage/llurlrequest.cpp +++ b/indra/llmessage/llurlrequest.cpp @@ -45,6 +45,7 @@ #include "llstring.h" #include "apr_env.h" #include "llapr.h" +#include "llscopedvolatileaprpool.h" static const U32 HTTP_STATUS_PIPE_ERROR = 499; /** @@ -161,27 +162,31 @@ void LLURLRequest::setCallback(LLURLRequestComplete* callback) // is called with use_proxy = FALSE void LLURLRequest::useProxy(bool use_proxy) { - static char *env_proxy; + static std::string env_proxy; - if (use_proxy && (env_proxy == NULL)) + if (use_proxy && env_proxy.empty()) { - apr_status_t status; - LLAPRPool pool; - status = apr_env_get(&env_proxy, "ALL_PROXY", pool.getAPRPool()); + char* env_proxy_str; + LLScopedVolatileAPRPool scoped_pool; + apr_status_t status = apr_env_get(&env_proxy_str, "ALL_PROXY", scoped_pool); if (status != APR_SUCCESS) { - status = apr_env_get(&env_proxy, "http_proxy", pool.getAPRPool()); + status = apr_env_get(&env_proxy_str, "http_proxy", scoped_pool); } if (status != APR_SUCCESS) { - use_proxy = FALSE; + use_proxy = false; } + else + { + // env_proxy_str is stored in the scoped_pool, so we have to make a copy. + env_proxy = env_proxy_str; + } } + lldebugs << "use_proxy = " << (use_proxy?'Y':'N') << ", env_proxy = \"" << env_proxy << "\"" << llendl; - lldebugs << "use_proxy = " << (use_proxy?'Y':'N') << ", env_proxy = " << (env_proxy ? env_proxy : "(null)") << llendl; - - if (env_proxy && use_proxy) + if (use_proxy) { mDetail->mCurlRequest->setoptString(CURLOPT_PROXY, env_proxy); } diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index 677052d65..d0572fb4a 100644 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -107,8 +107,10 @@ std::string get_shared_secret(); class LLMessagePollInfo { public: + LLMessagePollInfo(void) : mPool(LLThread::tldata().mRootPool) { } apr_socket_t *mAPRSocketp; apr_pollfd_t mPollFD; + AIAPRPool mPool; }; namespace @@ -297,20 +299,13 @@ LLMessageSystem::LLMessageSystem(const std::string& filename, U32 port, } // LL_DEBUGS("Messaging") << << "*** port: " << mPort << llendl; - // - // Create the data structure that we can poll on - // - if (!gAPRPoolp) - { - LL_ERRS("Messaging") << "No APR pool before message system initialization!" << llendl; - ll_init_apr(); - } - apr_socket_t *aprSocketp = NULL; - apr_os_sock_put(&aprSocketp, (apr_os_sock_t*)&mSocket, gAPRPoolp); - mPollInfop = new LLMessagePollInfo; + + apr_socket_t *aprSocketp = NULL; + apr_os_sock_put(&aprSocketp, (apr_os_sock_t*)&mSocket, mPollInfop->mPool()); + mPollInfop->mAPRSocketp = aprSocketp; - mPollInfop->mPollFD.p = gAPRPoolp; + mPollInfop->mPollFD.p = mPollInfop->mPool(); mPollInfop->mPollFD.desc_type = APR_POLL_SOCKET; mPollInfop->mPollFD.reqevents = APR_POLLIN; mPollInfop->mPollFD.rtnevents = 0; diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index 7a7f4e583..63a7ad75b 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -52,18 +52,20 @@ set(llplugin_HEADER_FILES set_source_files_properties(${llplugin_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) -if(NOT CMAKE_SIZEOF_VOID_P MATCHES 4) +if(NOT WORD_SIZE EQUAL 32) if(WINDOWS) add_definitions(/FIXED:NO) else(WINDOWS) # not windows therefore gcc LINUX and DARWIN add_definitions(-fPIC) endif(WINDOWS) -endif (NOT CMAKE_SIZEOF_VOID_P MATCHES 4) +endif (NOT WORD_SIZE EQUAL 32) list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES}) add_library (llplugin ${llplugin_SOURCE_FILES}) +add_dependencies(llplugin prepare) + add_subdirectory(slplugin) # # Add tests diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp old mode 100755 new mode 100644 diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h old mode 100755 new mode 100644 diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h old mode 100755 new mode 100644 diff --git a/indra/llplugin/llplugininstance.cpp b/indra/llplugin/llplugininstance.cpp old mode 100755 new mode 100644 index b822b9e94..3a1395cd2 --- a/indra/llplugin/llplugininstance.cpp +++ b/indra/llplugin/llplugininstance.cpp @@ -36,8 +36,7 @@ #include "linden_common.h" #include "llplugininstance.h" - -#include "llapr.h" +#include "aiaprpool.h" /** Virtual destructor. */ LLPluginInstanceMessageListener::~LLPluginInstanceMessageListener() @@ -86,7 +85,7 @@ int LLPluginInstance::load(std::string &plugin_file) int result = apr_dso_load(&mDSOHandle, plugin_file.c_str(), - gAPRPoolp); + AIAPRRootPool::get()()); if(result != APR_SUCCESS) { char buf[1024]; diff --git a/indra/llplugin/llplugininstance.h b/indra/llplugin/llplugininstance.h old mode 100755 new mode 100644 diff --git a/indra/llplugin/llpluginmessage.cpp b/indra/llplugin/llpluginmessage.cpp old mode 100755 new mode 100644 diff --git a/indra/llplugin/llpluginmessage.h b/indra/llplugin/llpluginmessage.h old mode 100755 new mode 100644 diff --git a/indra/llplugin/llpluginmessageclasses.h b/indra/llplugin/llpluginmessageclasses.h old mode 100755 new mode 100644 diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp old mode 100755 new mode 100644 index 8168b32c4..ebac3c52b --- a/indra/llplugin/llpluginmessagepipe.cpp +++ b/indra/llplugin/llpluginmessagepipe.cpp @@ -99,8 +99,6 @@ void LLPluginMessagePipeOwner::killMessagePipe(void) } LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket): - mInputMutex(gAPRPoolp), - mOutputMutex(gAPRPoolp), mOwner(owner), mSocket(socket) { diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h old mode 100755 new mode 100644 diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp old mode 100755 new mode 100644 index 8dbf2b3e9..d2238236f --- a/indra/llplugin/llpluginprocesschild.cpp +++ b/indra/llplugin/llpluginprocesschild.cpp @@ -47,7 +47,7 @@ LLPluginProcessChild::LLPluginProcessChild() { mState = STATE_UNINITIALIZED; mInstance = NULL; - mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); + mSocket = LLSocket::create(LLSocket::STREAM_TCP); mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz mCPUElapsed = 0.0f; mBlockingRequest = false; diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h old mode 100755 new mode 100644 diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp old mode 100755 new mode 100644 index 8fd18ef05..2cb6b2832 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -49,6 +49,7 @@ LLPluginProcessParentOwner::~LLPluginProcessParentOwner() bool LLPluginProcessParent::sUseReadThread = false; apr_pollset_t *LLPluginProcessParent::sPollSet = NULL; +AIAPRPool LLPluginProcessParent::sPollSetPool; bool LLPluginProcessParent::sPollsetNeedsRebuild = false; LLMutex *LLPluginProcessParent::sInstancesMutex; std::list LLPluginProcessParent::sInstances; @@ -59,7 +60,7 @@ class LLPluginProcessParentPollThread: public LLThread { public: LLPluginProcessParentPollThread() : - LLThread("LLPluginProcessParentPollThread", gAPRPoolp) + LLThread("LLPluginProcessParentPollThread") { } protected: @@ -84,12 +85,11 @@ protected: }; -LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner): - mIncomingQueueMutex(gAPRPoolp) +LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner) { if(!sInstancesMutex) { - sInstancesMutex = new LLMutex(gAPRPoolp); + sInstancesMutex = new LLMutex; } mOwner = owner; @@ -102,6 +102,7 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner): mBlocked = false; mPolledInput = false; mPollFD.client_data = NULL; + mPollFDPool.create(); mPluginLaunchTimeout = 60.0f; mPluginLockupTimeout = 15.0f; @@ -177,44 +178,28 @@ void LLPluginProcessParent::init(const std::string &launcher_filename, const std bool LLPluginProcessParent::accept() { bool result = false; - apr_status_t status = APR_EGENERAL; - apr_socket_t *new_socket = NULL; - - status = apr_socket_accept( - &new_socket, - mListenSocket->getSocket(), - gAPRPoolp); + mSocket = LLSocket::create(status, mListenSocket); if(status == APR_SUCCESS) { // llinfos << "SUCCESS" << llendl; // Success. Create a message pipe on the new socket - - // we MUST create a new pool for the LLSocket, since it will take ownership of it and delete it in its destructor! - apr_pool_t* new_pool = NULL; - status = apr_pool_create(&new_pool, gAPRPoolp); - - mSocket = LLSocket::create(new_socket, new_pool); new LLPluginMessagePipe(this, mSocket); result = true; } - else if(APR_STATUS_IS_EAGAIN(status)) - { -// llinfos << "EAGAIN" << llendl; - - // No incoming connections. This is not an error. - status = APR_SUCCESS; - } else { -// llinfos << "Error:" << llendl; - ll_apr_warn_status(status); - - // Some other error. - errorState(); + mSocket.reset(); + // EAGAIN means "No incoming connections". This is not an error. + if (!APR_STATUS_IS_EAGAIN(status)) + { + // Some other error. + ll_apr_warn_status(status); + errorState(); + } } return result; @@ -283,7 +268,7 @@ void LLPluginProcessParent::idle(void) apr_status_t status = APR_SUCCESS; apr_sockaddr_t* addr = NULL; - mListenSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); + mListenSocket = LLSocket::create(LLSocket::STREAM_TCP); mBoundPort = 0; // This code is based on parts of LLSocket::create() in lliosocket.cpp. @@ -294,7 +279,7 @@ void LLPluginProcessParent::idle(void) APR_INET, 0, // port 0 = ephemeral ("find me a port") 0, - gAPRPoolp); + AIAPRRootPool::get()()); if(ll_apr_warn_status(status)) { @@ -617,7 +602,8 @@ void LLPluginProcessParent::setMessagePipe(LLPluginMessagePipe *message_pipe) if(message_pipe != NULL) { // Set up the apr_pollfd_t - mPollFD.p = gAPRPoolp; + + mPollFD.p = mPollFDPool(); mPollFD.desc_type = APR_POLL_SOCKET; mPollFD.reqevents = APR_POLLIN|APR_POLLERR|APR_POLLHUP; mPollFD.rtnevents = 0; @@ -664,6 +650,7 @@ void LLPluginProcessParent::updatePollset() // delete the existing pollset. apr_pollset_destroy(sPollSet); sPollSet = NULL; + sPollSetPool.destroy(); } std::list::iterator iter; @@ -686,12 +673,14 @@ void LLPluginProcessParent::updatePollset() { #ifdef APR_POLLSET_NOCOPY // The pollset doesn't exist yet. Create it now. - apr_status_t status = apr_pollset_create(&sPollSet, count, gAPRPoolp, APR_POLLSET_NOCOPY); + sPollSetPool.create(); + apr_status_t status = apr_pollset_create(&sPollSet, count, sPollSetPool(), APR_POLLSET_NOCOPY); if(status != APR_SUCCESS) { #endif // APR_POLLSET_NOCOPY LL_WARNS("PluginPoll") << "Couldn't create pollset. Falling back to non-pollset mode." << LL_ENDL; sPollSet = NULL; + sPollSetPool.destroy(); #ifdef APR_POLLSET_NOCOPY } else diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h old mode 100755 new mode 100644 index 95f5f70c5..bba3643d6 --- a/indra/llplugin/llpluginprocessparent.h +++ b/indra/llplugin/llpluginprocessparent.h @@ -186,7 +186,9 @@ private: static bool sUseReadThread; apr_pollfd_t mPollFD; + AIAPRPool mPollFDPool; static apr_pollset_t *sPollSet; + static AIAPRPool sPollSetPool; static bool sPollsetNeedsRebuild; static LLMutex *sInstancesMutex; static std::list sInstances; diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp old mode 100755 new mode 100644 index e8a411a53..883d7b634 --- a/indra/llplugin/llpluginsharedmemory.cpp +++ b/indra/llplugin/llpluginsharedmemory.cpp @@ -201,7 +201,8 @@ bool LLPluginSharedMemory::create(size_t size) mName += createName(); mSize = size; - apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), gAPRPoolp ); + mPool.create(); + apr_status_t status = apr_shm_create( &(mImpl->mAprSharedMemory), mSize, mName.c_str(), mPool()); if(ll_apr_warn_status(status)) { @@ -224,7 +225,7 @@ bool LLPluginSharedMemory::destroy(void) } mImpl->mAprSharedMemory = NULL; } - + mPool.destroy(); return true; } @@ -233,7 +234,8 @@ bool LLPluginSharedMemory::attach(const std::string &name, size_t size) mName = name; mSize = size; - apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), gAPRPoolp ); + mPool.create(); + apr_status_t status = apr_shm_attach( &(mImpl->mAprSharedMemory), mName.c_str(), mPool() ); if(ll_apr_warn_status(status)) { @@ -255,6 +257,7 @@ bool LLPluginSharedMemory::detach(void) } mImpl->mAprSharedMemory = NULL; } + mPool.destroy(); return true; } diff --git a/indra/llplugin/llpluginsharedmemory.h b/indra/llplugin/llpluginsharedmemory.h old mode 100755 new mode 100644 index 081d311b3..669a3e409 --- a/indra/llplugin/llpluginsharedmemory.h +++ b/indra/llplugin/llpluginsharedmemory.h @@ -35,6 +35,8 @@ #ifndef LL_LLPLUGINSHAREDMEMORY_H #define LL_LLPLUGINSHAREDMEMORY_H +#include "aiaprpool.h" + class LLPluginSharedMemoryPlatformImpl; /** @@ -115,6 +117,7 @@ private: bool close(void); bool unlink(void); + AIAPRPool mPool; std::string mName; size_t mSize; void *mMappedAddress; diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt old mode 100755 new mode 100644 index fd555d394..5d0a57dfb --- a/indra/llplugin/slplugin/CMakeLists.txt +++ b/indra/llplugin/slplugin/CMakeLists.txt @@ -1,95 +1,95 @@ -project(SLPlugin) - -include(00-Common) -include(LLCommon) -include(LLPlugin) -include(Linking) -include(PluginAPI) -include(LLMessage) -include(GooglePerfTools) - -include_directories( - ${LLPLUGIN_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} -) - -if (DARWIN) - include(CMakeFindFrameworks) - find_library(CARBON_LIBRARY Carbon) - find_library(COCOA_LIBRARY Cocoa) -endif (DARWIN) - - -### SLPlugin - -set(SLPlugin_SOURCE_FILES - slplugin.cpp - ) - -if (DARWIN) - list(APPEND SLPlugin_SOURCE_FILES - slplugin-objc.mm - ) - list(APPEND SLPlugin_HEADER_FILES - slplugin-objc.h - ) -endif (DARWIN) - -set_source_files_properties(${SLPlugin_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -if (SLPlugin_HEADER_FILES) - list(APPEND SLPlugin_SOURCE_FILES ${SLPlugin_HEADER_FILES}) -endif (SLPlugin_HEADER_FILES) - -add_executable(SLPlugin - WIN32 - MACOSX_BUNDLE - ${SLPlugin_SOURCE_FILES} -) - -set_target_properties(SLPlugin - PROPERTIES - MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist - ) - -target_link_libraries(SLPlugin - ${GOOGLE_PERFTOOLS_LIBRARIES} - ${LLPLUGIN_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${PLUGIN_API_WINDOWS_LIBRARIES} -) - -add_dependencies(SLPlugin - ${LLPLUGIN_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLCOMMON_LIBRARIES} -) - -if (DARWIN) - # Mac version needs to link against Carbon - target_link_libraries(SLPlugin ${CARBON_LIBRARY} ${COCOA_LIBRARY}) - # Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later) - add_custom_command( - TARGET SLPlugin POST_BUILD - COMMAND mkdir - ARGS - -p - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/SLPlugin.app/Contents/Resources - ) -endif (DARWIN) - -if (LINUX) - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt") -endif (LINUX) - -if (WINDOWS) - set_target_properties(SLPlugin - PROPERTIES - LINK_FLAGS "${GOOGLE_PERFTOOLS_LINKER_FLAGS}" - ) -endif (WINDOWS) - -#ll_deploy_sharedlibs_command(SLPlugin) +project(SLPlugin) + +include(00-Common) +include(LLCommon) +include(LLPlugin) +include(Linking) +include(PluginAPI) +include(LLMessage) +include(GooglePerfTools) + +include_directories( + ${LLPLUGIN_INCLUDE_DIRS} + ${LLMESSAGE_INCLUDE_DIRS} + ${LLCOMMON_INCLUDE_DIRS} +) + +if (DARWIN) + include(CMakeFindFrameworks) + find_library(CARBON_LIBRARY Carbon) + find_library(COCOA_LIBRARY Cocoa) +endif (DARWIN) + + +### SLPlugin + +set(SLPlugin_SOURCE_FILES + slplugin.cpp + ) + +if (DARWIN) + list(APPEND SLPlugin_SOURCE_FILES + slplugin-objc.mm + ) + list(APPEND SLPlugin_HEADER_FILES + slplugin-objc.h + ) +endif (DARWIN) + +set_source_files_properties(${SLPlugin_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +if (SLPlugin_HEADER_FILES) + list(APPEND SLPlugin_SOURCE_FILES ${SLPlugin_HEADER_FILES}) +endif (SLPlugin_HEADER_FILES) + +add_executable(SLPlugin + WIN32 + MACOSX_BUNDLE + ${SLPlugin_SOURCE_FILES} +) + +set_target_properties(SLPlugin + PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist + ) + +target_link_libraries(SLPlugin + ${GOOGLE_PERFTOOLS_LIBRARIES} + ${LLPLUGIN_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${PLUGIN_API_WINDOWS_LIBRARIES} +) + +add_dependencies(SLPlugin + ${LLPLUGIN_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLCOMMON_LIBRARIES} +) + +if (DARWIN) + # Mac version needs to link against Carbon + target_link_libraries(SLPlugin ${CARBON_LIBRARY} ${COCOA_LIBRARY}) + # Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later) + add_custom_command( + TARGET SLPlugin POST_BUILD + COMMAND mkdir + ARGS + -p + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/SLPlugin.app/Contents/Resources + ) +endif (DARWIN) + +if (LINUX) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt") +endif (LINUX) + +if (WINDOWS) + set_target_properties(SLPlugin + PROPERTIES + LINK_FLAGS "${GOOGLE_PERFTOOLS_LINKER_FLAGS}" + ) +endif (WINDOWS) + +#ll_deploy_sharedlibs_command(SLPlugin) diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp old mode 100755 new mode 100644 index 64c087bec..cca8ead8f --- a/indra/llplugin/slplugin/slplugin.cpp +++ b/indra/llplugin/slplugin/slplugin.cpp @@ -183,8 +183,6 @@ int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL int main(int argc, char **argv) #endif { - ll_init_apr(); - // Set up llerror logging { LLError::initForApplication("."); @@ -400,8 +398,6 @@ int main(int argc, char **argv) delete plugin; - ll_cleanup_apr(); - return 0; } diff --git a/indra/llprimitive/llmaterialtable.cpp b/indra/llprimitive/llmaterialtable.cpp index 1772a8485..cb7154771 100644 --- a/indra/llprimitive/llmaterialtable.cpp +++ b/indra/llprimitive/llmaterialtable.cpp @@ -1,744 +1,744 @@ -/** - * @file llmaterialtable.cpp - * @brief Table of material names and IDs for viewer - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "linden_common.h" - -#include "llmaterialtable.h" -#include "llstl.h" -#include "material_codes.h" -#include "sound_ids.h" -#include "imageids.h" - -LLMaterialTable LLMaterialTable::basic(1); - -/* - Old Havok 1 constants - -// these are the approximately correct friction values for various materials -// however Havok1's friction dynamics are not very correct, so the effective -// friction coefficients that result from these numbers are approximately -// 25-50% too low, more incorrect for the lower values. -F32 const LLMaterialTable::FRICTION_MIN = 0.2f; -F32 const LLMaterialTable::FRICTION_GLASS = 0.2f; // borosilicate glass -F32 const LLMaterialTable::FRICTION_LIGHT = 0.2f; // -F32 const LLMaterialTable::FRICTION_METAL = 0.3f; // steel -F32 const LLMaterialTable::FRICTION_PLASTIC = 0.4f; // HDPE -F32 const LLMaterialTable::FRICTION_WOOD = 0.6f; // southern pine -F32 const LLMaterialTable::FRICTION_FLESH = 0.60f; // saltwater -F32 const LLMaterialTable::FRICTION_LAND = 0.78f; // dirt -F32 const LLMaterialTable::FRICTION_STONE = 0.8f; // concrete -F32 const LLMaterialTable::FRICTION_RUBBER = 0.9f; // -F32 const LLMaterialTable::FRICTION_MAX = 0.95f; // -*/ - -// #if LL_CURRENT_HAVOK_VERSION == LL_HAVOK_VERSION_460 -// Havok4 has more correct friction dynamics, however here we have to use -// the "incorrect" equivalents for the legacy Havok1 behavior -F32 const LLMaterialTable::FRICTION_MIN = 0.15f; -F32 const LLMaterialTable::FRICTION_GLASS = 0.13f; // borosilicate glass -F32 const LLMaterialTable::FRICTION_LIGHT = 0.14f; // -F32 const LLMaterialTable::FRICTION_METAL = 0.22f; // steel -F32 const LLMaterialTable::FRICTION_PLASTIC = 0.3f; // HDPE -F32 const LLMaterialTable::FRICTION_WOOD = 0.44f; // southern pine -F32 const LLMaterialTable::FRICTION_FLESH = 0.46f; // saltwater -F32 const LLMaterialTable::FRICTION_LAND = 0.58f; // dirt -F32 const LLMaterialTable::FRICTION_STONE = 0.6f; // concrete -F32 const LLMaterialTable::FRICTION_RUBBER = 0.67f; // -F32 const LLMaterialTable::FRICTION_MAX = 0.71f; // -// #endif - -F32 const LLMaterialTable::RESTITUTION_MIN = 0.02f; -F32 const LLMaterialTable::RESTITUTION_LAND = LLMaterialTable::RESTITUTION_MIN; -F32 const LLMaterialTable::RESTITUTION_FLESH = 0.2f; // saltwater -F32 const LLMaterialTable::RESTITUTION_STONE = 0.4f; // concrete -F32 const LLMaterialTable::RESTITUTION_METAL = 0.4f; // steel -F32 const LLMaterialTable::RESTITUTION_WOOD = 0.5f; // southern pine -F32 const LLMaterialTable::RESTITUTION_GLASS = 0.7f; // borosilicate glass -F32 const LLMaterialTable::RESTITUTION_PLASTIC = 0.7f; // HDPE -F32 const LLMaterialTable::RESTITUTION_LIGHT = 0.7f; // -F32 const LLMaterialTable::RESTITUTION_RUBBER = 0.9f; // -F32 const LLMaterialTable::RESTITUTION_MAX = 0.95f; - -F32 const LLMaterialTable::DEFAULT_FRICTION = 0.5f; -F32 const LLMaterialTable::DEFAULT_RESTITUTION = 0.4f; - -LLMaterialTable::LLMaterialTable() - : mCollisionSoundMatrix(NULL), - mSlidingSoundMatrix(NULL), - mRollingSoundMatrix(NULL) -{ -} - -LLMaterialTable::LLMaterialTable(U8 isBasic) -{ - initBasicTable(); -} - -LLMaterialTable::~LLMaterialTable() -{ - if (mCollisionSoundMatrix) - { - delete [] mCollisionSoundMatrix; - mCollisionSoundMatrix = NULL; - } - - if (mSlidingSoundMatrix) - { - delete [] mSlidingSoundMatrix; - mSlidingSoundMatrix = NULL; - } - - if (mRollingSoundMatrix) - { - delete [] mRollingSoundMatrix; - mRollingSoundMatrix = NULL; - } - - for_each(mMaterialInfoList.begin(), mMaterialInfoList.end(), DeletePointer()); - mMaterialInfoList.clear(); -} - -void LLMaterialTable::initBasicTable() -{ - // *TODO: Translate - add(LL_MCODE_STONE,std::string("Stone"), LL_DEFAULT_STONE_UUID); - add(LL_MCODE_METAL,std::string("Metal"), LL_DEFAULT_METAL_UUID); - add(LL_MCODE_GLASS,std::string("Glass"), LL_DEFAULT_GLASS_UUID); - add(LL_MCODE_WOOD,std::string("Wood"), LL_DEFAULT_WOOD_UUID); - add(LL_MCODE_FLESH,std::string("Flesh"), LL_DEFAULT_FLESH_UUID); - add(LL_MCODE_PLASTIC,std::string("Plastic"), LL_DEFAULT_PLASTIC_UUID); - add(LL_MCODE_RUBBER,std::string("Rubber"), LL_DEFAULT_RUBBER_UUID); - add(LL_MCODE_LIGHT,std::string("Light"), LL_DEFAULT_LIGHT_UUID); - - // specify densities for these materials. . . - // these were taken from http://www.mcelwee.net/html/densities_of_various_materials.html - - addDensity(LL_MCODE_STONE,30.f); - addDensity(LL_MCODE_METAL,50.f); - addDensity(LL_MCODE_GLASS,20.f); - addDensity(LL_MCODE_WOOD,10.f); - addDensity(LL_MCODE_FLESH,10.f); - addDensity(LL_MCODE_PLASTIC,5.f); - addDensity(LL_MCODE_RUBBER,0.5f); // - addDensity(LL_MCODE_LIGHT,20.f); // - - // add damage and energy values - addDamageAndEnergy(LL_MCODE_STONE, 1.f, 1.f, 1.f); // concrete - addDamageAndEnergy(LL_MCODE_METAL, 1.f, 1.f, 1.f); // steel - addDamageAndEnergy(LL_MCODE_GLASS, 1.f, 1.f, 1.f); // borosilicate glass - addDamageAndEnergy(LL_MCODE_WOOD, 1.f, 1.f, 1.f); // southern pine - addDamageAndEnergy(LL_MCODE_FLESH, 1.f, 1.f, 1.f); // saltwater - addDamageAndEnergy(LL_MCODE_PLASTIC, 1.f, 1.f, 1.f); // HDPE - addDamageAndEnergy(LL_MCODE_RUBBER, 1.f, 1.f, 1.f); // - addDamageAndEnergy(LL_MCODE_LIGHT, 1.f, 1.f, 1.f); // - - addFriction(LL_MCODE_STONE,0.8f); // concrete - addFriction(LL_MCODE_METAL,0.3f); // steel - addFriction(LL_MCODE_GLASS,0.2f); // borosilicate glass - addFriction(LL_MCODE_WOOD,0.6f); // southern pine - addFriction(LL_MCODE_FLESH,0.9f); // saltwater - addFriction(LL_MCODE_PLASTIC,0.4f); // HDPE - addFriction(LL_MCODE_RUBBER,0.9f); // - addFriction(LL_MCODE_LIGHT,0.2f); // - - addRestitution(LL_MCODE_STONE,0.4f); // concrete - addRestitution(LL_MCODE_METAL,0.4f); // steel - addRestitution(LL_MCODE_GLASS,0.7f); // borosilicate glass - addRestitution(LL_MCODE_WOOD,0.5f); // southern pine - addRestitution(LL_MCODE_FLESH,0.3f); // saltwater - addRestitution(LL_MCODE_PLASTIC,0.7f); // HDPE - addRestitution(LL_MCODE_RUBBER,0.9f); // - addRestitution(LL_MCODE_LIGHT,0.7f); // - - addShatterSound(LL_MCODE_STONE,LLUUID("ea296329-0f09-4993-af1b-e6784bab1dc9")); - addShatterSound(LL_MCODE_METAL,LLUUID("d1375446-1c4d-470b-9135-30132433b678")); - addShatterSound(LL_MCODE_GLASS,LLUUID("85cda060-b393-48e6-81c8-2cfdfb275351")); - addShatterSound(LL_MCODE_WOOD,LLUUID("6f00669f-15e0-4793-a63e-c03f62fee43a")); - addShatterSound(LL_MCODE_FLESH,LLUUID("2d8c6f51-149e-4e23-8413-93a379b42b67")); - addShatterSound(LL_MCODE_PLASTIC,LLUUID("d55c7f3c-e1c3-4ddc-9eff-9ef805d9190e")); - addShatterSound(LL_MCODE_RUBBER,LLUUID("212b6d1e-8d9c-4986-b3aa-f3c6df8d987d")); - addShatterSound(LL_MCODE_LIGHT,LLUUID("d55c7f3c-e1c3-4ddc-9eff-9ef805d9190e")); - - // CollisionSounds - mCollisionSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END]; - if (mCollisionSoundMatrix) - { - addCollisionSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_STONE_STONE); - addCollisionSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_STONE_METAL); - addCollisionSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_STONE_GLASS); - addCollisionSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_STONE_WOOD); - addCollisionSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_STONE_FLESH); - addCollisionSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_STONE_PLASTIC); - addCollisionSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_STONE_RUBBER); - addCollisionSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_STONE_PLASTIC); - - addCollisionSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_METAL_METAL); - addCollisionSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_METAL_GLASS); - addCollisionSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_METAL_WOOD); - addCollisionSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_METAL_FLESH); - addCollisionSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_METAL_PLASTIC); - addCollisionSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_METAL_PLASTIC); - addCollisionSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_METAL_RUBBER); - - addCollisionSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_GLASS_GLASS); - addCollisionSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_GLASS_WOOD); - addCollisionSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_GLASS_FLESH); - addCollisionSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_GLASS_PLASTIC); - addCollisionSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_GLASS_RUBBER); - addCollisionSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_GLASS_PLASTIC); - - addCollisionSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_WOOD_WOOD); - addCollisionSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_WOOD_FLESH); - addCollisionSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_WOOD_PLASTIC); - addCollisionSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_WOOD_RUBBER); - addCollisionSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_WOOD_PLASTIC); - - addCollisionSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_FLESH_FLESH); - addCollisionSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_FLESH_PLASTIC); - addCollisionSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_FLESH_RUBBER); - addCollisionSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_FLESH_PLASTIC); - - addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_RUBBER_RUBBER); - addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_RUBBER_PLASTIC); - addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_RUBBER_PLASTIC); - - addCollisionSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_PLASTIC_PLASTIC); - addCollisionSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_PLASTIC_PLASTIC); - - addCollisionSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_PLASTIC_PLASTIC); - } - - // Sliding Sounds - mSlidingSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END]; - if (mSlidingSoundMatrix) - { - addSlidingSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_SLIDE_STONE_STONE); - addSlidingSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_SLIDE_STONE_WOOD); - addSlidingSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_SLIDE_STONE_PLASTIC); - addSlidingSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_SLIDE_STONE_RUBBER); - addSlidingSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_SLIDE_STONE_PLASTIC); - - addSlidingSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_SLIDE_METAL_METAL); - addSlidingSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_SLIDE_METAL_GLASS); - addSlidingSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_SLIDE_METAL_WOOD); - addSlidingSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_SLIDE_METAL_FLESH); - addSlidingSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_SLIDE_METAL_RUBBER); - addSlidingSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); - - addSlidingSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); - - addSlidingSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_SLIDE_WOOD_WOOD); - addSlidingSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_SLIDE_WOOD_FLESH); - addSlidingSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_SLIDE_WOOD_PLASTIC); - addSlidingSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_SLIDE_WOOD_PLASTIC); - - addSlidingSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_SLIDE_FLESH_FLESH); - addSlidingSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); - - addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_SLIDE_RUBBER_PLASTIC); - addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_SLIDE_RUBBER_PLASTIC); - - addSlidingSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); - addSlidingSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); - - addSlidingSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); - } - - // Rolling Sounds - mRollingSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END]; - if (mRollingSoundMatrix) - { - addRollingSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_ROLL_STONE_STONE); - addRollingSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_ROLL_STONE_WOOD); - addRollingSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_ROLL_STONE_PLASTIC); - addRollingSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_ROLL_STONE_PLASTIC); - - addRollingSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_ROLL_METAL_GLASS); - addRollingSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_ROLL_METAL_WOOD); - addRollingSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_ROLL_METAL_WOOD); - addRollingSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_ROLL_METAL_WOOD); - - addRollingSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_ROLL_GLASS_WOOD); - addRollingSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); - - addRollingSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_ROLL_WOOD_WOOD); - addRollingSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_ROLL_WOOD_FLESH); - addRollingSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_ROLL_WOOD_PLASTIC); - addRollingSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_ROLL_WOOD_PLASTIC); - - addRollingSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_ROLL_FLESH_PLASTIC); - addRollingSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_ROLL_FLESH_PLASTIC); - - addRollingSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); - addRollingSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); - - addRollingSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_ROLL_PLASTIC_PLASTIC); - addRollingSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_ROLL_PLASTIC_PLASTIC); - - addRollingSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_ROLL_PLASTIC_PLASTIC); - } -} - -BOOL LLMaterialTable::add(U8 mcode, const std::string& name, const LLUUID &uuid) -{ - LLMaterialInfo *infop; - - infop = new LLMaterialInfo(mcode,name,uuid); - if (!infop) return FALSE; - - // Add at the end so the order in menus matches the order in this - // file. JNC 11.30.01 - mMaterialInfoList.push_back(infop); - - return TRUE; -} - -BOOL LLMaterialTable::addCollisionSound(U8 mcode, U8 mcode2, const LLUUID &uuid) -{ - if (mCollisionSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) - { - mCollisionSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid; - if (mcode != mcode2) - { - mCollisionSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid; - } - } - return TRUE; -} - -BOOL LLMaterialTable::addSlidingSound(U8 mcode, U8 mcode2, const LLUUID &uuid) -{ - if (mSlidingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) - { - mSlidingSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid; - if (mcode != mcode2) - { - mSlidingSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid; - } - } - return TRUE; -} - -BOOL LLMaterialTable::addRollingSound(U8 mcode, U8 mcode2, const LLUUID &uuid) -{ - if (mRollingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) - { - mRollingSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid; - if (mcode != mcode2) - { - mRollingSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid; - } - } - return TRUE; -} - -BOOL LLMaterialTable::addShatterSound(U8 mcode, const LLUUID &uuid) -{ - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - infop->mShatterSoundID = uuid; - return TRUE; - } - } - - return FALSE; -} - -BOOL LLMaterialTable::addDensity(U8 mcode, const F32 &density) -{ - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - infop->mDensity = density; - return TRUE; - } - } - - return FALSE; -} - -BOOL LLMaterialTable::addRestitution(U8 mcode, const F32 &restitution) -{ - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - infop->mRestitution = restitution; - return TRUE; - } - } - - return FALSE; -} - -BOOL LLMaterialTable::addFriction(U8 mcode, const F32 &friction) -{ - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - infop->mFriction = friction; - return TRUE; - } - } - - return FALSE; -} - -BOOL LLMaterialTable::addDamageAndEnergy(U8 mcode, const F32 &hp_mod, const F32 &damage_mod, const F32 &ep_mod) -{ - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - infop->mHPModifier = hp_mod; - infop->mDamageModifier = damage_mod; - infop->mEPModifier = ep_mod; - return TRUE; - } - } - - return FALSE; -} - -LLUUID LLMaterialTable::getDefaultTextureID(const std::string& name) -{ - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (name == infop->mName) - { - return infop->mDefaultTextureID; - } - } - - return LLUUID::null; -} - - -LLUUID LLMaterialTable::getDefaultTextureID(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mDefaultTextureID; - } - } - - return LLUUID::null; -} - - -U8 LLMaterialTable::getMCode(const std::string& name) -{ - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (name == infop->mName) - { - return infop->mMCode; - } - } - - // - if(name.find("MCode") == 0) - { - S32 s; - sscanf(name.c_str(), "MCode%d", &s); - return U8(s); - } - // - return 0; -} - - -std::string LLMaterialTable::getName(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mName; - } - } - - // - //return NULL; - return llformat("MCode%d", mcode); - // -} - - -LLUUID LLMaterialTable::getCollisionSoundUUID(U8 mcode, U8 mcode2) -{ - mcode &= LL_MCODE_MASK; - mcode2 &= LL_MCODE_MASK; - - //llinfos << "code 1: " << ((U32) mcode) << " code 2:" << ((U32) mcode2) << llendl; - if (mCollisionSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) - { - return(mCollisionSoundMatrix[mcode * LL_MCODE_END + mcode2]); - } - else - { - //llinfos << "Null Sound" << llendl; - return(SND_NULL); - } -} - -LLUUID LLMaterialTable::getSlidingSoundUUID(U8 mcode, U8 mcode2) -{ - mcode &= LL_MCODE_MASK; - mcode2 &= LL_MCODE_MASK; - - if (mSlidingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) - { - return(mSlidingSoundMatrix[mcode * LL_MCODE_END + mcode2]); - } - else - { - return(SND_NULL); - } -} - -LLUUID LLMaterialTable::getRollingSoundUUID(U8 mcode, U8 mcode2) -{ - mcode &= LL_MCODE_MASK; - mcode2 &= LL_MCODE_MASK; - - if (mRollingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) - { - return(mRollingSoundMatrix[mcode * LL_MCODE_END + mcode2]); - } - else - { - return(SND_NULL); - } -} - -LLUUID LLMaterialTable::getGroundCollisionSoundUUID(U8 mcode) -{ - // Create material appropriate sounds for collisions with the ground - // For now, simply return a single sound for all materials - return SND_STONE_DIRT_02; -} - -LLUUID LLMaterialTable::getGroundSlidingSoundUUID(U8 mcode) -{ - // Create material-specific sound for sliding on ground - // For now, just return a single sound - return SND_SLIDE_STONE_STONE_01; -} - -LLUUID LLMaterialTable::getGroundRollingSoundUUID(U8 mcode) -{ - // Create material-specific sound for rolling on ground - // For now, just return a single sound - return SND_SLIDE_STONE_STONE_01; -} - -LLUUID LLMaterialTable::getCollisionParticleUUID(U8 mcode, U8 mcode2) -{ - // Returns an appropriate UUID to use as sprite at collision betweeen objects - // For now, just return a single image - return IMG_SHOT; -} - -LLUUID LLMaterialTable::getGroundCollisionParticleUUID(U8 mcode) -{ - // Returns an appropriate - // For now, just return a single sound - return IMG_SMOKE_POOF; -} - - -F32 LLMaterialTable::getDensity(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mDensity; - } - } - - return 0.f; -} - -F32 LLMaterialTable::getRestitution(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mRestitution; - } - } - - return LLMaterialTable::DEFAULT_RESTITUTION; -} - -F32 LLMaterialTable::getFriction(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mFriction; - } - } - - return LLMaterialTable::DEFAULT_FRICTION; -} - -F32 LLMaterialTable::getHPMod(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mHPModifier; - } - } - - return 1.f; -} - -F32 LLMaterialTable::getDamageMod(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mDamageModifier; - } - } - - return 1.f; -} - -F32 LLMaterialTable::getEPMod(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mEPModifier; - } - } - - return 1.f; -} - -LLUUID LLMaterialTable::getShatterSoundUUID(U8 mcode) -{ - mcode &= LL_MCODE_MASK; - for (info_list_t::iterator iter = mMaterialInfoList.begin(); - iter != mMaterialInfoList.end(); ++iter) - { - LLMaterialInfo *infop = *iter; - if (mcode == infop->mMCode) - { - return infop->mShatterSoundID; - } - } - - return SND_NULL; -} +/** + * @file llmaterialtable.cpp + * @brief Table of material names and IDs for viewer + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llmaterialtable.h" +#include "llstl.h" +#include "material_codes.h" +#include "sound_ids.h" +#include "imageids.h" + +LLMaterialTable LLMaterialTable::basic(1); + +/* + Old Havok 1 constants + +// these are the approximately correct friction values for various materials +// however Havok1's friction dynamics are not very correct, so the effective +// friction coefficients that result from these numbers are approximately +// 25-50% too low, more incorrect for the lower values. +F32 const LLMaterialTable::FRICTION_MIN = 0.2f; +F32 const LLMaterialTable::FRICTION_GLASS = 0.2f; // borosilicate glass +F32 const LLMaterialTable::FRICTION_LIGHT = 0.2f; // +F32 const LLMaterialTable::FRICTION_METAL = 0.3f; // steel +F32 const LLMaterialTable::FRICTION_PLASTIC = 0.4f; // HDPE +F32 const LLMaterialTable::FRICTION_WOOD = 0.6f; // southern pine +F32 const LLMaterialTable::FRICTION_FLESH = 0.60f; // saltwater +F32 const LLMaterialTable::FRICTION_LAND = 0.78f; // dirt +F32 const LLMaterialTable::FRICTION_STONE = 0.8f; // concrete +F32 const LLMaterialTable::FRICTION_RUBBER = 0.9f; // +F32 const LLMaterialTable::FRICTION_MAX = 0.95f; // +*/ + +// #if LL_CURRENT_HAVOK_VERSION == LL_HAVOK_VERSION_460 +// Havok4 has more correct friction dynamics, however here we have to use +// the "incorrect" equivalents for the legacy Havok1 behavior +F32 const LLMaterialTable::FRICTION_MIN = 0.15f; +F32 const LLMaterialTable::FRICTION_GLASS = 0.13f; // borosilicate glass +F32 const LLMaterialTable::FRICTION_LIGHT = 0.14f; // +F32 const LLMaterialTable::FRICTION_METAL = 0.22f; // steel +F32 const LLMaterialTable::FRICTION_PLASTIC = 0.3f; // HDPE +F32 const LLMaterialTable::FRICTION_WOOD = 0.44f; // southern pine +F32 const LLMaterialTable::FRICTION_FLESH = 0.46f; // saltwater +F32 const LLMaterialTable::FRICTION_LAND = 0.58f; // dirt +F32 const LLMaterialTable::FRICTION_STONE = 0.6f; // concrete +F32 const LLMaterialTable::FRICTION_RUBBER = 0.67f; // +F32 const LLMaterialTable::FRICTION_MAX = 0.71f; // +// #endif + +F32 const LLMaterialTable::RESTITUTION_MIN = 0.02f; +F32 const LLMaterialTable::RESTITUTION_LAND = LLMaterialTable::RESTITUTION_MIN; +F32 const LLMaterialTable::RESTITUTION_FLESH = 0.2f; // saltwater +F32 const LLMaterialTable::RESTITUTION_STONE = 0.4f; // concrete +F32 const LLMaterialTable::RESTITUTION_METAL = 0.4f; // steel +F32 const LLMaterialTable::RESTITUTION_WOOD = 0.5f; // southern pine +F32 const LLMaterialTable::RESTITUTION_GLASS = 0.7f; // borosilicate glass +F32 const LLMaterialTable::RESTITUTION_PLASTIC = 0.7f; // HDPE +F32 const LLMaterialTable::RESTITUTION_LIGHT = 0.7f; // +F32 const LLMaterialTable::RESTITUTION_RUBBER = 0.9f; // +F32 const LLMaterialTable::RESTITUTION_MAX = 0.95f; + +F32 const LLMaterialTable::DEFAULT_FRICTION = 0.5f; +F32 const LLMaterialTable::DEFAULT_RESTITUTION = 0.4f; + +LLMaterialTable::LLMaterialTable() + : mCollisionSoundMatrix(NULL), + mSlidingSoundMatrix(NULL), + mRollingSoundMatrix(NULL) +{ +} + +LLMaterialTable::LLMaterialTable(U8 isBasic) +{ + initBasicTable(); +} + +LLMaterialTable::~LLMaterialTable() +{ + if (mCollisionSoundMatrix) + { + delete [] mCollisionSoundMatrix; + mCollisionSoundMatrix = NULL; + } + + if (mSlidingSoundMatrix) + { + delete [] mSlidingSoundMatrix; + mSlidingSoundMatrix = NULL; + } + + if (mRollingSoundMatrix) + { + delete [] mRollingSoundMatrix; + mRollingSoundMatrix = NULL; + } + + for_each(mMaterialInfoList.begin(), mMaterialInfoList.end(), DeletePointer()); + mMaterialInfoList.clear(); +} + +void LLMaterialTable::initBasicTable() +{ + // *TODO: Translate + add(LL_MCODE_STONE,std::string("Stone"), LL_DEFAULT_STONE_UUID); + add(LL_MCODE_METAL,std::string("Metal"), LL_DEFAULT_METAL_UUID); + add(LL_MCODE_GLASS,std::string("Glass"), LL_DEFAULT_GLASS_UUID); + add(LL_MCODE_WOOD,std::string("Wood"), LL_DEFAULT_WOOD_UUID); + add(LL_MCODE_FLESH,std::string("Flesh"), LL_DEFAULT_FLESH_UUID); + add(LL_MCODE_PLASTIC,std::string("Plastic"), LL_DEFAULT_PLASTIC_UUID); + add(LL_MCODE_RUBBER,std::string("Rubber"), LL_DEFAULT_RUBBER_UUID); + add(LL_MCODE_LIGHT,std::string("Light"), LL_DEFAULT_LIGHT_UUID); + + // specify densities for these materials. . . + // these were taken from http://www.mcelwee.net/html/densities_of_various_materials.html + + addDensity(LL_MCODE_STONE,30.f); + addDensity(LL_MCODE_METAL,50.f); + addDensity(LL_MCODE_GLASS,20.f); + addDensity(LL_MCODE_WOOD,10.f); + addDensity(LL_MCODE_FLESH,10.f); + addDensity(LL_MCODE_PLASTIC,5.f); + addDensity(LL_MCODE_RUBBER,0.5f); // + addDensity(LL_MCODE_LIGHT,20.f); // + + // add damage and energy values + addDamageAndEnergy(LL_MCODE_STONE, 1.f, 1.f, 1.f); // concrete + addDamageAndEnergy(LL_MCODE_METAL, 1.f, 1.f, 1.f); // steel + addDamageAndEnergy(LL_MCODE_GLASS, 1.f, 1.f, 1.f); // borosilicate glass + addDamageAndEnergy(LL_MCODE_WOOD, 1.f, 1.f, 1.f); // southern pine + addDamageAndEnergy(LL_MCODE_FLESH, 1.f, 1.f, 1.f); // saltwater + addDamageAndEnergy(LL_MCODE_PLASTIC, 1.f, 1.f, 1.f); // HDPE + addDamageAndEnergy(LL_MCODE_RUBBER, 1.f, 1.f, 1.f); // + addDamageAndEnergy(LL_MCODE_LIGHT, 1.f, 1.f, 1.f); // + + addFriction(LL_MCODE_STONE,0.8f); // concrete + addFriction(LL_MCODE_METAL,0.3f); // steel + addFriction(LL_MCODE_GLASS,0.2f); // borosilicate glass + addFriction(LL_MCODE_WOOD,0.6f); // southern pine + addFriction(LL_MCODE_FLESH,0.9f); // saltwater + addFriction(LL_MCODE_PLASTIC,0.4f); // HDPE + addFriction(LL_MCODE_RUBBER,0.9f); // + addFriction(LL_MCODE_LIGHT,0.2f); // + + addRestitution(LL_MCODE_STONE,0.4f); // concrete + addRestitution(LL_MCODE_METAL,0.4f); // steel + addRestitution(LL_MCODE_GLASS,0.7f); // borosilicate glass + addRestitution(LL_MCODE_WOOD,0.5f); // southern pine + addRestitution(LL_MCODE_FLESH,0.3f); // saltwater + addRestitution(LL_MCODE_PLASTIC,0.7f); // HDPE + addRestitution(LL_MCODE_RUBBER,0.9f); // + addRestitution(LL_MCODE_LIGHT,0.7f); // + + addShatterSound(LL_MCODE_STONE,LLUUID("ea296329-0f09-4993-af1b-e6784bab1dc9")); + addShatterSound(LL_MCODE_METAL,LLUUID("d1375446-1c4d-470b-9135-30132433b678")); + addShatterSound(LL_MCODE_GLASS,LLUUID("85cda060-b393-48e6-81c8-2cfdfb275351")); + addShatterSound(LL_MCODE_WOOD,LLUUID("6f00669f-15e0-4793-a63e-c03f62fee43a")); + addShatterSound(LL_MCODE_FLESH,LLUUID("2d8c6f51-149e-4e23-8413-93a379b42b67")); + addShatterSound(LL_MCODE_PLASTIC,LLUUID("d55c7f3c-e1c3-4ddc-9eff-9ef805d9190e")); + addShatterSound(LL_MCODE_RUBBER,LLUUID("212b6d1e-8d9c-4986-b3aa-f3c6df8d987d")); + addShatterSound(LL_MCODE_LIGHT,LLUUID("d55c7f3c-e1c3-4ddc-9eff-9ef805d9190e")); + + // CollisionSounds + mCollisionSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END]; + if (mCollisionSoundMatrix) + { + addCollisionSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_STONE_STONE); + addCollisionSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_STONE_METAL); + addCollisionSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_STONE_GLASS); + addCollisionSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_STONE_WOOD); + addCollisionSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_STONE_FLESH); + addCollisionSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_STONE_PLASTIC); + addCollisionSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_STONE_RUBBER); + addCollisionSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_STONE_PLASTIC); + + addCollisionSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_METAL_METAL); + addCollisionSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_METAL_GLASS); + addCollisionSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_METAL_WOOD); + addCollisionSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_METAL_FLESH); + addCollisionSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_METAL_PLASTIC); + addCollisionSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_METAL_PLASTIC); + addCollisionSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_METAL_RUBBER); + + addCollisionSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_GLASS_GLASS); + addCollisionSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_GLASS_WOOD); + addCollisionSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_GLASS_FLESH); + addCollisionSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_GLASS_PLASTIC); + addCollisionSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_GLASS_RUBBER); + addCollisionSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_GLASS_PLASTIC); + + addCollisionSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_WOOD_WOOD); + addCollisionSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_WOOD_FLESH); + addCollisionSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_WOOD_PLASTIC); + addCollisionSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_WOOD_RUBBER); + addCollisionSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_WOOD_PLASTIC); + + addCollisionSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_FLESH_FLESH); + addCollisionSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_FLESH_PLASTIC); + addCollisionSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_FLESH_RUBBER); + addCollisionSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_FLESH_PLASTIC); + + addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_RUBBER_RUBBER); + addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_RUBBER_PLASTIC); + addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_RUBBER_PLASTIC); + + addCollisionSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_PLASTIC_PLASTIC); + addCollisionSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_PLASTIC_PLASTIC); + + addCollisionSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_PLASTIC_PLASTIC); + } + + // Sliding Sounds + mSlidingSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END]; + if (mSlidingSoundMatrix) + { + addSlidingSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_SLIDE_STONE_STONE); + addSlidingSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_SLIDE_STONE_WOOD); + addSlidingSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_SLIDE_STONE_PLASTIC); + addSlidingSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_SLIDE_STONE_RUBBER); + addSlidingSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_SLIDE_STONE_PLASTIC); + + addSlidingSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_SLIDE_METAL_METAL); + addSlidingSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_SLIDE_METAL_GLASS); + addSlidingSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_SLIDE_METAL_WOOD); + addSlidingSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_SLIDE_METAL_FLESH); + addSlidingSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_SLIDE_METAL_RUBBER); + addSlidingSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); + + addSlidingSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); + + addSlidingSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_SLIDE_WOOD_WOOD); + addSlidingSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_SLIDE_WOOD_FLESH); + addSlidingSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_SLIDE_WOOD_PLASTIC); + addSlidingSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_SLIDE_WOOD_PLASTIC); + + addSlidingSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_SLIDE_FLESH_FLESH); + addSlidingSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); + + addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_SLIDE_RUBBER_PLASTIC); + addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_SLIDE_RUBBER_PLASTIC); + + addSlidingSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); + addSlidingSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); + + addSlidingSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); + } + + // Rolling Sounds + mRollingSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END]; + if (mRollingSoundMatrix) + { + addRollingSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_ROLL_STONE_STONE); + addRollingSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_ROLL_STONE_WOOD); + addRollingSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_ROLL_STONE_PLASTIC); + addRollingSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_ROLL_STONE_PLASTIC); + + addRollingSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_ROLL_METAL_GLASS); + addRollingSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_ROLL_METAL_WOOD); + addRollingSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_ROLL_METAL_WOOD); + addRollingSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_ROLL_METAL_WOOD); + + addRollingSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_ROLL_GLASS_WOOD); + addRollingSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); + + addRollingSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_ROLL_WOOD_WOOD); + addRollingSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_ROLL_WOOD_FLESH); + addRollingSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_ROLL_WOOD_PLASTIC); + addRollingSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_ROLL_WOOD_PLASTIC); + + addRollingSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_ROLL_FLESH_PLASTIC); + addRollingSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_ROLL_FLESH_PLASTIC); + + addRollingSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01); + addRollingSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01); + + addRollingSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_ROLL_PLASTIC_PLASTIC); + addRollingSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_ROLL_PLASTIC_PLASTIC); + + addRollingSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_ROLL_PLASTIC_PLASTIC); + } +} + +BOOL LLMaterialTable::add(U8 mcode, const std::string& name, const LLUUID &uuid) +{ + LLMaterialInfo *infop; + + infop = new LLMaterialInfo(mcode,name,uuid); + if (!infop) return FALSE; + + // Add at the end so the order in menus matches the order in this + // file. JNC 11.30.01 + mMaterialInfoList.push_back(infop); + + return TRUE; +} + +BOOL LLMaterialTable::addCollisionSound(U8 mcode, U8 mcode2, const LLUUID &uuid) +{ + if (mCollisionSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) + { + mCollisionSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid; + if (mcode != mcode2) + { + mCollisionSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid; + } + } + return TRUE; +} + +BOOL LLMaterialTable::addSlidingSound(U8 mcode, U8 mcode2, const LLUUID &uuid) +{ + if (mSlidingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) + { + mSlidingSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid; + if (mcode != mcode2) + { + mSlidingSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid; + } + } + return TRUE; +} + +BOOL LLMaterialTable::addRollingSound(U8 mcode, U8 mcode2, const LLUUID &uuid) +{ + if (mRollingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) + { + mRollingSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid; + if (mcode != mcode2) + { + mRollingSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid; + } + } + return TRUE; +} + +BOOL LLMaterialTable::addShatterSound(U8 mcode, const LLUUID &uuid) +{ + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + infop->mShatterSoundID = uuid; + return TRUE; + } + } + + return FALSE; +} + +BOOL LLMaterialTable::addDensity(U8 mcode, const F32 &density) +{ + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + infop->mDensity = density; + return TRUE; + } + } + + return FALSE; +} + +BOOL LLMaterialTable::addRestitution(U8 mcode, const F32 &restitution) +{ + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + infop->mRestitution = restitution; + return TRUE; + } + } + + return FALSE; +} + +BOOL LLMaterialTable::addFriction(U8 mcode, const F32 &friction) +{ + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + infop->mFriction = friction; + return TRUE; + } + } + + return FALSE; +} + +BOOL LLMaterialTable::addDamageAndEnergy(U8 mcode, const F32 &hp_mod, const F32 &damage_mod, const F32 &ep_mod) +{ + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + infop->mHPModifier = hp_mod; + infop->mDamageModifier = damage_mod; + infop->mEPModifier = ep_mod; + return TRUE; + } + } + + return FALSE; +} + +LLUUID LLMaterialTable::getDefaultTextureID(const std::string& name) +{ + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (name == infop->mName) + { + return infop->mDefaultTextureID; + } + } + + return LLUUID::null; +} + + +LLUUID LLMaterialTable::getDefaultTextureID(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mDefaultTextureID; + } + } + + return LLUUID::null; +} + + +U8 LLMaterialTable::getMCode(const std::string& name) +{ + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (name == infop->mName) + { + return infop->mMCode; + } + } + + // + if(name.find("MCode") == 0) + { + S32 s; + sscanf(name.c_str(), "MCode%d", &s); + return U8(s); + } + // + return 0; +} + + +std::string LLMaterialTable::getName(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mName; + } + } + + // + //return NULL; + return llformat("MCode%d", mcode); + // +} + + +LLUUID LLMaterialTable::getCollisionSoundUUID(U8 mcode, U8 mcode2) +{ + mcode &= LL_MCODE_MASK; + mcode2 &= LL_MCODE_MASK; + + //llinfos << "code 1: " << ((U32) mcode) << " code 2:" << ((U32) mcode2) << llendl; + if (mCollisionSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) + { + return(mCollisionSoundMatrix[mcode * LL_MCODE_END + mcode2]); + } + else + { + //llinfos << "Null Sound" << llendl; + return(SND_NULL); + } +} + +LLUUID LLMaterialTable::getSlidingSoundUUID(U8 mcode, U8 mcode2) +{ + mcode &= LL_MCODE_MASK; + mcode2 &= LL_MCODE_MASK; + + if (mSlidingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) + { + return(mSlidingSoundMatrix[mcode * LL_MCODE_END + mcode2]); + } + else + { + return(SND_NULL); + } +} + +LLUUID LLMaterialTable::getRollingSoundUUID(U8 mcode, U8 mcode2) +{ + mcode &= LL_MCODE_MASK; + mcode2 &= LL_MCODE_MASK; + + if (mRollingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END)) + { + return(mRollingSoundMatrix[mcode * LL_MCODE_END + mcode2]); + } + else + { + return(SND_NULL); + } +} + +LLUUID LLMaterialTable::getGroundCollisionSoundUUID(U8 mcode) +{ + // Create material appropriate sounds for collisions with the ground + // For now, simply return a single sound for all materials + return SND_STONE_DIRT_02; +} + +LLUUID LLMaterialTable::getGroundSlidingSoundUUID(U8 mcode) +{ + // Create material-specific sound for sliding on ground + // For now, just return a single sound + return SND_SLIDE_STONE_STONE_01; +} + +LLUUID LLMaterialTable::getGroundRollingSoundUUID(U8 mcode) +{ + // Create material-specific sound for rolling on ground + // For now, just return a single sound + return SND_SLIDE_STONE_STONE_01; +} + +LLUUID LLMaterialTable::getCollisionParticleUUID(U8 mcode, U8 mcode2) +{ + // Returns an appropriate UUID to use as sprite at collision betweeen objects + // For now, just return a single image + return IMG_SHOT; +} + +LLUUID LLMaterialTable::getGroundCollisionParticleUUID(U8 mcode) +{ + // Returns an appropriate + // For now, just return a single sound + return IMG_SMOKE_POOF; +} + + +F32 LLMaterialTable::getDensity(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mDensity; + } + } + + return 0.f; +} + +F32 LLMaterialTable::getRestitution(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mRestitution; + } + } + + return LLMaterialTable::DEFAULT_RESTITUTION; +} + +F32 LLMaterialTable::getFriction(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mFriction; + } + } + + return LLMaterialTable::DEFAULT_FRICTION; +} + +F32 LLMaterialTable::getHPMod(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mHPModifier; + } + } + + return 1.f; +} + +F32 LLMaterialTable::getDamageMod(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mDamageModifier; + } + } + + return 1.f; +} + +F32 LLMaterialTable::getEPMod(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mEPModifier; + } + } + + return 1.f; +} + +LLUUID LLMaterialTable::getShatterSoundUUID(U8 mcode) +{ + mcode &= LL_MCODE_MASK; + for (info_list_t::iterator iter = mMaterialInfoList.begin(); + iter != mMaterialInfoList.end(); ++iter) + { + LLMaterialInfo *infop = *iter; + if (mcode == infop->mMCode) + { + return infop->mShatterSoundID; + } + } + + return SND_NULL; +} diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index f29b4423f..1ec4512f9 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -35,6 +35,7 @@ set(llrender_SOURCE_FILES llpostprocess.cpp llrendersphere.cpp llshadermgr.cpp + lltexture.cpp llvertexbuffer.cpp ) @@ -57,6 +58,7 @@ set(llrender_HEADER_FILES llrender.h llrendersphere.h llshadermgr.h + lltexture.h llvertexbuffer.h ) diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 5d83f34be..f597d7c70 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -1079,15 +1079,15 @@ void LLFontGL::clearEmbeddedChars() mEmbeddedChars.clear(); } -void LLFontGL::addEmbeddedChar( llwchar wc, LLImageGL* image, const std::string& label ) const +void LLFontGL::addEmbeddedChar( llwchar wc, LLTexture* image, const std::string& label ) const { LLWString wlabel = utf8str_to_wstring(label); addEmbeddedChar(wc, image, wlabel); } -void LLFontGL::addEmbeddedChar( llwchar wc, LLImageGL* image, const LLWString& wlabel ) const +void LLFontGL::addEmbeddedChar( llwchar wc, LLTexture* image, const LLWString& wlabel ) const { - embedded_data_t* ext_data = new embedded_data_t(image, wlabel); + embedded_data_t* ext_data = new embedded_data_t(image->getGLTexture(), wlabel); mEmbeddedChars[wc] = ext_data; } diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index efeb420da..66fe73902 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -35,7 +35,7 @@ #define LL_LLFONTGL_H #include "llfont.h" -#include "llimagegl.h" +#include "lltexture.h" #include "v2math.h" #include "llcoord.h" #include "llrect.h" @@ -194,10 +194,10 @@ public: BOOL round = TRUE, BOOL use_embedded = FALSE) const; - LLImageGL *getImageGL() const; + LLTexture *getTexture() const; - void addEmbeddedChar( llwchar wc, LLImageGL* image, const std::string& label) const; - void addEmbeddedChar( llwchar wc, LLImageGL* image, const LLWString& label) const; + void addEmbeddedChar( llwchar wc, LLTexture* image, const std::string& label) const; + void addEmbeddedChar( llwchar wc, LLTexture* image, const LLWString& label) const; void removeEmbeddedChar( llwchar wc ) const; static std::string nameFromFont(const LLFontGL* fontp); diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 60c3582d8..f20e0d6ad 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -61,6 +61,7 @@ std::list LLImageGL::sDeadTextureList; BOOL LLImageGL::sGlobalUseAnisotropic = FALSE; F32 LLImageGL::sLastFrameTime = 0.f; BOOL LLImageGL::sAllowReadBackRaw = FALSE ; +LLImageGL* LLImageGL::sDefaultGLTexture = NULL ; std::set LLImageGL::sImageList; @@ -105,9 +106,9 @@ void check_all_images() } } -void LLImageGL::checkTexSize() const +void LLImageGL::checkTexSize(bool forced) const { - if (gDebugGL && mTarget == GL_TEXTURE_2D) + if ((forced || gDebugGL) && mTarget == GL_TEXTURE_2D) { GLint texname; glGetIntegerv(GL_TEXTURE_BINDING_2D, &texname); @@ -186,7 +187,6 @@ void LLImageGL::setHighlightTexture(S32 category) } } sHighlightTexturep->createGLTexture(0, image_raw, 0, TRUE, category); - sHighlightTexturep->dontDiscard(); image_raw = NULL; } @@ -272,27 +272,15 @@ void LLImageGL::updateStats(F32 current_time) } //static -S32 LLImageGL::updateBoundTexMemStatic(const S32 delta, const S32 size, S32 category) +S32 LLImageGL::updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 category) { - if(gAuditTexture) + if(gAuditTexture && ncomponents > 0 && category > -1) { - sTextureCurBoundCounter[getTextureCounterIndex(size)]++ ; - sTextureCurMemByCategoryBound[category] += delta ; + sTextureCurBoundCounter[getTextureCounterIndex(mem / ncomponents)]++ ; + sTextureCurMemByCategoryBound[category] += mem ; } - LLImageGL::sCurBoundTextureMemory += delta ; - return LLImageGL::sCurBoundTextureMemory; -} - -S32 LLImageGL::updateBoundTexMem()const -{ - if(gAuditTexture) - { - sTextureCurBoundCounter[getTextureCounterIndex(mTextureMemory / mComponents)]++ ; - sTextureCurMemByCategoryBound[mCategory] += mTextureMemory ; - } - - LLImageGL::sCurBoundTextureMemory += mTextureMemory ; + LLImageGL::sCurBoundTextureMemory += mem ; return LLImageGL::sCurBoundTextureMemory; } @@ -301,11 +289,13 @@ S32 LLImageGL::updateBoundTexMem()const //static void LLImageGL::destroyGL(BOOL save_state) { + deleteDeadTextures(); //Dump unimportant textures. for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++) { gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE); } + int stored_count = 0; sAllowReadBackRaw = true ; for (std::set::iterator iter = sImageList.begin(); iter != sImageList.end(); iter++) @@ -320,18 +310,24 @@ void LLImageGL::destroyGL(BOOL save_state) { glimage->mSaveData = NULL ; } + else + stored_count++; } glimage->destroyGLTexture(); stop_glerror(); } } + llinfos << "Storing " << stored_count << " images..." << llendl; sAllowReadBackRaw = false ; + deleteDeadTextures();//Now, actually call glDeleteTextures for everything. } //static void LLImageGL::restoreGL() { + + int recovered_count = 0; for (std::set::iterator iter = sImageList.begin(); iter != sImageList.end(); iter++) { @@ -346,10 +342,12 @@ void LLImageGL::restoreGL() { glimage->createGLTexture(glimage->mCurrentDiscardLevel, glimage->mSaveData, 0, TRUE, glimage->getCategory()); stop_glerror(); + recovered_count++; } glimage->mSaveData = NULL; // deletes data } } + llinfos << "Restored " << recovered_count << " images" << llendl; } //static @@ -478,11 +476,7 @@ void LLImageGL::init(BOOL usemipmaps) mMissed = FALSE; #endif - mCategory = -1 ; - - //LLTexture stuff - mDontDiscard = FALSE; - mTextureState = NO_DELETE ; + mCategory = -1; } void LLImageGL::cleanup() @@ -592,7 +586,7 @@ void LLImageGL::forceUpdateBindStats(void) const mLastBindTime = sLastFrameTime; } -BOOL LLImageGL::updateBindStats() const +BOOL LLImageGL::updateBindStats(S32 tex_mem) const { if (mTexName != 0) { @@ -604,32 +598,18 @@ BOOL LLImageGL::updateBindStats() const { // we haven't accounted for this texture yet this frame sUniqueCount++; - - updateBoundTexMem(); + updateBoundTexMem(tex_mem, mComponents, mCategory); mLastBindTime = sLastFrameTime; - + return TRUE ; } } - return FALSE; + return FALSE ; } -//virtual -bool LLImageGL::bindError(const S32 stage) const +F32 LLImageGL::getTimePassedSinceLastBound() { - return false; -} - -//virtual -bool LLImageGL::bindDefaultImage(const S32 stage) -{ - return false; -} - -//virtual -void LLImageGL::forceImmediateUpdate() -{ - return ; + return sLastFrameTime - mLastBindTime ; } void LLImageGL::setExplicitFormat( LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes ) @@ -1184,7 +1164,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_ if(gAuditTexture) { - decTextureCounter() ; + decTextureCounter(mTextureMemory, mComponents, mCategory) ; } LLImageGL::deleteTextures(1, &old_name); @@ -1194,11 +1174,10 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_ mTextureMemory = getMipBytes(discard_level); sGlobalTextureMemoryInBytes += mTextureMemory; - setActive() ; if(gAuditTexture) { - incTextureCounter() ; + incTextureCounter(mTextureMemory, mComponents, mCategory) ; } // mark this as bound at this point, so we don't throw it out immediately mLastBindTime = sLastFrameTime; @@ -1281,7 +1260,7 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre llverify(gGL.getTexUnit(0)->bindManual(mBindTarget, mTexName)); //debug code, leave it there commented. - //checkTexSize() ; + checkTexSize() ; LLGLint glwidth = 0; glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_WIDTH, (GLint*)&glwidth); @@ -1398,20 +1377,21 @@ void LLImageGL::destroyGLTexture() { if(gAuditTexture) { - decTextureCounter() ; + decTextureCounter(mTextureMemory, mComponents, mCategory) ; } sGlobalTextureMemoryInBytes -= mTextureMemory; mTextureMemory = 0; } - LLImageGL::deleteTextures(1, &mTexName); - mTextureState = DELETED ; + LLImageGL::deleteTextures(1, &mTexName); mTexName = 0; mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel. mGLTextureCreated = FALSE ; } } + + //---------------------------------------------------------------------------- void LLImageGL::setAddressMode(LLTexUnit::eTextureAddressMode mode) @@ -1724,59 +1704,6 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h) } } -BOOL LLImageGL::isDeleted() -{ - return mTextureState == DELETED ; -} - -BOOL LLImageGL::isInactive() -{ - return mTextureState == INACTIVE ; -} - -BOOL LLImageGL::isDeletionCandidate() -{ - return mTextureState == DELETION_CANDIDATE ; -} -//---------------------------------------------------------------------------- - - -void LLImageGL::setDeletionCandidate() -{ - if(mTexName && (mTextureState == INACTIVE)) - { - mTextureState = DELETION_CANDIDATE ; - } -} - -void LLImageGL::forceActive() -{ - mTextureState = ACTIVE ; -} - -void LLImageGL::setActive() -{ - if(mTextureState != NO_DELETE) - { - mTextureState = ACTIVE ; - } -} - -//set the texture inactive -void LLImageGL::setInactive() -{ - if(mTexName && (mTextureState == ACTIVE) && !getBoundRecently()) - { - mTextureState = INACTIVE ; - } -} - -//set the texture to stay in memory -void LLImageGL::setNoDelete() -{ - mTextureState = NO_DELETE ; -} - //---------------------------------------------------------------------------- void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in) { @@ -1928,26 +1855,21 @@ S32 LLImageGL::getTextureCounterIndex(U32 val) return ret ; } } -void LLImageGL::incTextureCounterStatic(U32 val, S32 ncomponents, S32 category) + +//static +void LLImageGL::incTextureCounter(U32 val, S32 ncomponents, S32 category) { sTextureLoadedCounter[getTextureCounterIndex(val)]++ ; sTextureMemByCategory[category] += (S32)val * ncomponents ; } -void LLImageGL::decTextureCounterStatic(U32 val, S32 ncomponents, S32 category) + +//static +void LLImageGL::decTextureCounter(U32 val, S32 ncomponents, S32 category) { sTextureLoadedCounter[getTextureCounterIndex(val)]-- ; sTextureMemByCategory[category] += (S32)val * ncomponents ; } -void LLImageGL::incTextureCounter() -{ - sTextureLoadedCounter[getTextureCounterIndex(mTextureMemory / mComponents)]++ ; - sTextureMemByCategory[mCategory] += mTextureMemory ; -} -void LLImageGL::decTextureCounter() -{ - sTextureLoadedCounter[getTextureCounterIndex(mTextureMemory / mComponents)]-- ; - sTextureMemByCategory[mCategory] -= mTextureMemory ; -} + void LLImageGL::setCurTexSizebar(S32 index, BOOL set_pick_size) { sCurTexSizeBar = index ; diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 6cb9dd314..eb9f63fc5 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -59,7 +59,8 @@ public: static S32 dataFormatBytes(S32 dataformat, S32 width, S32 height); static S32 dataFormatComponents(S32 dataformat); - BOOL updateBindStats(void) const; + BOOL updateBindStats(S32 tex_mem) const ; + F32 getTimePassedSinceLastBound(); void forceUpdateBindStats(void) const; // needs to be called every frame @@ -71,8 +72,7 @@ public: static void dirtyTexOptions(); // Sometimes called externally for textures not using LLImageGL (should go away...) - static S32 updateBoundTexMemStatic(const S32 delta, const S32 size, S32 category) ; - S32 updateBoundTexMem()const; + static S32 updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 category) ; static bool checkSize(S32 width, S32 height); @@ -95,11 +95,9 @@ protected: public: virtual void dump(); // debugging info to llinfos - virtual bool bindError(const S32 stage = 0) const; - virtual bool bindDefaultImage(const S32 stage = 0) ; - virtual void forceImmediateUpdate() ; - + void setSize(S32 width, S32 height, S32 ncomponents); + void setComponents(S32 ncomponents) { mComponents = (S8)ncomponents ;} // These 3 functions currently wrap glGenTextures(), glDeleteTextures(), and glTexImage2D() // for tracking purposes and will be deprecated in the future @@ -122,7 +120,6 @@ public: void destroyGLTexture(); void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE); - void dontDiscard() { mDontDiscard = 1; mTextureState = NO_DELETE; } void setComponents(S8 ncomponents) { mComponents = ncomponents; } S32 getDiscardLevel() const { return mCurrentDiscardLevel; } @@ -154,14 +151,12 @@ public: void setGLTextureCreated (bool initialized) { mGLTextureCreated = initialized; } BOOL getUseMipMaps() const { return mUseMipMaps; } - void setUseMipMaps(BOOL usemips) { mUseMipMaps = usemips; } - BOOL getUseDiscard() const { return mUseMipMaps && !mDontDiscard; } - BOOL getDontDiscard() const { return mDontDiscard; } + void setUseMipMaps(BOOL usemips) { mUseMipMaps = usemips; } void updatePickMask(S32 width, S32 height, const U8* data_in); BOOL getMask(const LLVector2 &tc); - void checkTexSize() const ; + void checkTexSize(bool forced = false) const ; // Sets the addressing mode used to sample the texture // (such as wrapping, mirrored wrapping, and clamp) @@ -175,17 +170,7 @@ public: void setFilteringOption(LLTexUnit::eTextureFilterOptions option); LLTexUnit::eTextureFilterOptions getFilteringOption(void) const { return mFilterOption; } - BOOL isDeleted() ; - BOOL isInactive() ; - BOOL isDeletionCandidate(); - void setDeletionCandidate() ; - void setInactive() ; - void setActive() ; - void forceActive() ; - void setNoDelete() ; - - void setTextureSize(S32 size) {mTextureMemory = size;} -protected: + LLGLenum getTexTarget()const { return mTarget ;} void init(BOOL usemipmaps); virtual void cleanup(); // Clean up the LLImageGL so it can be reinitialized. Be careful when using this in derived class destructors @@ -224,8 +209,7 @@ protected: S8 mComponents; S8 mMaxDiscardLevel; - S8 mDontDiscard; // Keep full res version of this image (for UI, etc) - + bool mTexOptionsDirty; LLTexUnit::eTextureAddressMode mAddressMode; // Defaults to TAM_WRAP LLTexUnit::eTextureFilterOptions mFilterOption; // Defaults to TFO_TRILINEAR @@ -235,17 +219,6 @@ protected: LLGLenum mFormatPrimary; // = GL format (pixel data format) LLGLenum mFormatType; BOOL mFormatSwapBytes;// if true, use glPixelStorei(GL_UNPACK_SWAP_BYTES, 1) - -protected: - typedef enum - { - DELETED = 0, //removed from memory - DELETION_CANDIDATE, //ready to be removed from memory - INACTIVE, //not be used for the last certain period (i.e., 30 seconds). - ACTIVE, //just being used, can become inactive if not being used for a certain time (10 seconds). - NO_DELETE = 99 //stay in memory, can not be removed. - } LLGLTexureState; - LLGLTexureState mTextureState ; // STATICS public: @@ -263,6 +236,8 @@ public: static U32 sBindCount; // Tracks number of texture binds for current frame static U32 sUniqueCount; // Tracks number of unique texture binds for current frame static BOOL sGlobalUseAnisotropic; + static LLImageGL* sDefaultGLTexture ; + #if DEBUG_MISS BOOL mMissed; // Missed on last bind? BOOL getMissed() const { return mMissed; }; @@ -300,13 +275,10 @@ public: static void setHighlightTexture(S32 category) ; static S32 getTextureCounterIndex(U32 val) ; - static void incTextureCounterStatic(U32 val, S32 ncomponents, S32 category) ; - static void decTextureCounterStatic(U32 val, S32 ncomponents, S32 category) ; + static void incTextureCounter(U32 val, S32 ncomponents, S32 category) ; + static void decTextureCounter(U32 val, S32 ncomponents, S32 category) ; static void setCurTexSizebar(S32 index, BOOL set_pick_size = TRUE) ; static void resetCurTexSizebar(); - - void incTextureCounter() ; - void decTextureCounter() ; //---------------------------------------- //for debug use: show texture category distribution diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 1d5078a76..5bc77f437 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -38,6 +38,7 @@ #include "llcubemap.h" #include "llimagegl.h" #include "llrendertarget.h" +#include "lltexture.h" LLRender gGL; @@ -179,50 +180,86 @@ void LLTexUnit::disable(void) } } -bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind) +bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind) { stop_glerror(); if (mIndex < 0) return false; gGL.flush(); - if (texture == NULL) + LLImageGL* gl_tex = NULL ; + if (texture == NULL || !(gl_tex = texture->getGLTexture())) { llwarns << "NULL LLTexUnit::bind texture" << llendl; return false; } - - if (!texture->getTexName()) //if texture does not exist - { - if (texture->isDeleted()) - { - // This will re-generate the texture immediately. - texture->forceImmediateUpdate() ; - } - texture->forceUpdateBindStats() ; + if (!gl_tex->getTexName()) //if texture does not exist + { + //if deleted, will re-generate it immediately + texture->forceImmediateUpdate() ; + + gl_tex->forceUpdateBindStats() ; return texture->bindDefaultImage(mIndex); } + //in audit, replace the selected texture by the default one. if(gAuditTexture && for_rendering && LLImageGL::sCurTexPickSize > 0) { if(texture->getWidth() * texture->getHeight() == LLImageGL::sCurTexPickSize) { - texture->updateBindStats(); + gl_tex->updateBindStats(gl_tex->mTextureMemory); return bind(LLImageGL::sHighlightTexturep.get()); } } + if ((mCurrTexture != gl_tex->getTexName()) || forceBind) + { + activate(); + enable(gl_tex->getTarget()); + mCurrTexture = gl_tex->getTexName(); + glBindTexture(sGLTextureType[gl_tex->getTarget()], mCurrTexture); + if(gl_tex->updateBindStats(gl_tex->mTextureMemory)) + { + texture->setActive() ; + texture->updateBindStatsForTester() ; + } + mHasMipMaps = gl_tex->mHasMipMaps; + if (gl_tex->mTexOptionsDirty) + { + gl_tex->mTexOptionsDirty = false; + setTextureAddressMode(gl_tex->mAddressMode); + setTextureFilteringOption(gl_tex->mFilterOption); + } + } + return true; +} +bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind) +{ + stop_glerror(); + if (mIndex < 0) return false; + + if(!texture) + { + llwarns << "NULL LLTexUnit::bind texture" << llendl; + return false; + } + + if(!texture->getTexName()) + { + if(LLImageGL::sDefaultGLTexture && LLImageGL::sDefaultGLTexture->getTexName()) + { + return bind(LLImageGL::sDefaultGLTexture) ; + } + return false ; + } if ((mCurrTexture != texture->getTexName()) || forceBind) { activate(); enable(texture->getTarget()); mCurrTexture = texture->getTexName(); glBindTexture(sGLTextureType[texture->getTarget()], mCurrTexture); - if(texture->updateBindStats()) - { - texture->setActive() ; - } + texture->updateBindStats(texture->mTextureMemory); mHasMipMaps = texture->mHasMipMaps; if (texture->mTexOptionsDirty) { @@ -255,7 +292,7 @@ bool LLTexUnit::bind(LLCubeMap* cubeMap) mCurrTexture = cubeMap->mImages[0]->getTexName(); glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mCurrTexture); mHasMipMaps = cubeMap->mImages[0]->mHasMipMaps; - cubeMap->mImages[0]->updateBindStats(); + cubeMap->mImages[0]->updateBindStats(cubeMap->mImages[0]->mTextureMemory); if (cubeMap->mImages[0]->mTexOptionsDirty) { cubeMap->mImages[0]->mTexOptionsDirty = false; diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 0faaac441..ab0935bbe 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -51,6 +51,7 @@ class LLVertexBuffer; class LLCubeMap; class LLImageGL; class LLRenderTarget; +class LLTexture ; class LLTexUnit { @@ -149,6 +150,7 @@ public: // Binds the LLImageGL to this texture unit // (automatically enables the unit for the LLImageGL's texture type) bool bind(LLImageGL* texture, bool for_rendering = false, bool forceBind = false); + bool bind(LLTexture* texture, bool for_rendering = false, bool forceBind = false); // Binds a cubemap to this texture unit // (automatically enables the texture unit for cubemaps) diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index d9f4f3430..106b93a21 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -399,7 +399,13 @@ void LLRenderTarget::flush(BOOL fetch_depth) check_framebuffer_status(); stop_glerror(); - glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); + if(gGLManager.mIsATI) + { + glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); + glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_STENCIL_BUFFER_BIT, GL_NEAREST); + } + else + glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); stop_glerror(); if (mTex.size() > 1) @@ -465,7 +471,13 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, stop_glerror(); check_framebuffer_status(); stop_glerror(); - glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + if(gGLManager.mIsATI && mask & GL_STENCIL_BUFFER_BIT) + { + mask &= ~GL_STENCIL_BUFFER_BIT; + glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, GL_STENCIL_BUFFER_BIT, filter); + } + if(mask) + glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); stop_glerror(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); stop_glerror(); @@ -482,13 +494,19 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0 llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl; } { - glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, source.mFBO); + glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, source.mSampleBuffer ? source.mSampleBuffer->mFBO : source.mFBO); stop_glerror(); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0); stop_glerror(); check_framebuffer_status(); stop_glerror(); - glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + if(gGLManager.mIsATI && mask & GL_STENCIL_BUFFER_BIT) + { + mask &= ~GL_STENCIL_BUFFER_BIT; + glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, GL_STENCIL_BUFFER_BIT, filter); + } + if(mask) + glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); stop_glerror(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); stop_glerror(); diff --git a/indra/llrender/lltexture.cpp b/indra/llrender/lltexture.cpp new file mode 100644 index 000000000..5098cdb3a --- /dev/null +++ b/indra/llrender/lltexture.cpp @@ -0,0 +1,38 @@ +/** + * @file lltexture.cpp + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + */ +#include "linden_common.h" +#include "lltexture.h" + +//virtual +LLTexture::~LLTexture() +{ +} diff --git a/indra/llrender/lltexture.h b/indra/llrender/lltexture.h new file mode 100644 index 000000000..8745b5059 --- /dev/null +++ b/indra/llrender/lltexture.h @@ -0,0 +1,80 @@ +/** + * @file lltexture.h + * @brief LLTexture definition + * + * This class acts as a wrapper for OpenGL calls. + * The goal of this class is to minimize the number of api calls due to legacy rendering + * code, to define an interface for a multiple rendering API abstraction of the UI + * rendering, and to abstract out direct rendering calls in a way that is cleaner and easier to maintain. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + */ + +#ifndef LL_TEXTURE_H +#define LL_TEXTURE_H + +#include "llmemory.h" +class LLImageGL ; +class LLTexUnit ; +class LLFontGL ; + +// +//this is an abstract class as the parent for the class LLViewerTexture +//through the following virtual functions, the class LLViewerTexture can be reached from /llrender. +// +class LLTexture : public LLRefCount +{ + friend class LLTexUnit ; + friend class LLFontGL ; + +protected: + virtual ~LLTexture(); + +public: + LLTexture(){} + + // + //interfaces to access LLViewerTexture + // + virtual S8 getType() const = 0 ; + virtual void setKnownDrawSize(S32 width, S32 height) = 0 ; + virtual bool bindDefaultImage(const S32 stage = 0) = 0 ; + virtual void forceImmediateUpdate() = 0 ; + virtual void setActive() = 0 ; + virtual S32 getWidth(S32 discard_level = -1) const = 0 ; + virtual S32 getHeight(S32 discard_level = -1) const = 0 ; + +private: + //note: do not make this function public. + virtual LLImageGL* getGLTexture() const = 0 ; + + virtual void updateBindStatsForTester() = 0 ; +}; +#endif + diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 8d927ada5..8108eeee8 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -70,6 +70,22 @@ BOOL LLVertexBuffer::sOmitBlank = FALSE; std::vector LLVertexBuffer::sDeleteList; + +GLuint LLVBOPool::allocateName() +{ + GLuint name; + glGenBuffersARB(1, &name); + LLVertexBuffer::sGLCount++; + return name; +} + +void LLVBOPool::releaseName(GLuint name) +{ + glDeleteBuffersARB(1, &name); + LLVertexBuffer::sGLCount--; +} + + S32 LLVertexBuffer::sTypeOffsets[LLVertexBuffer::TYPE_MAX] = { sizeof(LLVector3), // TYPE_VERTEX, @@ -342,6 +358,7 @@ void LLVertexBuffer::clientCopy(F64 max_time) if (!sDeleteList.empty()) { glDeleteBuffersARB(sDeleteList.size(), (GLuint*) &(sDeleteList[0])); + sGLCount -= sDeleteList.size(); sDeleteList.clear(); } } @@ -432,8 +449,8 @@ void LLVertexBuffer::genBuffer() { BOOST_STATIC_ASSERT(sizeof(mGLBuffer) == sizeof(GLuint)); glGenBuffersARB(1, (GLuint*)&mGLBuffer); + sGLCount++; } - sGLCount++; } void LLVertexBuffer::genIndices() @@ -450,8 +467,8 @@ void LLVertexBuffer::genIndices() { BOOST_STATIC_ASSERT(sizeof(mGLBuffer) == sizeof(GLuint)); glGenBuffersARB(1, (GLuint*)&mGLIndices); + sGLCount++; } - sGLCount++; } void LLVertexBuffer::releaseBuffer() @@ -468,7 +485,6 @@ void LLVertexBuffer::releaseBuffer() { sDeleteList.push_back(mGLBuffer); } - sGLCount--; } void LLVertexBuffer::releaseIndices() @@ -485,7 +501,6 @@ void LLVertexBuffer::releaseIndices() { sDeleteList.push_back(mGLIndices); } - sGLCount--; } void LLVertexBuffer::createGLBuffer() @@ -1299,7 +1314,31 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const if ((data_mask & mTypeMask) != data_mask) { - llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl; + llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask. Missing: "; + + static const char* mask_names[] = {"VERTEX","NORMAL","TEXCOORD0","TEXCOORD1","TEXCOORD2","TEXCOORD3","COLOR","BINORMAL","WEIGHT","CLOTH_WEIGHT"}; + for(int i = 0; i < 32; ++i) + { + if((data_mask & (1<setCommitOnKeyboardMovement(FALSE); addChild(mList); - mArrowImage = LLUI::sImageProvider->getUIImage("combobox_arrow.tga"); + mArrowImage = LLUI::getUIImage("combobox_arrow.tga"); mButton->setImageOverlay("combobox_arrow.tga", LLFontGL::RIGHT); updateLayout(); @@ -248,6 +248,8 @@ void LLComboBox::onCommit() mTextEntry->setValue(getSimple()); mTextEntry->setTentative(FALSE); } + + setControlValue(getValue()); LLUICtrl::onCommit(); } diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp index 0df960e88..9b0f1d038 100644 --- a/indra/llui/lliconctrl.cpp +++ b/indra/llui/lliconctrl.cpp @@ -89,7 +89,7 @@ void LLIconCtrl::setImage(const std::string& image_name) else { mImageName = image_name; - mImagep = LLUI::sImageProvider->getUIImage(image_name); + mImagep = LLUI::getUIImage(image_name); mImageID.setNull(); } } @@ -97,7 +97,7 @@ void LLIconCtrl::setImage(const std::string& image_name) void LLIconCtrl::setImage(const LLUUID& image_id) { mImageName.clear(); - mImagep = LLUI::sImageProvider->getUIImageByID(image_id); + mImagep = LLUI::getUIImageByID(image_id); mImageID = image_id; } diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 980d705af..fe4190a2b 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -55,6 +55,7 @@ #include "llui.h" #include "lluictrlfactory.h" #include "llclipboard.h" +#include "../newview/lgghunspell_wrapper.h" // // Imported globals @@ -118,6 +119,7 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect, mLastSelectionY(-1), mLastSelectionStart(-1), mLastSelectionEnd(-1), + mLastContextMenuX(-1), mPrevalidateFunc( prevalidate_func ), mCursorColor( LLUI::sColorsGroup->getColor( "TextCursorColor" ) ), mFgColor( LLUI::sColorsGroup->getColor( "TextFgColor" ) ), @@ -137,7 +139,8 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect, mReadOnly(FALSE), mHaveHistory(FALSE), mImage( sImage ), - mReplaceNewlinesWithSpaces( TRUE ) + mReplaceNewlinesWithSpaces( TRUE ), + mSpellCheckable( FALSE ) { llassert( max_length_bytes > 0 ); @@ -187,10 +190,7 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect, menu->append(new LLMenuItemCallGL("Paste", context_paste, NULL, this)); menu->append(new LLMenuItemCallGL("Delete", context_delete, NULL, this)); menu->append(new LLMenuItemCallGL("Select All", context_selectall, NULL, this)); - menu->appendSeparator("Transep"); - LLMenuGL* translatemenu = new LLMenuGL("Translate To"); - translatemenu->setCanTearOff(FALSE); - + menu->appendSeparator("Spelsep"); //menu->setBackgroundColor(gColors.getColor("MenuPopupBgColor")); menu->setCanTearOff(FALSE); menu->setVisible(FALSE); @@ -454,6 +454,89 @@ void LLLineEditor::context_copy(void* data) if(line)line->copy(); } + +void LLLineEditor::spell_correct(void* data) +{ + SpellMenuBind* tempBind = (SpellMenuBind*)data; + LLLineEditor* line = tempBind->origin; + if(tempBind && line) + { + llinfos << ((LLMenuItemCallGL *)(tempBind->menuItem))->getName() << " : " << tempBind->origin->getName() << " : " << tempBind->word << llendl; + if(line)line->spellReplace(tempBind); + } +} + + +void LLLineEditor::spell_show(void * data) +{ + SpellMenuBind* tempBind = (SpellMenuBind*)data; + LLLineEditor* line = tempBind->origin; + + if (tempBind && line) + { + BOOL show = (tempBind->word == "Show Misspellings"); + glggHunSpell->setSpellCheckHighlight(show); + } +} + +std::vector LLLineEditor::getMisspelledWordsPositions() +{ + std::vector thePosesOfBadWords; + const LLWString& text = mText.getWString(); + + //llinfos << "end of box is at " << cursorloc << " and end of text is at " << text.length() << llendl; + S32 wordStart=0; + S32 wordEnd=mStartSpellHere; + while(wordEnd < mEndSpellHere) + { + //go through all the chars... XD + if( LLTextEditor::isPartOfWord( text[wordEnd] ) ) + + { + // Select word the cursor is over + while ((wordEnd > 0) && LLTextEditor::isPartOfWord(text[wordEnd-1])) + { + wordEnd--; + } + wordStart=wordEnd; + while ((wordEnd < (S32)text.length()) && LLTextEditor::isPartOfWord( text[wordEnd] ) ) + { + wordEnd++; + } + //got a word :D + std::string selectedWord(std::string(text.begin(), + text.end()).substr(wordStart,wordEnd-wordStart)); + + if(!glggHunSpell->isSpelledRight(selectedWord)) + { + //misspelled word here, and you have just right clicked on it! + //get the center of this word.. + //S32 center = llround( (wordEnd-wordStart)/2 ) + wordStart; + //turn this cursor position into a pixel pos + //center = findPixelNearestPos(center-getCursor()); + + thePosesOfBadWords.push_back( + wordStart); + thePosesOfBadWords.push_back(wordEnd); + } + } + wordEnd++; + } + return thePosesOfBadWords; +} + + +void LLLineEditor::spell_add(void* data) +{ + SpellMenuBind* tempBind = (SpellMenuBind*)data; + if(tempBind) + { + glggHunSpell->addWordToCustomDictionary(tempBind->word); + tempBind->origin->mPrevSpelledText="";//make it update + } +} + + void LLLineEditor::context_paste(void* data) { LLLineEditor* line = (LLLineEditor*)data; @@ -568,6 +651,10 @@ BOOL LLLineEditor::handleRightMouseDown( S32 x, S32 y, MASK mask ) setFocus(TRUE); //setCursorAtLocalPos( x); + S32 wordStart = 0; + S32 wordLen = 0; + S32 pos = calculateCursorFromMouse(x); + LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get(); if (menu) { @@ -575,7 +662,81 @@ BOOL LLLineEditor::handleRightMouseDown( S32 x, S32 y, MASK mask ) { menu->setVisible(FALSE); } + for (int i = 0;i<(int)suggestionMenuItems.size();i++) + { + SpellMenuBind * tempBind = suggestionMenuItems[i]; + if(tempBind) + { + menu->remove((LLMenuItemCallGL *)tempBind->menuItem); + ((LLMenuItemCallGL *)tempBind->menuItem)->die(); + //delete tempBind->menuItem; + //tempBind->menuItem = NULL; + delete tempBind; + } + } + suggestionMenuItems.clear(); + // spell_check="true" in xui + menu->setItemVisible("Spelsep", !mReadOnly && mSpellCheckable); + if (!mReadOnly && mSpellCheckable) + { + // search for word matches + bool is_word_part = getWordBoundriesAt(pos, &wordStart, &wordLen); + if (is_word_part) + { + const LLWString& text = mText.getWString(); + std::string selectedWord(std::string(text.begin(), text.end()).substr(wordStart,wordLen)); + + if (!glggHunSpell->isSpelledRight(selectedWord)) + { + //misspelled word here, and you have just right clicked on it! + std::vector suggs = glggHunSpell->getSuggestionList(selectedWord); + + for (int i = 0; i<(int)suggs.size() ;i++) + { + SpellMenuBind * tempStruct = new SpellMenuBind; + tempStruct->origin = this; + tempStruct->word = suggs[i]; + tempStruct->wordPositionEnd = wordStart + wordLen; + tempStruct->wordPositionStart=wordStart; + LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL( + tempStruct->word, spell_correct, NULL, tempStruct); + //new LLMenuItemCallGL("Select All", context_selectall, NULL, this)); + tempStruct->menuItem = suggMenuItem; + suggestionMenuItems.push_back(tempStruct); + menu->append(suggMenuItem); + } + SpellMenuBind * tempStruct = new SpellMenuBind; + tempStruct->origin = this; + tempStruct->word = selectedWord; + tempStruct->wordPositionEnd = wordStart + wordLen; + tempStruct->wordPositionStart=wordStart; + LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL( + "Add Word", spell_add, NULL, tempStruct); + tempStruct->menuItem = suggMenuItem; + suggestionMenuItems.push_back(tempStruct); + menu->append(suggMenuItem); + } + } + + SpellMenuBind * tempStruct = new SpellMenuBind; + tempStruct->origin = this; + if (glggHunSpell->getSpellCheckHighlight()) + { + tempStruct->word = "Hide Misspellings"; + } + else + { + tempStruct->word = "Show Misspellings"; + } + LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL( + tempStruct->word, spell_show, NULL, tempStruct); + tempStruct->menuItem = suggMenuItem; + suggestionMenuItems.push_back(tempStruct); + menu->append(suggMenuItem); + } + + mLastContextMenuX = x; menu->buildDrawLabels(); menu->updateParent(LLMenuGL::sMenuContainer); LLMenuGL::showPopup(this, menu, x, y); @@ -892,6 +1053,26 @@ S32 LLLineEditor::nextWordPos(S32 cursorPos) const return cursorPos; } +BOOL LLLineEditor::getWordBoundriesAt(const S32 at, S32* word_begin, S32* word_length) const +{ + const LLWString& wtext = mText.getWString(); + S32 pos = at; + if (LLTextEditor::isPartOfWord(wtext[pos])) + { + while ( (pos > 0) && LLTextEditor::isPartOfWord(wtext[pos - 1]) ) + { + pos--; + } + *word_begin = pos; + while ( (pos < (S32)wtext.length()) && LLTextEditor::isPartOfWord(wtext[pos]) ) + { + pos++; + } + *word_length = pos - *word_begin; + return TRUE; + } + return FALSE; +} BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask) { @@ -1046,6 +1227,16 @@ void LLLineEditor::copy() } } + +void LLLineEditor::spellReplace(SpellMenuBind* spellData) +{ + mText.erase(spellData->wordPositionStart, + spellData->wordPositionEnd - spellData->wordPositionStart); + insert(spellData->word,spellData->wordPositionStart); + mCursorPos+=spellData->word.length() - (spellData->wordPositionEnd-spellData->wordPositionStart); +} + + void LLLineEditor::insert(std::string what, S32 wher) { LLLineEditorRollback rollback(this); @@ -1063,6 +1254,7 @@ void LLLineEditor::insert(std::string what, S32 wher) else if( mKeystrokeCallback ) mKeystrokeCallback( this, mCallbackUserData ); } + BOOL LLLineEditor::canPaste() const { return !mReadOnly && gClipboard.canPasteString(); @@ -1588,6 +1780,57 @@ void LLLineEditor::doDelete() } +void LLLineEditor::drawMisspelled(LLRect background) +{ + if (!mReadOnly && mSpellCheckable) + { + S32 newStartSpellHere =mScrollHPos; + S32 cursorloc =calculateCursorFromMouse(mMaxHPixels); + S32 newStopSpellHere = ( ((S32)mText.length())>cursorloc)?cursorloc:(S32)mText.length(); + + F32 elapsed = mSpellTimer.getElapsedTimeF32(); + if(S32(elapsed / 1) & 1) + { + if(isSpellDirty()||(newStartSpellHere!=mStartSpellHere)||(newStopSpellHere!=mEndSpellHere)) + { + mStartSpellHere=newStartSpellHere; + mEndSpellHere= newStopSpellHere; + resetSpellDirty(); + misspellLocations=getMisspelledWordsPositions(); + } + } + + if (glggHunSpell->getSpellCheckHighlight()) + { + for (int i =0; i<(int)misspellLocations.size(); i++) + { + S32 wstart =findPixelNearestPos( misspellLocations[i]-getCursor()); + S32 wend = findPixelNearestPos(misspellLocations[++i]-getCursor()); + S32 maxw = getRect().getWidth(); + + if (wend > maxw) + { + wend = maxw; + } + if (wstart > maxw) + { + wstart = maxw; + } + gGL.color4ub(255,0,0,200); + //3 line zig zags.. + while (wstart < wend) + { + gl_line_2d(wstart, background.mBottom-1, wstart+3, background.mBottom+2); + gl_line_2d(wstart+3, background.mBottom+2, wstart+6, background.mBottom-1); + wstart+=6; + } + } + } + } + +} + + void LLLineEditor::draw() { S32 text_len = mText.length(); @@ -1776,6 +2019,9 @@ void LLLineEditor::draw() mBorder->setVisible(FALSE); // no more programmatic art. #endif + drawMisspelled(background); + resetSpellDirty(); + // If we're editing... if( gFocusMgr.getKeyboardFocus() == this) { @@ -2455,6 +2701,11 @@ LLView* LLLineEditor::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory { line_editor->setCommitOnFocusLost(commit_on_focus_lost); } + BOOL spell_checking = FALSE; + if (node->getAttributeBOOL("spell_check", spell_checking)) + { + line_editor->setSpellCheckable(spell_checking); + } line_editor->setColorParameters(node); diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 1d9f7e9d4..2272c450b 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -96,6 +96,16 @@ public: /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char); /*virtual*/ void onMouseCaptureLost(); + struct SpellMenuBind + { + LLLineEditor* origin; + void * menuItem; + std::string word; + S32 wordPositionStart; + S32 wordPositionEnd; + }; + + virtual void spellReplace(SpellMenuBind* spellData); virtual void insert(std::string what,S32 wher); // LLEditMenuHandler overrides @@ -127,8 +137,14 @@ public: static void context_paste(void* data); static void context_delete(void* data); static void context_selectall(void* data); + static void spell_correct(void* data); + static void spell_show(void* data); + static void spell_add(void* data); + + std::vector getMisspelledWordsPositions(); // view overrides virtual void draw(); + void drawMisspelled(LLRect background); virtual void reshape(S32 width,S32 height,BOOL called_from_parent=TRUE); virtual void onFocusReceived(); virtual void onFocusLost(); @@ -143,6 +159,8 @@ public: virtual void onCommit(); virtual BOOL isDirty() const { return mText.getString() != mPrevText; } // Returns TRUE if user changed value at all virtual void resetDirty() { mPrevText = mText.getString(); } // Clear dirty state + virtual BOOL isSpellDirty() const { return mText.getString() != mPrevSpelledText; } // Returns TRUE if user changed value at all + virtual void resetSpellDirty() { mPrevSpelledText = mText.getString(); } // Clear dirty state // assumes UTF8 text virtual void setValue(const LLSD& value ) { setText(value.asString()); } @@ -178,6 +196,7 @@ public: void setWriteableBgColor( const LLColor4& c ) { mWriteableBgColor = c; } void setReadOnlyBgColor( const LLColor4& c ) { mReadOnlyBgColor = c; } void setFocusBgColor(const LLColor4& c) { mFocusBgColor = c; } + void setSpellCheckable(BOOL b) { mSpellCheckable = b; } const LLColor4& getFgColor() const { return mFgColor; } const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor; } @@ -194,6 +213,7 @@ public: // get the cursor position of the beginning/end of the prev/next word in the text S32 prevWordPos(S32 cursorPos) const; S32 nextWordPos(S32 cursorPos) const; + BOOL getWordBoundriesAt(const S32 at, S32* word_begin, S32* word_length) const; BOOL hasSelection() const { return (mSelectionStart != mSelectionEnd); } void startSelection(); @@ -268,6 +288,14 @@ protected: LLUIString mText; // The string being edited. std::string mPrevText; // Saved string for 'ESC' revert LLUIString mLabel; // text label that is visible when no user text provided + std::string mPrevSpelledText; // saved string so we know whether to respell or not + std::vector misspellLocations; // where all the misspelled words are + S32 mStartSpellHere; // the position of the first char on the screen, stored so we know when to update + S32 mEndSpellHere; // the location of the last char on the screen + BOOL mSpellCheckable; // set in xui as "spell_check". Default value for a field + LLFrameTimer mSpellTimer; + std::vector suggestionMenuItems; + S32 mLastContextMenuX; // line history support: BOOL mHaveHistory; // flag for enabled line history diff --git a/indra/llui/llmemberlistener.h b/indra/llui/llmemberlistener.h old mode 100755 new mode 100644 diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index f14b9a8ad..cfa10734e 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -2525,6 +2525,11 @@ BOOL LLMenuGL::handleJumpKey(KEY key) // Add the menu item to this menu. BOOL LLMenuGL::append( LLMenuItemGL* item ) { + if (mSpilloverMenu) + { + return mSpilloverMenu->append(item); + } + mItems.push_back( item ); addChild( item ); arrange(); @@ -2572,6 +2577,31 @@ BOOL LLMenuGL::appendMenu( LLMenuGL* menu ) return success; } +// Remove a menu item from this menu. +BOOL LLMenuGL::remove( LLMenuItemGL* item ) +{ + if (mSpilloverMenu) + { + cleanupSpilloverBranch(); + } + + item_list_t::iterator found_iter = std::find(mItems.begin(), mItems.end(), item); + if (found_iter != mItems.end()) + { + mItems.erase(found_iter); + } + + removeChild( item ); + + // We keep it around in case someone is pointing at it. + // The caller can delete it if it's safe. + // Note that getMenu() will still not work since its parent isn't a menu. + sMenuContainer->addChild( item ); + + arrange(); + return TRUE; +} + void LLMenuGL::setEnabledSubMenus(BOOL enable) { setEnabled(enable); @@ -2829,6 +2859,11 @@ void LLMenuGL::updateParent(LLView* parentp) { (*item_iter)->updateBranchParent(parentp); } + + if (mSpilloverMenu) + { + mSpilloverMenu->updateParent(parentp); + } } BOOL LLMenuGL::handleAcceleratorKey(KEY key, MASK mask) diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 26fc2944c..63f9d555d 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -442,6 +442,9 @@ public: // Add the menu item to this menu. virtual BOOL append( LLMenuItemGL* item ); + // Remove a menu item from this menu. + virtual BOOL remove( LLMenuItemGL* item ); + // *NOTE:Mani - appendNoArrange() should be removed when merging to skinning/viewer2.0 // Its added as a fix to a viewer 1.23 bug that has already been address by skinning work. virtual BOOL appendNoArrange( LLMenuItemGL* item ); diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index a0da4e272..06903d742 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -439,7 +439,7 @@ void LLMultiSlider::draw() F32 opacity = getEnabled() ? 1.f : 0.3f; // Track - LLUIImagePtr thumb_imagep = LLUI::sImageProvider->getUIImage("rounded_square.tga"); + LLUIImagePtr thumb_imagep = LLUI::getUIImage("rounded_square.tga"); S32 height_offset = (getRect().getHeight() - MULTI_TRACK_HEIGHT) / 2; LLRect track_rect(0, getRect().getHeight() - height_offset, getRect().getWidth(), height_offset ); diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 7748df84f..6bd4e4f22 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1194,13 +1194,13 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements) if (found != replacements.end()) { replacement = found->second; - //llwarns << "replaceSubstituionStrings: value: " << value << " repl: " << replacement << llendl; + //llinfos << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << llendl; it->second->setValue(replacement); } else { - llwarns << "replaceSubstituionStrings FAILURE: value: " << value << " repl: " << replacement << llendl; + llwarns << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << llendl; } } } diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp index d14873399..dcecfd323 100644 --- a/indra/llui/llprogressbar.cpp +++ b/indra/llui/llprogressbar.cpp @@ -98,12 +98,12 @@ void LLProgressBar::setPercent(const F32 percent) void LLProgressBar::setImageBar( const std::string &bar_name ) { - mImageBar = LLUI::sImageProvider->getUIImage(bar_name)->getImage(); + mImageBar = LLUI::getUIImage(bar_name)->getImage(); } void LLProgressBar::setImageShadow(const std::string &shadow_name) { - mImageShadow = LLUI::sImageProvider->getUIImage(shadow_name)->getImage(); + mImageShadow = LLUI::getUIImage(shadow_name)->getImage(); } void LLProgressBar::setColorBar(const LLColor4 &c) diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h index 5e02c3bd5..2c0e2bac4 100644 --- a/indra/llui/llprogressbar.h +++ b/indra/llui/llprogressbar.h @@ -61,13 +61,13 @@ public: protected: F32 mPercentDone; - LLPointer mImageBar; + LLPointer mImageBar; //LLUUID mImageBarID; //LLString mImageBarName; LLColor4 mColorBar; LLColor4 mColorBar2; - LLPointer mImageShadow; + LLPointer mImageShadow; //LLUUID mImageShadowID; //LLString mImageShadowName; LLColor4 mColorShadow; diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp index c5d57d8d6..64eb52b54 100644 --- a/indra/llui/llresizehandle.cpp +++ b/indra/llui/llresizehandle.cpp @@ -60,7 +60,7 @@ LLResizeHandle::LLResizeHandle( const std::string& name, const LLRect& rect, S32 if( RIGHT_BOTTOM == mCorner) { - mImage = LLUI::sImageProvider->getUIImage("UIImgResizeBottomRightUUID"); + mImage = LLUI::getUIImage("UIImgResizeBottomRightUUID"); } switch( mCorner ) diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index 65086d833..c578f9d1e 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -509,7 +509,7 @@ void LLScrollbar::draw() // Draw background and thumb. - LLUIImage* rounded_rect_imagep = LLUI::sImageProvider->getUIImage("rounded_square.tga"); + LLUIImage* rounded_rect_imagep = LLUI::getUIImage("rounded_square.tga"); if (!rounded_rect_imagep) { diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 9f2ee055b..fd4867b13 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -132,7 +132,7 @@ void LLScrollListIcon::setValue(const LLSD& value) { // don't use default image specified by LLUUID::null, use no image in that case LLUUID image_id = value.asUUID(); - mIcon = image_id.notNull() ? LLUI::sImageProvider->getUIImageByID(image_id) : LLUIImagePtr(NULL); + mIcon = image_id.notNull() ? LLUI::getUIImageByID(image_id) : LLUIImagePtr(NULL); } else { @@ -325,7 +325,7 @@ LLScrollListText::LLScrollListText( const std::string& text, const LLFontGL* fon // initialize rounded rect image if (!mRoundedRectImage) { - mRoundedRectImage = LLUI::sImageProvider->getUIImage("rounded_square.tga"); + mRoundedRectImage = LLUI::getUIImage("rounded_square.tga"); } } //virtual diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp index 7b4da9b46..28b30cccb 100644 --- a/indra/llui/llslider.cpp +++ b/indra/llui/llslider.cpp @@ -73,9 +73,9 @@ LLSlider::LLSlider( mMouseDownCallback( NULL ), mMouseUpCallback( NULL ) { - mThumbImage = LLUI::sImageProvider->getUIImage("icn_slide-thumb_dark.tga"); - mTrackImage = LLUI::sImageProvider->getUIImage("icn_slide-groove_dark.tga"); - mTrackHighlightImage = LLUI::sImageProvider->getUIImage("icn_slide-highlight.tga"); + mThumbImage = LLUI::getUIImage("icn_slide-thumb_dark.tga"); + mTrackImage = LLUI::getUIImage("icn_slide-groove_dark.tga"); + mTrackHighlightImage = LLUI::getUIImage("icn_slide-highlight.tga"); // properly handle setting the starting thumb rect // do it this way to handle both the operating-on-settings diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h index 154685fac..253b72803 100644 --- a/indra/llui/llslider.h +++ b/indra/llui/llslider.h @@ -36,7 +36,6 @@ #include "lluictrl.h" #include "v4color.h" -class LLImageGL; class LLSlider : public LLUICtrl { diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index a716cbbae..90e538807 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -36,7 +36,7 @@ #include "llstring.h" #include "llui.h" -//#include "llviewerimagelist.h" +//#include "llviewertexturelist.h" LLStyle::LLStyle() { @@ -166,7 +166,7 @@ LLUIImagePtr LLStyle::getImage() const void LLStyle::setImage(const LLUUID& src) { - mImagep = LLUI::sImageProvider->getUIImageByID(src); + mImagep = LLUI::getUIImageByID(src); } diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 2ea3423b0..3326524cb 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -58,14 +58,15 @@ #include "llimagegl.h" #include "llwindow.h" #include "lltextparser.h" +#include "lldir.h" #include #include "llmenugl.h" +#include "../newview/lgghunspell_wrapper.h" // // Globals // static LLRegisterWidget r("simple_text_editor"); - BOOL gDebugTextEditorTips = FALSE; // @@ -289,8 +290,11 @@ LLTextEditor::LLTextEditor( mMouseDownY(0), mLastSelectionX(-1), mLastSelectionY(-1), + mLastContextMenuX(-1), + mLastContextMenuY(-1), mReflowNeeded(FALSE), - mScrollNeeded(FALSE) + mScrollNeeded(FALSE), + mSpellCheckable(FALSE) { mSourceID.generate(); @@ -354,6 +358,7 @@ LLTextEditor::LLTextEditor( menu->append(new LLMenuItemCallGL("Paste", context_paste, NULL, this)); menu->append(new LLMenuItemCallGL("Delete", context_delete, NULL, this)); menu->append(new LLMenuItemCallGL("Select All", context_selectall, NULL, this)); + menu->appendSeparator("Spelsep"); menu->setCanTearOff(FALSE); menu->setVisible(FALSE); mPopupMenuHandle = menu->getHandle(); @@ -387,6 +392,85 @@ void LLTextEditor::context_copy(void* data) LLTextEditor* line = (LLTextEditor*)data; if(line)line->copy(); } + + +void LLTextEditor::spell_correct(void* data) +{ + SpellMenuBind* tempBind = (SpellMenuBind*)data; + LLTextEditor* line = tempBind->origin; + if(tempBind && line) + { + llinfos << tempBind->menuItem->getName() << " : " << tempBind->origin->getName() << " : " << tempBind->word << llendl; + if(line)line->spellReplace(tempBind); + } +} + + +void LLTextEditor::spell_show(void * data) +{ + SpellMenuBind* tempBind = (SpellMenuBind*)data; + LLTextEditor* line = tempBind->origin; + + if(tempBind && line) + { + BOOL show = (tempBind->word == "Show Misspellings"); + glggHunSpell->setSpellCheckHighlight(show); + } +} + + +std::vector LLTextEditor::getMisspelledWordsPositions() +{ + resetSpellDirty(); + std::vector thePosesOfBadWords; + LLWString& text = mWText; + S32 wordStart=0; + S32 wordEnd=spellStart;//start at the scroll start + while(wordEnd < spellEnd) + { + //go through all the chars... XD + if( LLTextEditor::isPartOfWord( text[wordEnd] ) ) + { + // Select word the cursor is over + while ((wordEnd > 0) && LLTextEditor::isPartOfWord(text[wordEnd-1])) + { + wordEnd--; + } + wordStart=wordEnd; + while ((wordEnd < (S32)text.length()) && LLTextEditor::isPartOfWord( text[wordEnd] ) ) + { + wordEnd++; + } + //got a word :D + + std::string regText(text.begin(),text.end()); + std::string selectedWord(regText.substr(wordStart,wordEnd-wordStart)); + + if(!glggHunSpell->isSpelledRight(selectedWord)) + { + //misspelled word here, and you have just right clicked on it + + thePosesOfBadWords.push_back(wordStart); + thePosesOfBadWords.push_back(wordEnd); + } + } + wordEnd++; + } + return thePosesOfBadWords; +} + + +void LLTextEditor::spell_add(void* data) +{ + SpellMenuBind* tempBind = (SpellMenuBind*)data; + if(tempBind) + { + glggHunSpell->addWordToCustomDictionary(tempBind->word); + tempBind->origin->mPrevSpelledText.erase();//make it update + } +} + + void LLTextEditor::context_paste(void* data) { LLTextEditor* line = (LLTextEditor*)data; @@ -779,6 +863,26 @@ S32 LLTextEditor::nextWordPos(S32 cursorPos) const return cursorPos; } +BOOL LLTextEditor::getWordBoundriesAt(const S32 at, S32* word_begin, S32* word_length) const +{ + S32 pos = at; + if (isPartOfWord(mWText[pos])) + { + while ( (pos > 0) && isPartOfWord(mWText[pos - 1]) ) + { + pos--; + } + *word_begin = pos; + while ( (pos < getLength()) && isPartOfWord(mWText[pos]) ) + { + pos++; + } + *word_length = pos - *word_begin; + return TRUE; + } + return FALSE; +} + S32 LLTextEditor::getLineStart( S32 line ) const { S32 num_lines = getLineCount(); @@ -1268,11 +1372,91 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLTextEditor::handleRightMouseDown( S32 x, S32 y, MASK mask ) { setFocus(TRUE); - llinfos << "Right mouse click - Opening menu." << llendl; + //setCursorAtLocalPos( x, y, TRUE ); + S32 wordStart = 0; + S32 wordLen = 0; + S32 pos = getCursorPosFromLocalCoord(x,y,TRUE); + LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get(); if (menu) { + for(int i = 0;i<(int)suggestionMenuItems.size();i++) + { + SpellMenuBind * tempBind = suggestionMenuItems[i]; + if(tempBind) + { + menu->remove(tempBind->menuItem); + tempBind->menuItem->die(); + //delete tempBind->menuItem; + //tempBind->menuItem = NULL; + delete tempBind; + } + } + suggestionMenuItems.clear(); + + // spell_check="true" in xui + menu->setItemVisible("Spelsep", !mReadOnly && mSpellCheckable); + if (!mReadOnly && mSpellCheckable) + { + bool is_word_part = getWordBoundriesAt(pos, &wordStart, &wordLen); + if (is_word_part) + { + const LLWString &text = mWText; + std::string selectedWord(std::string(text.begin(), text.end()).substr(wordStart,wordLen)); + + if (!glggHunSpell->isSpelledRight(selectedWord)) + { + //misspelled word here, and you have just right clicked on it! + std::vector suggs = glggHunSpell->getSuggestionList(selectedWord); + + for (int i = 0; i<(int)suggs.size(); i++) + { + SpellMenuBind * tempStruct = new SpellMenuBind; + tempStruct->origin = this; + tempStruct->word = suggs[i]; + tempStruct->wordPositionEnd = wordStart + wordLen; + tempStruct->wordPositionStart=wordStart; + tempStruct->wordY=y; + LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL( + tempStruct->word, spell_correct, NULL, tempStruct); + tempStruct->menuItem = suggMenuItem; + suggestionMenuItems.push_back(tempStruct); + menu->append(suggMenuItem); + } + SpellMenuBind * tempStruct = new SpellMenuBind; + tempStruct->origin = this; + tempStruct->word = selectedWord; + tempStruct->wordPositionEnd = wordStart + wordLen; + tempStruct->wordPositionStart=wordStart; + tempStruct->wordY=y; + LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL( + "Add Word", spell_add, NULL, tempStruct); + tempStruct->menuItem = suggMenuItem; + suggestionMenuItems.push_back(tempStruct); + menu->append(suggMenuItem); + } + } + + SpellMenuBind * tempStruct = new SpellMenuBind; + tempStruct->origin = this; + if (glggHunSpell->getSpellCheckHighlight()) + { + tempStruct->word = "Hide Misspellings"; + } + else + { + tempStruct->word = "Show Misspellings"; + } + + LLMenuItemCallGL * suggMenuItem = new LLMenuItemCallGL( + tempStruct->word, spell_show, NULL, tempStruct); + tempStruct->menuItem = suggMenuItem; + suggestionMenuItems.push_back(tempStruct); + menu->append(suggMenuItem); + } + mLastContextMenuX = x; + mLastContextMenuY = y; menu->buildDrawLabels(); menu->updateParent(LLMenuGL::sMenuContainer); LLMenuGL::showPopup(this, menu, x, y); @@ -1971,6 +2155,17 @@ BOOL LLTextEditor::canPaste() const } +void LLTextEditor::spellReplace(SpellMenuBind* spellData) +{ + remove( spellData->wordPositionStart, + spellData->wordPositionEnd - spellData->wordPositionStart, TRUE ); + LLWString clean_string = utf8str_to_wstring(spellData->word); + insert(spellData->wordPositionStart, clean_string, FALSE); + mCursorPos+=clean_string.length() - (spellData->wordPositionEnd-spellData->wordPositionStart); + needsReflow(); +} + + // paste from clipboard void LLTextEditor::paste() { @@ -2823,6 +3018,106 @@ void LLTextEditor::drawSelectionBackground() } } + +void LLTextEditor::drawMisspelled() +{ + if (!mReadOnly && mSpellCheckable) + { + if( + ( ((getLength()<400)||(false)) &&( (S32(mSpellTimer.getElapsedTimeF32() / 1) & 1) )) + || + (S32(mKeystrokeTimer.getElapsedTimeF32() / 1) & 1) + ) + { + S32 newSpellStart = getLineStart(mScrollbar->getDocPos());//start at the scroll start + S32 newSpellEnd = getLineStart(mScrollbar->getDocPos() + 1 + mScrollbar->getDocSize()-mScrollbar->getDocPosMax());//end at the end o.o + + if (mScrollbar->getDocPos() == mScrollbar->getDocPosMax()) + { + newSpellEnd = (S32)mWText.length(); + } + if (isSpellDirty() || (newSpellEnd!=spellEnd || newSpellStart!=spellStart)) + { + spellEnd = newSpellEnd; + spellStart = newSpellStart; + misspellLocations = getMisspelledWordsPositions(); + } + } + //draw + if (glggHunSpell->getSpellCheckHighlight()) + { + for (int i = 0; i<(int)misspellLocations.size() ;i++) + { + S32 wstart = misspellLocations[i]; + S32 wend = misspellLocations[++i]; + //start curor code mod + const LLWString &text = mWText; + const S32 text_len = getLength(); + // Skip through the lines we aren't drawing. + S32 search_pos = mScrollbar->getDocPos(); + S32 num_lines = getLineCount(); + if (search_pos >= num_lines) + { + return; + } + S32 line_start = getLineStart(search_pos); + F32 line_height = mGLFont->getLineHeight(); + F32 text_y = (F32)(mTextRect.mTop) - line_height; + + F32 word_left = 0.f; + F32 word_right = 0.f; + F32 word_bottom = 0.f; + BOOL word_visible = FALSE; + + S32 line_end = 0; + // Determine if the cursor is visible and if so what its coordinates are. + while( (mTextRect.mBottom <= llround(text_y)) && (search_pos < num_lines)) + { + line_end = text_len + 1; + S32 next_line = -1; + + if ((search_pos + 1) < num_lines) + { + next_line = getLineStart(search_pos + 1); + line_end = next_line - 1; + } + const llwchar* line = text.c_str() + line_start; + // Find the cursor and selection bounds + if( line_start <= wstart && wend <= line_end ) + { + word_visible = TRUE; + word_left = (F32)mTextRect.mLeft + mGLFont->getWidthF32(line, 0, wstart - line_start, mAllowEmbeddedItems )-1.f; + word_right = (F32)mTextRect.mLeft + mGLFont->getWidthF32(line, 0, wend - line_start, mAllowEmbeddedItems )+1.f; + word_bottom = text_y; + break; + } + // move down one line + text_y -= line_height; + line_start = next_line; + search_pos++; + } + if (mShowLineNumbers) + { + word_left += UI_TEXTEDITOR_LINE_NUMBER_MARGIN; + word_right += UI_TEXTEDITOR_LINE_NUMBER_MARGIN; + } + // Draw the cursor + if (word_visible) + { + //end cursor code mod + gGL.color4ub(255,0,0,200); + while (word_leftgetLindenUserDir(true).empty()) { LLTextParser* highlight = LLTextParser::getInstance(); highlight->parseFullLineHighlights(new_text, &lcolor); @@ -3787,7 +4086,10 @@ void LLTextEditor::appendHighlightedText(const std::string &new_text, S32 highlight_part, LLStyleSP stylep) { - if (mParseHighlights) + // If LindenUserDir is empty then we didn't login yet. + // In that case we can't instantiate LLTextParser, which + // is initialized per user. + if (mParseHighlights && !gDirUtilp->getLindenUserDir(true).empty()) { LLTextParser* highlight = LLTextParser::getInstance(); @@ -4474,6 +4776,8 @@ void LLTextEditor::setTextEditorParameters(LLXMLNodePtr node) node->getAttributeBOOL("track_bottom", mTrackBottom); + node->getAttributeBOOL("spell_check", mSpellCheckable); + LLColor4 color; if (LLUICtrlFactory::getAttributeColor(node,"cursor_color", color)) { diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 292779826..136a8528a 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -110,7 +110,19 @@ public: virtual void setFocus( BOOL b ); virtual BOOL acceptsTextInput() const; virtual BOOL isDirty() const { return( mLastCmd != NULL || (mPristineCmd && (mPristineCmd != mLastCmd)) ); } + BOOL isSpellDirty() const { return mWText != mPrevSpelledText; } // Returns TRUE if user changed value at all + void resetSpellDirty() { mPrevSpelledText = mWText; } // Clear dirty state + struct SpellMenuBind + { + LLTextEditor* origin; + LLMenuItemCallGL * menuItem; + std::string word; + S32 wordPositionStart; + S32 wordPositionEnd; + S32 wordY; + }; + // LLEditMenuHandler interface virtual void undo(); virtual BOOL canUndo() const; @@ -123,6 +135,8 @@ public: virtual void paste(); virtual BOOL canPaste() const; + virtual void spellReplace(SpellMenuBind* spellData); + virtual void updatePrimary(); virtual void copyPrimary(); virtual void pastePrimary(); @@ -140,6 +154,10 @@ public: static void context_paste(void* data); static void context_delete(void* data); static void context_selectall(void* data); + static void spell_correct(void* data); + static void spell_add(void* data); + static void spell_show(void* data); + std::vector getMisspelledWordsPositions(); void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE); BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE); @@ -206,6 +224,7 @@ public: void setHighlightColor( const LLColor4& color ); void setShadowColor( const LLColor4& color ); LLColor4 getReadOnlyFgColor() { return mReadOnlyFgColor; } + void setSpellCheckable(BOOL b) { mSpellCheckable = b; } // Hacky methods to make it into a word-wrapping, potentially scrolling, // read-only text box. @@ -272,7 +291,7 @@ public: const LLTextSegment* getPreviousSegment() const; void getSelectedSegments(std::vector& segments) const; - static bool isPartOfWord(llwchar c) { return (c == '_') || LLStringOps::isAlnum((char)c); } + static bool isPartOfWord(llwchar c) { return ( (c == '_') || (c == '\'') || LLStringOps::isAlnum((char)c)); } BOOL isReadOnly() { return mReadOnly; } protected: @@ -329,6 +348,7 @@ protected: S32 prevWordPos(S32 cursorPos) const; S32 nextWordPos(S32 cursorPos) const; + BOOL getWordBoundriesAt(const S32 at, S32* word_begin, S32* word_length) const; S32 getLineCount() const { return mLineStartList.size(); } S32 getLineStart( S32 line ) const; @@ -467,6 +487,7 @@ private: void drawBackground(); void drawSelectionBackground(); void drawCursor(); + void drawMisspelled(); void drawText(); void drawClippedSegment(const LLWString &wtext, S32 seg_start, S32 seg_end, F32 x, F32 y, S32 selection_left, S32 selection_right, const LLStyleSP& color, F32* right_x); @@ -497,6 +518,12 @@ private: mutable std::string mUTF8Text; mutable BOOL mTextIsUpToDate; + LLWString mPrevSpelledText; // saved string so we know whether to respell or not + S32 spellStart; + S32 spellEnd; + std::vector misspellLocations; // where all the mispelled words are + BOOL mSpellCheckable; // set in xui as "spell_check". Default value for a field + S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes const LLFontGL* mGLFont; @@ -533,11 +560,18 @@ private: } }; typedef std::vector line_list_t; + + //to keep track of what we have to remove before showing menu + std::vector suggestionMenuItems; + S32 mLastContextMenuX; + S32 mLastContextMenuY; + line_list_t mLineStartList; BOOL mReflowNeeded; BOOL mScrollNeeded; LLFrameTimer mKeystrokeTimer; + LLFrameTimer mSpellTimer; LLColor4 mCursorColor; diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 75a446782..e06314d17 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -42,7 +42,6 @@ #include "v4color.h" #include "llrender.h" #include "llrect.h" -#include "llimagegl.h" #include "lldir.h" #include "llfontgl.h" @@ -407,7 +406,7 @@ void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max } -void gl_draw_image( S32 x, S32 y, LLImageGL* image, const LLColor4& color, const LLRectf& uv_rect ) +void gl_draw_image( S32 x, S32 y, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect ) { if (NULL == image) { @@ -417,7 +416,7 @@ void gl_draw_image( S32 x, S32 y, LLImageGL* image, const LLColor4& color, const gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), 0.f, image, color, uv_rect ); } -void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, const LLColor4& color, const LLRectf& uv_rect) +void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) { if (NULL == image) { @@ -427,7 +426,7 @@ void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, gl_draw_scaled_rotated_image( x, y, width, height, 0.f, image, color, uv_rect ); } -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLImageGL* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect) +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect) { if (NULL == image) { @@ -443,7 +442,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border gl_draw_scaled_image_with_border(x, y, width, height, image, color, solid_color, uv_rect, scale_rect); } -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect, const LLRectf& scale_rect) +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect, const LLRectf& scale_rect) { stop_glerror(); @@ -629,12 +628,12 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLIma } } -void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLImageGL* image, const LLColor4& color, const LLRectf& uv_rect) +void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) { gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), degrees, image, color, uv_rect ); } -void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLImageGL* image, const LLColor4& color, const LLRectf& uv_rect) +void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) { if (NULL == image) { @@ -680,7 +679,7 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre } -void gl_draw_scaled_image_inverted(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, const LLColor4& color, const LLRectf& uv_rect) +void gl_draw_scaled_image_inverted(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) { if (NULL == image) { @@ -1559,7 +1558,8 @@ void LLUI::initClass(LLControlGroup* config, LLImageProviderInterface* image_provider, LLUIAudioCallback audio_callback, const LLVector2* scale_factor, - const std::string& language) + const std::string& language + ) { sConfigGroup = config; sIgnoresGroup = ignores; @@ -1764,11 +1764,24 @@ void LLUI::glRectToScreen(const LLRect& gl, LLRect *screen) glPointToScreen(gl.mRight, gl.mBottom, &screen->mRight, &screen->mBottom); } -//static -LLUIImage* LLUI::getUIImage(const std::string& name) +//static +LLPointer LLUI::getUIImageByID(const LLUUID& image_id, S32 priority) { - if (!name.empty()) - return sImageProvider->getUIImage(name); + if (sImageProvider) + { + return sImageProvider->getUIImageByID(image_id, priority); + } + else + { + return NULL; + } +} + +//static +LLPointer LLUI::getUIImage(const std::string& name, S32 priority) +{ + if (!name.empty() && sImageProvider) + return sImageProvider->getUIImage(name, priority); else return NULL; } @@ -1853,7 +1866,7 @@ LLLocalClipRect::LLLocalClipRect(const LLRect &rect, BOOL enabled) // LLUIImage // -LLUIImage::LLUIImage(const std::string& name, LLPointer image) : +LLUIImage::LLUIImage(const std::string& name, LLPointer image) : mName(name), mImage(image), mScaleRegion(0.f, 1.f, 1.f, 0.f), diff --git a/indra/llui/llui.h b/indra/llui/llui.h index ebcc7304b..c7b7446a0 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -42,7 +42,7 @@ //#include "llhtmlhelp.h" #include "llgl.h" // *TODO: break this dependency #include -//#include "llimagegl.h" +#include "lltexture.h" #include // LLUIFactory @@ -50,7 +50,6 @@ class LLColor4; class LLHtmlHelp; -class LLImageGL; class LLVector3; class LLVector2; class LLUUID; @@ -91,14 +90,14 @@ void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); void gl_washer_spokes_2d(F32 outer_radius, F32 inner_radius, S32 count, const LLColor4& inner_color, const LLColor4& outer_color); -void gl_draw_image(S32 x, S32 y, LLImageGL* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLImageGL* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees,LLImageGL* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLImageGL* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), const LLRectf& scale_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_image(S32 x, S32 y, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees,LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), const LLRectf& scale_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); // Flip vertical, used for LLFloaterHTML -void gl_draw_scaled_image_inverted(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image_inverted(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); void gl_rect_2d_xor(S32 left, S32 top, S32 right, S32 bottom); void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase = 0.f ); @@ -182,7 +181,8 @@ public: static void getCursorPositionLocal(const LLView* viewp, S32 *x, S32 *y); static void setScaleFactor(const LLVector2& scale_factor); static void setLineWidth(F32 width); - static LLUIImage* getUIImage(const std::string& name); + static LLPointer getUIImageByID(const LLUUID& image_id, S32 priority = 0); + static LLPointer getUIImage(const std::string& name, S32 priority = 0); static LLVector2 getWindowSize(); static void screenPointToGL(S32 screen_x, S32 screen_y, S32 *gl_x, S32 *gl_y); static void glPointToScreen(S32 gl_x, S32 gl_y, S32 *screen_x, S32 *screen_y); @@ -416,13 +416,13 @@ public: class LLUIImage : public LLRefCount { public: - LLUIImage(const std::string& name, LLPointer image); + LLUIImage(const std::string& name, LLPointer image); void setClipRegion(const LLRectf& region); void setScaleRegion(const LLRectf& region); - LLPointer getImage() { return mImage; } - const LLPointer& getImage() const { return mImage; } + LLPointer getImage() { return mImage; } + const LLPointer& getImage() const { return mImage; } void draw(S32 x, S32 y, S32 width, S32 height, const LLColor4& color = UI_VERTEX_COLOR) const; void draw(S32 x, S32 y, const LLColor4& color = UI_VERTEX_COLOR) const; @@ -449,7 +449,7 @@ protected: std::string mName; LLRectf mScaleRegion; LLRectf mClipRegion; - LLPointer mImage; + LLPointer mImage; BOOL mUniformScaling; BOOL mNoClip; }; @@ -597,8 +597,8 @@ public: LLImageProviderInterface() {}; virtual ~LLImageProviderInterface() {}; - virtual LLUIImagePtr getUIImage(const std::string& name) = 0; - virtual LLUIImagePtr getUIImageByID(const LLUUID& id) = 0; + virtual LLUIImagePtr getUIImage(const std::string& name, S32 priority) = 0; + virtual LLUIImagePtr getUIImageByID(const LLUUID& id, S32 priority) = 0; virtual void cleanUp() = 0; }; diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp old mode 100755 new mode 100644 diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h old mode 100755 new mode 100644 diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp index 47323e2b5..84edd7aa3 100644 --- a/indra/llui/llviewborder.cpp +++ b/indra/llui/llviewborder.cpp @@ -69,7 +69,7 @@ void LLViewBorder::setColorsExtended( const LLColor4& shadow_light, const LLColo void LLViewBorder::setTexture( const LLUUID &image_id ) { - mTexture = LLUI::sImageProvider->getUIImageByID(image_id); + mTexture = LLUI::getUIImageByID(image_id); } diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index d495176de..29b50d7bc 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -193,8 +193,9 @@ const std::string &LLDir::getOSUserAppDir() const return mOSUserAppDir; } -const std::string &LLDir::getLindenUserDir() const +const std::string &LLDir::getLindenUserDir(bool empty_ok) const { + llassert(empty_ok || !mLindenUserDir.empty()); return mLindenUserDir; } diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 4111f4ffa..a90b8ab24 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -92,7 +92,7 @@ class LLDir const std::string &getAppRODataDir() const; // Location of read-only data files const std::string &getOSUserDir() const; // Location of the os-specific user dir const std::string &getOSUserAppDir() const; // Location of the os-specific user app dir - const std::string &getLindenUserDir() const; // Location of the Linden user dir. + const std::string &getLindenUserDir(bool empty_ok = false) const; // Location of the Linden user dir. const std::string &getChatLogsDir() const; // Location of the chat logs dir. const std::string &getPerAccountChatLogsDir() const; // Location of the per account chat logs dir. const std::string &getTempDir() const; // Common temporary directory diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index ec0a4f468..ce6b1885f 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -97,7 +97,7 @@ LLDir_Linux::LLDir_Linux() mAppRODataDir = tmp_str; mOSUserDir = getCurrentUserHome(tmp_str); mOSUserAppDir = ""; - mLindenUserDir = tmp_str; + mLindenUserDir = ""; char path [32]; /* Flawfinder: ignore */ @@ -235,6 +235,15 @@ void LLDir_Linux::initAppDirs(const std::string &app_name) } } + res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries")); + if (res == -1) + { + if (errno != EEXIST) + { + llwarns << "Couldn't create LL_PATH_USER_SETTINGS/dictionaries dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl; + } + } + mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); } diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index c647e2bd1..2ebd6e471 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -100,7 +100,7 @@ LLDir_Solaris::LLDir_Solaris() mAppRODataDir = strdup(tmp_str); mOSUserDir = getCurrentUserHome(tmp_str); mOSUserAppDir = ""; - mLindenUserDir = tmp_str; + mLindenUserDir = ""; char path [LL_MAX_PATH]; /* Flawfinder: ignore */ @@ -247,6 +247,15 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name) } } + res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries")); + if (res == -1) + { + if (errno != EEXIST) + { + llwarns << "Couldn't create LL_PATH_USER_SETTINGS/dictionaries dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl; + } + } + mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); } diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index e5d6747d9..c41c591c5 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -207,7 +207,16 @@ void LLDir_Win32::initAppDirs(const std::string &app_name) llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl; } } - + + res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries")); + if (res == -1) + { + if (errno != EEXIST) + { + llwarns << "Couldn't create LL_PATH_USER_SETTINGS/dictionaries dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl; + } + } + mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); } diff --git a/indra/llvfs/llpidlock.cpp b/indra/llvfs/llpidlock.cpp old mode 100755 new mode 100644 index cb6442816..93f1af52b --- a/indra/llvfs/llpidlock.cpp +++ b/indra/llvfs/llpidlock.cpp @@ -60,8 +60,12 @@ class LLPidLockFile { public: LLPidLockFile( ) : - mSaving(FALSE), mWaiting(FALSE), - mClean(TRUE), mPID(LLApp::getPid()) + mAutosave(false), + mSaving(false), + mWaiting(false), + mPID(LLApp::getPid()), + mNameTable(NULL), + mClean(true) { mLockName = gDirUtilp->getTempDir() + "/savelock"; } diff --git a/indra/llvfs/llpidlock.h b/indra/llvfs/llpidlock.h old mode 100755 new mode 100644 diff --git a/indra/llvfs/llvfile.h b/indra/llvfs/llvfile.h index 8db45d30b..c3bca8c73 100644 --- a/indra/llvfs/llvfile.h +++ b/indra/llvfs/llvfile.h @@ -80,16 +80,14 @@ public: static const S32 READ_WRITE; static const S32 APPEND; +protected: LLAssetType::EType mFileType; LLUUID mFileID; - -protected: S32 mPosition; S32 mMode; LLVFS *mVFS; F32 mPriority; - BOOL mOnReadQueue; S32 mBytesRead; LLVFSThread::handle_t mHandle; diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp index 18c3951fd..1f4c991b2 100644 --- a/indra/llvfs/llvfs.cpp +++ b/indra/llvfs/llvfs.cpp @@ -219,7 +219,7 @@ const S32 LLVFSFileBlock::SERIAL_SIZE = 34; LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename, const BOOL read_only, const U32 presize, const BOOL remove_after_crash) : mRemoveAfterCrash(remove_after_crash) { - mDataMutex = new LLMutex(0); + mDataMutex = new LLMutex; S32 i; for (i = 0; i < VFSLOCK_COUNT; i++) @@ -566,8 +566,9 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename } } - LL_WARNS("VFS") << "Using index file " << mIndexFilename << LL_ENDL; - LL_WARNS("VFS") << "Using data file " << mDataFilename << LL_ENDL; + // Success! + LL_INFOS("VFS") << "Using index file " << mIndexFilename << LL_ENDL; + LL_INFOS("VFS") << "Using data file " << mDataFilename << LL_ENDL; mValid = VFSVALID_OK; } diff --git a/indra/llwindow/glh/glh_linear.h b/indra/llwindow/glh/glh_linear.h old mode 100755 new mode 100644 diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index df769c444..8abbb9018 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -2841,8 +2841,16 @@ void LLSplashScreenWin32::updateImpl(const std::string& mesg) { if (!mWindow) return; - WCHAR w_mesg[1024]; - mbstowcs(w_mesg, mesg.c_str(), 1024); + int output_str_len = MultiByteToWideChar(CP_UTF8, 0, mesg.c_str(), mesg.length(), NULL, 0); + if( output_str_len>1024 ) + return; + + WCHAR w_mesg[1025];//big enought to keep null terminatos + + MultiByteToWideChar (CP_UTF8, 0, mesg.c_str(), mesg.length(), w_mesg, output_str_len); + + //looks like MultiByteToWideChar didn't add null terminator to converted string, see EXT-4858 + w_mesg[output_str_len] = 0; SendDlgItemMessage(mWindow, 666, // HACK: text id @@ -2970,78 +2978,6 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url ) sei.lpFile = url_utf16.c_str(); ShellExecuteEx( &sei ); - //// TODO: LEAVING OLD CODE HERE SO I DON'T BONE OTHER MERGES - //// DELETE THIS ONCE THE MERGES ARE DONE - - // Figure out the user's default web browser - // HKEY_CLASSES_ROOT\http\shell\open\command - /* - std::string reg_path_str = gURLProtocolWhitelistHandler[i] + "\\shell\\open\\command"; - WCHAR reg_path_wstr[256]; - mbstowcs( reg_path_wstr, reg_path_str.c_str(), LL_ARRAY_SIZE(reg_path_wstr) ); - - HKEY key; - WCHAR browser_open_wstr[1024]; - DWORD buffer_length = 1024; - RegOpenKeyEx(HKEY_CLASSES_ROOT, reg_path_wstr, 0, KEY_QUERY_VALUE, &key); - RegQueryValueEx(key, NULL, NULL, NULL, (LPBYTE)browser_open_wstr, &buffer_length); - RegCloseKey(key); - - // Convert to STL string - LLWString browser_open_wstring = utf16str_to_wstring(browser_open_wstr); - - if (browser_open_wstring.length() < 2) - { - LL_WARNS("Window") << "Invalid browser executable in registry " << browser_open_wstring << LL_ENDL; - return; - } - - // Extract the process that's supposed to be launched - LLWString browser_executable; - if (browser_open_wstring[0] == '"') - { - // executable is quoted, find the matching quote - size_t quote_pos = browser_open_wstring.find('"', 1); - // copy out the string including both quotes - browser_executable = browser_open_wstring.substr(0, quote_pos+1); - } - else - { - // executable not quoted, find a space - size_t space_pos = browser_open_wstring.find(' ', 1); - browser_executable = browser_open_wstring.substr(0, space_pos); - } - - LL_DEBUGS("Window") << "Browser reg key: " << wstring_to_utf8str(browser_open_wstring) << LL_ENDL; - LL_INFOS("Window") << "Browser executable: " << wstring_to_utf8str(browser_executable) << LL_ENDL; - - // Convert URL to wide string for Windows API - // Assume URL is UTF8, as can come from scripts - LLWString url_wstring = utf8str_to_wstring(escaped_url); - llutf16string url_utf16 = wstring_to_utf16str(url_wstring); - - // Convert executable and path to wide string for Windows API - llutf16string browser_exec_utf16 = wstring_to_utf16str(browser_executable); - - // ShellExecute returns HINSTANCE for backwards compatiblity. - // MS docs say to cast to int and compare to 32. - HWND our_window = NULL; - LPCWSTR directory_wstr = NULL; - int retval = (int) ShellExecute(our_window, // Flawfinder: ignore - L"open", - browser_exec_utf16.c_str(), - url_utf16.c_str(), - directory_wstr, - SW_SHOWNORMAL); - if (retval > 32) - { - LL_DEBUGS("Window") << "load_url success with " << retval << LL_ENDL; - } - else - { - LL_INFOS("Window") << "load_url failure with " << retval << LL_ENDL; - } - */ } diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index f57646b8e..3e6b1d0e4 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -66,7 +66,20 @@ const S32 CURRENT_VERSION = 101; //So, a global it is! bool gCOAEnabled = false; -LLControlVariable *LLControlVariable::getCOAActive() +LLControlVariable* LLControlVariable::getCOAActive() +{ + //if no coa connection, return 'this' + //if per account is ON and this IS a parent, return child var + //if per account is ON and this IS NOT a parent, return 'this' + //if per account is OFF and this IS NOT a parent, return parent var + //if per account is OFF and this IS a parent, return 'this' + if(getCOAConnection() && gCOAEnabled == isCOAParent()) + return getCOAConnection(); + else + return this; +} + +LLControlVariable const* LLControlVariable::getCOAActive() const { //if no coa connection, return 'this' //if per account is ON and this IS a parent, return child var @@ -282,11 +295,9 @@ LLSD LLControlVariable::getSaveValue() const #if PROF_CTRL_CALLS std::vector> gSettingsCallMap; -#endif //PROF_CTRL_CALLS -LLPointer LLControlGroup::getControl(const std::string& name) + +static update_gSettingsCallMap(ctrl_name_table_t::const_iterator const& iter) { - ctrl_name_table_t::iterator iter = mNameTable.find(name); -#if PROF_CTRL_CALLS if(iter != mNameTable.end()) { std::vector>::iterator iter2 = gSettingsCallMap.begin(); @@ -302,13 +313,32 @@ LLPointer LLControlGroup::getControl(const std::string& name) if(iter2 == gSettingsCallMap.end()) gSettingsCallMap.push_back(std::pair(name.c_str(),1)); } +} +#endif //PROF_CTRL_CALLS + +LLControlVariable* LLControlGroup::getControl(std::string const& name) +{ + ctrl_name_table_t::iterator iter = mNameTable.find(name); +#if PROF_CTRL_CALLS + update_gSettingsCallMap(iter); #endif //PROF_CTRL_CALLS if(iter != mNameTable.end()) return iter->second->getCOAActive(); else - return LLPointer(); + return NULL; } +LLControlVariable const* LLControlGroup::getControl(std::string const& name) const +{ + ctrl_name_table_t::const_iterator iter = mNameTable.find(name); +#if PROF_CTRL_CALLS + update_gSettingsCallMap(iter); +#endif //PROF_CTRL_CALLS + if(iter != mNameTable.end()) + return iter->second->getCOAActive(); + else + return NULL; +} //////////////////////////////////////////////////////////////////////////// @@ -502,9 +532,9 @@ std::string LLControlGroup::findString(const std::string& name) return LLStringUtil::null; } -std::string LLControlGroup::getString(const std::string& name) +std::string LLControlGroup::getString(const std::string& name) const { - LLControlVariable* control = getControl(name); + LLControlVariable const* control = getControl(name); if (control && control->isType(TYPE_STRING)) return control->get().asString(); @@ -649,9 +679,9 @@ LLSD LLControlGroup::getLLSD(const std::string& name) return LLSD(); } -BOOL LLControlGroup::controlExists(const std::string& name) +BOOL LLControlGroup::controlExists(const std::string& name) const { - ctrl_name_table_t::iterator iter = mNameTable.find(name); + ctrl_name_table_t::const_iterator iter = mNameTable.find(name); return iter != mNameTable.end(); } diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index 76dfa47ff..e5cbf7354 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -122,7 +122,7 @@ public: const std::string& getComment() const { return mComment; } eControlType type() { return mType; } - bool isType(eControlType tp) { return tp == mType; } + bool isType(eControlType tp) const { return tp == mType; } void resetToDefault(bool fire_signal = false); @@ -153,7 +153,8 @@ public: bool isCOA() const { return mIsCOA; } bool isCOAParent() const { return mIsCOAParent; } LLControlVariable *getCOAConnection() const { return mCOAConnectedVar; } - LLControlVariable *getCOAActive(); + LLControlVariable* getCOAActive(); + LLControlVariable const* getCOAActive() const; void setIsCOA(bool IsCOA) { mIsCOA=IsCOA; } void setCOAConnect(LLControlVariable *pConnect, bool IsParent) { @@ -185,7 +186,8 @@ public: ~LLControlGroup(); void cleanup(); - LLPointer getControl(const std::string& name); + LLControlVariable* getControl(std::string const& name); + LLControlVariable const* getControl(std::string const& name) const; struct ApplyFunctor { @@ -210,7 +212,7 @@ public: std::string findString(const std::string& name); - std::string getString(const std::string& name); + std::string getString(const std::string& name) const; LLWString getWString(const std::string& name); std::string getText(const std::string& name); LLVector3 getVector3(const std::string& name); @@ -245,7 +247,7 @@ public: void setValue(const std::string& name, const LLSD& val); - BOOL controlExists(const std::string& name); + BOOL controlExists(const std::string& name) const; // Returns number of controls loaded, 0 if failed // If require_declaration is false, will auto-declare controls it finds @@ -405,7 +407,15 @@ template <> inline void LLCachedControl::setValue(const LLSD& newvalue else this->mCachedValue = (const LLColor4 &)newvalue; } - +template <> inline void LLCachedControl::setValue(const LLSD& newvalue) +{ + if(mControl->isType(TYPE_U32) || mControl->isType(TYPE_S32)) //LLSD does not support U32 fully + mCachedValue = (U32)newvalue.asInteger(); + else if(this->mControl->isType(TYPE_F32)) + mCachedValue = (U32)newvalue.asReal(); + else + mCachedValue = (U32)0; //What to do... +} //Following is actually defined in newview/llviewercontrol.cpp, but extern access is fine (Unless GCC bites me) template <> eControlType get_control_type(const U32& in, LLSD& out); diff --git a/indra/llxml/llcontrolgroupreader.h b/indra/llxml/llcontrolgroupreader.h index c4c04b98b..ef8ee18c9 100644 --- a/indra/llxml/llcontrolgroupreader.h +++ b/indra/llxml/llcontrolgroupreader.h @@ -46,7 +46,7 @@ public: LLControlGroupReader() {} virtual ~LLControlGroupReader() {} - virtual std::string getString(const std::string& name) = 0; + virtual std::string getString(const std::string& name) const = 0; //virtual LLWString getWString(const std::string& name) = 0; virtual std::string getText(const std::string& name) = 0; //virtual LLVector3 getVector3(const std::string& name) = 0; diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/indra/media_plugins/base/CMakeLists.txt b/indra/media_plugins/base/CMakeLists.txt index 8d620433a..fc6f8e9cf 100644 --- a/indra/media_plugins/base/CMakeLists.txt +++ b/indra/media_plugins/base/CMakeLists.txt @@ -25,13 +25,13 @@ include_directories( ### media_plugin_base -if(NOT CMAKE_SIZEOF_VOID_P MATCHES 4) +if(NOT WORD_SIZE EQUAL 32) if(WINDOWS) add_definitions(/FIXED:NO) else(WINDOWS) # not windows therefore gcc LINUX and DARWIN add_definitions(-fPIC) endif(WINDOWS) -endif (NOT CMAKE_SIZEOF_VOID_P MATCHES 4) +endif (NOT WORD_SIZE EQUAL 32) set(media_plugin_base_SOURCE_FILES media_plugin_base.cpp @@ -47,3 +47,5 @@ add_library(media_plugin_base ${media_plugin_base_SOURCE_FILES} ) +add_dependencies(media_plugin_base prepare) + diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp old mode 100755 new mode 100644 diff --git a/indra/media_plugins/base/media_plugin_base.h b/indra/media_plugins/base/media_plugin_base.h old mode 100755 new mode 100644 diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt index 56cefde4b..54dc5de1e 100644 --- a/indra/media_plugins/example/CMakeLists.txt +++ b/indra/media_plugins/example/CMakeLists.txt @@ -79,4 +79,4 @@ if (DARWIN) LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp" ) -endif (DARWIN) \ No newline at end of file +endif (DARWIN) diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp old mode 100755 new mode 100644 diff --git a/indra/media_plugins/quicktime/CMakeLists.txt b/indra/media_plugins/quicktime/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp old mode 100755 new mode 100644 diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt old mode 100755 new mode 100644 index 05f123660..3b1f67954 --- a/indra/media_plugins/webkit/CMakeLists.txt +++ b/indra/media_plugins/webkit/CMakeLists.txt @@ -27,6 +27,7 @@ include_directories( ${LLIMAGE_INCLUDE_DIRS} ${LLRENDER_INCLUDE_DIRS} ${LLWINDOW_INCLUDE_DIRS} + ${LLQTWEBKIT_INCLUDE_DIR} ) diff --git a/indra/media_plugins/webkit/dummy_volume_catcher.cpp b/indra/media_plugins/webkit/dummy_volume_catcher.cpp old mode 100755 new mode 100644 diff --git a/indra/media_plugins/webkit/linux_volume_catcher.cpp b/indra/media_plugins/webkit/linux_volume_catcher.cpp old mode 100755 new mode 100644 index 085708640..321d1f91f --- a/indra/media_plugins/webkit/linux_volume_catcher.cpp +++ b/indra/media_plugins/webkit/linux_volume_catcher.cpp @@ -50,7 +50,7 @@ extern "C" { #include #include // There's no special reason why we want the *glib* PA mainloop, but the generic polling implementation seems broken. -#include "apr_pools.h" +#include "aiaprpool.h" #include "apr_dso.h" } @@ -66,7 +66,7 @@ extern "C" { #undef LL_PA_SYM static bool sSymsGrabbed = false; -static apr_pool_t *sSymPADSOMemoryPool = NULL; +static AIAPRPool sSymPADSOMemoryPool; static apr_dso_handle_t *sSymPADSOHandleG = NULL; bool grab_pa_syms(std::string pulse_dso_name) @@ -85,11 +85,11 @@ bool grab_pa_syms(std::string pulse_dso_name) #define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##PASYM, sSymPADSOHandle, #PASYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #PASYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #PASYM, (void*)ll##PASYM);}while(0) //attempt to load the shared library - apr_pool_create(&sSymPADSOMemoryPool, NULL); + sSymPADSOMemoryPool.create(); if ( APR_SUCCESS == (rv = apr_dso_load(&sSymPADSOHandle, pulse_dso_name.c_str(), - sSymPADSOMemoryPool) )) + sSymPADSOMemoryPool()) )) { INFOMSG("Found DSO: %s", pulse_dso_name.c_str()); @@ -132,11 +132,7 @@ void ungrab_pa_syms() sSymPADSOHandleG = NULL; } - if ( sSymPADSOMemoryPool ) - { - apr_pool_destroy(sSymPADSOMemoryPool); - sSymPADSOMemoryPool = NULL; - } + sSymPADSOMemoryPool.destroy(); // NULL-out all of the symbols we'd grabbed #define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{ll##PASYM = NULL;}while(0) diff --git a/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc old mode 100755 new mode 100644 diff --git a/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc old mode 100755 new mode 100644 diff --git a/indra/media_plugins/webkit/mac_volume_catcher.cpp b/indra/media_plugins/webkit/mac_volume_catcher.cpp old mode 100755 new mode 100644 diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp old mode 100755 new mode 100644 diff --git a/indra/media_plugins/webkit/volume_catcher.h b/indra/media_plugins/webkit/volume_catcher.h old mode 100755 new mode 100644 diff --git a/indra/media_plugins/webkit/windows_volume_catcher.cpp b/indra/media_plugins/webkit/windows_volume_catcher.cpp old mode 100755 new mode 100644 diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3c39d8919..7071fbc4b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1,1651 +1,1665 @@ -# -*- cmake -*- - -project(viewer) - -include(00-Common) -include(Boost) -include(DBusGlib) -include(DirectX) -include(ELFIO) -include(FMOD) -include(OPENAL) -include(FindOpenGL) -include(JsonCpp) -include(LLAddBuildTest) -include(LLAudio) -include(LLCharacter) -include(LLCommon) -include(LLImage) -include(LLImageJ2COJ) -include(LLInventory) -include(LLMath) -include(LLMessage) -include(LLPlugin) -include(LLPrimitive) -include(LLRender) -include(LLUI) -include(LLVFS) -include(LLWindow) -include(LLXML) -include(LScript) -include(Linking) -include(NDOF) -include(GooglePerfTools) -include(TemplateCheck) -include(UI) -include(LLKDU) -include(ViewerMiscLibs) -include(ViewerArtwork.cmake) - -if (WINDOWS) - include(CopyWinLibs) -endif (WINDOWS) - -include_directories( - ${DBUSGLIB_INCLUDE_DIRS} - ${ELFIO_INCLUDE_DIR} - ${JSONCPP_INCLUDE_DIRS} - ${LLAUDIO_INCLUDE_DIRS} - ${LLCHARACTER_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLINVENTORY_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLPLUGIN_INCLUDE_DIRS} - ${LLPRIMITIVE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLUI_INCLUDE_DIRS} - ${LLVFS_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LSCRIPT_INCLUDE_DIRS} - ${LSCRIPT_INCLUDE_DIRS}/lscript_compile - ) - -set(viewer_SOURCE_FILES - llviewerobjectbackup.cpp - slfloatermediafilter.cpp - floaterlocalassetbrowse.cpp - aoremotectrl.cpp - floaterao.cpp - floatervoicelicense.cpp - cofmgr.cpp - ascentdaycyclemanager.cpp - ascentfloatercontactgroups.cpp - ascentprefssys.cpp - ascentprefsvan.cpp - dhparam.cpp - dsaparam.cpp - emerald.cpp - emeraldboobutils.cpp - dofloaterhex.cpp - dohexeditor.cpp - floatersculptpreview.cpp - hbfloatergrouptitles.cpp - hgfloatertexteditor.cpp - hippogridmanager.cpp - hippofloaterxml.cpp - hippolimits.cpp - hipporestrequest.cpp - hippopanelgrids.cpp - jcfloaterareasearch.cpp - chatbar_as_cmdline.cpp - qtoolalign.cpp - llagent.cpp - llagentaccess.cpp - llagentdata.cpp - llagentlanguage.cpp - llagentpilot.cpp - llanimstatelabels.cpp - llappviewer.cpp - llassetconverter.cpp - llassetuploadresponders.cpp - llassetuploadqueue.cpp - llattachmentsmgr.cpp - llaudiosourcevo.cpp - llbbox.cpp - llbox.cpp - llbuildnewviewsscheduler.cpp - llcallbacklist.cpp - llcallingcard.cpp - llcaphttpsender.cpp - llchatbar.cpp - llclassifiedinfo.cpp - llclassifiedstatsresponder.cpp - llcloud.cpp - llcolorscheme.cpp - llcolorswatch.cpp - llcommandhandler.cpp - llcommandlineparser.cpp - llcompass.cpp - llcompilequeue.cpp - llconfirmationmanager.cpp - llconsole.cpp - llcontainerview.cpp - llcurrencyuimanager.cpp - llcylinder.cpp - lldebugmessagebox.cpp - lldebugview.cpp - lldelayedgestureerror.cpp - lldirpicker.cpp - lldrawable.cpp - lldrawpoolalpha.cpp - lldrawpoolavatar.cpp - lldrawpoolbump.cpp - lldrawpool.cpp - lldrawpoolground.cpp - lldrawpoolsimple.cpp - lldrawpoolsky.cpp - lldrawpoolterrain.cpp - lldrawpooltree.cpp - lldrawpoolwater.cpp - lldrawpoolwlsky.cpp - lldriverparam.cpp - lldynamictexture.cpp - llemote.cpp - lleventinfo.cpp - lleventnotifier.cpp - lleventpoll.cpp - llface.cpp - llfasttimerview.cpp - llfeaturemanager.cpp - llfilepicker.cpp - llfirstuse.cpp - llflexibleobject.cpp - llfloaterabout.cpp - llfloateractivespeakers.cpp - llfloateranimpreview.cpp - llfloaterauction.cpp - llfloateravatarinfo.cpp - llfloateravatarlist.cpp - llfloateravatarpicker.cpp - llfloateravatartextures.cpp - llfloaterbeacons.cpp - llfloaterblacklist.cpp - llviewerdisplayname.cpp - llfloaterdisplayname.cpp - llfloaterbuildoptions.cpp - llfloaterbulkpermission.cpp - llfloaterbump.cpp - llfloaterbuycontents.cpp - llfloaterbuy.cpp - llfloaterbuycurrency.cpp - llfloaterbuyland.cpp - llfloatercamera.cpp - llfloaterchat.cpp - llfloaterchatterbox.cpp - llfloaterclassified.cpp - llfloatercolorpicker.cpp - llfloatercustomize.cpp - llfloaterdaycycle.cpp - llfloaterdickdongs.cpp - llfloaterdirectory.cpp - llfloatereditui.cpp - llfloaterenvsettings.cpp - llfloaterevent.cpp - llfloaterexploreanimations.cpp - llfloaterexploresounds.cpp - llfloaterfriends.cpp - llfloaterfonttest.cpp - llfloatergesture.cpp - llfloatergodtools.cpp - llfloatergroupinfo.cpp - llfloatergroupinvite.cpp - llfloatergroups.cpp - llfloaterhandler.cpp - llfloaterhardwaresettings.cpp - llfloaterhtmlcurrency.cpp - llfloatermediabrowser.cpp - llfloaterhtmlsimple.cpp - llfloaterhud.cpp - llfloaterimagepreview.cpp - llfloaterinspect.cpp - llfloaterjoystick.cpp - llfloaterlagmeter.cpp - llfloaterland.cpp - llfloaterlandholdings.cpp - llfloaterlandmark.cpp - llfloatermap.cpp - llfloatermemleak.cpp - llfloatermessagelog.cpp - llfloatermute.cpp - llfloaternamedesc.cpp - llfloaternewim.cpp - llfloaternotificationsconsole.cpp - llfloaterobjectiminfo.cpp - llfloateropenobject.cpp - llfloaterparcel.cpp - llfloaterpermissionsmgr.cpp - llfloaterperms.cpp - llfloaterpostcard.cpp - llfloaterpostprocess.cpp - llfloaterpreference.cpp - llfloaterproperties.cpp - llfloaterregioninfo.cpp - llfloaterreporter.cpp - llfloaterscriptdebug.cpp - llfloatersellland.cpp - llfloatersettingsdebug.cpp - llfloatersnapshot.cpp - llfloaterstats.cpp - llfloatertelehub.cpp - llfloaterteleport.cpp - llfloaterteleporthistory.cpp - llfloatertest.cpp - llfloatertools.cpp - llfloatertopobjects.cpp - llfloatertos.cpp - llfloaterurldisplay.cpp - llfloaterurlentry.cpp - llfloatervfs.cpp - llfloatervfsexplorer.cpp - llfloatervoicedevicesettings.cpp - llfloaterwater.cpp - llfloaterwindlight.cpp - llfloaterworldmap.cpp - llfolderview.cpp - llfollowcam.cpp - llframestats.cpp - llframestatview.cpp - llgesturemgr.cpp - llgivemoney.cpp - llglsandbox.cpp - llgroupmgr.cpp - llgroupnotify.cpp - llhomelocationresponder.cpp - llhoverview.cpp - llhudeffectbeam.cpp - llhudeffect.cpp - llhudeffectlookat.cpp - llhudeffectpointat.cpp - llhudeffecttrail.cpp - llhudicon.cpp - llhudmanager.cpp - llhudobject.cpp - llhudrender.cpp - llhudtext.cpp - llhudview.cpp - llimpanel.cpp - llimview.cpp - llinventoryactions.cpp - llinventorybackup.cpp - llinventorybridge.cpp - llinventoryclipboard.cpp - llinventorymodel.cpp - llinventoryview.cpp - lljoystickbutton.cpp - lllandmarklist.cpp - lllocalinventory.cpp - lllogchat.cpp - llloginhandler.cpp - llsavedlogins.cpp - llmanip.cpp - llmaniprotate.cpp - llmanipscale.cpp - llmaniptranslate.cpp - llmediaremotectrl.cpp - llmemoryview.cpp - llmenucommands.cpp - llmimetypes.cpp - llmorphview.cpp - llmoveview.cpp - llmutelist.cpp - llnamebox.cpp - llnameeditor.cpp - llnamelistctrl.cpp - llnetmap.cpp - llnotify.cpp - lloverlaybar.cpp - llpanelaudioprefs.cpp - llpanelaudiovolume.cpp - llpanelavatar.cpp - llpanelclassified.cpp - llpanelcontents.cpp - llpaneldebug.cpp - llpaneldirbrowser.cpp - llpaneldirclassified.cpp - llpaneldirevents.cpp - llpaneldirfind.cpp - llpaneldirgroups.cpp - llpaneldirland.cpp - llpaneldirpeople.cpp - llpaneldirplaces.cpp - llpaneldirpopular.cpp - llpaneldisplay.cpp - llpanelevent.cpp - llpanelface.cpp - llpanelgeneral.cpp - llpanelgroup.cpp - llpanelgroupgeneral.cpp - llpanelgroupinvite.cpp - llpanelgrouplandmoney.cpp - llpanelgroupnotices.cpp - llpanelgrouproles.cpp - llpanelgroupvoting.cpp - llpanelinput.cpp - llpanelinventory.cpp - llpanelland.cpp - llpanellandaudio.cpp - llpanellandmedia.cpp - llpanellandobjects.cpp - llpanellandoptions.cpp - llpanellogin.cpp - llpanelmorph.cpp - llpanelmediahud.cpp - llpanelmsgs.cpp - llpanelnetwork.cpp - llpanelobject.cpp - llpanelpermissions.cpp - llpanelpick.cpp - llpanelplace.cpp - llpanelskins.cpp - llpanelvolume.cpp - llpanelweb.cpp - llparcelselection.cpp - llpatchvertexarray.cpp - llpolymesh.cpp - llpolymorph.cpp - llprefschat.cpp - llprefsim.cpp - llprefsvoice.cpp - llpreviewanim.cpp - llpreview.cpp - llpreviewgesture.cpp - llpreviewlandmark.cpp - llpreviewnotecard.cpp - llpreviewscript.cpp - llpreviewsound.cpp - llpreviewtexture.cpp - llproductinforequest.cpp - llprogressview.cpp - llregionposition.cpp - llremoteparcelrequest.cpp - llsavedsettingsglue.cpp - llselectmgr.cpp - llsky.cpp - llspatialpartition.cpp - llsprite.cpp - llsrv.cpp - llstartup.cpp - llstatbar.cpp - llstatgraph.cpp - llstatusbar.cpp - llstatview.cpp - llstylemap.cpp - llsurface.cpp - llsurfacepatch.cpp - lltexlayer.cpp - lltexturecache.cpp - lltexturectrl.cpp - lltexturefetch.cpp - lltextureinfo.cpp - lltextureinfodetails.cpp - lltexturestats.cpp - lltexturestatsuploader.cpp - lltextureview.cpp - lltoolbar.cpp - lltoolbrush.cpp - lltoolcomp.cpp - lltool.cpp - lltooldraganddrop.cpp - lltoolface.cpp - lltoolfocus.cpp - lltoolgrab.cpp - lltoolgun.cpp - lltoolindividual.cpp - lltoolmgr.cpp - lltoolmorph.cpp - lltoolobjpicker.cpp - lltoolpie.cpp - lltoolpipette.cpp - lltoolplacer.cpp - lltoolselect.cpp - lltoolselectland.cpp - lltoolselectrect.cpp - lltoolview.cpp - lltracker.cpp - lltrans.cpp - lltranslate.cpp - lluploaddialog.cpp - llurl.cpp - llurldispatcher.cpp - llurlhistory.cpp - llurlsimstring.cpp - llurlwhitelist.cpp - lluserauth.cpp - llvectorperfoptions.cpp - llvelocitybar.cpp - llviewchildren.cpp - llviewerassetstorage.cpp - llvieweraudio.cpp - llviewercamera.cpp - llviewercontrol.cpp - llviewerdisplay.cpp - llviewergenericmessage.cpp - llviewergesture.cpp - llviewerimage.cpp - llviewerimagelist.cpp - llviewerinventory.cpp - llviewerjointattachment.cpp - llviewerjoint.cpp - llviewerjointmesh.cpp - llviewerjointmesh_sse2.cpp - llviewerjointmesh_sse.cpp - llviewerjointmesh_vec.cpp - llviewerjoystick.cpp - llviewerkeyboard.cpp - llviewerlayer.cpp - llviewermedia.cpp - llviewermediafocus.cpp - llviewermedia_streamingaudio.cpp - llviewermenu.cpp - llviewermenufile.cpp - llviewermessage.cpp - llviewernetwork.cpp - llviewerobject.cpp - llviewerobjectlist.cpp - llviewerparcelmedia.cpp - llviewerparcelmediaautoplay.cpp - llviewerparcelmgr.cpp - llviewerparceloverlay.cpp - llviewerpartsim.cpp - llviewerpartsource.cpp - llviewerregion.cpp - llviewershadermgr.cpp - llviewerstats.cpp - llviewertexteditor.cpp - llviewertextureanim.cpp - llviewerthrottle.cpp - llviewervisualparam.cpp - llviewerwindow.cpp - llvlcomposition.cpp - llvlmanager.cpp - llvoavatar.cpp - llvoavatardefines.cpp - llvocache.cpp - llvoclouds.cpp - llvograss.cpp - llvoground.cpp - llvoiceclient.cpp - llvoiceremotectrl.cpp - llvoicevisualizer.cpp - llvoinventorylistener.cpp - llvopartgroup.cpp - llvosky.cpp - llvosurfacepatch.cpp - llvotextbubble.cpp - llvotree.cpp - llvovolume.cpp - llvowater.cpp - llvowlsky.cpp - llwatchdog.cpp - llwaterparammanager.cpp - llwaterparamset.cpp - llwearable.cpp - llwearablelist.cpp - llweb.cpp - llmediactrl.cpp - llwind.cpp - llwlanimator.cpp - llwldaycycle.cpp - llwlparammanager.cpp - llwlparamset.cpp - llworld.cpp - llworldmap.cpp - llworldmipmap.cpp - llmapresponders.cpp - llworldmapview.cpp - llxmlrpctransaction.cpp - noise.cpp - pipeline.cpp - scriptcounter.cpp - wlfPanel_AdvSettings.cpp - rlvhandler.cpp - rlvhelper.cpp - rlvcommon.cpp - rlvlocks.cpp - rlvinventory.cpp - rlvextensions.cpp - rlvfloaterbehaviour.cpp - rlvviewer2.cpp - shcommandhandler.cpp - ) - -# This gets renamed in the packaging step -set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING - "The name of the viewer executable to create.") - -if ((LINUX OR DARWIN) AND NOT DARWIN_PPC) - # We can't set these flags for Darwin, because they get passed to - # the PPC compiler. Ugh. - - set_source_files_properties( - llviewerjointmesh_sse.cpp - PROPERTIES COMPILE_FLAGS "-msse -mfpmath=sse" - ) - set_source_files_properties( - llviewerjointmesh_sse2.cpp - PROPERTIES COMPILE_FLAGS "-msse2 -mfpmath=sse" - ) -endif ((LINUX OR DARWIN) AND NOT DARWIN_PPC) - -set(viewer_HEADER_FILES - CMakeLists.txt - ViewerInstall.cmake - - llviewerobjectbackup.h - slfloatermediafilter.h - floaterlocalassetbrowse.h - aoremotectrl.h - floaterao.h - floatervoicelicense.h - cofmgr.h - ascentdaycyclemanager.h - ascentfloatercontactgroups.h - ascentprefssys.h - ascentprefsvan.h - emerald.h - emeraldboobutils.h - dofloaterhex.h - dohexeditor.h - floatersculptpreview.h - hbfloatergrouptitles.h - hgfloatertexteditor.h - hippogridmanager.h - hippofloaterxml.h - hippolimits.h - hipporestrequest.h - hippopanelgrids.h - jcfloaterareasearch.h - chatbar_as_cmdline.h - qtoolalign.h - llagent.h - llagentaccess.h - llagentdata.h - llagentlanguage.h - llagentpilot.h - llanimstatelabels.h - llappearance.h - llappviewer.h - llassetconverter.h - llassetuploadresponders.h - llassetuploadqueue.h - llattachmentsmgr.h - llaudiosourcevo.h - llbbox.h - llbox.h - llbuildnewviewsscheduler.h - llcallbacklist.h - llcallingcard.h - llcaphttpsender.h - llchatbar.h - llclassifiedinfo.h - llclassifiedstatsresponder.h - llcloud.h - llcolorscheme.h - llcolorswatch.h - llcommandhandler.h - llcommandlineparser.h - llcompass.h - llcompilequeue.h - llconfirmationmanager.h - llconsole.h - llcontainerview.h - llcurrencyuimanager.h - llcylinder.h - lldebugmessagebox.h - lldebugview.h - lldelayedgestureerror.h - lldirpicker.h - lldrawable.h - lldrawpool.h - lldrawpoolalpha.h - lldrawpoolavatar.h - lldrawpoolbump.h - lldrawpoolclouds.h - lldrawpoolground.h - lldrawpoolsimple.h - lldrawpoolsky.h - lldrawpoolterrain.h - lldrawpooltree.h - lldrawpoolwater.h - lldrawpoolwlsky.h - lldriverparam.h - lldynamictexture.h - llemote.h - lleventinfo.h - lleventnotifier.h - lleventpoll.h - llface.h - llfasttimerview.h - llfeaturemanager.h - llfilepicker.h - llfirstuse.h - llflexibleobject.h - llfloaterabout.h - llfloateractivespeakers.h - llfloateranimpreview.h - llfloaterauction.h - llfloateravatarinfo.h - llfloateravatarlist.h - llfloateravatarpicker.h - llfloateravatartextures.h - llfloaterbeacons.h - llfloaterblacklist.h - llviewerdisplayname.h - llfloaterdisplayname.h - llfloaterbuildoptions.h - llfloaterbulkpermission.h - llfloaterbump.h - llfloaterbuy.h - llfloaterbuycontents.h - llfloaterbuycurrency.h - llfloaterbuyland.h - llfloatercamera.h - llfloaterchat.h - llfloaterchatterbox.h - llfloaterclassified.h - llfloatercolorpicker.h - llfloatercustomize.h - llfloaterdaycycle.h - llfloaterdickdongs.h - llfloaterdirectory.h - llfloatereditui.h - llfloaterenvsettings.h - llfloaterexploreanimations.h - llfloaterexploresounds.h - llfloaterevent.h - llfloaterfonttest.h - llfloaterfriends.h - llfloatergesture.h - llfloatergodtools.h - llfloatergroupinfo.h - llfloatergroupinvite.h - llfloatergroups.h - llfloaterhandler.h - llfloaterhardwaresettings.h - llfloaterhtmlcurrency.h - llfloatermediabrowser.h - llfloaterhtmlsimple.h - llfloaterhud.h - llfloaterimagepreview.h - llfloaterinspect.h - llfloaterjoystick.h - llfloaterlagmeter.h - llfloaterland.h - llfloaterlandholdings.h - llfloaterlandmark.h - llfloatermap.h - llfloatermemleak.h - llfloatermessagelog.h - llfloatermute.h - llfloaternamedesc.h - llfloaternewim.h - llfloaternotificationsconsole.h - llfloaterobjectiminfo.h - llfloateropenobject.h - llfloaterparcel.h - llfloaterpermissionsmgr.h - llfloaterpostcard.h - llfloaterpostprocess.h - llfloaterpreference.h - llfloaterperms.h - llfloaterproperties.h - llfloaterregioninfo.h - llfloaterreporter.h - llfloaterscriptdebug.h - llfloatersellland.h - llfloatersettingsdebug.h - llfloatersnapshot.h - llfloaterstats.h - llfloatertelehub.h - llfloaterteleport.h - llfloaterteleporthistory.h - llfloatertest.h - llfloatertools.h - llfloatertopobjects.h - llfloatertos.h - llfloaterurldisplay.h - llfloaterurlentry.h - llfloatervfs.h - llfloatervfsexplorer.h - llfloatervoicedevicesettings.h - llfloaterwater.h - llfloaterwindlight.h - llfloaterworldmap.h - llfolderview.h - llfollowcam.h - llframestats.h - llframestatview.h - llgesturemgr.h - llgivemoney.h - llgroupmgr.h - llgroupnotify.h - llhomelocationresponder.h - llhoverview.h - llhudeffect.h - llhudeffectbeam.h - llhudeffectlookat.h - llhudeffectpointat.h - llhudeffecttrail.h - llhudicon.h - llhudmanager.h - llhudobject.h - llhudrender.h - llhudtext.h - llhudview.h - llimpanel.h - llimview.h - llinventorybackup.h - llinventorybridge.h - llinventoryclipboard.h - llinventorymodel.h - llinventoryview.h - lljoystickbutton.h - lllandmarklist.h - lllightconstants.h - lllocalinventory.h - lllogchat.h - llloginhandler.h - llsavedlogins.h - llmanip.h - llmaniprotate.h - llmanipscale.h - llmaniptranslate.h - llmediaremotectrl.h - llmemoryview.h - llmenucommands.h - llmimetypes.h - llmorphview.h - llmoveview.h - llmutelist.h - llnamebox.h - llnameeditor.h - llnamelistctrl.h - llnetmap.h - llnotify.h - lloverlaybar.h - llpanelaudioprefs.h - llpanelaudiovolume.h - llpanelavatar.h - llpanelclassified.h - llpanelcontents.h - llpaneldebug.h - llpaneldirbrowser.h - llpaneldirclassified.h - llpaneldirevents.h - llpaneldirfind.h - llpaneldirgroups.h - llpaneldirland.h - llpaneldirpeople.h - llpaneldirplaces.h - llpaneldirpopular.h - llpaneldisplay.h - llpanelevent.h - llpanelface.h - llpanelgeneral.h - llpanelgroup.h - llpanelgroupgeneral.h - llpanelgroupinvite.h - llpanelgrouplandmoney.h - llpanelgroupnotices.h - llpanelgrouproles.h - llpanelgroupvoting.h - llpanelinput.h - llpanelinventory.h - llpanelland.h - llpanellandaudio.h - llpanellandmedia.h - llpanellandobjects.h - llpanellandoptions.h - llpanelLCD.h - llpanellogin.h - llpanelmorph.h - llpanelmediahud.h - llpanelmsgs.h - llpanelnetwork.h - llpanelobject.h - llpanelpermissions.h - llpanelpick.h - llpanelplace.h - llpanelskins.h - llpanelvolume.h - llpanelweb.h - llparcelselection.h - llpatchvertexarray.h - llpolymesh.h - llpolymorph.h - llprefschat.h - llprefsim.h - llprefsvoice.h - llpreview.h - llpreviewanim.h - llpreviewgesture.h - llpreviewlandmark.h - llpreviewnotecard.h - llpreviewscript.h - llpreviewsound.h - llpreviewtexture.h - llproductinforequest.h - llprogressview.h - llregionposition.h - llremoteparcelrequest.h - llresourcedata.h - llsavedsettingsglue.h - llselectmgr.h - llsky.h - llspatialpartition.h - llsprite.h - llsrv.h - llstartup.h - llstatbar.h - llstatgraph.h - llstatusbar.h - llstatview.h - llstylemap.h - llsurface.h - llsurfacepatch.h - lltable.h - lltexlayer.h - lltexturecache.h - lltexturectrl.h - lltexturefetch.h - lltextureinfo.h - lltextureinfodetails.h - lltexturestats.h - lltexturestatsuploader.h - lltextureview.h - lltool.h - lltoolbar.h - lltoolbrush.h - lltoolcomp.h - lltooldraganddrop.h - lltoolface.h - lltoolfocus.h - lltoolgrab.h - lltoolgun.h - lltoolindividual.h - lltoolmgr.h - lltoolmorph.h - lltoolobjpicker.h - lltoolpie.h - lltoolpipette.h - lltoolplacer.h - lltoolselect.h - lltoolselectland.h - lltoolselectrect.h - lltoolview.h - lltracker.h - lltrans.h - lltranslate.h - lluiconstants.h - lluploaddialog.h - llurl.h - llurldispatcher.h - llurlhistory.h - llurlsimstring.h - llurlwhitelist.h - lluserauth.h - llvectorperfoptions.h - llvelocitybar.h - llviewchildren.h - llviewerassetstorage.h - llvieweraudio.h - llviewerbuild.h - llviewercamera.h - llviewercontrol.h - llviewerdisplay.h - llviewergenericmessage.h - llviewergesture.h - llviewerimage.h - llviewerimagelist.h - llviewerinventory.h - llviewerjoint.h - llviewerjointattachment.h - llviewerjointmesh.h - llviewerjoystick.h - llviewerkeyboard.h - llviewerlayer.h - llviewermedia.h - llviewermediaobserver.h - llviewermediafocus.h - llviewermenu.h - llviewermenufile.h - llviewermessage.h - llviewernetwork.h - llviewerobject.h - llviewerobjectlist.h - llviewerparcelmedia.h - llviewerparcelmediaautoplay.h - llviewerparcelmgr.h - llviewerparceloverlay.h - llviewerpartsim.h - llviewerpartsource.h - llviewerprecompiledheaders.h - llviewerregion.h - llviewershadermgr.h - llviewerstats.h - llviewertexteditor.h - llviewertextureanim.h - llviewerthrottle.h - llviewervisualparam.h - llviewerwindow.h - llvlcomposition.h - llvlmanager.h - llvoavatar.h - llvoavatardefines.h - llvocache.h - llvoclouds.h - llvograss.h - llvoground.h - llvoiceclient.h - llvoiceremotectrl.h - llvoicevisualizer.h - llvoinventorylistener.h - llvopartgroup.h - llvosky.h - llvosurfacepatch.h - llvotextbubble.h - llvotree.h - llvotreenew.h - llvovolume.h - llvowater.h - llvowlsky.h - llwatchdog.h - llwaterparammanager.h - llwaterparamset.h - llwearable.h - llwearablelist.h - llweb.h - llmediactrl.h - llwind.h - llwindebug.h - llwlanimator.h - llwldaycycle.h - llwlparammanager.h - llwlparamset.h - llworld.h - llworldmap.h - llworldmipmap.h - llmapresponders.h - llworldmapview.h - llxmlrpctransaction.h - macmain.h - noise.h - pipeline.h - randgauss.h - scriptcounter.h - VertexCache.h - VorbisFramework.h - wlfPanel_AdvSettings.h - rlvdefines.h - rlvhandler.h - rlvhelper.h - rlvcommon.h - rlvlocks.h - rlvinventory.h - rlvextensions.h - rlvfloaterbehaviour.h - rlvviewer2.h - shcommandhandler.h - ) - -source_group("CMake Rules" FILES ViewerInstall.cmake) - -if (DARWIN) - LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp) - - find_library(AGL_LIBRARY AGL) - find_library(APPKIT_LIBRARY AppKit) - find_library(COCOA_LIBRARY Cocoa) - find_library(IOKIT_LIBRARY IOKit) - - set(viewer_LIBRARIES - ${COCOA_LIBRARY} - ${AGL_LIBRARY} - ${IOKIT_LIBRARY} - ) - - # Add resource files to the project. - set(viewer_RESOURCE_FILES - ${VIEWER_BRANDING_ID}.icns - macview.r - gpu_table.txt - Info-${VIEWER_BRANDING_NAME_CAMELCASE}.plist - SecondLife.nib/ - # CMake doesn't seem to support Xcode language variants well just yet - English.lproj/InfoPlist.strings - English.lproj/language.txt - German.lproj/language.txt - Japanese.lproj/language.txt - Korean.lproj/language.txt - ) - set_source_files_properties( - ${viewer_RESOURCE_FILES} - PROPERTIES - HEADER_FILE_ONLY TRUE - #MACOSX_PACKAGE_LOCATION Resources #don't do this! this tells cmake to copy the files. - ) - SOURCE_GROUP("Resources" FILES ${viewer_RESOURCE_FILES}) - list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) -endif (DARWIN) - -if (LINUX) - LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) - LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -luuid -lrt -laprutil-1 -lfontconfig -Wl,--as-needed") - - set(viewer_LIBRARIES - Xinerama - ) -endif (LINUX) - -if (WINDOWS) - list(APPEND viewer_SOURCE_FILES - llappviewerwin32.cpp - llwindebug.cpp - ) - - list(APPEND viewer_HEADER_FILES - llappviewerwin32.h - llwindebug.h - ) - - # precompiled header configuration - # llviewerprecompiledheaders.cpp generates - # the .pch file. - # All sources added to viewer_SOURCE_FILES - # at this point use it. - set_source_files_properties(llviewerprecompiledheaders.cpp - PROPERTIES - COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" - ) - foreach( src_file ${viewer_SOURCE_FILES} ) - set_source_files_properties( - ${src_file} - PROPERTIES - COMPILE_FLAGS "/Yullviewerprecompiledheaders.h" - ) - endforeach( src_file ${viewer_SOURCE_FILES} ) - list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp) - - # Add resource files to the project. - # viewerRes.rc is the only buildable file, but - # the rest are all dependencies of it. - set(viewer_RESOURCE_FILES - ${ARTWORK_DIR}/res/arrow.cur - ${ARTWORK_DIR}/res/arrowcop.cur - ${ARTWORK_DIR}/res/arrowcopmulti.cur - ${ARTWORK_DIR}/res/arrowdrag.cur - ${ARTWORK_DIR}/res/circleandline.cur - ${ARTWORK_DIR}/res/icon1.ico - ${ARTWORK_DIR}/res/llarrow.cur - ${ARTWORK_DIR}/res/llarrowdrag.cur - ${ARTWORK_DIR}/res/llarrowdragmulti.cur - ${ARTWORK_DIR}/res/llarrowlocked.cur - ${ARTWORK_DIR}/res/llgrablocked.cur - ${ARTWORK_DIR}/res/llno.cur - ${ARTWORK_DIR}/res/llnolocked.cur - ${ARTWORK_DIR}/res/lltoolcamera.cur - ${ARTWORK_DIR}/res/lltoolcreate.cur - ${ARTWORK_DIR}/res/lltoolfocus.cur - ${ARTWORK_DIR}/res/lltoolgrab.cur - ${ARTWORK_DIR}/res/lltoolland.cur - ${ARTWORK_DIR}/res/lltoolpan.cur - ${ARTWORK_DIR}/res/lltoolpipette.cur - ${ARTWORK_DIR}/res/lltoolrotate.cur - ${ARTWORK_DIR}/res/lltoolscale.cur - ${ARTWORK_DIR}/res/lltooltranslate.cur - ${ARTWORK_DIR}/res/lltoolzoomin.cur - ${ARTWORK_DIR}/res/lltoolzoomout.cur - ${ARTWORK_DIR}/res/snowglobe_icon.BMP - ${ARTWORK_DIR}/res/snowglobe_icon.ico - ${ARTWORK_DIR}/res/resource.h - ${ARTWORK_DIR}/res/toolbuy.cur - ${ARTWORK_DIR}/res/toolopen.cur - ${ARTWORK_DIR}/res/toolpay.cur - ${ARTWORK_DIR}/res/toolpickobject.cur - ${ARTWORK_DIR}/res/toolpickobject2.cur - ${ARTWORK_DIR}/res/toolpickobject3.cur - ${ARTWORK_DIR}/res/toolpipette.cur - ${ARTWORK_DIR}/res/toolsit.cur - ) - - set_source_files_properties(${viewer_RESOURCE_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - - if(NOT ARTWORK_IN_SOURCE) - # The resource compiler needs to find resources here. - include_directories(${ARTWORK_DIR}/res) - endif(NOT ARTWORK_IN_SOURCE) - - if (MSVC71 OR MSVC80 AND NOT VISTA_ICON) - set(viewer_RESOURCE_FILES - res/resource.h - res/viewerRes_bc.rc - ${viewer_RESOURCE_FILES} - ) - else (MSVC71 OR MSVC80 AND NOT VISTA_ICON) - set(viewer_RESOURCE_FILES - res/resource.h - res/viewerRes.rc - ${viewer_RESOURCE_FILES} - ) - endif (MSVC71 OR MSVC80 AND NOT VISTA_ICON) - - SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES}) - - list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) - - find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR}) - find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR}) - mark_as_advanced( - DINPUT_LIBRARY - DXGUID_LIBRARY - ) - - set(viewer_LIBRARIES - advapi32 - comdlg32 - ${DINPUT_LIBRARY} - ${DXGUID_LIBRARY} - fmodvc - gdi32 - kernel32 - odbc32 - odbccp32 - ole32 - oleaut32 - opengl32 - shell32 - user32 - Vfw32 - winspool - ) - - find_library(INTEL_MEMOPS_LIBRARY - NAMES ll_intel_memops - PATHS - optimized ${ARCH_PREBUILT_DIRS_RELEASE} - debug ${ARCH_PREBUILT_DIRS_DEBUG} - ) - mark_as_advanced(INTEL_MEMOPS_LIBRARY) - - if (INTEL_MEMOPS_LIBRARY) - list(APPEND viewer_LIBRARIES ${INTEL_MEMOPS_LIBRARY}) - endif (INTEL_MEMOPS_LIBRARY) - - use_prebuilt_binary(dbghelp) -endif (WINDOWS) - -# Add the xui files. This is handy for searching for xui elements -# from within the IDE. - -file(GLOB viewer_XUI_FILE_GLOB_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en-us/*.xml) - -set(viewer_XUI_FILES - - ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/colors.xml - ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/colors_base.xml - - - - ) - -list(APPEND viewer_XUI_FILES ${viewer_XUI_FILE_GLOB_LIST}) -list(SORT viewer_XUI_FILES) - -source_group("XUI Files" FILES ${viewer_XUI_FILES}) - -set_source_files_properties(${viewer_XUI_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES}) - -set(viewer_APPSETTINGS_FILES - app_settings/anim.ini - app_settings/cmd_line.xml - app_settings/grass.xml - app_settings/high_graphics.xml - app_settings/keys.ini - app_settings/keywords.ini - app_settings/logcontrol.xml - app_settings/low_graphics.xml - app_settings/mid_graphics.xml - app_settings/settings.xml - app_settings/settings_crash_behavior.xml - app_settings/settings_files.xml - app_settings/settings_per_account.xml - app_settings/std_bump.ini - app_settings/trees.xml - app_settings/ultra_graphics.xml - app_settings/viewerart.xml - ${CMAKE_SOURCE_DIR}/../etc/message.xml - ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg - ) - -source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES}) - -set_source_files_properties(${viewer_APPSETTINGS_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -list(APPEND viewer_SOURCE_FILES ${viewer_APPSETTINGS_FILES}) - -if(ARTWORK_EXISTS) - set(viewer_CHARACTER_FILES - ${ARTWORK_DIR}/character/attentions.xml - ${ARTWORK_DIR}/character/attentionsN.xml - ${ARTWORK_DIR}/character/avatar_lad.xml - ${ARTWORK_DIR}/character/avatar_skeleton.xml - ${ARTWORK_DIR}/character/genepool.xml - ) - - source_group("Character File" FILES ${viewer_CHARACTER_FILES}) - - set_source_files_properties(${viewer_CHARACTER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - - list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) -endif(ARTWORK_EXISTS) - -if (WINDOWS) - file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi) - - source_group("Installer Files" FILES ${viewer_INSTALLER_FILES}) - - set_source_files_properties(${viewer_INSTALLER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - - list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) -endif (WINDOWS) - -if (OPENAL) - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_OPENAL") -endif (OPENAL) - -if (FMOD) - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMOD") - - if (NOT WINDOWS) - set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp) - add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES}) - set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY}) - if (DARWIN) - list(APPEND fmodwrapper_needed_LIBRARIES ${CARBON_LIBRARY}) - set_target_properties( - fmodwrapper - PROPERTIES - BUILD_WITH_INSTALL_RPATH 1 - INSTALL_NAME_DIR "@executable_path/../Resources" - LINK_FLAGS "-unexported_symbols_list \"${CMAKE_CURRENT_SOURCE_DIR}/fmod_hidden_symbols.exp\"" - ) - endif (DARWIN) - set(FMODWRAPPER_LIBRARY fmodwrapper) - target_link_libraries(fmodwrapper ${fmodwrapper_needed_LIBRARIES}) - endif (NOT WINDOWS) -endif (FMOD) - -set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") - -list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) - -set_source_files_properties(${viewer_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -add_executable(${VIEWER_BINARY_NAME} - WIN32 - MACOSX_BUNDLE - ${viewer_SOURCE_FILES} - ) - -if (!DISABLE_TEMPLATE_CHECK) - check_message_template(${VIEWER_BINARY_NAME}) -endif (!DISABLE_TEMPLATE_CHECK) - -if (LLKDU_LIBRARY) - add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY}) -endif (LLKDU_LIBRARY) - -# We package by default on Linux so we can run from newview/packaged. -if (LINUX) - set(PACKAGE_DEFAULT ON) -else (LINUX) - set(PACKAGE_DEFAULT OFF) -endif (LINUX) -set(PACKAGE ${PACKAGE_DEFAULT} CACHE BOOL - "Add a package target that builds an installer package.") - -if (WINDOWS) - if(MSVC71) - set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map /MAPINFO:LINES") - else(MSVC71) - set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map") - endif(MSVC71) - - set_target_properties(${VIEWER_BINARY_NAME} - PROPERTIES - LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${GOOGLE_PERFTOOLS_LINKER_FLAGS}" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" - LINK_FLAGS_RELEASE ${release_flags} - ) - - # sets the 'working directory' for debugging from visual studio. - if (NOT UNATTENDED) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe - ARGS - --solution - ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln - --workingdir - ${VIEWER_BINARY_NAME} - ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging." - ) - endif (NOT UNATTENDED) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg - COMMENT "Copying message_template.msg to the runtime folder." - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml - COMMENT "Copying message.xml to the runtime folder." - ) - - add_dependencies(${VIEWER_BINARY_NAME} copy_win_libs) - - if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) - add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) - endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) - - add_custom_command( - OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --configuration=${CMAKE_CFG_INTDIR} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --branding_id=${VIEWER_BRANDING_ID} - --grid=${GRID} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat - DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) - - if (PACKAGE) - add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat) - add_dependencies(package windows-updater windows-crash-logger) - endif (PACKAGE) -endif (WINDOWS) - -target_link_libraries(${VIEWER_BINARY_NAME} - ${GOOGLE_PERFTOOLS_LIBRARIES} - ${LLAUDIO_LIBRARIES} - ${LLCHARACTER_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLIMAGEJ2COJ_LIBRARIES} - ${LLINVENTORY_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLPLUGIN_LIBRARIES} - ${LLPRIMITIVE_LIBRARIES} - ${LLRENDER_LIBRARIES} - ${FREETYPE_LIBRARIES} - ${LLUI_LIBRARIES} - ${LLVFS_LIBRARIES} - ${LLWINDOW_LIBRARIES} - ${LLXML_LIBRARIES} - ${LSCRIPT_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${NDOF_LIBRARY} - ${viewer_LIBRARIES} - ${BOOST_FILESYSTEM_LIBRARY} - ${BOOST_PROGRAM_OPTIONS_LIBRARY} - ${BOOST_REGEX_LIBRARY} - ${BOOST_SIGNALS_LIBRARY} - ${BOOST_SYSTEM_LIBRARY} - ${DBUSGLIB_LIBRARIES} - ${OPENGL_LIBRARIES} - ${FMODWRAPPER_LIBRARY} - ${OPENGL_LIBRARIES} - ${JSONCPP_LIBRARIES} - ${SDL_LIBRARY} - ${SMARTHEAP_LIBRARY} - ${UI_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${XMLRPCEPI_LIBRARIES} - ${ELFIO_LIBRARIES} - ) - -if (LINUX) - add_custom_command( - OUTPUT secondlife-stripped - COMMAND strip - ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME} - DEPENDS ${VIEWER_BINARY_NAME} - ) - - set(product ${VIEWER_BRANDING_NAME_CAMELCASE}-${ARCH}-${viewer_VERSION}) - - add_custom_command( - OUTPUT ${product}.tar.bz2 - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --branding_id=${VIEWER_BRANDING_ID} - --installer_name=${product} - --arch=${ARCH} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - --buildtype=${CMAKE_BUILD_TYPE} - DEPENDS secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit) - - if (PACKAGE) - add_custom_target(package ALL DEPENDS ${product}.tar.bz2) - add_dependencies(package linux-crash-logger-strip-target) - endif (PACKAGE) -endif (LINUX) - -if (DARWIN) - set(product ${VIEWER_BRANDING_NAME}) - set_target_properties( - ${VIEWER_BINARY_NAME} - PROPERTIES - OUTPUT_NAME "${product}" - MACOSX_BUNDLE_INFO_STRING "A stable third-party Second Life viewer." - MACOSX_BUNDLE_ICON_FILE "${VIEWER_BRANDING_ID}.icns" - MACOSX_BUNDLE_GUI_IDENTIFIER "${VIEWER_BRANDING_NAME}" - MACOSX_BUNDLE_LONG_VERSION_STRING "${viewer_VERSION}" - MACOSX_BUNDLE_BUNDLE_NAME "${VIEWER_BRANDING_NAME}" - MACOSX_BUNDLE_SHORT_VERSION_STRING "${viewer_VERSION}" - MACOSX_BUNDLE_BUNDLE_VERSION "${viewer_VERSION}" - MACOSX_BUNDLE_COPYRIGHT "Copyright 2010 Balseraph Software Group" - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --actions=copy - --configuration=${CMAKE_CFG_INTDIR} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --branding_id=${VIEWER_BRANDING_ID} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app - --buildtype=${CMAKE_BUILD_TYPE} - DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) - - if (PACKAGE) - add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) - add_dependencies(package mac-updater mac-crash-logger) - - add_custom_command( - TARGET package POST_BUILD - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --configuration=${CMAKE_CFG_INTDIR} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --branding_id=${VIEWER_BRANDING_ID} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - --buildtype=${CMAKE_BUILD_TYPE} - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - - add_custom_command( - TARGET package POST_BUILD - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --configuration=${CMAKE_CFG_INTDIR} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --branding_id=${VIEWER_BRANDING_ID} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - --buildtype=${CMAKE_BUILD_TYPE} - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - endif (PACKAGE) -endif (DARWIN) - -if (INSTALL) - include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake) -endif (INSTALL) - -# Add tests -if (LL_TESTS) - ADD_VIEWER_BUILD_TEST(llagentaccess viewer) - #ADD_VIEWER_BUILD_TEST(llworldmap viewer) - #ADD_VIEWER_BUILD_TEST(llworldmipmap viewer) - ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) - ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) - ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer) - #ADD_VIEWER_COMM_BUILD_TEST(lltranslate viewer "") -endif (LL_TESTS) - -# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py -if (WINDOWS) - - #~ get_target_property(BUILT_LLCOMMON llcommon LOCATION) - #~ add_custom_command( - #~ TARGET ${VIEWER_BINARY_NAME} POST_BUILD - #~ COMMAND ${CMAKE_COMMAND} - #~ ARGS - #~ -E - #~ copy_if_different - #~ ${BUILT_LLCOMMON} - #~ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - #~ COMMENT "Copying llcommon.dll to the runtime folder." - #~ ) - - get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_SLPLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - COMMENT "Copying SLPlugin executable to the runtime folder." - ) - - get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_WEBKIT_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying WebKit Plugin to the runtime folder." - ) - - get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_QUICKTIME_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying Quicktime Plugin to the runtime folder." - ) - - # Copying the mime_types.xml file to app_settings - set(mime_types_source "${CMAKE_SOURCE_DIR}/newview/skins/default/xui/en-us") - set(mime_types_dest "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings") - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${mime_types_source}/mime_types_windows.xml - ${mime_types_dest}/mime_types.xml - COMMENT "Copying mime_types_windows.xml to mime_types.xml." - ) - -endif (WINDOWS) - -if (DARWIN) -# Don't do this here -- it's taken care of by viewer_manifest.py -# add_custom_command(TARGET ${VIEWER_BINARY_NAME} POST_BUILD -# COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/ -# DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib -# ) -endif (DARWIN) +# -*- cmake -*- + +project(viewer) + +include(00-Common) +include(Boost) +include(DBusGlib) +include(DirectX) +include(ELFIO) +include(FMOD) +include(OPENAL) +include(HUNSPELL) +include(FindOpenGL) +include(JsonCpp) +include(LLAddBuildTest) +include(LLAudio) +include(LLCharacter) +include(LLCommon) +include(LLImage) +include(LLImageJ2COJ) +include(LLInventory) +include(LLMath) +include(LLMessage) +include(LLPlugin) +include(LLPrimitive) +include(LLRender) +include(LLUI) +include(LLVFS) +include(LLWindow) +include(LLXML) +include(LScript) +include(Linking) +include(NDOF) +include(GooglePerfTools) +include(TemplateCheck) +include(UI) +include(LLKDU) +include(ViewerMiscLibs) +include(ViewerArtwork.cmake) + +if (WINDOWS) + include(CopyWinLibs) +endif (WINDOWS) + +include_directories( + ${DBUSGLIB_INCLUDE_DIRS} + ${HUNSPELL_INCLUDE_DIR} + ${ELFIO_INCLUDE_DIR} + ${JSONCPP_INCLUDE_DIRS} + ${LLAUDIO_INCLUDE_DIRS} + ${LLCHARACTER_INCLUDE_DIRS} + ${LLCOMMON_INCLUDE_DIRS} + ${LLIMAGE_INCLUDE_DIRS} + ${LLINVENTORY_INCLUDE_DIRS} + ${LLMATH_INCLUDE_DIRS} + ${LLMESSAGE_INCLUDE_DIRS} + ${LLPLUGIN_INCLUDE_DIRS} + ${LLPRIMITIVE_INCLUDE_DIRS} + ${LLRENDER_INCLUDE_DIRS} + ${LLUI_INCLUDE_DIRS} + ${LLVFS_INCLUDE_DIRS} + ${LLWINDOW_INCLUDE_DIRS} + ${LLXML_INCLUDE_DIRS} + ${LSCRIPT_INCLUDE_DIRS} + ${LSCRIPT_INCLUDE_DIRS}/lscript_compile + ) + +set(viewer_SOURCE_FILES + llviewerobjectbackup.cpp + slfloatermediafilter.cpp + floaterlocalassetbrowse.cpp + aoremotectrl.cpp + lgghunspell_wrapper.cpp + lggdicdownload.cpp + floaterao.cpp + floatervoicelicense.cpp + cofmgr.cpp + ascentdaycyclemanager.cpp + ascentfloatercontactgroups.cpp + ascentprefssys.cpp + ascentprefsvan.cpp + dhparam.cpp + dsaparam.cpp + emerald.cpp + emeraldboobutils.cpp + dofloaterhex.cpp + dohexeditor.cpp + floatersculptpreview.cpp + hbfloatergrouptitles.cpp + hgfloatertexteditor.cpp + hippogridmanager.cpp + hippofloaterxml.cpp + hippolimits.cpp + hipporestrequest.cpp + hippopanelgrids.cpp + jcfloaterareasearch.cpp + chatbar_as_cmdline.cpp + qtoolalign.cpp + llagent.cpp + llagentaccess.cpp + llagentdata.cpp + llagentlanguage.cpp + llagentpilot.cpp + llanimstatelabels.cpp + llappviewer.cpp + llassetconverter.cpp + llassetuploadresponders.cpp + llassetuploadqueue.cpp + llattachmentsmgr.cpp + llaudiosourcevo.cpp + llbbox.cpp + llbox.cpp + llbuildnewviewsscheduler.cpp + llcallbacklist.cpp + llcallingcard.cpp + llcaphttpsender.cpp + llchatbar.cpp + llclassifiedinfo.cpp + llclassifiedstatsresponder.cpp + llcloud.cpp + llcolorscheme.cpp + llcolorswatch.cpp + llcommandhandler.cpp + llcommandlineparser.cpp + llcompass.cpp + llcompilequeue.cpp + llconfirmationmanager.cpp + llconsole.cpp + llcontainerview.cpp + llcurrencyuimanager.cpp + llcylinder.cpp + lldebugmessagebox.cpp + lldebugview.cpp + lldelayedgestureerror.cpp + lldirpicker.cpp + lldrawable.cpp + lldrawpoolalpha.cpp + lldrawpoolavatar.cpp + lldrawpoolbump.cpp + lldrawpool.cpp + lldrawpoolground.cpp + lldrawpoolsimple.cpp + lldrawpoolsky.cpp + lldrawpoolterrain.cpp + lldrawpooltree.cpp + lldrawpoolwater.cpp + lldrawpoolwlsky.cpp + lldriverparam.cpp + lldynamictexture.cpp + llemote.cpp + lleventinfo.cpp + lleventnotifier.cpp + lleventpoll.cpp + llface.cpp + llfasttimerview.cpp + llfeaturemanager.cpp + llfilepicker.cpp + llfirstuse.cpp + llflexibleobject.cpp + llfloaterabout.cpp + llfloateractivespeakers.cpp + llfloateranimpreview.cpp + llfloaterauction.cpp + llfloateravatarinfo.cpp + llfloateravatarlist.cpp + llfloateravatarpicker.cpp + llfloateravatartextures.cpp + llfloaterbeacons.cpp + llfloaterblacklist.cpp + llviewerdisplayname.cpp + llfloaterdisplayname.cpp + llfloaterbuildoptions.cpp + llfloaterbulkpermission.cpp + llfloaterbump.cpp + llfloaterbuycontents.cpp + llfloaterbuy.cpp + llfloaterbuycurrency.cpp + llfloaterbuyland.cpp + llfloatercamera.cpp + llfloaterchat.cpp + llfloaterchatterbox.cpp + llfloaterclassified.cpp + llfloatercolorpicker.cpp + llfloatercustomize.cpp + llfloaterdaycycle.cpp + llfloaterdickdongs.cpp + llfloaterdirectory.cpp + llfloatereditui.cpp + llfloaterenvsettings.cpp + llfloaterevent.cpp + llfloaterexploreanimations.cpp + llfloaterexploresounds.cpp + llfloaterfriends.cpp + llfloaterfonttest.cpp + llfloatergesture.cpp + llfloatergodtools.cpp + llfloatergroupinfo.cpp + llfloatergroupinvite.cpp + llfloatergroups.cpp + llfloaterhandler.cpp + llfloaterhardwaresettings.cpp + llfloaterhtmlcurrency.cpp + llfloatermediabrowser.cpp + llfloaterhtmlsimple.cpp + llfloaterhud.cpp + llfloaterimagepreview.cpp + llfloaterinspect.cpp + llfloaterjoystick.cpp + llfloaterlagmeter.cpp + llfloaterland.cpp + llfloaterlandholdings.cpp + llfloaterlandmark.cpp + llfloatermap.cpp + llfloatermemleak.cpp + llfloatermessagelog.cpp + llfloatermute.cpp + llfloaternamedesc.cpp + llfloaternewim.cpp + llfloaternotificationsconsole.cpp + llfloaterobjectiminfo.cpp + llfloateropenobject.cpp + llfloaterparcel.cpp + llfloaterpermissionsmgr.cpp + llfloaterperms.cpp + llfloaterpostcard.cpp + llfloaterpostprocess.cpp + llfloaterpreference.cpp + llfloaterproperties.cpp + llfloaterregioninfo.cpp + llfloaterreporter.cpp + llfloaterscriptdebug.cpp + llfloatersellland.cpp + llfloatersettingsdebug.cpp + llfloatersnapshot.cpp + llfloaterstats.cpp + llfloatertelehub.cpp + llfloaterteleport.cpp + llfloaterteleporthistory.cpp + llfloatertest.cpp + llfloatertools.cpp + llfloatertopobjects.cpp + llfloatertos.cpp + llfloaterurldisplay.cpp + llfloaterurlentry.cpp + llfloatervfs.cpp + llfloatervfsexplorer.cpp + llfloatervoicedevicesettings.cpp + llfloaterwater.cpp + llfloaterwindlight.cpp + llfloaterworldmap.cpp + llfolderview.cpp + llfollowcam.cpp + llframestats.cpp + llframestatview.cpp + llgesturemgr.cpp + llgivemoney.cpp + llglsandbox.cpp + llgroupmgr.cpp + llgroupnotify.cpp + llhomelocationresponder.cpp + llhoverview.cpp + llhudeffectbeam.cpp + llhudeffect.cpp + llhudeffectlookat.cpp + llhudeffectpointat.cpp + llhudeffecttrail.cpp + llhudicon.cpp + llhudmanager.cpp + llhudobject.cpp + llhudrender.cpp + llhudtext.cpp + llhudview.cpp + llimpanel.cpp + llimview.cpp + llinventoryactions.cpp + llinventorybackup.cpp + llinventorybridge.cpp + llinventoryclipboard.cpp + llinventorymodel.cpp + llinventoryview.cpp + lljoystickbutton.cpp + lllandmarklist.cpp + lllocalinventory.cpp + lllogchat.cpp + llloginhandler.cpp + llsavedlogins.cpp + llmanip.cpp + llmaniprotate.cpp + llmanipscale.cpp + llmaniptranslate.cpp + llmediaremotectrl.cpp + llmemoryview.cpp + llmenucommands.cpp + llmimetypes.cpp + llmorphview.cpp + llmoveview.cpp + llmutelist.cpp + llnamebox.cpp + llnameeditor.cpp + llnamelistctrl.cpp + llnetmap.cpp + llnotify.cpp + lloverlaybar.cpp + llpanelaudioprefs.cpp + llpanelaudiovolume.cpp + llpanelavatar.cpp + llpanelclassified.cpp + llpanelcontents.cpp + llpaneldebug.cpp + llpaneldirbrowser.cpp + llpaneldirclassified.cpp + llpaneldirevents.cpp + llpaneldirfind.cpp + llpaneldirgroups.cpp + llpaneldirland.cpp + llpaneldirpeople.cpp + llpaneldirplaces.cpp + llpaneldirpopular.cpp + llpaneldisplay.cpp + llpanelevent.cpp + llpanelface.cpp + llpanelgeneral.cpp + llpanelgroup.cpp + llpanelgroupgeneral.cpp + llpanelgroupinvite.cpp + llpanelgrouplandmoney.cpp + llpanelgroupnotices.cpp + llpanelgrouproles.cpp + llpanelgroupvoting.cpp + llpanelinput.cpp + llpanelinventory.cpp + llpanelland.cpp + llpanellandaudio.cpp + llpanellandmedia.cpp + llpanellandobjects.cpp + llpanellandoptions.cpp + llpanellogin.cpp + llpanelmorph.cpp + llpanelmediahud.cpp + llpanelmsgs.cpp + llpanelnetwork.cpp + llpanelobject.cpp + llpanelpermissions.cpp + llpanelpick.cpp + llpanelplace.cpp + llpanelskins.cpp + llpanelvolume.cpp + llpanelweb.cpp + llparcelselection.cpp + llpatchvertexarray.cpp + llphysicsmotion.cpp + llpolymesh.cpp + llpolymorph.cpp + llprefschat.cpp + llprefsim.cpp + llprefsvoice.cpp + llpreviewanim.cpp + llpreview.cpp + llpreviewgesture.cpp + llpreviewlandmark.cpp + llpreviewnotecard.cpp + llpreviewscript.cpp + llpreviewsound.cpp + llpreviewtexture.cpp + llproductinforequest.cpp + llprogressview.cpp + llregionposition.cpp + llremoteparcelrequest.cpp + llsavedsettingsglue.cpp + llselectmgr.cpp + llsky.cpp + llspatialpartition.cpp + llsprite.cpp + llsrv.cpp + llstartup.cpp + llstatbar.cpp + llstatgraph.cpp + llstatusbar.cpp + llstatview.cpp + llstylemap.cpp + llsurface.cpp + llsurfacepatch.cpp + lltexlayer.cpp + lltexturecache.cpp + lltexturectrl.cpp + lltexturefetch.cpp + lltextureinfo.cpp + lltextureinfodetails.cpp + lltexturestats.cpp + lltexturestatsuploader.cpp + lltextureview.cpp + lltoolbar.cpp + lltoolbrush.cpp + lltoolcomp.cpp + lltool.cpp + lltooldraganddrop.cpp + lltoolface.cpp + lltoolfocus.cpp + lltoolgrab.cpp + lltoolgun.cpp + lltoolindividual.cpp + lltoolmgr.cpp + lltoolmorph.cpp + lltoolobjpicker.cpp + lltoolpie.cpp + lltoolpipette.cpp + lltoolplacer.cpp + lltoolselect.cpp + lltoolselectland.cpp + lltoolselectrect.cpp + lltoolview.cpp + lltracker.cpp + lltrans.cpp + lltranslate.cpp + lluploaddialog.cpp + llurl.cpp + llurldispatcher.cpp + llurlhistory.cpp + llurlsimstring.cpp + llurlwhitelist.cpp + lluserauth.cpp + llvectorperfoptions.cpp + llvelocitybar.cpp + llviewchildren.cpp + llviewerassetstorage.cpp + llvieweraudio.cpp + llviewercamera.cpp + llviewercontrol.cpp + llviewerdisplay.cpp + llviewergenericmessage.cpp + llviewergesture.cpp + #llviewerimage.cpp + #llviewerimagelist.cpp + llviewerinventory.cpp + llviewerjointattachment.cpp + llviewerjoint.cpp + llviewerjointmesh.cpp + llviewerjointmesh_sse2.cpp + llviewerjointmesh_sse.cpp + llviewerjointmesh_vec.cpp + llviewerjoystick.cpp + llviewerkeyboard.cpp + llviewerlayer.cpp + llviewermedia.cpp + llviewermediafocus.cpp + llviewermedia_streamingaudio.cpp + llviewermenu.cpp + llviewermenufile.cpp + llviewermessage.cpp + llviewernetwork.cpp + llviewerobject.cpp + llviewerobjectlist.cpp + llviewerparcelmedia.cpp + llviewerparcelmediaautoplay.cpp + llviewerparcelmgr.cpp + llviewerparceloverlay.cpp + llviewerpartsim.cpp + llviewerpartsource.cpp + llviewerregion.cpp + llviewershadermgr.cpp + llviewerstats.cpp + llviewertexteditor.cpp + llviewertexture.cpp + llviewertextureanim.cpp + llviewertexturelist.cpp + llviewerthrottle.cpp + llviewervisualparam.cpp + llviewerwindow.cpp + llvlcomposition.cpp + llvlmanager.cpp + llvoavatar.cpp + llvoavatardefines.cpp + llvocache.cpp + llvoclouds.cpp + llvograss.cpp + llvoground.cpp + llvoiceclient.cpp + llvoiceremotectrl.cpp + llvoicevisualizer.cpp + llvoinventorylistener.cpp + llvopartgroup.cpp + llvosky.cpp + llvosurfacepatch.cpp + llvotextbubble.cpp + llvotree.cpp + llvovolume.cpp + llvowater.cpp + llvowlsky.cpp + llwatchdog.cpp + llwaterparammanager.cpp + llwaterparamset.cpp + llwearable.cpp + llwearablelist.cpp + llweb.cpp + llmediactrl.cpp + llwind.cpp + llwlanimator.cpp + llwldaycycle.cpp + llwlparammanager.cpp + llwlparamset.cpp + llworld.cpp + llworldmap.cpp + llworldmipmap.cpp + llmapresponders.cpp + llworldmapview.cpp + llxmlrpctransaction.cpp + noise.cpp + pipeline.cpp + scriptcounter.cpp + wlfPanel_AdvSettings.cpp + rlvhandler.cpp + rlvhelper.cpp + rlvcommon.cpp + rlvlocks.cpp + rlvinventory.cpp + rlvextensions.cpp + rlvfloaterbehaviour.cpp + rlvviewer2.cpp + shcommandhandler.cpp + ) + +# This gets renamed in the packaging step +set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING + "The name of the viewer executable to create.") + +if ((LINUX OR DARWIN) AND NOT DARWIN_PPC) + # We can't set these flags for Darwin, because they get passed to + # the PPC compiler. Ugh. + + set_source_files_properties( + llviewerjointmesh_sse.cpp + PROPERTIES COMPILE_FLAGS "-msse -mfpmath=sse" + ) + set_source_files_properties( + llviewerjointmesh_sse2.cpp + PROPERTIES COMPILE_FLAGS "-msse2 -mfpmath=sse" + ) +endif ((LINUX OR DARWIN) AND NOT DARWIN_PPC) + +set(viewer_HEADER_FILES + CMakeLists.txt + ViewerInstall.cmake + + llviewerobjectbackup.h + slfloatermediafilter.h + floaterlocalassetbrowse.h + aoremotectrl.h + floaterao.h + floatervoicelicense.h + cofmgr.h + ascentdaycyclemanager.h + ascentfloatercontactgroups.h + ascentprefssys.h + ascentprefsvan.h + emerald.h + emeraldboobutils.h + dofloaterhex.h + dohexeditor.h + floatersculptpreview.h + hbfloatergrouptitles.h + hgfloatertexteditor.h + hippogridmanager.h + hippofloaterxml.h + hippolimits.h + hipporestrequest.h + hippopanelgrids.h + jcfloaterareasearch.h + lggdicdownload.h + lgghunspell_wrapper.h + chatbar_as_cmdline.h + qtoolalign.h + llagent.h + llagentaccess.h + llagentdata.h + llagentlanguage.h + llagentpilot.h + llanimstatelabels.h + llappearance.h + llappviewer.h + llassetconverter.h + llassetuploadresponders.h + llassetuploadqueue.h + llattachmentsmgr.h + llaudiosourcevo.h + llbbox.h + llbox.h + llbuildnewviewsscheduler.h + llcallbacklist.h + llcallingcard.h + llcaphttpsender.h + llchatbar.h + llclassifiedinfo.h + llclassifiedstatsresponder.h + llcloud.h + llcolorscheme.h + llcolorswatch.h + llcommandhandler.h + llcommandlineparser.h + llcompass.h + llcompilequeue.h + llconfirmationmanager.h + llconsole.h + llcontainerview.h + llcurrencyuimanager.h + llcylinder.h + lldebugmessagebox.h + lldebugview.h + lldelayedgestureerror.h + lldirpicker.h + lldrawable.h + lldrawpool.h + lldrawpoolalpha.h + lldrawpoolavatar.h + lldrawpoolbump.h + lldrawpoolclouds.h + lldrawpoolground.h + lldrawpoolsimple.h + lldrawpoolsky.h + lldrawpoolterrain.h + lldrawpooltree.h + lldrawpoolwater.h + lldrawpoolwlsky.h + lldriverparam.h + lldynamictexture.h + llemote.h + lleventinfo.h + lleventnotifier.h + lleventpoll.h + llface.h + llfasttimerview.h + llfeaturemanager.h + llfilepicker.h + llfirstuse.h + llflexibleobject.h + llfloaterabout.h + llfloateractivespeakers.h + llfloateranimpreview.h + llfloaterauction.h + llfloateravatarinfo.h + llfloateravatarlist.h + llfloateravatarpicker.h + llfloateravatartextures.h + llfloaterbeacons.h + llfloaterblacklist.h + llviewerdisplayname.h + llfloaterdisplayname.h + llfloaterbuildoptions.h + llfloaterbulkpermission.h + llfloaterbump.h + llfloaterbuy.h + llfloaterbuycontents.h + llfloaterbuycurrency.h + llfloaterbuyland.h + llfloatercamera.h + llfloaterchat.h + llfloaterchatterbox.h + llfloaterclassified.h + llfloatercolorpicker.h + llfloatercustomize.h + llfloaterdaycycle.h + llfloaterdickdongs.h + llfloaterdirectory.h + llfloatereditui.h + llfloaterenvsettings.h + llfloaterexploreanimations.h + llfloaterexploresounds.h + llfloaterevent.h + llfloaterfonttest.h + llfloaterfriends.h + llfloatergesture.h + llfloatergodtools.h + llfloatergroupinfo.h + llfloatergroupinvite.h + llfloatergroups.h + llfloaterhandler.h + llfloaterhardwaresettings.h + llfloaterhtmlcurrency.h + llfloatermediabrowser.h + llfloaterhtmlsimple.h + llfloaterhud.h + llfloaterimagepreview.h + llfloaterinspect.h + llfloaterjoystick.h + llfloaterlagmeter.h + llfloaterland.h + llfloaterlandholdings.h + llfloaterlandmark.h + llfloatermap.h + llfloatermemleak.h + llfloatermessagelog.h + llfloatermute.h + llfloaternamedesc.h + llfloaternewim.h + llfloaternotificationsconsole.h + llfloaterobjectiminfo.h + llfloateropenobject.h + llfloaterparcel.h + llfloaterpermissionsmgr.h + llfloaterpostcard.h + llfloaterpostprocess.h + llfloaterpreference.h + llfloaterperms.h + llfloaterproperties.h + llfloaterregioninfo.h + llfloaterreporter.h + llfloaterscriptdebug.h + llfloatersellland.h + llfloatersettingsdebug.h + llfloatersnapshot.h + llfloaterstats.h + llfloatertelehub.h + llfloaterteleport.h + llfloaterteleporthistory.h + llfloatertest.h + llfloatertools.h + llfloatertopobjects.h + llfloatertos.h + llfloaterurldisplay.h + llfloaterurlentry.h + llfloatervfs.h + llfloatervfsexplorer.h + llfloatervoicedevicesettings.h + llfloaterwater.h + llfloaterwindlight.h + llfloaterworldmap.h + llfolderview.h + llfollowcam.h + llframestats.h + llframestatview.h + llgesturemgr.h + llgivemoney.h + llgroupmgr.h + llgroupnotify.h + llhomelocationresponder.h + llhoverview.h + llhudeffect.h + llhudeffectbeam.h + llhudeffectlookat.h + llhudeffectpointat.h + llhudeffecttrail.h + llhudicon.h + llhudmanager.h + llhudobject.h + llhudrender.h + llhudtext.h + llhudview.h + llimpanel.h + llimview.h + llinventorybackup.h + llinventorybridge.h + llinventoryclipboard.h + llinventorymodel.h + llinventoryview.h + lljoystickbutton.h + lllandmarklist.h + lllightconstants.h + lllocalinventory.h + lllogchat.h + llloginhandler.h + llsavedlogins.h + llmanip.h + llmaniprotate.h + llmanipscale.h + llmaniptranslate.h + llmediaremotectrl.h + llmemoryview.h + llmenucommands.h + llmimetypes.h + llmorphview.h + llmoveview.h + llmutelist.h + llnamebox.h + llnameeditor.h + llnamelistctrl.h + llnetmap.h + llnotify.h + lloverlaybar.h + llpanelaudioprefs.h + llpanelaudiovolume.h + llpanelavatar.h + llpanelclassified.h + llpanelcontents.h + llpaneldebug.h + llpaneldirbrowser.h + llpaneldirclassified.h + llpaneldirevents.h + llpaneldirfind.h + llpaneldirgroups.h + llpaneldirland.h + llpaneldirpeople.h + llpaneldirplaces.h + llpaneldirpopular.h + llpaneldisplay.h + llpanelevent.h + llpanelface.h + llpanelgeneral.h + llpanelgroup.h + llpanelgroupgeneral.h + llpanelgroupinvite.h + llpanelgrouplandmoney.h + llpanelgroupnotices.h + llpanelgrouproles.h + llpanelgroupvoting.h + llpanelinput.h + llpanelinventory.h + llpanelland.h + llpanellandaudio.h + llpanellandmedia.h + llpanellandobjects.h + llpanellandoptions.h + llpanelLCD.h + llpanellogin.h + llpanelmorph.h + llpanelmediahud.h + llpanelmsgs.h + llpanelnetwork.h + llpanelobject.h + llpanelpermissions.h + llpanelpick.h + llpanelplace.h + llpanelskins.h + llpanelvolume.h + llpanelweb.h + llparcelselection.h + llpatchvertexarray.h + llphysicsmotion.h + llpolymesh.h + llpolymorph.h + llprefschat.h + llprefsim.h + llprefsvoice.h + llpreview.h + llpreviewanim.h + llpreviewgesture.h + llpreviewlandmark.h + llpreviewnotecard.h + llpreviewscript.h + llpreviewsound.h + llpreviewtexture.h + llproductinforequest.h + llprogressview.h + llregionposition.h + llremoteparcelrequest.h + llresourcedata.h + llsavedsettingsglue.h + llselectmgr.h + llsky.h + llspatialpartition.h + llsprite.h + llsrv.h + llstartup.h + llstatbar.h + llstatgraph.h + llstatusbar.h + llstatview.h + llstylemap.h + llsurface.h + llsurfacepatch.h + lltable.h + lltexlayer.h + lltexturecache.h + lltexturectrl.h + lltexturefetch.h + lltextureinfo.h + lltextureinfodetails.h + lltexturestats.h + lltexturestatsuploader.h + lltextureview.h + lltool.h + lltoolbar.h + lltoolbrush.h + lltoolcomp.h + lltooldraganddrop.h + lltoolface.h + lltoolfocus.h + lltoolgrab.h + lltoolgun.h + lltoolindividual.h + lltoolmgr.h + lltoolmorph.h + lltoolobjpicker.h + lltoolpie.h + lltoolpipette.h + lltoolplacer.h + lltoolselect.h + lltoolselectland.h + lltoolselectrect.h + lltoolview.h + lltracker.h + lltrans.h + lltranslate.h + lluiconstants.h + lluploaddialog.h + llurl.h + llurldispatcher.h + llurlhistory.h + llurlsimstring.h + llurlwhitelist.h + lluserauth.h + llvectorperfoptions.h + llvelocitybar.h + llviewchildren.h + llviewerassetstorage.h + llvieweraudio.h + llviewerbuild.h + llviewercamera.h + llviewercontrol.h + llviewerdisplay.h + llviewergenericmessage.h + llviewergesture.h + #llviewerimage.h + #llviewerimagelist.h + llviewerinventory.h + llviewerjoint.h + llviewerjointattachment.h + llviewerjointmesh.h + llviewerjoystick.h + llviewerkeyboard.h + llviewerlayer.h + llviewermedia.h + llviewermediaobserver.h + llviewermediafocus.h + llviewermenu.h + llviewermenufile.h + llviewermessage.h + llviewernetwork.h + llviewerobject.h + llviewerobjectlist.h + llviewerparcelmedia.h + llviewerparcelmediaautoplay.h + llviewerparcelmgr.h + llviewerparceloverlay.h + llviewerpartsim.h + llviewerpartsource.h + llviewerprecompiledheaders.h + llviewerregion.h + llviewershadermgr.h + llviewerstats.h + llviewertexteditor.h + llviewertexture.h + llviewertextureanim.h + llviewertexturelist.h + llviewerthrottle.h + llviewervisualparam.h + llviewerwindow.h + llvlcomposition.h + llvlmanager.h + llvoavatar.h + llvoavatardefines.h + llvocache.h + llvoclouds.h + llvograss.h + llvoground.h + llvoiceclient.h + llvoiceremotectrl.h + llvoicevisualizer.h + llvoinventorylistener.h + llvopartgroup.h + llvosky.h + llvosurfacepatch.h + llvotextbubble.h + llvotree.h + llvotreenew.h + llvovolume.h + llvowater.h + llvowlsky.h + llwatchdog.h + llwaterparammanager.h + llwaterparamset.h + llwearable.h + llwearablelist.h + llweb.h + llmediactrl.h + llwind.h + llwindebug.h + llwlanimator.h + llwldaycycle.h + llwlparammanager.h + llwlparamset.h + llworld.h + llworldmap.h + llworldmipmap.h + llmapresponders.h + llworldmapview.h + llxmlrpctransaction.h + macmain.h + noise.h + pipeline.h + randgauss.h + scriptcounter.h + VertexCache.h + VorbisFramework.h + wlfPanel_AdvSettings.h + rlvdefines.h + rlvhandler.h + rlvhelper.h + rlvcommon.h + rlvlocks.h + rlvinventory.h + rlvextensions.h + rlvfloaterbehaviour.h + rlvviewer2.h + shcommandhandler.h + ) + +source_group("CMake Rules" FILES ViewerInstall.cmake) + +if (DARWIN) + LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp) + + find_library(AGL_LIBRARY AGL) + find_library(APPKIT_LIBRARY AppKit) + find_library(COCOA_LIBRARY Cocoa) + find_library(IOKIT_LIBRARY IOKit) + + set(viewer_LIBRARIES + ${COCOA_LIBRARY} + ${AGL_LIBRARY} + ${IOKIT_LIBRARY} + ) + + # Add resource files to the project. + set(viewer_RESOURCE_FILES + ${VIEWER_BRANDING_ID}.icns + macview.r + gpu_table.txt + Info-${VIEWER_BRANDING_NAME_CAMELCASE}.plist + SecondLife.nib/ + # CMake doesn't seem to support Xcode language variants well just yet + English.lproj/InfoPlist.strings + English.lproj/language.txt + German.lproj/language.txt + Japanese.lproj/language.txt + Korean.lproj/language.txt + ) + set_source_files_properties( + ${viewer_RESOURCE_FILES} + PROPERTIES + HEADER_FILE_ONLY TRUE + #MACOSX_PACKAGE_LOCATION Resources #don't do this! this tells cmake to copy the files. + ) + SOURCE_GROUP("Resources" FILES ${viewer_RESOURCE_FILES}) + list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) +endif (DARWIN) + +if (LINUX) + LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) + LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -luuid -lrt -laprutil-1 -lfontconfig -Wl,--as-needed") + + set(viewer_LIBRARIES + Xinerama + ) +endif (LINUX) + +if (WINDOWS) + list(APPEND viewer_SOURCE_FILES + llappviewerwin32.cpp + llwindebug.cpp + ) + + list(APPEND viewer_HEADER_FILES + llappviewerwin32.h + llwindebug.h + ) + + # precompiled header configuration + # llviewerprecompiledheaders.cpp generates + # the .pch file. + # All sources added to viewer_SOURCE_FILES + # at this point use it. + set_source_files_properties(llviewerprecompiledheaders.cpp + PROPERTIES + COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" + ) + foreach( src_file ${viewer_SOURCE_FILES} ) + set_source_files_properties( + ${src_file} + PROPERTIES + COMPILE_FLAGS "/Yullviewerprecompiledheaders.h" + ) + endforeach( src_file ${viewer_SOURCE_FILES} ) + list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp) + + # Add resource files to the project. + # viewerRes.rc is the only buildable file, but + # the rest are all dependencies of it. + set(viewer_RESOURCE_FILES + ${ARTWORK_DIR}/res/arrow.cur + ${ARTWORK_DIR}/res/arrowcop.cur + ${ARTWORK_DIR}/res/arrowcopmulti.cur + ${ARTWORK_DIR}/res/arrowdrag.cur + ${ARTWORK_DIR}/res/circleandline.cur + ${ARTWORK_DIR}/res/icon1.ico + ${ARTWORK_DIR}/res/llarrow.cur + ${ARTWORK_DIR}/res/llarrowdrag.cur + ${ARTWORK_DIR}/res/llarrowdragmulti.cur + ${ARTWORK_DIR}/res/llarrowlocked.cur + ${ARTWORK_DIR}/res/llgrablocked.cur + ${ARTWORK_DIR}/res/llno.cur + ${ARTWORK_DIR}/res/llnolocked.cur + ${ARTWORK_DIR}/res/lltoolcamera.cur + ${ARTWORK_DIR}/res/lltoolcreate.cur + ${ARTWORK_DIR}/res/lltoolfocus.cur + ${ARTWORK_DIR}/res/lltoolgrab.cur + ${ARTWORK_DIR}/res/lltoolland.cur + ${ARTWORK_DIR}/res/lltoolpan.cur + ${ARTWORK_DIR}/res/lltoolpipette.cur + ${ARTWORK_DIR}/res/lltoolrotate.cur + ${ARTWORK_DIR}/res/lltoolscale.cur + ${ARTWORK_DIR}/res/lltooltranslate.cur + ${ARTWORK_DIR}/res/lltoolzoomin.cur + ${ARTWORK_DIR}/res/lltoolzoomout.cur + ${ARTWORK_DIR}/res/snowglobe_icon.BMP + ${ARTWORK_DIR}/res/snowglobe_icon.ico + ${ARTWORK_DIR}/res/resource.h + ${ARTWORK_DIR}/res/toolbuy.cur + ${ARTWORK_DIR}/res/toolopen.cur + ${ARTWORK_DIR}/res/toolpay.cur + ${ARTWORK_DIR}/res/toolpickobject.cur + ${ARTWORK_DIR}/res/toolpickobject2.cur + ${ARTWORK_DIR}/res/toolpickobject3.cur + ${ARTWORK_DIR}/res/toolpipette.cur + ${ARTWORK_DIR}/res/toolsit.cur + ) + + set_source_files_properties(${viewer_RESOURCE_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + + if(NOT ARTWORK_IN_SOURCE) + # The resource compiler needs to find resources here. + include_directories(${ARTWORK_DIR}/res) + endif(NOT ARTWORK_IN_SOURCE) + + if (MSVC71 OR MSVC80 AND NOT VISTA_ICON) + set(viewer_RESOURCE_FILES + res/resource.h + res/viewerRes_bc.rc + ${viewer_RESOURCE_FILES} + ) + else (MSVC71 OR MSVC80 AND NOT VISTA_ICON) + set(viewer_RESOURCE_FILES + res/resource.h + res/viewerRes.rc + ${viewer_RESOURCE_FILES} + ) + endif (MSVC71 OR MSVC80 AND NOT VISTA_ICON) + + SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES}) + + list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) + + find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR}) + find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR}) + mark_as_advanced( + DINPUT_LIBRARY + DXGUID_LIBRARY + ) + + set(viewer_LIBRARIES + advapi32 + comdlg32 + ${DINPUT_LIBRARY} + ${DXGUID_LIBRARY} + fmodvc + gdi32 + kernel32 + odbc32 + odbccp32 + ole32 + oleaut32 + opengl32 + shell32 + user32 + Vfw32 + winspool + ) + + find_library(INTEL_MEMOPS_LIBRARY + NAMES ll_intel_memops + PATHS + optimized ${ARCH_PREBUILT_DIRS_RELEASE} + debug ${ARCH_PREBUILT_DIRS_DEBUG} + ) + mark_as_advanced(INTEL_MEMOPS_LIBRARY) + + if (INTEL_MEMOPS_LIBRARY) + list(APPEND viewer_LIBRARIES ${INTEL_MEMOPS_LIBRARY}) + endif (INTEL_MEMOPS_LIBRARY) + + use_prebuilt_binary(dbghelp) +endif (WINDOWS) + +# Add the xui files. This is handy for searching for xui elements +# from within the IDE. + +file(GLOB viewer_XUI_FILE_GLOB_LIST + ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en-us/*.xml) + +set(viewer_XUI_FILES + + ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/colors.xml + ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/colors_base.xml + + + + ) + +list(APPEND viewer_XUI_FILES ${viewer_XUI_FILE_GLOB_LIST}) +list(SORT viewer_XUI_FILES) + +source_group("XUI Files" FILES ${viewer_XUI_FILES}) + +set_source_files_properties(${viewer_XUI_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES}) + +set(viewer_APPSETTINGS_FILES + app_settings/anim.ini + app_settings/cmd_line.xml + app_settings/grass.xml + app_settings/high_graphics.xml + app_settings/keys.ini + app_settings/keywords.ini + app_settings/logcontrol.xml + app_settings/low_graphics.xml + app_settings/mid_graphics.xml + app_settings/settings.xml + app_settings/settings_crash_behavior.xml + app_settings/settings_files.xml + app_settings/settings_per_account.xml + app_settings/std_bump.ini + app_settings/trees.xml + app_settings/ultra_graphics.xml + app_settings/viewerart.xml + ${CMAKE_SOURCE_DIR}/../etc/message.xml + ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg + ) + +source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES}) + +set_source_files_properties(${viewer_APPSETTINGS_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND viewer_SOURCE_FILES ${viewer_APPSETTINGS_FILES}) + +if(ARTWORK_EXISTS) + set(viewer_CHARACTER_FILES + ${ARTWORK_DIR}/character/attentions.xml + ${ARTWORK_DIR}/character/attentionsN.xml + ${ARTWORK_DIR}/character/avatar_lad.xml + ${ARTWORK_DIR}/character/avatar_skeleton.xml + ${ARTWORK_DIR}/character/genepool.xml + ) + + source_group("Character File" FILES ${viewer_CHARACTER_FILES}) + + set_source_files_properties(${viewer_CHARACTER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + + list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) +endif(ARTWORK_EXISTS) + +if (WINDOWS) + file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi) + + source_group("Installer Files" FILES ${viewer_INSTALLER_FILES}) + + set_source_files_properties(${viewer_INSTALLER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + + list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) +endif (WINDOWS) + +if (OPENAL) + set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_OPENAL") +endif (OPENAL) + +if (FMOD) + set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMOD") + + if (NOT WINDOWS) + set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp) + add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES}) + set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY}) + if (DARWIN) + list(APPEND fmodwrapper_needed_LIBRARIES ${CARBON_LIBRARY}) + set_target_properties( + fmodwrapper + PROPERTIES + BUILD_WITH_INSTALL_RPATH 1 + INSTALL_NAME_DIR "@executable_path/../Resources" + LINK_FLAGS "-unexported_symbols_list \"${CMAKE_CURRENT_SOURCE_DIR}/fmod_hidden_symbols.exp\"" + ) + endif (DARWIN) + set(FMODWRAPPER_LIBRARY fmodwrapper) + target_link_libraries(fmodwrapper ${fmodwrapper_needed_LIBRARIES}) + endif (NOT WINDOWS) +endif (FMOD) + +set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") + +list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) + +set_source_files_properties(${viewer_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +add_executable(${VIEWER_BINARY_NAME} + WIN32 + MACOSX_BUNDLE + ${viewer_SOURCE_FILES} + ) + +if (!DISABLE_TEMPLATE_CHECK) + check_message_template(${VIEWER_BINARY_NAME}) +endif (!DISABLE_TEMPLATE_CHECK) + +if (LLKDU_LIBRARY) + add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY}) +endif (LLKDU_LIBRARY) + +# We package by default on Linux so we can run from newview/packaged. +if (LINUX) + set(PACKAGE_DEFAULT ON) +else (LINUX) + set(PACKAGE_DEFAULT OFF) +endif (LINUX) +set(PACKAGE ${PACKAGE_DEFAULT} CACHE BOOL + "Add a package target that builds an installer package.") + +if (WINDOWS) + if(MSVC10) + set(release_flags "/MAPRelease/${VIEWER_BINARY_NAME}.map") + else() + set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map") + endif() + + set_target_properties(${VIEWER_BINARY_NAME} + PROPERTIES + LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${GOOGLE_PERFTOOLS_LINKER_FLAGS}" + LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" + LINK_FLAGS_RELEASE ${release_flags} + ) + + # sets the 'working directory' for debugging from visual studio. + if (NOT UNATTENDED) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe + ARGS + --solution + ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln + --workingdir + ${VIEWER_BINARY_NAME} + ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging." + ) + endif (NOT UNATTENDED) + + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg + COMMENT "Copying message_template.msg to the runtime folder." + ) + + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml + COMMENT "Copying message.xml to the runtime folder." + ) + + add_dependencies(${VIEWER_BINARY_NAME} copy_win_libs) + + if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) + add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) + endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) + + add_custom_command( + OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --configuration=${CMAKE_CFG_INTDIR} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --branding_id=${VIEWER_BRANDING_ID} + --grid=${GRID} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat + DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) + + if (PACKAGE) + add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat) + add_dependencies(package windows-updater windows-crash-logger) + endif (PACKAGE) +endif (WINDOWS) + +target_link_libraries(${VIEWER_BINARY_NAME} + ${GOOGLE_PERFTOOLS_LIBRARIES} + ${LLAUDIO_LIBRARIES} + ${LLCHARACTER_LIBRARIES} + ${LLIMAGE_LIBRARIES} + ${LLIMAGEJ2COJ_LIBRARIES} + ${LLINVENTORY_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLPLUGIN_LIBRARIES} + ${LLPRIMITIVE_LIBRARIES} + ${LLRENDER_LIBRARIES} + ${FREETYPE_LIBRARIES} + ${LLUI_LIBRARIES} + ${LLVFS_LIBRARIES} + ${LLWINDOW_LIBRARIES} + ${LLXML_LIBRARIES} + ${LSCRIPT_LIBRARIES} + ${LLMATH_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${NDOF_LIBRARY} + ${viewer_LIBRARIES} + ${BOOST_FILESYSTEM_LIBRARY} + ${BOOST_PROGRAM_OPTIONS_LIBRARY} + ${BOOST_REGEX_LIBRARY} + ${BOOST_SIGNALS_LIBRARY} + ${BOOST_SYSTEM_LIBRARY} + ${DBUSGLIB_LIBRARIES} + ${OPENGL_LIBRARIES} + ${FMODWRAPPER_LIBRARY} + ${OPENGL_LIBRARIES} + ${JSONCPP_LIBRARIES} + ${SDL_LIBRARY} + ${SMARTHEAP_LIBRARY} + ${UI_LIBRARIES} + ${WINDOWS_LIBRARIES} + ${XMLRPCEPI_LIBRARIES} + ${ELFIO_LIBRARIES} + ${HUNSPELL_LIBRARY} + ) + +if (LINUX) + add_custom_command( + OUTPUT secondlife-stripped + COMMAND strip + ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME} + DEPENDS ${VIEWER_BINARY_NAME} + ) + + set(product ${VIEWER_BRANDING_NAME_CAMELCASE}-${ARCH}-${viewer_VERSION}) + + add_custom_command( + OUTPUT ${product}.tar.bz2 + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --standalone=${STANDALONE} + --grid=${GRID} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --branding_id=${VIEWER_BRANDING_ID} + --installer_name=${product} + --arch=${ARCH} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched + --buildtype=${CMAKE_BUILD_TYPE} + DEPENDS secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit) + + if (PACKAGE) + add_custom_target(package ALL DEPENDS ${product}.tar.bz2) + add_dependencies(package linux-crash-logger-strip-target) + endif (PACKAGE) +endif (LINUX) + +if (DARWIN) + set(product ${VIEWER_BRANDING_NAME}) + set_target_properties( + ${VIEWER_BINARY_NAME} + PROPERTIES + OUTPUT_NAME "${product}" + MACOSX_BUNDLE_INFO_STRING "A stable third-party Second Life viewer." + MACOSX_BUNDLE_ICON_FILE "${VIEWER_BRANDING_ID}.icns" + MACOSX_BUNDLE_GUI_IDENTIFIER "${VIEWER_BRANDING_NAME}" + MACOSX_BUNDLE_LONG_VERSION_STRING "${viewer_VERSION}" + MACOSX_BUNDLE_BUNDLE_NAME "${VIEWER_BRANDING_NAME}" + MACOSX_BUNDLE_SHORT_VERSION_STRING "${viewer_VERSION}" + MACOSX_BUNDLE_BUNDLE_VERSION "${viewer_VERSION}" + MACOSX_BUNDLE_COPYRIGHT "Copyright 2010 Balseraph Software Group" + ) + + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --grid=${GRID} + --actions=copy + --configuration=${CMAKE_CFG_INTDIR} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --branding_id=${VIEWER_BRANDING_ID} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + --buildtype=${CMAKE_BUILD_TYPE} + DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) + + if (PACKAGE) + add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) + add_dependencies(package mac-updater mac-crash-logger) + + add_custom_command( + TARGET package POST_BUILD + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --grid=${GRID} + --configuration=${CMAKE_CFG_INTDIR} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --branding_id=${VIEWER_BRANDING_ID} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched + --buildtype=${CMAKE_BUILD_TYPE} + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + + add_custom_command( + TARGET package POST_BUILD + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --grid=${GRID} + --configuration=${CMAKE_CFG_INTDIR} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --branding_id=${VIEWER_BRANDING_ID} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched + --buildtype=${CMAKE_BUILD_TYPE} + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + endif (PACKAGE) +endif (DARWIN) + +if (INSTALL) + include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake) +endif (INSTALL) + +# Add tests +if (LL_TESTS) + ADD_VIEWER_BUILD_TEST(llagentaccess viewer) + #ADD_VIEWER_BUILD_TEST(llworldmap viewer) + #ADD_VIEWER_BUILD_TEST(llworldmipmap viewer) + ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) + ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) + ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer) + #ADD_VIEWER_COMM_BUILD_TEST(lltranslate viewer "") +endif (LL_TESTS) + +# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py +if (WINDOWS) + + get_target_property(BUILT_LLCOMMON llcommon LOCATION) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${BUILT_LLCOMMON} + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + COMMENT "Copying llcommon.dll to the runtime folder." + ) + + get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${BUILT_SLPLUGIN} + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + COMMENT "Copying SLPlugin executable to the runtime folder." + ) + + get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${BUILT_WEBKIT_PLUGIN} + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin + COMMENT "Copying WebKit Plugin to the runtime folder." + ) + + get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${BUILT_QUICKTIME_PLUGIN} + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin + COMMENT "Copying Quicktime Plugin to the runtime folder." + ) + + # Copying the mime_types.xml file to app_settings + set(mime_types_source "${CMAKE_SOURCE_DIR}/newview/skins/default/xui/en-us") + set(mime_types_dest "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings") + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${mime_types_source}/mime_types_windows.xml + ${mime_types_dest}/mime_types.xml + COMMENT "Copying mime_types_windows.xml to mime_types.xml." + ) + +endif (WINDOWS) + +if (DARWIN) +# Don't do this here -- it's taken care of by viewer_manifest.py +# add_custom_command(TARGET ${VIEWER_BINARY_NAME} POST_BUILD +# COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/ +# DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib +# ) +endif (DARWIN) diff --git a/indra/newview/app_settings/CA.pem b/indra/newview/app_settings/CA.pem index b14e7346a..63bb036c9 100644 --- a/indra/newview/app_settings/CA.pem +++ b/indra/newview/app_settings/CA.pem @@ -27,1487 +27,1100 @@ mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb K+9A46sd33oqK8n8 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF -BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz -aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC -QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry -dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw -CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x -FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS -b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC -AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK -pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV -6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc -OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV -jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9 -cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C -AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k -qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT -ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg -TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm -/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx -fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ -TzFxiNmIf1Q= +MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS +BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v +cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 +4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB +Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J +0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ +FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx +bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q +SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb +6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV +m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g +eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG +kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 +6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG +CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc +aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB +gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w +aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 +tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 +nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M +77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV +Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L +ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM +zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU +rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF +YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT +oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu +FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB +0m6lG5kngOcLqagA -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI -zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt -fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs -trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr -5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc -LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+ -XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM -eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7 -CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf -WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT -LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz -vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw -X7A5KGgOc90lmt4S +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs -RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs -i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg -/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ -2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0 -ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X -+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml -J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo -Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ -Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex -MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0 -cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF -ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY -vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/ -drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la -5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks -mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5 -O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD -062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41 -xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL -Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV +BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK +EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq +b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow +djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx +EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG +9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa +F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 +eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV +Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB +k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 +ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV +dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO +txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD +VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD +QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY +S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ +mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR +qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE +TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe +1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4 -dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h -bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B -ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1 -c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8 -k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50 -ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504 -B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez -eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5 -aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB -3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6 -xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv -cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ -KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R -xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT -K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1 -n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx -REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O -hgQ= +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze -xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI -gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O -M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc -sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5 -mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG -9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU -tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx -IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0 -MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9 -tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL -/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV -g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6 -tkD9xOQ14R0WHNC8K47Wcdk= +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe -Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF -MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+ -A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c -+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2 -P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX -C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R -s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9 -BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf -d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB -jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG -A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu -G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj -PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY -GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6 -NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx -My3ZdvJOOjMMK7MtkAY= +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v -dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT -AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg -VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek -n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk -IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z -sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t -UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R -+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES -a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5 -lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw -ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh -bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh -lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9 -5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF -Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA -wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw -dOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X -DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa -xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl -GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n -BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx -VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE -mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu -JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5 -9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA -A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM -IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI -dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j -8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X -DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN -t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/ -DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x -uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE -18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr -kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD -bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX -uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu -Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9 -W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48 -ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn -AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL -M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf -tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR -Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R -+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr -+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM -nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt -d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI -WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ -ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y -3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz -2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw RY8mkaKO/qk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0 -MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx -MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV -BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ -QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h -Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR -QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP -wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1 -pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT -Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC -AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud -EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA -A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT -I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/ -oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67 -G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 +MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U +0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI +TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf +RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF +zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh +BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA +AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY +PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn +9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT +Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF +Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW +H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw -MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR -EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth -zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0 -dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx -MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3 -pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA -sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6 -w4pl +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz +NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ +7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb +m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY +xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ +YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq +JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx +I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz +kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S +Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM +gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu +rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO +1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu +h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP +yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q +7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT +RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ +ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB +M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ +my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO +AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT +9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 +fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx -ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U -q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF -koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh -TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd -lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn -7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+ -LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV -WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX -8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8 -6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT -F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3 -MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB -w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e -ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd -55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw -OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s -NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb -dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih -w6ID +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i +805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6 +l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B +FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp +kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7 +eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa +MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A +AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig +dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu +dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk +IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g +UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l +bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl +LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k +ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By +b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc +cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA +WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6 +7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY +gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb +4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9 +CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy -MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6 -ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5 -/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9 -MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih -YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv -bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog -WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6 -HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV -6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8 -PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30 -sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO +K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD +d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj +DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe +yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt +VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB +MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI +KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp +ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 +aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg +Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 +cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF +BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz +L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug +eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv +b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w +bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw +ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA +FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw +qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE +kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ +5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz +ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k +XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh +xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB -X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy -MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp -ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU -rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB -3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y -NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E -gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw -PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0 -Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD -AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW -BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA -O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L -a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l -TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg== +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB +czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp +b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm +YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn +HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I +1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk +tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU +GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er +cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY +MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ +AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j +b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh +dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS +ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo +ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w +cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME +GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt +z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g +6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK +mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd +LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb +J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 +SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf -Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz -dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF -bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg -aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg -MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l -dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G -CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw -tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK -wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI -XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD -AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu -dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy -MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0 -IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw -NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc -/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv -yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp -bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/ -bIkz8OwVDw== +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf -MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy -MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4 -QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC -DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj -/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP -KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd -enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB -0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ -FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh -fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU -KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho -wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2 -+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888 -6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50 -cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs -aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp -bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa -MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV -BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw -LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50 -cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL -ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv -x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV -iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173 -iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw -ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff -SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE -CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 -cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD -VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D -bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx -MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW -/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG -A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ -OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU -ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE -PHayXOw= +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50 -cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE -AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3 -dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh -Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow -OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0 -VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN -iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk -mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT -MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY -pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs -aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM -aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo -dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi -gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE -FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9 -B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn -CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx -xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6 -rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 -cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4 -MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx -LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0 -eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R -FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO -/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv -K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt -MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw -HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u -FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1 -aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0 -MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT -E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl -IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy -td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR -OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC -AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w -HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o -oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf -2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa -z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1 -pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1 -aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN -MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh -eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu -ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe -k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5 -/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW -HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG -SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4 -MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq -R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm -JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1 -tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr -tWKmpj29f5JZzVoqgrI3eQ== +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy +MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny +Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 +iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn +5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd +BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 +MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l +dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy +MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF +fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w +AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS +hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ +GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd +zmVml64mXg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm -YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5 -MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg -U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et -MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF -7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD -pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM -HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT -ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw -HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt -y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML +RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu +Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl +IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa +Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE +CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO +8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB +bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 +dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 +QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT +C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy +ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw +KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD +VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud +DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia +d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF +JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U +yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy -dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg -R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1 -MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD -VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT -GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4 -ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn -ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F -LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3 -46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq -81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d -XIVtx6quTx8itc2VrbqnzPmrC3p/ +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy -dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw -CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD -ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K -DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw -KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID -AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD -+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv -U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e -6bR64eVaH4QwnNOfpSXY +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u +ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh +Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU +MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D +bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq +RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G +CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo +6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux +5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm +AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC +ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m +by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp +IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg +Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV +HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E +BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE +FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 +pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz +wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a +EkP/TOYGJqibGapEPHayXOw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz -dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE -AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH -CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC -GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7 -csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj -Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe -JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB -o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9 -qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq -hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe -R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV -Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot -2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX -xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL -MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV -BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05 -ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw -FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw -GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR -4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc -71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4 -bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK -OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW -ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP -AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ -UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC -AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd -PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q -gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT -2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD -NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg -Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f -NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM -MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 -t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b -e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu -PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx -NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB -gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY -rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt -bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME -GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N -AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy -HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 -am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B -qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 -MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 -RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E -0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J -6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq -s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD -uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw -YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW -gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 -/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V -EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g -EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq -aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk -llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk -qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO -gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7 -zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W -LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR -T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac -ASZ4smZHcFFk +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ -GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn -v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA -o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4 -iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC -GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS -CdS7kjXvD9s0 +MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU +YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7 +5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q +gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR +rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7 +ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o +Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl -cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp -Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow -gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV -BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm -BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV -BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ -cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK -P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ -fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j -kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB -gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 -B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl -cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m -cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz -NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx -EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp -bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG -SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N -j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef -QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY -x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC -neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr -5PjRzneigQ== +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq +SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD +VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha +Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg +cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu +ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD +QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp +bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP +aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ +spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB +hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB +Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O +BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5 +PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE +CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ +bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt +YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD +aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT +IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG +CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB +BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw +EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC +BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg +aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw +cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv +aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3 +dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB +BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w +NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5 +Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz +L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W +WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN +HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN +b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl -cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy -ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 -NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw -EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n -MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw -IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 -DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 -7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j -Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq -W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx -eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 -KzGJ +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw +NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS +zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS +YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ +KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb +adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK +Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj +V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ +hjM+5i9Ibq9UkE6tsSU= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl -IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl -cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 -OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ -BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg -Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 -DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI -NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL -lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN -9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B -AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ -a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU -Qg== +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx +MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ +H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY +8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr +SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj +mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD +qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 +D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy +r33I6unUVtkOE7LFRVA= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl -IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG -A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw -ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE -CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ -VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz -QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I -/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC -6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX -TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD -TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni -TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 +MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 +m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd +ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 +eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 +3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA +AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF +aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL +H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls -bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj -YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw -MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT -BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x -HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN -AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 -WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR -5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 -X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK -0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 -zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ -SdM= +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 +MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN +G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU +VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn +6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 +2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca +2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI +3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS +AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF -ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU -Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0 -ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT -AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT -RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz -dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh -dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV -hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb -GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ -NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4 -xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv -/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i -gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf -8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0 -LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh -i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq -f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf -hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP -NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+ -FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis -H8SE ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw -8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m -+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN -dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V -YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so -gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc -65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ -b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn -wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4 -OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ -oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE -CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3 -noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B -9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg -1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM -P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P -/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj -t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq -0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9 -Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c -PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr -bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i -P/68DzFc6PLZ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR -ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j -Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh -JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P -oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh -v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ -BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf -xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM -DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5 -SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV -OBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAx -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC57V56Ondfzl86UvzNZPdxtW9qlsZZklWUXS9bLsER -6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQDalbBgyzhb1upVFAkSsYuekyh -WzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4S8co5GYjhFHvRreT2IEz -y+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF -BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j -b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG -CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud -EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMX -fH8C6dX3i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4 -KY2kpXeH9fErJq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z -6k/BEVmXarIrE7HarZehs7GgIFvKMquNzxPwHynD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM -JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE -erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC -JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob -K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg -MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3 -Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV -BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g -LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g -VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla -MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6 -BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf -rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z -Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN -BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/ -7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x -RnInjBJ7xUS0rg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE -CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg -VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG -A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx -NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg -SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE -CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1 -c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8 -1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT -2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT -AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ -HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC -YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh -ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE -p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B -MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab -5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX -p/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAy -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDQymMxYX9ENHwFfQs9apDLeUt3Cj9LxyPlwGItfpx+ -PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDiWr3I3bR45qVCkwhnAcAgTddc -9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ/wtVqxXd+5rBuR10DbKM -RF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF -BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j -b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG -CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud -EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUE -nPMmm+M5bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1Vs -WJsswrQ0LHozQsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+ -It3jl6jhvCJDwt1N2/aBnpIUnjkPE1TegtjAXjSN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q -RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In -zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a -/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM -EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw -TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk -uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM -XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX -wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV -j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U -bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo -1KpYoJ2daZH9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2 -R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo -vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg -TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V -k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ -OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my -/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA -Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S -GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb -o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh -/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDx5AgOg7t140jluNum8Lmr6Txix141W9ACVBHYydFW -uXZLuat65s269gwE1n7WsAplrE454/H3LaMlOe+wi8++2wxdbnD0B81w9zrA -PjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4KC8/BdsEIb/hRWb+PLeC -7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCTBCBggr -BgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVyaXNp -Z24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw -KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJ -BgNVHRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNj -wKke8tCLMzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJU -LBMK03cjzzf8Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnE -KMLL/J6oia5bPY4S6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6 -8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK -QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX -xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI -L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt -ImRPT8qAkbYp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl -S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC -KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc -VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL -MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD -Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr -IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK -vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP -QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP -mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr -9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu -MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE -BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb -MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O -LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs -iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC -sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw -4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr -l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1 -g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEF -BQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5 -LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4x -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6 -Ly93d3cudmVyaXNpZ24uY29tL1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJl -IFNlcnZlciBPQ1NQIFJlc3BvbmRlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8oXiMM+6f9L452psPTUepjyDoS0S9 -zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSuzOLDB4Nqo3IQASdiIqY1Jjkt -ns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnXOZXYHTWewr2zXcEMSx8C -AwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYDVQQDEwhPQ1NQIDEt -NDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlzaWduLmNvbS9S -U0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwkwQgYI -KwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZlcmlz -aWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB -MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEw -CQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBT -ZpxJky4xoAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+ -TtvOzLqGuBjOsRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8Y -dZqfFzP9qSa44+LewqjEWop/mNYHBmvMVp6GcM7U7w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF -ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww -OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g -QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1 -OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh -dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD -EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2 -fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/ -RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB -CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG -A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz -Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 -cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG -CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp -c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 -DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn -Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n -tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC -VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h -bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN -MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN -MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl -cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ -DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ -XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl -Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm -7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa -xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e -QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO -qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG -SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp -NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ -kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL -axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt -Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 -ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF -ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz -YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT -E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0 -MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE -CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa -BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh -28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362 -rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81 -q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF -Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0 -lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC -AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht -cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI -xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/ -hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW -HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R -9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3 -fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f -HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm -iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg -B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB -/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR -MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl -IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu -dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k -YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj -YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 -eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT -VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj -dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3 -dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww -HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9 -w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B -AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z -dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9 -beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ -XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d -UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py -05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg -Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy -MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV -BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow -GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4 -SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3 -o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V -cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k -bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8 -tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC -AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB -TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp -YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz -IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 -ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u -IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl -VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t -L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU -ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD -VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub -2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir -ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax -6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl -pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE -/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA -AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH -0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG -EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1 -Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw -ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV -m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb -hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu -6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX -LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g -BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH -AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug -b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u -ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0 -YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj -aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0 -cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl -eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t -L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD -AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl -ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS -VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx -MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa -j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04 -ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB -evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220 -Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2 -KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi -aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep -9w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF -ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS -b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w -bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi -MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290 -IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt -ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw -CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK -Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU -vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL -O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe -rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1 -S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV -HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD -kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v -cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB -OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj -cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo -ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv -bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l -bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu -IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93 -d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s -MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN -GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF -BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0 -3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt -NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1 -UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM -m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y -mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr +SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG +A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx +OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy +Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l +dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw +cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh +bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU +aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B +CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 +Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY +q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G +A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL +0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ +BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ +UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp +cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg +Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD +EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w +HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD +VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw +cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl +IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0 +dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v +d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG +SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U +aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC +AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp +bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy +MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF +BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3 +6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I +3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC @@ -1543,75 +1156,787 @@ mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK SnQ2+Q== -----END CERTIFICATE----- - -----BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw -OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu -ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h -gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K -5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy -9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE -gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 -eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs -YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp -aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp -dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb -sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB -FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W -+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 -uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf -tXncwKJrMiE3lvgOOBITRzcahirLer4c +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa -Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g -eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND -IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu -QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui -me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm -RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ -OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G -O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF -BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI -KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh -c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl -cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw -HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX -hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV -Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw -6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF -6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e -Pr3WHV1wA7EY6oT4zBx+2gT9XBTB +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx +MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O +isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY +78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 +zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd +BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA +Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN +T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD +mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE -ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE -AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ -BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT -aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl -KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX -GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj -93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ -P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow -ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g -ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN -W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB -IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB -ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA -ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb -MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv -J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW -pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J -HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw +ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU +REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr +2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s +2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU +GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj +dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r +TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB +AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv +c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl +ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu +MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud +HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD +VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny +bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ +J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG +SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom +JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO +inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y +caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB +mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ +YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 +BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj +IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X +DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw +EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy +dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD +QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 +dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK +wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 +G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P +9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p +dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv +bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa +QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY +BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u +IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl +bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu +Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs +Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI +Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD +ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh +KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd +BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN +MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g +Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l +c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT +6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa +Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL +8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC +9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ +pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ +CayJSdM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB +ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt +TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 +NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD +VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS +Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 +N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH +iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe +YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 +axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g +yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh +ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V +VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB +BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs +QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 +ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM +YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb +QErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB +lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt +T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc +BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3 +dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP +HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO +KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo +5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+ +pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb +kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC +AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov +L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV +HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN +AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB +mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU +4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5 +81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR +Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 +NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD +VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N +H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR +4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN +BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo +EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 +FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx +lA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx +DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 +aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 +MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT +QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp +b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX +ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i +/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU +58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g +halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E +1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ +ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb +mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN +dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ +ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn +B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEwOTIzMTMxODE3WjB1MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQg +LSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g +5DY1Hw7hgCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZs +jqBeynX8T90vFILqsY2K5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfH +HB67Af+g7u0dEHdDW7lwy81MwFYxBTRy9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAEgfwwgfkwgfYGDSsGAQQB +vj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3eXN0YXdp +b255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2pp +IGRsYSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENB +IHcgaGllcmFyY2hpaSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3 +LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQw +HwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQbsa8wHQYDVR0OBBYEFMODHtVZ +d1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQBFIGh8Jpxt87A +gSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIis +TsytFzVP32/W+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB +3vSaoYg+wdkcvb6souMJzuc2uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U +1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uftXncwKJrMiE3lvgOOBITRzcahirL +er4c +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQ +Q0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNaFw0xNzA0MTgxMjUzMDdaMHUxCzAJ +BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMSQwIgYD +VQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkNDIFNp +Z25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCqgLJuQqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0g +oBFAfntNU/QTKwSBaNuime7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2 +U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDImRoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8 +hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/OBRZp0uO1CSLcMcVJzyr +2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0GO9f3/Ca5 +Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEA +MIHDMHUGCCsGAQUFBwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2Vy +dHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYIKwYBBQUHAgEWPmh0dHA6Ly93 +d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xhc2EyL3BjX3Bj +YTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl +cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE +82AVXO08kMIwHQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3 +DQEBBQUAA4IBAQBWTsCbqXrXhBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM +2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuVXo5u0WK8iaqATSyEVBhADHrPG6wY +cLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw6P7pslxMWJBSNyQx +aLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF6caa +9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrW +wBFjzz5ePr3WHV1wA7EY6oT4zBx+2gT9XBTB -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ @@ -1640,148 +1965,1349 @@ ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg -U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN -MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G -A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD -ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts -YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO -4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF -KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL -/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw -EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 -dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh -My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB -BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g -IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 -IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 -dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM -GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ -MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq -bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ -xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU -upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk -GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug -5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7B +rBlbN5maM5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRA +spEXE4gvwb08ASY6w5s+HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8w +nfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxWCeol9IekpBRVmuuSA6QG0Jkm+pGDJ05y +j2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9JyN0ag1yII/LPx8HK5J4 +W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3xW20QjQcS +ZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUwGxGyl2CfpYHRonE82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1 +TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkxUGY7U9kVrLI71xBgoNVyzXTiMNDB +vjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsanot1Xt6j0ZDC+03Fj +LHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G22Ohu ++EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqW +uHitKQDVtcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6 +NA9GRTCNxm/dXlcwnmY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma -M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ -HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW -Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 -JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x -W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE -82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx -UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan -ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 -2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV -tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3 +LanJtdueNe6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP +6KZTU0DixOrV+K7iWaqAiQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6H +dbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPEOpO94mAKcBUhk6T/ki0evXX/ZvvktwmF +3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Dbw34hA1A+ckTwhxzecrB8 +TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC3P8QqoK4 +ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUXvthcPHlH5BgGhlMErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIc +e95Mvn710KCAISA0CuHD4aznTU6pLoCDShW47OR+GTpJUm1coTcUqlBHV9mra4VF +rBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJGdsJF/XU/7smummgj +MNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oFJTlp +uxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1D +OcePEhKz1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BX +WCW+KxwiBrtQTXv4dTE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue -Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA -iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE -OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db -w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC -3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM -ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 -7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG -dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF -JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz -1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= +MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYwOTIxMTU0MjE5WjBxMQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQg +LSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNp +ELfGW3KsARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq +5c9epcGu+kg4a3BJChVXREl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5P +LsUj3qwF78jUCQVckiiLVcnGfZtFCm+DCJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7 +lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luUYG/YDxTC4mqhRqfa4MnV +O5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSPl+9k2fAU +dchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0g +BIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNl +cnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdp +b255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEF +BQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50 +eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf +BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit +5BZufZj2Tq3v8L3SgE34GOoIcdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDS +PiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1CQk2JoKQJ6pyAf6xJBgWEIlm4RXE +4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKWha0RJJxJgw/NyWpK +G7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmABKK6o +3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw -OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu -ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks -ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX -REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D -CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU -YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP -l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 -MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz -dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg -Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg -Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt -L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf -BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN -AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI -cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 -CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW -ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB -KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloXDTExMDkyMzExMTgxN1owdjELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0MgU2ln +bmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJY +rISEtSsduHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ1 +2FJarD1X6mSQ4cfN/60vLfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjR +AM0tdwXSnzuTEunfw0Oup559y3Iqxg1cExflB6cfAgMBAAGjggGXMIIBkzBBBgNV +HR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0v +Y3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG +AQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYB +BQUHAgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVu +dGVtICJQb2xpdHlrYSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5p +ZSBjemFzZW0iLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVw +b3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJfMS5wZGYwHwYDVR0jBBgwFoAU +w4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavOYd9u9tej53vW +XwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMb +skF8I31JxIeBvueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR ++7KtwMg4sFDJZ8RNgOf7tbA= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX -DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 -IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg -U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd -uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v -LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c -ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w -bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM -MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH -AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr -YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC -ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf -MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO -Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB -vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= +MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG +UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v +U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN +AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw +MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD +VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM +BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m +cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws +ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx +8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ +s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c +9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V +pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ +pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC +aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y +CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ +6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG +A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 +MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF +AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob +sRQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE -ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z -dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq -hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 -WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh -bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g -dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE -AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt -YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 -rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL -VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 -I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV -HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ -vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ -bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl -IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe -BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW -iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms -1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx +DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 +Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 +OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp +bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp +dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x +18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 +yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI +LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G +A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW +zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x +GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh +cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G +CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy +BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j +cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ +YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ +YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 +ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p +00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb +cCOxgN8aIDjnfg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD +VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz +MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD +VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx +JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz +MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh +cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe +MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 +GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 +fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx +Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u +jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx +ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp +/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ +co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s +zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo ++uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F +TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w +ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm +gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO +BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf +U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h +c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN +AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ +BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC +AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC +AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG ++EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV +HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN +BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y +PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M +AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP +qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP +sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v +dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ +O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P ++UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg +g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg +T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa +yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE +o2A= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGJDCCBY2gAwIBAgIEQoaroDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjA3 +MTQxNzEwMjhaFw0xNDA3MTQxNzQwMjhaMFwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xGzAZBgNV +BAMTEkRpZ2lDZXJ0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMQ8vMy66mLmnkIjr7SyEa5ijdmh04/MFHIZ7Zn2/d5du1nAsMKvaplS +lVcLNf/hhvqvosPBBWUnIHYvClQlfOor3ZVBV5sPO89H6AEGjMVESPwHLvNygzBR +lJ5pOoOph5AU2V7EoniPwT7UGWEOGufcGpUgQb5vF9q4HEHumLD61x01PxanBCgT +XT0FdZouhp4ssBeHIFhX7+HqVWC4LHAhrCljDBD8YLz51Rw3ZNW0+x6rJjlGiKTL +zTBnwCZ55cpo+SLX5dKxu0hMmwuYW0KS5dLtDkcw+t0nVmNqpQHHjq/wTjsbVRVE +1T5NVx7hkeq4oI/OOmNflom6CD7+RLsCAwEAAaOCAwUwggMBMBIGA1UdEwEB/wQI +MAYBAf8CAQAwggEyBgNVHSAEggEpMIIBJTCCASEGCSqGSIb2fQdLAjCCARIwJgYI +KwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvY3BzMIHnBggrBgEFBQcC +AjCB2hqB10ZvciB1c2Ugc29sZWx5IHdpdGggU1NMIGFuZCBTL01JTUUgY2VydGlm +aWNhdGVzIGlzc3VlZCBieSBEaWdpY2VydCwgSW5jLiB0byBhdXRob3JpemVkIHN1 +YnNjcmliZXJzLg0KRE9FUyBOT1QgcmVwcmVzZW50IGFueSBlbmRvcnNlbWVudCBi +eSBFbnRydXN0IEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMgYXMgdG8gdGhlIGlkZW50 +aXR5IG9mIGFueSBjZXJ0aWZpY2F0ZSBob2xkZXIuMDEGA1UdJQQqMCgGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwQGCCsGAQUFBwMJMIIBGAYDVR0fBIIBDzCC +AQswKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvc2VydmVyMS5jcmwwgd6g +gduggdikgdUwgdIxCzAJBgNVBAYTAlVTMRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE7 +MDkGA1UECxMyd3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0 +ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwCwYDVR0PBAQDAgEGMB8GA1Ud +IwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMB0GA1UdDgQWBBSnxxOgegE8ne+C +SIJI1XNRthJWKjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0B +AQUFAAOBgQBK8bPOaGnjWKNh7bYWyJOxGDA+4HLfTz3iTeG4/D/ByeNFqV2pwdqj +5TbXjtYPrTavbLxE5ppGlKYRoNBS59pVsPYchftjUnu2mY8f4stHZKLrCGXmUdsc +S21/U58eDTGT1DBdHm4BBydgXbvT9ONsHSAPdSozEKe3idepFxQyAw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD diff --git a/indra/newview/app_settings/dictionaries/en_sl.dic b/indra/newview/app_settings/dictionaries/en_sl.dic new file mode 100644 index 000000000..09076f788 --- /dev/null +++ b/indra/newview/app_settings/dictionaries/en_sl.dic @@ -0,0 +1,1849 @@ +1835 +Core +Alex +Abbot +Solo +Aboma +Zepp +Crystal +Viper +Blackheart +Dover +Baily +Sparta +Neox +FLux +Ruby +Arun +Aquila +Chrome +Bayn +Deed +Fallen +Andretti +Lionheart +Toxx +Aldrin +Foxclaw +Brune +Zsun +Jupiter +Enyo +Moonwall +Admiral +Ying +Zarco +Delicioso +Boxen +Gant +Silvercloud +Bigbear +Scorpio +Titanium +Guardian +Popstar +Silverfall +Haiku +Citron +Keng +Runner +Shim +Monday +Artful +Draconia +Alchemi +Naxos +India +Taurus +Anton +Barcelos +Goldshark +Rain +Sapphire +Copperfield +Kenin +Carpaccio +Breil +Pizzaro +Zelin +Radikal +Carami +Maven +Mocha +Kling +Roxley +Genesis +Bombastic +Static +Crumb +Millar +Wasp +Snowpaw +Badger +Abrahams +Inaka +Spore +Ziplon +Broono +Engineer +Nayar +Bigboots +Magnifico +Kimono +Garnet +Falconer +Darkwatch +Unplugged +Riler +Vemo +Eyre +McAndrews +Difference +Lexington +Dembo +Ronas +Mistwalker +Portland +Kanya +Acer +Shuffle +Ellisson +Starship +Wylder +Blackbart +Rage +Halostar +Kamala +Ivanovic +Delvalle +Braham +Hanly +Kytori +Spires +Calamity +Frostbite +Rexie +Skute +Lexico +Baudin +Yven +Lenroy +Cheng +Marville +Menna +Cristole +Veeper +SecretSpy +Overland +Brianna +Werefox +Alderton +Digfoot +Warden +Carfield +Luckstone +Starsider +Fairlady +Cascarino +Panthar +Nider +Debbel +Velde +Hoxley +Gearbox +Greymoon +Philly +Vaniva +Ireman +Pinelli +Zuzu +Lectar +Lanley +Okelli +Halsey +Neutron +Sandalwood +Seerose +Ditko +Rudolf +Lavendel +Yakubu +Fireguard +Ibor +Verino +Swansong +Giordano +Somerset +Zifer +Snowbear +Ireto +Hema +Deezul +Woodrunner +Winslet +Loudwater +Umia +Nyoki +Fensen +Shamen +Rumble +Feden +Darkfire +Ulrik +Bulmer +McWinnie +Rascon +Flagon +Monitor +Abrastraza +Cyberstar +Steampunk +Juneberry +Ordinary +TopHat +Appletor +Firelight +Batistuta +Oakleaf +Coberts +Raynier +Spingflower +Lamilton +Oompa +Macarthur +Serrao +Mhia +Qork +Rewell +McMahn +Francois +Mexicola +Serendipity +Falmer +Murfin +Mistwood +Mirabella +Funizza +Metaller +Zemenis +Brunswick +Molko +Adagio +Denfu +Wickentower +Bonham +Sciavo +Bubble +Mildor +Galtier +Finchy +Xenga +Luckless +Lemondrop +Bearsfoot +MacFanatic +Mixmaster +Warwillow +Delwood +Svenson +Alenquer +Metaluna +Paneer +Collinson +Earthboy +Highfield +Stromfield +Claremont +Iadyl +Twist +Inkpen +Freng +Crescendo +Megadon +Hyx +Peretz +Alcove +McAuley +Trill +Frequency +Southpaw +Baguier +Drascol +Bumblefoot +Steamweaver +Wardark +Bowenford +Herbit +Nyn +Ubert +Starsmith +Haven +Zeitman +Dirkle +Donogal +Quixote +Bovarro +Aiten +Farshore +Edelmann +Moonshadow +Teixeira +Madrigal +McGillivary +Royce +Adderstein +Alderbury +Sharktooth +Puddlegum +Caramel +Hoof +Shoreman +Lemton +Eleonara +Fazuku +Nowles +Ishtari +Midal +Marialla +Pookes +Flinders +Darkfury +Baragula +Causten +Helstein +Carminucci +Toros +Warrhol +Rizooto +Dionysus +Velinov +Voir +Aubin +Raleigh +Caggles +Gearhead +Leistone +Marabana +Hadisson +Silvershade +Ixtar +Bianco +Asamoah +Mendle +Belargio +Bernitz +Iali +Dethly +Uxlay +Horngold +Bhalti +Farspire +Choovio +Ranimo +Torii +Asalia +Bluewood +Dockal +Fadlan +Greybeard +Yheng +Arcana +Bunjie +Fenwitch +Verrazzano +Colter +Cliassi +Holfe +Kalinakov +Lysette +Ashmoot +Coy +Yardley +Miggins +Vespucciano +Macpherson +Fanbridge +Pelliot +Sharpshire +Panache +Foehammer +Xurina +Glendale +Hernandoz +Pexington +Classito +Acacia +Grantly +Paragorn +Titian +Deluxe +Balzibo +Streusel +Blokke +Mekanic +Frentis +Dimanovic +Wikifoo +Wolfhunter +Venom +Islar +Toki +Torvalar +Souther +Xaron +Orellana +Trapdoor +Kingsley +Chiung +Darwinian +Fetuccio +Foodiboo +Blazewood +Barnside +Medier +Atisso +Asadar +Sunkiller +Edring +Hoffnung +Farrasco +Freidman +Reanimator +Battitude +Marioman +Arlington +Sabetha +Hexicola +Renilo +Aurotharius +Razorfen +Cardalines +Darkthief +Oberts +Malaspina +Avalira +Wellesley +Lapis +Wizenheim +Oxidor +Trallis +Domenitzo +Leimes +Monk +Mixemup +Yebut +Kimagawa +Rubanis +Katana +Bradders +Dimitriaski +Solano +Hartle +Mactavish +Tamatzui +Threebeards +Zaytsev +Slafford +Knave +Zahm +Allardyce +Genezzia +Breuer +Azambuja +Tutti +Jestyr +Blauvelt +Humbridge +Briand +Frenburg +Omegaman +Darkward +Bernandes +Emolite +Belavidorico +Loorden +Sorrowman +Latoe +Deanimator +Xomotron +Dawodu +Blogfan +Petrolhead +Porterfield +Darbyshire +Cerna +Moonkill +Listern +Viatruso +Steerpike +Mumblewood +Lynwood +Seljan +Bernheim +Waddington +Manx +Auggers +Kyrie +Oatsmill +Burckhardt +Czartza +Faerye +Balehawk +Menizah +Maesar +Whelan +Yiwama +Gracemount +Miliandrovic +Underby +Krovac +Teodosio +Khalim +Nikita +Mystiere +Niosaki +Airy +Rainier +Ivercourt +Geordie +Wyx +Ryada +Yangtz +Merchi +Lavarock +Huxxely +Udein +Cifuentes +Farlight +Fenstalker +Kerang +Calael +Eddingham +Xofan +Wheatcliffe +Geraln +Zenoria +Euromat +Derryth +Kaur +Snowfield +Daysleeper +Silent +Coeur +Firecloak +Hydraconis +Ganloso +Zifanwe +Klaber +Caedmon +Nandahar +Edenbaum +Xenobuilder +Yowman +Rajesh +Redenblack +Ranica +Gandt +Blackcinder +Roi +Xuanzang +Cvercko +Sonnenkern +Bluestar +Shieldmaiden +Serrta +Jiersen +Roddenham +Colinsgrove +Pennent +Mattercaster +Lacourte +Namiboo +Seaside +Spearsong +Qarnac +Garsdale +Walamai +Mongrain +Taur +Ronzales +Reilig +Avium +Madeye +Deimatov +Ilex +Thirdborn +Dighno +Serin +Czavicevic +Sharpesworth +Wrydan +Malik +Canonmill +Lemur +Dotterkelch +Tsunenaga +Hauster +Quinzet +Xstar +Woodsheart +Zalivstok +Lyric +Seorn +Caliera +Bettencourt +Podless +Rhys +Corbeau +Narstrom +Gata +Whitefalcon +Slavicz +llSin +llCos +llTan +llAtan2 +llSqrt +llPow +llAbs +llFabs +llFrand +llFloor +llCeil +llRound +llVecMag +llVecNorm +llVecDist +llRot2Euler +llEuler2Rot +llAxes2Rot +llRot2Fwd +llRot2Left +llRot2Up +llRotBetween +llWhisper +llSay +llShout +llListen +llListenControl +llListenRemove +llSensor +llSensorRepeat +llSensorRemove +llDetectedName +llDetectedKey +llDetectedOwner +llDetectedType +llDetectedPos +llDetectedVel +llDetectedGrab +llDetectedRot +llDetectedGroup +llDetectedLinkNumber +llDie +llGround +llCloud +llWind +llSetStatus +llGetStatus +llSetScale +llGetScale +llSetColor +llGetAlpha +llSetAlpha +llGetColor +llSetTexture +llScaleTexture +llOffsetTexture +llRotateTexture +llGetTexture +llSetPos +llGetPos +llGetLocalPos +llSetRot +llGetRot +llGetLocalRot +llSetForce +llGetForce +llTarget +llTargetRemove +llRotTarget +llRotTargetRemove +llMoveToTarget +llStopMoveToTarget +llApplyImpulse +llApplyRotationalImpulse +llSetTorque +llGetTorque +llSetForceAndTorque +llGetVel +llGetAccel +llGetOmega +llGetTimeOfDay +llGetWallclock +llGetTime +llResetTime +llGetAndResetTime +llSound +llPlaySound +llLoopSound +llLoopSoundMaster +llLoopSoundSlave +llPlaySoundSlave +llTriggerSound +llStopSound +llPreloadSound +llGetSubString +llDeleteSubString +llInsertString +llToUpper +llToLower +llGiveMoney +llMakeExplosion +llMakeFountain +llMakeSmoke +llMakeFire +llRezObject +llLookAt +llStopLookAt +llSetTimerEvent +llSleep +llGetMass +llCollisionFilter +llTakeControls +llReleaseControls +llAttachToAvatar +llDetachFromAvatar +llTakeCamera +llReleaseCamera +llGetOwner +llInstantMessage +llEmail +llGetNextEmail +llGetKey +llSetBuoyancy +llSetHoverHeight +llStopHover +llMinEventDelay +llSoundPreload +llRotLookAt +llStringLength +llStartAnimation +llStopAnimation +llPointAt +llStopPointAt +llTargetOmega +llGetStartParameter +llGodLikeRezObject +llRequestPermissions +llGetPermissionsKey +llGetPermissions +llGetLinkNumber +llSetLinkColor +llCreateLink +llBreakLink +llBreakAllLinks +llGetLinkKey +llGetLinkName +llGetInventoryNumber +llGetInventoryName +llSetScriptState +llGetEnergy +llGiveInventory +llRemoveInventory +llSetText +llWater +llPassTouches +llRequestAgentData +llRequestInventoryData +llSetDamage +llTeleportAgentHome +llModifyLand +llCollisionSound +llCollisionSprite +llGetAnimation +llResetScript +llMessageLinked +llPushObject +llPassCollisions +llGetScriptName +llGetNumberOfSides +llAxisAngle2Rot +llRot2Axis +llRot2Angle +llAcos +llAsin +llAngleBetween +llGetInventoryKey +llAllowInventoryDrop +llGetSunDirection +llGetTextureOffset +llGetTextureScale +llGetTextureRot +llSubStringIndex +llGetOwnerKey +llGetCenterOfMass +llListSort +llGetListLength +llList2Integer +llList2Float +llList2String +llList2Key +llList2Vector +llList2Rot +llList2List +llDeleteSubList +llGetListEntryType +llList2CSV +llCSV2List +llListRandomize +llList2ListStrided +llGetRegionCorner +llListInsertList +llListFindList +llGetObjectName +llSetObjectName +llGetDate +llEdgeOfWorld +llGetAgentInfo +llAdjustSoundVolume +llSetSoundQueueing +llSetSoundRadius +llKey2Name +llSetTextureAnim +llTriggerSoundLimited +llEjectFromLand +llParseString2List +llOverMyLand +llGetLandOwnerAt +llGetNotecardLine +llGetAgentSize +llSameGroup +llUnSit +llGroundSlope +llGroundNormal +llGroundContour +llGetAttached +llGetFreeMemory +llGetRegionName +llGetRegionTimeDilation +llGetRegionFPS +llParticleSystem +llGroundRepel +llGiveInventoryList +llSetVehicleType +llSetVehicleFloatParam +llSetVehicleVectorParam +llSetVehicleRotationParam +llSetVehicleFlags +llRemoveVehicleFlags +llSitTarget +llAvatarOnSitTarget +llAddToLandPassList +llSetTouchText +llSetSitText +llSetCameraEyeOffset +llSetCameraAtOffset +llDumpList2String +llScriptDanger +llDialog +llVolumeDetect +llResetOtherScript +llGetScriptState +llRemoteLoadScript +llSetRemoteScriptAccessPin +llRemoteLoadScriptPin +llOpenRemoteDataChannel +llSendRemoteData +llRemoteDataReply +llCloseRemoteDataChannel +llMD5String +llSetPrimitiveParams +llStringToBase64 +llBase64ToString +llXorBase64Strings +llRemoteDataSetRegion +llLog10 +llLog +llGetAnimationList +llSetParcelMusicURL +llGetRootPosition +llGetRootRotation +llGetObjectDesc +llSetObjectDesc +llGetCreator +llGetTimestamp +llSetLinkAlpha +llGetNumberOfPrims +llGetNumberOfNotecardLines +llGetBoundingBox +llGetGeometricCenter +llGetPrimitiveParams +llIntegerToBase64 +llBase64ToInteger +llGetGMTclock +llGetSimulatorHostname +llSetLocalRot +llParseStringKeepNulls +llRezAtRoot +llGetObjectPermMask +llSetObjectPermMask +llGetInventoryPermMask +llSetInventoryPermMask +llGetInventoryCreator +llOwnerSay +llRequestSimulatorData +llForceMouselook +llGetObjectMass +llListReplaceList +llLoadURL +llParcelMediaCommandList +llParcelMediaQuery +llModPow +llGetInventoryType +llSetPayPrice +llGetCameraPos +llGetCameraRot +llSetPrimURL +llRefreshPrimURL +llEscapeURL +llUnescapeURL +llMapDestination +llAddToLandBanList +llRemoveFromLandPassList +llRemoveFromLandBanList +llSetCameraParams +llClearCameraParams +llListStatistics +llGetUnixTime +llGetParcelFlags +llGetRegionFlags +llXorBase64StringsCorrect +llHTTPRequest +llResetLandBanList +llResetLandPassList +llGetObjectPrimCount +llGetParcelPrimOwners +llGetParcelPrimCount +llGetParcelMaxPrims +llGetParcelDetails +llSetLinkPrimitiveParams +llSetLinkTexture +llStringTrim +llRegionSay +llGetObjectDetails +llSetClickAction +llGetRegionAgentCount +llTextBox +llGetAgentLanguage +llDetectedTouchUV +llDetectedTouchFace +llDetectedTouchPos +llDetectedTouchNormal +llDetectedTouchBinormal +llDetectedTouchST +llSHA1String +llGetFreeURLs +llRequestURL +llRequestSecureURL +llReleaseURL +llHTTPResponse +llGetHTTPHeader +llSetPrimMediaParams +llGetPrimMediaParams +llClearPrimMedia +llSetLinkPrimitiveParamsFast +llGetLinkPrimitiveParams +llLinkParticleSystem +llSetLinkTextureAnim +llGetLinkNumberOfSides +osSetRegionWaterHeight +osSetRegionSunSettings +osSetEstateSunSettings +osGetCurrentSunHour +osSunGetParam +osSunSetParam +osWindActiveModelPluginName +osWindParamSet +osWindParamGet +osList2Double +osSetDynamicTextureURL +osSetDynamicTextureData +osSetDynamicTextureURLBlend +osSetDynamicTextureDataBlend +osSetDynamicTextureURLBlendFace +osSetDynamicTextureDataBlendFace +osTerrainGetHeight +osTerrainSetHeight +osTerrainFlush +osRegionRestart +osRegionNotice +osConsoleCommand +osSetParcelMediaURL +osSetParcelSIPAddress +osSetPrimFloatOnWater +osTeleportAgent +osGetAgentIP +osGetAgents +osAvatarPlayAnimation +osAvatarStopAnimation +osMovePen +osDrawLine +osDrawText +osDrawEllipse +osDrawRectangle +osDrawFilledRectangle +osDrawPolygon +osDrawFilledPolygon +osSetFontSize +osSetFontName +osSetPenSize +osSetPenCap +osSetPenColour +osDrawImage +osGetDrawStringSize +osSetStateEvents +osGetScriptEngineName +osGetSimulatorVersion +osParseJSON +osMessageObject +osMakeNotecard +osGetNotecardLine +osGetNotecard +osGetNumberOfNotecardLines +osAvatarName2Key +osKey2Name +osGetGridNick +osGetGridName +osGetGridLoginURI +osFormatString +osMatchString +osLoadedCreationDate +osLoadedCreationTime +osLoadedCreationID +osGetLinkPrimitiveParams +osNpcCreate +osNpcMoveTo +osNpcSay +osNpcRemove +osGetMapTexture +osGetRegionMapTexture +osGetRegionStats +osGetSimulatorMemory +osKickAvatar +osSetSpeed +osCauseDamage +osCauseHealing +cmSetWindlightScene +cmSetWindlightSceneTargeted +cmGetWindlightScene +lsSetWindlightScene +lsSetWindlightSceneTargeted +lsGetWindlightScene +llkeywords +word +default +state +integer +float +string +key +vector +rotation +list +state_entry +state_exit +touch_start +touch +touch_end +collision_start +collision +collision_end +land_collision_start +land_collision +land_collision_end +timer +listen +sensor +no_sensor +control +at_target +not_at_target +at_rot_target +not_at_rot_target +money +email +run_time_permissions +attach +dataserver +moving_start +moving_end +on_rez +object_rez +link_message +changed +remote_data +http_response +http_request +TRUE +FALSE +STATUS_PHYSICS +STATUS_PHANTOM +STATUS_ROTATE_X +STATUS_ROTATE_Y +STATUS_ROTATE_Z +STATUS_SANDBOX +STATUS_BLOCK_GRAB +STATUS_DIE_AT_EDGE +STATUS_RETURN_AT_EDGE +STATUS_CAST_SHADOWS +AGENT +AGENT_BY_USERNAME +AGENT_BY_LEGACY_NAME +ACTIVE +PASSIVE +SCRIPTED +CONTROL_FWD +CONTROL_BACK +CONTROL_LEFT +CONTROL_RIGHT +CONTROL_ROT_LEFT +CONTROL_ROT_RIGHT +CONTROL_UP +CONTROL_DOWN +CONTROL_LBUTTON +CONTROL_ML_LBUTTON +PERMISSION_DEBIT +PERMISSION_TAKE_CONTROLS +PERMISSION_TRIGGER_ANIMATION +PERMISSION_ATTACH +PERMISSION_CHANGE_LINKS +PERMISSION_TRACK_CAMERA +PERMISSION_CONTROL_CAMERA +DEBUG_CHANNEL +PUBLIC_CHANNEL +AGENT_FLYING +AGENT_ATTACHMENTS +AGENT_SCRIPTED +AGENT_SITTING +AGENT_ON_OBJECT +AGENT_MOUSELOOK +AGENT_AWAY +AGENT_WALKING +AGENT_IN_AIR +AGENT_TYPING +AGENT_CROUCHING +AGENT_BUSY +AGENT_ALWAYS_RUN +AGENT_AUTOPILOT +PSYS_PART_FLAGS +PSYS_PART_START_COLOR +PSYS_PART_START_ALPHA +PSYS_PART_START_SCALE +PSYS_PART_END_COLOR +PSYS_PART_END_ALPHA +PSYS_PART_END_SCALE +PSYS_PART_MAX_AGE +PSYS_PART_BOUNCE_MASK +PSYS_PART_WIND_MASK +PSYS_PART_INTERP_COLOR_MASK +PSYS_PART_INTERP_SCALE_MASK +PSYS_PART_FOLLOW_SRC_MASK +PSYS_PART_FOLLOW_VELOCITY_MASK +PSYS_PART_TARGET_POS_MASK +PSYS_PART_EMISSIVE_MASK +PSYS_PART_TARGET_LINEAR_MASK +PSYS_SRC_PATTERN +PSYS_SRC_INNERANGLE +PSYS_SRC_OUTERANGLE +PSYS_SRC_ANGLE_BEGIN +PSYS_SRC_ANGLE_END +PSYS_SRC_BURST_RATE +PSYS_SRC_BURST_PART_COUNT +PSYS_SRC_BURST_RADIUS +PSYS_SRC_BURST_SPEED_MIN +PSYS_SRC_BURST_SPEED_MAX +PSYS_SRC_MAX_AGE +PSYS_SRC_ACCEL +PSYS_SRC_TEXTURE +PSYS_SRC_TARGET_KEY +PSYS_SRC_OMEGA +PSYS_SRC_PATTERN_DROP +PSYS_SRC_PATTERN_EXPLODE +PSYS_SRC_PATTERN_ANGLE +PSYS_SRC_PATTERN_ANGLE_CONE +PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY +OBJECT_UNKNOWN_DETAIL +OBJECT_NAME +OBJECT_DESC +OBJECT_POS +OBJECT_ROT +OBJECT_VELOCITY +OBJECT_OWNER +OBJECT_GROUP +OBJECT_CREATOR +VEHICLE_TYPE_NONE +VEHICLE_TYPE_SLED +VEHICLE_TYPE_CAR +VEHICLE_TYPE_BOAT +VEHICLE_TYPE_AIRPLANE +VEHICLE_TYPE_BALLOON +VEHICLE_REFERENCE_FRAME +VEHICLE_LINEAR_FRICTION_TIMESCALE +VEHICLE_ANGULAR_FRICTION_TIMESCALE +VEHICLE_LINEAR_MOTOR_DIRECTION +VEHICLE_LINEAR_MOTOR_OFFSET +VEHICLE_ANGULAR_MOTOR_DIRECTION +VEHICLE_HOVER_HEIGHT +VEHICLE_HOVER_EFFICIENCY +VEHICLE_HOVER_TIMESCALE +VEHICLE_BUOYANCY +VEHICLE_LINEAR_DEFLECTION_EFFICIENCY +VEHICLE_LINEAR_DEFLECTION_TIMESCALE +VEHICLE_LINEAR_MOTOR_TIMESCALE +VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE +VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY +VEHICLE_ANGULAR_DEFLECTION_TIMESCALE +VEHICLE_ANGULAR_MOTOR_TIMESCALE +VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE +VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY +VEHICLE_VERTICAL_ATTRACTION_TIMESCALE +VEHICLE_BANKING_EFFICIENCY +VEHICLE_BANKING_MIX +VEHICLE_BANKING_TIMESCALE +VEHICLE_FLAG_NO_DEFLECTION_UP +VEHICLE_FLAG_LIMIT_ROLL_ONLY +VEHICLE_FLAG_HOVER_WATER_ONLY +VEHICLE_FLAG_HOVER_TERRAIN_ONLY +VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT +VEHICLE_FLAG_HOVER_UP_ONLY +VEHICLE_FLAG_LIMIT_MOTOR_UP +VEHICLE_FLAG_MOUSELOOK_STEER +VEHICLE_FLAG_MOUSELOOK_BANK +VEHICLE_FLAG_CAMERA_DECOUPLED +CAMERA_PITCH +CAMERA_FOCUS_OFFSET +CAMERA_POSITION_LAG +CAMERA_FOCUS_LAG +CAMERA_DISTANCE +CAMERA_BEHINDNESS_ANGLE +CAMERA_BEHINDNESS_LAG +CAMERA_POSITION_THRESHOLD +CAMERA_FOCUS_THRESHOLD +CAMERA_ACTIVE +CAMERA_POSITION +CAMERA_FOCUS +CAMERA_POSITION_LOCKED +CAMERA_FOCUS_LOCKED +INVENTORY_TEXTURE +INVENTORY_SOUND +INVENTORY_OBJECT +INVENTORY_SCRIPT +INVENTORY_LANDMARK +INVENTORY_CLOTHING +INVENTORY_NOTECARD +INVENTORY_BODYPART +INVENTORY_ANIMATION +INVENTORY_GESTURE +INVENTORY_ALL +INVENTORY_NONE +ATTACH_CHEST +ATTACH_HEAD +ATTACH_LSHOULDER +ATTACH_RSHOULDER +ATTACH_LHAND +ATTACH_RHAND +ATTACH_LFOOT +ATTACH_RFOOT +ATTACH_BACK +ATTACH_PELVIS +ATTACH_MOUTH +ATTACH_CHIN +ATTACH_LEAR +ATTACH_REAR +ATTACH_LEYE +ATTACH_REYE +ATTACH_NOSE +ATTACH_RUARM +ATTACH_RLARM +ATTACH_LUARM +ATTACH_LLARM +ATTACH_RHIP +ATTACH_RULEG +ATTACH_RLLEG +ATTACH_LHIP +ATTACH_LULEG +ATTACH_LLLEG +ATTACH_BELLY +ATTACH_RPEC +ATTACH_LPEC +LAND_LEVEL +LAND_RAISE +LAND_LOWER +LAND_SMOOTH +LAND_NOISE +LAND_REVERT +LAND_SMALL_BRUSH +LAND_MEDIUM_BRUSH +LAND_LARGE_BRUSH +DATA_PAYINFO +DATA_ONLINE +DATA_NAME +DATA_BORN +DATA_RATING +DATA_SIM_POS +DATA_SIM_STATUS +DATA_SIM_RATING +PAYMENT_INFO_ON_FILE +PAYMENT_INFO_USED +ANIM_ON +LOOP +REVERSE +PING_PONG +SMOOTH +ROTATE +SCALE +ALL_SIDES +LINK_SET +LINK_ROOT +LINK_ALL_OTHERS +LINK_ALL_CHILDREN +LINK_THIS +CHANGED_INVENTORY +CHANGED_COLOR +CHANGED_SHAPE +CHANGED_SCALE +CHANGED_TEXTURE +CHANGED_LINK +CHANGED_ALLOWED_DROP +CHANGED_OWNER +CHANGED_REGION +CHANGED_TELEPORT +CHANGED_REGION_START +CHANGED_MEDIA +TYPE_INTEGER +TYPE_FLOAT +TYPE_STRING +TYPE_KEY +TYPE_VECTOR +TYPE_ROTATION +TYPE_INVALID +REMOTE_DATA_CHANNEL +REMOTE_DATA_REQUEST +REMOTE_DATA_REPLY +PRIM_TYPE +PRIM_MATERIAL +PRIM_PHYSICS +PRIM_FLEXIBLE +PRIM_POINT_LIGHT +PRIM_TEMP_ON_REZ +PRIM_PHANTOM +PRIM_CAST_SHADOWS +PRIM_POSITION +PRIM_SIZE +PRIM_ROTATION +PRIM_TEXTURE +PRIM_COLOR +PRIM_BUMP_SHINY +PRIM_FULLBRIGHT +PRIM_TEXGEN +PRIM_GLOW +PRIM_TEXT +PRIM_NAME +PRIM_DESC +PRIM_TYPE_BOX +PRIM_TYPE_CYLINDER +PRIM_TYPE_PRISM +PRIM_TYPE_SPHERE +PRIM_TYPE_TORUS +PRIM_TYPE_TUBE +PRIM_TYPE_RING +PRIM_TYPE_SCULPT +PRIM_HOLE_DEFAULT +PRIM_HOLE_SQUARE +PRIM_HOLE_CIRCLE +PRIM_HOLE_TRIANGLE +PRIM_MATERIAL_STONE +PRIM_MATERIAL_METAL +PRIM_MATERIAL_GLASS +PRIM_MATERIAL_WOOD +PRIM_MATERIAL_FLESH +PRIM_MATERIAL_PLASTIC +PRIM_MATERIAL_RUBBER +PRIM_MATERIAL_LIGHT +PRIM_SHINY_NONE +PRIM_SHINY_LOW +PRIM_SHINY_MEDIUM +PRIM_SHINY_HIGH +PRIM_BUMP_NONE +PRIM_BUMP_BRIGHT +PRIM_BUMP_DARK +PRIM_BUMP_WOOD +PRIM_BUMP_BARK +PRIM_BUMP_BRICKS +PRIM_BUMP_CHECKER +PRIM_BUMP_CONCRETE +PRIM_BUMP_TILE +PRIM_BUMP_STONE +PRIM_BUMP_DISKS +PRIM_BUMP_GRAVEL +PRIM_BUMP_BLOBS +PRIM_BUMP_SIDING +PRIM_BUMP_LARGETILE +PRIM_BUMP_STUCCO +PRIM_BUMP_SUCTION +PRIM_BUMP_WEAVE +PRIM_TEXGEN_DEFAULT +PRIM_TEXGEN_PLANAR +PRIM_SCULPT_TYPE_SPHERE +PRIM_SCULPT_TYPE_TORUS +PRIM_SCULPT_TYPE_PLANE +PRIM_SCULPT_TYPE_CYLINDER +PRIM_SCULPT_TYPE_MASK +PRIM_SCULPT_FLAG_INVERT +PRIM_SCULPT_FLAG_MIRROR +MASK_BASE +MASK_OWNER +MASK_GROUP +MASK_EVERYONE +MASK_NEXT +PERM_TRANSFER +PERM_MODIFY +PERM_COPY +PERM_MOVE +PERM_ALL +PARCEL_MEDIA_COMMAND_STOP +PARCEL_MEDIA_COMMAND_PAUSE +PARCEL_MEDIA_COMMAND_PLAY +PARCEL_MEDIA_COMMAND_LOOP +PARCEL_MEDIA_COMMAND_TEXTURE +PARCEL_MEDIA_COMMAND_URL +PARCEL_MEDIA_COMMAND_TYPE +PARCEL_MEDIA_COMMAND_DESC +PARCEL_MEDIA_COMMAND_TIME +PARCEL_MEDIA_COMMAND_SIZE +PARCEL_MEDIA_COMMAND_AGENT +PARCEL_MEDIA_COMMAND_UNLOAD +PARCEL_MEDIA_COMMAND_AUTO_ALIGN +PAY_HIDE +PAY_DEFAULT +LIST_STAT_MAX +LIST_STAT_MIN +LIST_STAT_MEAN +LIST_STAT_MEDIAN +LIST_STAT_STD_DEV +LIST_STAT_SUM +LIST_STAT_SUM_SQUARES +LIST_STAT_NUM_COUNT +LIST_STAT_GEOMETRIC_MEAN +LIST_STAT_RANGE +PARCEL_FLAG_ALLOW_FLY +PARCEL_FLAG_ALLOW_GROUP_SCRIPTS +PARCEL_FLAG_ALLOW_SCRIPTS +PARCEL_FLAG_ALLOW_LANDMARK +PARCEL_FLAG_ALLOW_TERRAFORM +PARCEL_FLAG_ALLOW_DAMAGE +PARCEL_FLAG_ALLOW_CREATE_OBJECTS +PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS +PARCEL_FLAG_USE_ACCESS_GROUP +PARCEL_FLAG_USE_ACCESS_LIST +PARCEL_FLAG_USE_BAN_LIST +PARCEL_FLAG_USE_LAND_PASS_LIST +PARCEL_FLAG_LOCAL_SOUND_ONLY +PARCEL_FLAG_RESTRICT_PUSHOBJECT +PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY +PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY +REGION_FLAG_ALLOW_DAMAGE +REGION_FLAG_FIXED_SUN +REGION_FLAG_BLOCK_TERRAFORM +REGION_FLAG_SANDBOX +REGION_FLAG_DISABLE_COLLISIONS +REGION_FLAG_DISABLE_PHYSICS +REGION_FLAG_BLOCK_FLY +REGION_FLAG_ALLOW_DIRECT_TELEPORT +REGION_FLAG_RESTRICT_PUSHOBJECT +HTTP_METHOD +HTTP_MIMETYPE +HTTP_BODY_MAXLENGTH +HTTP_VERIFY_CERT +HTTP_BODY_TRUNCATED +PARCEL_COUNT_TOTAL +PARCEL_COUNT_OWNER +PARCEL_COUNT_GROUP +PARCEL_COUNT_OTHER +PARCEL_COUNT_SELECTED +PARCEL_COUNT_TEMP +PARCEL_DETAILS_NAME +PARCEL_DETAILS_DESC +PARCEL_DETAILS_OWNER +PARCEL_DETAILS_GROUP +PARCEL_DETAILS_AREA +STRING_TRIM_HEAD +STRING_TRIM_TAIL +STRING_TRIM +CLICK_ACTION_NONE +CLICK_ACTION_TOUCH +CLICK_ACTION_SIT +CLICK_ACTION_BUY +CLICK_ACTION_PAY +CLICK_ACTION_OPEN +CLICK_ACTION_PLAY +CLICK_ACTION_OPEN_MEDIA +CLICK_ACTION_ZOOM +TOUCH_INVALID_TEXCOORD +TOUCH_INVALID_VECTOR +TOUCH_INVALID_FACE +PRIM_MEDIA_ALT_IMAGE_ENABLE +PRIM_MEDIA_CONTROLS +PRIM_MEDIA_CURRENT_URL +PRIM_MEDIA_HOME_URL +PRIM_MEDIA_AUTO_LOOP +PRIM_MEDIA_AUTO_PLAY +PRIM_MEDIA_AUTO_SCALE +PRIM_MEDIA_AUTO_ZOOM +PRIM_MEDIA_FIRST_CLICK_INTERACT +PRIM_MEDIA_WIDTH_PIXELS +PRIM_MEDIA_HEIGHT_PIXELS +PRIM_MEDIA_WHITELIST_ENABLE +PRIM_MEDIA_WHITELIST +PRIM_MEDIA_PERMS_INTERACT +PRIM_MEDIA_PERMS_CONTROL +PRIM_MEDIA_PARAM_MAX +PRIM_MEDIA_CONTROLS_STANDARD +PRIM_MEDIA_CONTROLS_MINI +PRIM_MEDIA_PERM_NONE +PRIM_MEDIA_PERM_OWNER +PRIM_MEDIA_PERM_GROUP +PRIM_MEDIA_PERM_ANYONE +PRIM_MEDIA_MAX_URL_LENGTH +PRIM_MEDIA_MAX_WHITELIST_SIZE +PRIM_MEDIA_MAX_WHITELIST_COUNT +PRIM_MEDIA_MAX_WIDTH_PIXELS +PRIM_MEDIA_MAX_HEIGHT_PIXELS +STATUS_OK +STATUS_MALFORMED_PARAMS +STATUS_TYPE_MISMATCH +STATUS_BOUNDS_ERROR +STATUS_NOT_FOUND +STATUS_NOT_SUPPORTED +STATUS_INTERNAL_ERROR +STATUS_WHITELIST_FAILED +WL_WATER_COLOR +WL_WATER_FOG_DENSITY_EXPONENT +WL_UNDERWATER_FOG_MODIFIER +WL_REFLECTION_WAVELET_SCALE +WL_FRESNEL_SCALE +WL_FRESNEL_OFFSET +WL_REFRACT_SCALE_ABOVE +WL_REFRACT_SCALE_BELOW +WL_BLUR_MULTIPLIER +WL_BIG_WAVE_DIRECTION +WL_LITTLE_WAVE_DIRECTION +WL_NORMAL_MAP_TEXTURE +WL_HORIZON +WL_HAZE_HORIZON +WL_BLUE_DENSITY +WL_HAZE_DENSITY +WL_DENSITY_MULTIPLIER +WL_DISTANCE_MULTIPLIER +WL_MAX_ALTITUDE +WL_SUN_MOON_COLOR +WL_SUN_MOON_POSITION +WL_AMBIENT +WL_EAST_ANGLE +WL_SUN_GLOW_FOCUS +WL_SUN_GLOW_SIZE +WL_SCENE_GAMMA +WL_STAR_BRIGHTNESS +WL_CLOUD_COLOR +WL_CLOUD_XY_DENSITY +WL_CLOUD_COVERAGE +WL_CLOUD_SCALE +WL_CLOUD_DETAIL_XY_DENSITY +WL_CLOUD_SCROLL_X +WL_CLOUD_SCROLL_Y +WL_CLOUD_SCROLL_Y_LOCK +WL_CLOUD_SCROLL_X_LOCK +WL_DRAW_CLASSIC_CLOUDS +NULL_KEY +EOF +TEXTURE_BLANK +TEXTURE_DEFAULT +TEXTURE_MEDIA +TEXTURE_PLYWOOD +TEXTURE_TRANSPARENT +URL_REQUEST_GRANTED +URL_REQUEST_DENIED +PI +TWO_PI +PI_BY_TWO +DEG_TO_RAD +RAD_TO_DEG +SQRT2 +ZERO_VECTOR +ZERO_ROTATION +for +do +while +if +else +jump +return +com +org +net +gov +edu +co +uk +www +irc +3rdrock +3rdrockgrid +3rg +addac +aditi +afk +agni +alt +alts +anim +anims +ao +aos +avatar +avatars +avination +banline +banlines +bling +blog +blogger +blogs +calc +cao +cgi +chim +chims +clrchat +cmake +cmakelists +cmakelists.txt +coalesced +copy_win_libs +copy_win_scripts +crashlog +cyberlandia +dangergrid +dd +derender +develop.py +facelight +facelights +firefox +flexi +flr +freebie +freebies +furdom +furries +furry +furson +giantgrid +gor +gorean +gorgrid +griefer +griefers +griefing +gteam +gth +gtp +havok +havok4 +havok7 +homestead +http +https +hud +huds +imprudence.exe +imprudenceviewer +indra +infohub +infohubs +invisiprim +invisiprims +inworldz +inworldzbeta +iw +j2c +j2p +jira +jpeg2000 +kakadu +kdu +key2name +l$ +lag +lagging +lags +landmark +landmarks +legendcityonline +liason +liasons +lightshare +linden +lindens +lindex +llaudio +llcharacter +llcommon +llcrashlogger +llimage +llimagej2coj +llinventory +llkdu +llkdu.dll +llmath +llmessage +llplugin +llprimitive +llrender +llui +llvfs +llwindow +llxml +lms +localhost +login +logins +logout +lscript +lsl +lsl2 +mac_crash_logger +mac_updater +mapto +media_plugins +megaprim +megaprims +megaregion +megaregions +megas +meta7 +mod +mono +mouselook +mouseview +mozilla +neko +newview +newworldgrid +noob +noobie +noobs +offertp +offline +ogg +omv +onikenkon +online +onrez +openjpeg.dll +openmetaverse +opensim +opensimulator +openspace +os +osg +osgrid +php +prebuilt +prefab +prim +primitar +prims +quaternion +quicktime +reactiongrid +rebake +rebaked +rebakes +redmine +render +resi +rez +rezplat +rezzed +rezzes +rezzing +roleplayworlds +ruth +ruths +ruthing +sciencesim +sciencesimbeta +sculptie +sculpties +sculptmap +secondlife +secondlifebeta +showcase +sim +simiangrid +skybox +sl +slebrity +slex +slexing +slurl +slurls +slutorial +snowglobe +snowstorm +spacenav +spacenavigator +spam +spamming +spams +steampunk +stipend +stipends +teleport +test_apps +thegorgrid +thenewworldgrid +tier +tiers +tos +tp +tp2 +tp2cam +tph +tping +tps +trans +unlink +unlinks +uuid +uuids +viewer_manifest.py +virtyou +vorbis +webkit +wiki +win_crash_logger +win_updater +windlight +worldsimterra +xml +xstreet +xstreetsl +yiff +yiffs +yiffing +yiffy +youralternativelife +total_number diff --git a/indra/newview/app_settings/dictionaries/en_us.aff b/indra/newview/app_settings/dictionaries/en_us.aff new file mode 100644 index 000000000..2ddd98543 --- /dev/null +++ b/indra/newview/app_settings/dictionaries/en_us.aff @@ -0,0 +1,201 @@ +SET ISO8859-1 +TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ' +NOSUGGEST ! + +# ordinal numbers +COMPOUNDMIN 1 +# only in compounds: 1th, 2th, 3th +ONLYINCOMPOUND c +# compound rules: +# 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.) +# 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.) +COMPOUNDRULE 2 +COMPOUNDRULE n*1t +COMPOUNDRULE n*mp +WORDCHARS 0123456789 + +PFX A Y 1 +PFX A 0 re . + +PFX I Y 1 +PFX I 0 in . + +PFX U Y 1 +PFX U 0 un . + +PFX C Y 1 +PFX C 0 de . + +PFX E Y 1 +PFX E 0 dis . + +PFX F Y 1 +PFX F 0 con . + +PFX K Y 1 +PFX K 0 pro . + +SFX V N 2 +SFX V e ive e +SFX V 0 ive [^e] + +SFX N Y 3 +SFX N e ion e +SFX N y ication y +SFX N 0 en [^ey] + +SFX X Y 3 +SFX X e ions e +SFX X y ications y +SFX X 0 ens [^ey] + +SFX H N 2 +SFX H y ieth y +SFX H 0 th [^y] + +SFX Y Y 1 +SFX Y 0 ly . + +SFX G Y 2 +SFX G e ing e +SFX G 0 ing [^e] + +SFX J Y 2 +SFX J e ings e +SFX J 0 ings [^e] + +SFX D Y 4 +SFX D 0 d e +SFX D y ied [^aeiou]y +SFX D 0 ed [^ey] +SFX D 0 ed [aeiou]y + +SFX T N 4 +SFX T 0 st e +SFX T y iest [^aeiou]y +SFX T 0 est [aeiou]y +SFX T 0 est [^ey] + +SFX R Y 4 +SFX R 0 r e +SFX R y ier [^aeiou]y +SFX R 0 er [aeiou]y +SFX R 0 er [^ey] + +SFX Z Y 4 +SFX Z 0 rs e +SFX Z y iers [^aeiou]y +SFX Z 0 ers [aeiou]y +SFX Z 0 ers [^ey] + +SFX S Y 4 +SFX S y ies [^aeiou]y +SFX S 0 s [aeiou]y +SFX S 0 es [sxzh] +SFX S 0 s [^sxzhy] + +SFX P Y 3 +SFX P y iness [^aeiou]y +SFX P 0 ness [aeiou]y +SFX P 0 ness [^y] + +SFX M Y 1 +SFX M 0 's . + +SFX B Y 3 +SFX B 0 able [^aeiou] +SFX B 0 able ee +SFX B e able [^aeiou]e + +SFX L Y 1 +SFX L 0 ment . + +REP 88 +REP a ei +REP ei a +REP a ey +REP ey a +REP ai ie +REP ie ai +REP are air +REP are ear +REP are eir +REP air are +REP air ere +REP ere air +REP ere ear +REP ere eir +REP ear are +REP ear air +REP ear ere +REP eir are +REP eir ere +REP ch te +REP te ch +REP ch ti +REP ti ch +REP ch tu +REP tu ch +REP ch s +REP s ch +REP ch k +REP k ch +REP f ph +REP ph f +REP gh f +REP f gh +REP i igh +REP igh i +REP i uy +REP uy i +REP i ee +REP ee i +REP j di +REP di j +REP j gg +REP gg j +REP j ge +REP ge j +REP s ti +REP ti s +REP s ci +REP ci s +REP k cc +REP cc k +REP k qu +REP qu k +REP kw qu +REP o eau +REP eau o +REP o ew +REP ew o +REP oo ew +REP ew oo +REP ew ui +REP ui ew +REP oo ui +REP ui oo +REP ew u +REP u ew +REP oo u +REP u oo +REP u oe +REP oe u +REP u ieu +REP ieu u +REP ue ew +REP ew ue +REP uff ough +REP oo ieu +REP ieu oo +REP ier ear +REP ear ier +REP ear air +REP air ear +REP w qu +REP qu w +REP z ss +REP ss z +REP shun tion +REP shun sion +REP shun cion diff --git a/indra/newview/app_settings/dictionaries/en_us.dic b/indra/newview/app_settings/dictionaries/en_us.dic new file mode 100644 index 000000000..4f69807a2 --- /dev/null +++ b/indra/newview/app_settings/dictionaries/en_us.dic @@ -0,0 +1,62120 @@ +62118 +0/nm +1/n1 +2/nm +3/nm +4/nm +5/nm +6/nm +7/nm +8/nm +9/nm +0th/pt +1st/p +1th/tc +2nd/p +2th/tc +3rd/p +3th/tc +4th/pt +5th/pt +6th/pt +7th/pt +8th/pt +9th/pt +a +A +AA +AAA +Aachen/M +aardvark/SM +Aaren/M +Aarhus/M +Aarika/M +Aaron/M +AB +aback +abacus/SM +abaft +Abagael/M +Abagail/M +abalone/SM +abandoner/M +abandon/LGDRS +abandonment/SM +abase/LGDSR +abasement/S +abaser/M +abashed/UY +abashment/MS +abash/SDLG +abate/DSRLG +abated/U +abatement/MS +abater/M +abattoir/SM +Abba/M +Abbe/M +abbé/S +abbess/SM +Abbey/M +abbey/MS +Abbie/M +Abbi/M +Abbot/M +abbot/MS +Abbott/M +abbr +abbrev +abbreviated/UA +abbreviates/A +abbreviate/XDSNG +abbreviating/A +abbreviation/M +Abbye/M +Abby/M +ABC/M +Abdel/M +abdicate/NGDSX +abdication/M +abdomen/SM +abdominal/YS +abduct/DGS +abduction/SM +abductor/SM +Abdul/M +ab/DY +abeam +Abelard/M +Abel/M +Abelson/M +Abe/M +Aberdeen/M +Abernathy/M +aberrant/YS +aberrational +aberration/SM +abet/S +abetted +abetting +abettor/SM +Abeu/M +abeyance/MS +abeyant +Abey/M +abhorred +abhorrence/MS +abhorrent/Y +abhorrer/M +abhorring +abhor/S +abidance/MS +abide/JGSR +abider/M +abiding/Y +Abidjan/M +Abie/M +Abigael/M +Abigail/M +Abigale/M +Abilene/M +ability/IMES +abjection/MS +abjectness/SM +abject/SGPDY +abjuration/SM +abjuratory +abjurer/M +abjure/ZGSRD +ablate/VGNSDX +ablation/M +ablative/SY +ablaze +abler/E +ables/E +ablest +able/U +abloom +ablution/MS +Ab/M +ABM/S +abnegate/NGSDX +abnegation/M +Abner/M +abnormality/SM +abnormal/SY +aboard +abode/GMDS +abolisher/M +abolish/LZRSDG +abolishment/MS +abolitionism/SM +abolitionist/SM +abolition/SM +abominable +abominably +abominate/XSDGN +abomination/M +aboriginal/YS +aborigine/SM +Aborigine/SM +aborning +abortionist/MS +abortion/MS +abortiveness/M +abortive/PY +abort/SRDVG +Abo/SM! +abound/GDS +about/S +aboveboard +aboveground +above/S +abracadabra/S +abrader/M +abrade/SRDG +Abraham/M +Abrahan/M +Abra/M +Abramo/M +Abram/SM +Abramson/M +Abran/M +abrasion/MS +abrasiveness/S +abrasive/SYMP +abreaction/MS +abreast +abridge/DSRG +abridged/U +abridger/M +abridgment/SM +abroad +abrogate/XDSNG +abrogation/M +abrogator/SM +abruptness/SM +abrupt/TRYP +ABS +abscess/GDSM +abscissa/SM +abscission/SM +absconder/M +abscond/SDRZG +abseil/SGDR +absence/SM +absenteeism/SM +absentee/MS +absentia/M +absentmindedness/S +absentminded/PY +absent/SGDRY +absinthe/SM +abs/M +absoluteness/SM +absolute/NPRSYTX +absolution/M +absolutism/MS +absolutist/SM +absolve/GDSR +absolver/M +absorb/ASGD +absorbed/U +absorbency/MS +absorbent/MS +absorber/SM +absorbing/Y +absorption/MS +absorptive +absorptivity/M +abstainer/M +abstain/GSDRZ +abstemiousness/MS +abstemious/YP +abstention/SM +abstinence/MS +abstinent/Y +abstractedness/SM +abstracted/YP +abstracter/M +abstractionism/M +abstractionist/SM +abstraction/SM +abstractness/SM +abstractor/MS +abstract/PTVGRDYS +abstruseness/SM +abstruse/PRYT +absurdity/SM +absurdness/SM +absurd/PRYST +Abuja +abundance/SM +abundant/Y +abused/E +abuse/GVZDSRB +abuser/M +abuses/E +abusing/E +abusiveness/SM +abusive/YP +abut/LS +abutment/SM +abutted +abutter/MS +abutting +abuzz +abysmal/Y +abyssal +Abyssinia/M +Abyssinian +abyss/SM +AC +acacia/SM +academe/MS +academia/SM +academical/Y +academicianship +academician/SM +academic/S +academy/SM +Acadia/M +acanthus/MS +Acapulco/M +accede/SDG +accelerated/U +accelerate/NGSDXV +accelerating/Y +acceleration/M +accelerator/SM +accelerometer/SM +accented/U +accent/SGMD +accentual/Y +accentuate/XNGSD +accentuation/M +acceptability/SM +acceptability's/U +acceptableness/SM +acceptable/P +acceptably/U +acceptance/SM +acceptant +acceptation/SM +accepted/Y +accepter/M +accepting/PY +acceptor/MS +accept/RDBSZVG +accessed/A +accessibility/IMS +accessible/IU +accessibly/I +accession/SMDG +accessors +accessory/SM +access/SDMG +accidence/M +accidentalness/M +accidental/SPY +accident/MS +acclaimer/M +acclaim/SDRG +acclamation/MS +acclimate/XSDGN +acclimation/M +acclimatisation +acclimatise/DG +acclimatization/AMS +acclimatized/U +acclimatize/RSDGZ +acclimatizes/A +acclivity/SM +accolade/GDSM +accommodated/U +accommodate/XVNGSD +accommodating/Y +accommodation/M +accommodativeness/M +accommodative/P +accompanied/U +accompanier/M +accompaniment/MS +accompanist/SM +accompany/DRSG +accomplice/MS +accomplished/U +accomplisher/M +accomplishment/SM +accomplish/SRDLZG +accordance/SM +accordant/Y +accorder/M +according/Y +accordionist/SM +accordion/MS +accord/SZGMRD +accost/SGD +accountability/MS +accountability's/U +accountableness/M +accountable/U +accountably/U +accountancy/SM +accountant/MS +account/BMDSGJ +accounted/U +accounting/M +accouter/GSD +accouterments +accouterment's +accoutrement/M +Accra/M +accreditation/SM +accredited/U +accredit/SGD +accretion/SM +accrual/MS +accrue/SDG +acct +acculturate/XSDVNG +acculturation/M +accumulate/VNGSDX +accumulation/M +accumulativeness/M +accumulative/YP +accumulator/MS +accuracy/IMS +accurate/IY +accurateness/SM +accursedness/SM +accursed/YP +accusal/M +accusation/SM +accusative/S +accusatory +accused/M +accuser/M +accuse/SRDZG +accusing/Y +accustomedness/M +accustomed/P +accustom/SGD +ac/DRG +aced/M +acerbate/DSG +acerbic +acerbically +acerbity/MS +ace/SM +acetaminophen/S +acetate/MS +acetic +acetone/SM +acetonic +acetylene/MS +Acevedo/M +Achaean/M +Achebe/M +ached/A +ache/DSG +achene/SM +Achernar/M +aches/A +Acheson/M +achievable/U +achieved/UA +achieve/LZGRSDB +achievement/SM +achiever/M +Achilles +aching/Y +achoo +achromatic +achy/TR +acidic +acidification/M +acidify/NSDG +acidity/SM +acidness/M +acidoses +acidosis/M +acid/SMYP +acidulous +acing/M +Ackerman/M +acknowledgeable +acknowledgedly +acknowledged/U +acknowledge/GZDRS +acknowledger/M +acknowledgment/SAM +ACLU +Ac/M +ACM +acme/SM +acne/MDS +acolyte/MS +Aconcagua/M +aconite/MS +acorn/SM +Acosta/M +acoustical/Y +acoustician/M +acoustic/S +acoustics/M +acquaintance/MS +acquaintanceship/S +acquainted/U +acquaint/GASD +acquiesce/GSD +acquiescence/SM +acquiescent/Y +acquirable +acquire/ASDG +acquirement/SM +acquisition's/A +acquisition/SM +acquisitiveness/MS +acquisitive/PY +acquit/S +acquittal/MS +acquittance/M +acquitted +acquitter/M +acquitting +acreage/MS +acre/MS +acridity/MS +acridness/SM +acrid/TPRY +acrimoniousness/MS +acrimonious/YP +acrimony/MS +acrobatically +acrobatic/S +acrobatics/M +acrobat/SM +acronym/SM +acrophobia/SM +Acropolis/M +acropolis/SM +across +acrostic/SM +Acrux/M +acrylate/M +acrylic/S +ACT +Actaeon/M +Acta/M +ACTH +acting/S +actinic +actinide/SM +actinium/MS +actinometer/MS +action/DMSGB +actions/AI +action's/IA +activate/AXCDSNGI +activated/U +activation/AMCI +activator/SM +active/APY +actively/I +activeness/MS +actives +activism/MS +activist/MS +activities/A +activity/MSI +Acton/M +actor/MAS +actress/SM +act's +Acts +act/SADVG +actuality/SM +actualization/MAS +actualize/GSD +actualizes/A +actual/SY +actuarial/Y +actuary/MS +actuate/GNXSD +actuation/M +actuator/SM +acuity/MS +acumen/SM +acupressure/S +acupuncture/SM +acupuncturist/S +acuteness/MS +acute/YTSRP +acyclic +acyclically +acyclovir/S +AD +adage/MS +adagio/S +Adah/M +Adair/M +Adaline/M +Ada/M +adamant/SY +Adamo/M +Adam/SM +Adamson/M +Adana/M +Adan/M +adaptability/MS +adaptable/U +adaptation/MS +adaptedness/M +adapted/P +adapter/M +adapting/A +adaption +adaptively +adaptiveness/M +adaptive/U +adaptivity +adapt/SRDBZVG +Adara/M +ad/AS +ADC +Adda/M +Addams +addenda +addend/SM +addendum/M +adder/M +Addia/M +addiction/MS +addictive/P +addict/SGVD +Addie/M +Addi/M +Addison/M +additional/Y +addition/MS +additive/YMS +additivity +addle/GDS +addressability +addressable/U +addressed/A +addressee/SM +addresser/M +addresses/A +address/MDRSZGB +Addressograph/M +adduce/GRSD +adducer/M +adduct/DGVS +adduction/M +adductor/M +Addy/M +add/ZGBSDR +Adelaida/M +Adelaide/M +Adela/M +Adelbert/M +Adele/M +Adelheid/M +Adelice/M +Adelina/M +Adelind/M +Adeline/M +Adella/M +Adelle/M +Adel/M +Ade/M +Adena/M +Adenauer/M +adenine/SM +Aden/M +adenoidal +adenoid/S +adeptness/MS +adept/RYPTS +adequacy/IMS +adequate/IPY +adequateness's/I +adequateness/SM +Adey/M +Adham/M +Adhara/M +adherence/SM +adherent/YMS +adherer/M +adhere/ZGRSD +adhesion/MS +adhesiveness/MS +adhesive/PYMS +adiabatic +adiabatically +Adiana/M +Adidas/M +adieu/S +Adi/M +Adina/M +adiós +adipose/S +Adirondack/SM +adj +adjacency/MS +adjacent/Y +adjectival/Y +adjective/MYS +adjoin/SDG +adjoint/M +adjourn/DGLS +adjournment/SM +adjudge/DSG +adjudicate/VNGXSD +adjudication/M +adjudicator/SM +adjudicatory +adjunct/VSYM +adjuration/SM +adjure/GSD +adjustable/U +adjustably +adjust/DRALGSB +adjusted/U +adjuster's/A +adjuster/SM +adjustive +adjustment/MAS +adjustor's +adjutant/SM +Adkins/M +Adlai/M +Adler/M +adman/M +admen +administer/GDJS +administrable +administrate/XSDVNG +administration/M +administrative/Y +administrator/MS +administratrix/M +admirableness/M +admirable/P +admirably +admiral/SM +admiralty/MS +Admiralty/S +admiration/MS +admirer/M +admire/RSDZBG +admiring/Y +admissibility/ISM +admissible/I +admissibly +admission/AMS +admit/AS +admittance/MS +admitted/A +admittedly +admitting/A +admix/SDG +admixture/SM +Adm/M +Ad/MN +admonisher/M +admonish/GLSRD +admonishing/Y +admonishment/SM +admonition/MS +admonitory +adobe/MS +adolescence/MS +adolescent/SYM +Adolf/M +Adolfo/M +Adolphe/M +Adolph/M +Adolpho/M +Adolphus/M +Ado/M +ado/MS +Adonis/SM +adopted/AU +adopter/M +adoption/MS +adoptive/Y +adopt/RDSBZVG +adopts/A +adorableness/SM +adorable/P +adorably +Adora/M +adoration/SM +adore/DSRGZB +Adoree/M +Adore/M +adorer/M +adoring/Y +adorned/U +Adorne/M +adornment/SM +adorn/SGLD +ADP +Adrea/M +adrenalin +adrenaline/MS +Adrenalin/MS +adrenal/YS +Adria/MX +Adriana/M +Adriane/M +Adrian/M +Adrianna/M +Adrianne/M +Adriano/M +Adriatic +Adriena/M +Adrien/M +Adrienne/M +adrift +adroitness/MS +adroit/RTYP +ads +ad's +adsorbate/M +adsorbent/S +adsorb/GSD +adsorption/MS +adsorptive/Y +adulate/GNDSX +adulation/M +adulator/SM +adulatory +adulterant/SM +adulterated/U +adulterate/NGSDX +adulteration/M +adulterer/SM +adulteress/MS +adulterous/Y +adultery/SM +adulthood/MS +adult/MYPS +adultness/M +adumbrate/XSDVGN +adumbration/M +adumbrative/Y +adv +advance/DSRLZG +advancement/MS +advancer/M +advantage/GMEDS +advantageous/EY +advantageousness/M +Adventist/M +adventist/S +adventitiousness/M +adventitious/PY +adventive/Y +Advent/SM +advent/SVM +adventurer/M +adventuresome +adventure/SRDGMZ +adventuress/SM +adventurousness/SM +adventurous/YP +adverbial/MYS +adverb/SM +adversarial +adversary/SM +adverse/DSRPYTG +adverseness/MS +adversity/SM +advert/GSD +advertised/U +advertise/JGZSRDL +advertisement/SM +advertiser/M +advertising/M +advertorial/S +advice/SM +Advil/M +advisability/SIM +advisable/I +advisableness/M +advisably +advisedly/I +advised/YU +advisee/MS +advisement/MS +adviser/M +advise/ZRSDGLB +advisor/S +advisor's +advisory/S +advocacy/SM +advocate/NGVDS +advocation/M +advt +adze's +adz/MDSG +Aegean +aegis/SM +Aelfric/M +Aeneas +Aeneid/M +aeolian +Aeolus/M +aeon's +aerate/XNGSD +aeration/M +aerator/MS +aerialist/MS +aerial/SMY +Aeriela/M +Aeriell/M +Aeriel/M +aerie/SRMT +aeroacoustic +aerobatic/S +aerobically +aerobic/S +aerodrome/SM +aerodynamically +aerodynamic/S +aerodynamics/M +aeronautical/Y +aeronautic/S +aeronautics/M +aerosolize/D +aerosol/MS +aerospace/SM +Aeschylus/M +Aesculapius/M +Aesop/M +aesthete/S +aesthetically +aestheticism/MS +aesthetics/M +aesthetic/U +aether/M +aetiology/M +AF +AFAIK +afar/S +AFB +AFC +AFDC +affability/MS +affable/TR +affably +affair/SM +affectation/MS +affectedness/EM +affected/UEYP +affect/EGSD +affecter/M +affecting/Y +affectionate/UY +affectioned +affection/EMS +affectioning +affective/MY +afferent/YS +affiance/GDS +affidavit/SM +affiliated/U +affiliate/EXSDNG +affiliation/EM +affine +affinity/SM +affirm/ASDG +affirmation/SAM +affirmative/SY +affix/SDG +afflatus/MS +afflict/GVDS +affliction/SM +afflictive/Y +affluence/SM +affluent/YS +afford/DSBG +afforest/A +afforestation/SM +afforested +afforesting +afforests +affray/MDSG +affricate/VNMS +affrication/M +affricative/M +affright +affront/GSDM +Afghani/SM +Afghanistan/M +afghan/MS +Afghan/SM +aficionado/MS +afield +afire +aflame +afloat +aflutter +afoot +afore +aforementioned +aforesaid +aforethought/S +afoul +Afr +afraid/U +afresh +Africa/M +African/MS +Afrikaans/M +Afrikaner/SM +afro +Afrocentric +Afrocentrism/S +Afro/MS +afterbirth/M +afterbirths +afterburner/MS +aftercare/SM +aftereffect/MS +afterglow/MS +afterimage/MS +afterlife/M +afterlives +aftermath/M +aftermaths +aftermost +afternoon/SM +aftershave/S +aftershock/SM +afters/M +aftertaste/SM +afterthought/MS +afterward/S +afterworld/MS +Afton/M +aft/ZR +Agace/M +again +against +Agamemnon/M +agapae +agape/S +agar/MS +Agassiz/M +Agata/M +agate/SM +Agatha/M +Agathe/M +agave/SM +agedness/M +aged/PY +age/GJDRSMZ +ageism/S +ageist/S +agelessness/MS +ageless/YP +agency/SM +agenda/MS +agent/AMS +agented +agenting +agentive +ageratum/M +Aggie/M +Aggi/M +agglomerate/XNGVDS +agglomeration/M +agglutinate/VNGXSD +agglutination/M +agglutinin/MS +aggrandize/LDSG +aggrandizement/SM +aggravate/SDNGX +aggravating/Y +aggravation/M +aggregated/U +aggregate/EGNVD +aggregately +aggregateness/M +aggregates +aggregation/SM +aggregative/Y +aggression/SM +aggressively +aggressiveness/S +aggressive/U +aggressor/MS +aggrieved/Y +aggrieve/GDS +Aggy/SM +aghast +agile/YTR +agility/MS +agitated/Y +agitate/XVNGSD +agitation/M +agitator/SM +agitprop/MS +Aglaia/M +agleam +aglitter +aglow +Ag/M +Agna/M +Agnella/M +Agnese/M +Agnes/M +Agnesse/M +Agneta/M +Agnew/M +Agni/M +Agnola/M +agnosticism/MS +agnostic/SM +ago +agog +agonizedly/S +agonized/Y +agonize/ZGRSD +agonizing/Y +agony/SM +agoraphobia/MS +agoraphobic/S +Agosto/M +Agra/M +agrarianism/MS +agrarian/S +agreeable/EP +agreeableness/SME +agreeably/E +agreeing/E +agree/LEBDS +agreement/ESM +agreer/S +Agretha/M +agribusiness/SM +Agricola/M +agriculturalist/S +agricultural/Y +agriculture/MS +agriculturist/SM +Agrippa/M +Agrippina/M +agrochemicals +agronomic/S +agronomist/SM +agronomy/MS +aground +Aguascalientes/M +ague/MS +Aguie/M +Aguilar/M +Aguinaldo/M +Aguirre/M +Aguistin/M +Aguste/M +Agustin/M +ah +Ahab/M +Aharon/M +aha/S +ahead +ahem/S +Ahmadabad +Ahmad/M +Ahmed/M +ahoy/S +Ahriman/M +AI +Aida/M +Aidan/M +aided/U +aide/MS +aider/M +AIDS +aid/ZGDRS +Aigneis/M +aigrette/SM +Aiken/M +Aila/M +Ailbert/M +Ailee/M +Aileen/M +Aile/M +Ailene/M +aileron/MS +Ailey/M +Ailina/M +Aili/SM +ail/LSDG +ailment/SM +Ailsun/M +Ailyn/M +Aimee/M +Aime/M +aimer/M +Aimil/M +aimlessness/MS +aimless/YP +aim/ZSGDR +Aindrea/M +Ainslee/M +Ainsley/M +Ainslie/M +ain't +Ainu/M +airbag/MS +airbase/S +airborne +airbrush/SDMG +Airbus/M +airbus/SM +aircraft/MS +aircrew/M +airdrop/MS +airdropped +airdropping +Airedale/SM +Aires +airfare/S +airfield/MS +airflow/SM +airfoil/MS +airframe/MS +airfreight/SGD +airhead/MS +airily +airiness/MS +airing/M +airlessness/S +airless/P +airlift/MDSG +airliner/M +airline/SRMZ +airlock/MS +airmail/DSG +airman/M +airmass +air/MDRTZGJS +airmen +airpark +airplane/SM +airplay/S +airport/MS +airship/MS +airsickness/SM +airsick/P +airspace/SM +airspeed/SM +airstrip/MS +airtightness/M +airtight/P +airtime +airwaves +airway/SM +airworthiness/SM +airworthy/PTR +airy/PRT +Aisha/M +aisle/DSGM +aitch/MS +ajar +Ajax/M +Ajay/M +AK +aka +Akbar/M +Akihito/M +akimbo +Akim/M +akin +Akita/M +Akkad/M +Akron/M +Aksel/M +AL +Alabama/M +Alabaman/S +Alabamian/MS +alabaster/MS +alack/S +alacrity/SM +Aladdin/M +Alaine/M +Alain/M +Alair/M +Alameda/M +Alamogordo/M +Alamo/SM +ala/MS +Ala/MS +Alanah/M +Alana/M +Aland/M +Alane/M +alanine/M +Alan/M +Alanna/M +Alano/M +Alanson/M +Alard/M +Alaric/M +Alar/M +alarming/Y +alarmist/MS +alarm/SDG +Alasdair/M +Alaska/M +Alaskan/S +alas/S +Alastair/M +Alasteir/M +Alaster/M +Alayne/M +albacore/SM +alba/M +Alba/M +Albania/M +Albanian/SM +Albany/M +albatross/SM +albedo/M +Albee/M +albeit +Alberich/M +Alberik/M +Alberio/M +Alberta/M +Albertan/S +Albertina/M +Albertine/M +Albert/M +Alberto/M +Albie/M +Albigensian +Albina/M +albinism/SM +albino/MS +Albion/M +Albireo/M +alb/MS +Albrecht/M +albumen/M +albumin/MS +albuminous +album/MNXS +Albuquerque/M +Alcatraz/M +Alcestis/M +alchemical +alchemist/SM +alchemy/MS +Alcibiades/M +Alcmena/M +Alcoa/M +alcoholically +alcoholic/MS +alcoholism/SM +alcohol/MS +Alcott/M +alcove/MSD +Alcuin/M +Alcyone/M +Aldan/M +Aldebaran/M +aldehyde/M +Alden/M +Alderamin/M +alderman/M +aldermen +alder/SM +alderwoman +alderwomen +Aldin/M +Aldis/M +Aldo/M +Aldon/M +Aldous/M +Aldrich/M +Aldric/M +Aldridge/M +Aldrin/M +Aldus/M +Aldwin/M +aleatory +Alecia/M +Aleck/M +Alec/M +Aleda/M +alee +Aleece/M +Aleen/M +alehouse/MS +Aleichem/M +Alejandra/M +Alejandrina/M +Alejandro/M +Alejoa/M +Aleksandr/M +Alembert/M +alembic/SM +ale/MVS +Alena/M +Alene/M +aleph/M +Aleppo/M +Aler/M +alerted/Y +alertness/MS +alert/STZGPRDY +Alessandra/M +Alessandro/M +Aleta/M +Alethea/M +Aleutian/S +Aleut/SM +alewife/M +alewives +Alexa/M +Alexander/SM +Alexandra/M +Alexandre/M +Alexandria/M +Alexandrian/S +Alexandrina/M +Alexandr/M +Alexandro/MS +Alexei/M +Alexia/M +Alexina/M +Alexine/M +Alexio/M +Alexi/SM +Alex/M +alfalfa/MS +Alfa/M +Alfie/M +Alfi/M +Alf/M +Alfonse/M +Alfons/M +Alfonso/M +Alfonzo/M +Alford/M +Alfreda/M +Alfred/M +Alfredo/M +alfresco +Alfy/M +algae +algaecide +algal +alga/M +algebraic +algebraical/Y +algebraist/M +algebra/MS +Algenib/M +Algeria/M +Algerian/MS +Alger/M +Algernon/M +Algieba/M +Algiers/M +alginate/SM +ALGOL +Algol/M +Algonquian/SM +Algonquin/SM +algorithmic +algorithmically +algorithm/MS +Alhambra/M +Alhena/M +Alia/M +alias/GSD +alibi/MDSG +Alica/M +Alicea/M +Alice/M +Alicia/M +Alick/M +Alic/M +Alida/M +Alidia/M +Alie/M +alienable/IU +alienate/SDNGX +alienation/M +alienist/MS +alien/RDGMBS +Alighieri/M +alight/DSG +aligned/U +aligner/SM +align/LASDG +alignment/SAM +Alika/M +Alikee/M +alikeness/M +alike/U +alimentary +aliment/SDMG +alimony/MS +Ali/MS +Alina/M +Aline/M +alinement's +Alioth/M +aliquot/S +Alisa/M +Alisander/M +Alisha/M +Alison/M +Alissa/M +Alistair/M +Alister/M +Alisun/M +aliveness/MS +alive/P +Alix/M +aliyah/M +aliyahs +Aliza/M +Alkaid/M +alkalies +alkali/M +alkaline +alkalinity/MS +alkalize/SDG +alkaloid/MS +alkyd/S +alkyl/M +Allahabad/M +Allah/M +Alla/M +Allan/M +Allard/M +allay/GDS +Allayne/M +Alleen/M +allegation/SM +alleged/Y +allege/SDG +Allegheny/MS +allegiance/SM +allegiant +allegoric +allegoricalness/M +allegorical/YP +allegorist/MS +allegory/SM +Allegra/M +allegretto/MS +allegri +allegro/MS +allele/SM +alleluia/S +allemande/M +Allendale/M +Allende/M +Allene/M +Allen/M +Allentown/M +allergenic +allergen/MS +allergic +allergically +allergist/MS +allergy/MS +alleviate/SDVGNX +alleviation/M +alleviator/MS +Alley/M +alley/MS +Alleyn/M +alleyway/MS +Allhallows +alliance/MS +Allianora/M +Allie/M +allier +allies/M +alligator/DMGS +Alli/MS +Allina/M +Allin/M +Allison/M +Allissa/M +Allister/M +Allistir/M +alliterate/XVNGSD +alliteration/M +alliterative/Y +Allix/M +allocable/U +allocatable +allocate/ACSDNGX +allocated/U +allocation/AMC +allocative +allocator/AMS +allophone/MS +allophonic +allotment/MS +allotments/A +allotrope/M +allotropic +allots/A +allot/SDL +allotted/A +allotter/M +allotting/A +allover/S +allowableness/M +allowable/P +allowably +allowance/GSDM +allowed/Y +allowing/E +allow/SBGD +allows/E +alloyed/U +alloy/SGMD +all/S +allspice/MS +Allstate/M +Allsun/M +allude/GSD +allure/GLSD +allurement/SM +alluring/Y +allusion/MS +allusiveness/MS +allusive/PY +alluvial/S +alluvions +alluvium/MS +Allx/M +ally/ASDG +Allyce/M +Ally/MS +Allyn/M +Allys +Allyson/M +alma +Almach/M +Almaden/M +almagest +Alma/M +almanac/MS +Almaty/M +Almeda/M +Almeria/M +Almeta/M +almightiness/M +Almighty/M +almighty/P +Almira/M +Almire/M +almond/SM +almoner/MS +almost +Al/MRY +alms/A +almshouse/SM +almsman/M +alnico +Alnilam/M +Alnitak/M +aloe/MS +aloft +aloha/SM +Aloin/M +Aloise/M +Aloisia/M +aloneness/M +alone/P +along +alongshore +alongside +Alon/M +Alonso/M +Alonzo/M +aloofness/MS +aloof/YP +aloud +Aloysia/M +Aloysius/M +alpaca/SM +Alpert/M +alphabetical/Y +alphabetic/S +alphabetization/SM +alphabetizer/M +alphabetize/SRDGZ +alphabet/SGDM +alpha/MS +alphanumerical/Y +alphanumeric/S +Alphard/M +Alphecca/M +Alpheratz/M +Alphonse/M +Alphonso/M +Alpine +alpine/S +alp/MS +Alps +already +Alric/M +alright +Alsace/M +Alsatian/MS +also +Alsop/M +Alston/M +Altaic/M +Altai/M +Altair/M +Alta/M +altar/MS +altarpiece/SM +alterable/UI +alteration/MS +altercate/NX +altercation/M +altered/U +alternate/SDVGNYX +alternation/M +alternativeness/M +alternative/YMSP +alternator/MS +alter/RDZBG +Althea/M +although +altimeter/SM +Altiplano/M +altitude/SM +altogether/S +Alton/M +alto/SM +Altos/M +altruism/SM +altruistic +altruistically +altruist/SM +alt/RZS +ALU +Aludra/M +Aluin/M +Aluino/M +alumina/SM +aluminum/MS +alumnae +alumna/M +alumni +alumnus/MS +alum/SM +alundum +Alva/M +Alvan/M +Alvarado/M +Alvarez/M +Alvaro/M +alveolar/Y +alveoli +alveolus/M +Alvera/M +Alverta/M +Alvie/M +Alvina/M +Alvinia/M +Alvin/M +Alvira/M +Alvis/M +Alvy/M +alway/S +Alwin/M +Alwyn/M +Alyce/M +Alyda/M +Alyosha/M +Alysa/M +Alyse/M +Alysia/M +Alys/M +Alyson/M +Alyss +Alyssa/M +Alzheimer/M +AM +AMA +Amabelle/M +Amabel/M +Amadeus/M +Amado/M +amain +Amalea/M +Amalee/M +Amaleta/M +amalgamate/VNGXSD +amalgamation/M +amalgam/MS +Amalia/M +Amalie/M +Amalita/M +Amalle/M +Amanda/M +Amandie/M +Amandi/M +Amandy/M +amanuenses +amanuensis/M +Amara/M +amaranth/M +amaranths +amaretto/S +Amargo/M +Amarillo/M +amaryllis/MS +am/AS +amasser/M +amass/GRSD +Amata/M +amateurishness/MS +amateurish/YP +amateurism/MS +amateur/SM +Amati/M +amatory +amazed/Y +amaze/LDSRGZ +amazement/MS +amazing/Y +amazonian +Amazonian +amazon/MS +Amazon/SM +ambassadorial +ambassador/MS +ambassadorship/MS +ambassadress/SM +ambergris/SM +Amberly/M +amber/MS +Amber/YM +ambiance/MS +ambidexterity/MS +ambidextrous/Y +ambience's +ambient/S +ambiguity/MS +ambiguously/U +ambiguousness/M +ambiguous/YP +ambition/GMDS +ambitiousness/MS +ambitious/PY +ambit/M +ambivalence/SM +ambivalent/Y +amble/GZDSR +Amble/M +ambler/M +ambrose +Ambrose/M +ambrosial/Y +ambrosia/SM +Ambrosi/M +Ambrosio/M +Ambrosius/M +Ambros/M +ambulance/MS +ambulant/S +ambulate/DSNGX +ambulation/M +ambulatory/S +Ambur/M +ambuscade/MGSRD +ambuscader/M +ambusher/M +ambush/MZRSDG +Amby/M +Amdahl/M +ameba's +Amelia/M +Amelie/M +Amelina/M +Ameline/M +ameliorate/XVGNSD +amelioration/M +Amelita/M +amenability/SM +amenably +amended/U +amender/M +amendment/SM +amen/DRGTSB +amend/SBRDGL +amends/M +Amenhotep/M +amenity/MS +amenorrhea/M +Amerada/M +Amerasian/S +amercement/MS +amerce/SDLG +Americana/M +Americanism/SM +Americanization/SM +americanized +Americanize/SDG +American/MS +America/SM +americium/MS +Amerigo/M +Amerindian/MS +Amerind/MS +Amer/M +Amery/M +Ameslan/M +Ame/SM +amethystine +amethyst/MS +Amharic/M +Amherst/M +amiability/MS +amiableness/M +amiable/RPT +amiably +amicability/SM +amicableness/M +amicable/P +amicably +amide/SM +amid/S +amidships +amidst +Amie/M +Amiga/M +amigo/MS +Amii/M +Amil/M +Ami/M +amines +aminobenzoic +amino/M +amir's +Amish +amiss +Amitie/M +Amity/M +amity/SM +Ammamaria/M +Amman/M +Ammerman/M +ammeter/MS +ammo/MS +ammoniac +ammonia/MS +ammonium/M +Am/MR +ammunition/MS +amnesiac/MS +amnesia/SM +amnesic/S +amnesty/GMSD +amniocenteses +amniocentesis/M +amnion/SM +amniotic +Amoco/M +amoeba/SM +amoebic +amoeboid +amok/MS +among +amongst +Amontillado/M +amontillado/MS +amorality/MS +amoral/Y +amorousness/SM +amorous/PY +amorphousness/MS +amorphous/PY +amortization/SUM +amortized/U +amortize/SDG +Amory/M +Amos +amount/SMRDZG +amour/MS +Amparo/M +amperage/SM +Ampere/M +ampere/MS +ampersand/MS +Ampex/M +amphetamine/MS +amphibian/SM +amphibiousness/M +amphibious/PY +amphibology/M +amphitheater/SM +amphorae +amphora/M +ampleness/M +ample/PTR +amplification/M +amplifier/M +amplify/DRSXGNZ +amplitude/MS +ampoule's +amp/SGMDY +ampule/SM +amputate/DSNGX +amputation/M +amputee/SM +Amritsar/M +ams +Amsterdam/M +amt +Amtrak/M +amuck's +amulet/SM +Amundsen/M +Amur/M +amused/Y +amuse/LDSRGVZ +amusement/SM +amuser/M +amusingness/M +amusing/YP +Amway/M +Amye/M +amylase/MS +amyl/M +Amy/M +Anabal/M +Anabaptist/SM +Anabella/M +Anabelle/M +Anabel/M +anabolic +anabolism/MS +anachronism/SM +anachronistic +anachronistically +Anacin/M +anaconda/MS +Anacreon/M +anaerobe/SM +anaerobic +anaerobically +anaglyph/M +anagrammatic +anagrammatically +anagrammed +anagramming +anagram/MS +Anaheim/M +Analects/M +analgesia/MS +analgesic/S +Analiese/M +Analise/M +Anallese/M +Anallise/M +analogical/Y +analogize/SDG +analogousness/MS +analogous/YP +analog/SM +analogue/SM +analogy/MS +anal/Y +analysand/MS +analyses +analysis/AM +analyst/SM +analytical/Y +analyticity/S +analytic/S +analytics/M +analyzable/U +analyze/DRSZGA +analyzed/U +analyzer/M +Ana/M +anamorphic +Ananias/M +anapaest's +anapestic/S +anapest/SM +anaphora/M +anaphoric +anaphorically +anaplasmosis/M +anarchic +anarchical/Y +anarchism/MS +anarchistic +anarchist/MS +anarchy/MS +Anastasia/M +Anastasie/M +Anastassia/M +anastigmatic +anastomoses +anastomosis/M +anastomotic +anathema/MS +anathematize/GSD +Anatola/M +Anatole/M +Anatolia/M +Anatolian +Anatollo/M +Anatol/M +anatomic +anatomical/YS +anatomist/MS +anatomize/GSD +anatomy/MS +Anaxagoras/M +Ancell/M +ancestor/SMDG +ancestral/Y +ancestress/SM +ancestry/SM +Anchorage/M +anchorage/SM +anchored/U +anchorite/MS +anchoritism/M +anchorman/M +anchormen +anchorpeople +anchorperson/S +anchor/SGDM +anchorwoman +anchorwomen +anchovy/MS +ancientness/MS +ancient/SRYTP +ancillary/S +an/CS +Andalusia/M +Andalusian +Andaman +andante/S +and/DZGS +Andean/M +Andeee/M +Andee/M +Anderea/M +Andersen/M +Anders/N +Anderson/M +Andes +Andie/M +Andi/M +andiron/MS +Andonis/M +Andorra/M +Andover/M +Andra/SM +Andrea/MS +Andreana/M +Andree/M +Andrei/M +Andrej/M +Andre/SM +Andrew/MS +Andrey/M +Andria/M +Andriana/M +Andriette/M +Andris +androgenic +androgen/SM +androgynous +androgyny/SM +android/MS +Andromache/M +Andromeda/M +Andropov/M +Andros/M +Andrus/M +Andy/M +anecdotal/Y +anecdote/SM +anechoic +anemia/SM +anemically +anemic/S +anemometer/MS +anemometry/M +anemone/SM +anent +aneroid +Anestassia/M +anesthesia/MS +anesthesiologist/MS +anesthesiology/SM +anesthetically +anesthetic/SM +anesthetist/MS +anesthetization/SM +anesthetizer/M +anesthetize/ZSRDG +Anet/M +Anetta/M +Anette/M +Anett/M +aneurysm/MS +anew +Angara/M +Angela/M +Angeleno/SM +Angele/SM +angelfish/SM +Angelia/M +angelic +angelical/Y +Angelica/M +angelica/MS +Angelico/M +Angelika/M +Angeli/M +Angelina/M +Angeline/M +Angelique/M +Angelita/M +Angelle/M +Angel/M +angel/MDSG +Angelo/M +Angelou/M +Ange/M +anger/GDMS +Angevin/M +Angie/M +Angil/M +angina/MS +angiography +angioplasty/S +angiosperm/MS +Angkor/M +angle/GMZDSRJ +angler/M +Angles +angleworm/MS +Anglia/M +Anglicanism/MS +Anglican/MS +Anglicism/SM +Anglicization/MS +anglicize/SDG +Anglicize/SDG +angling/M +Anglo/MS +Anglophile/SM +Anglophilia/M +Anglophobe/MS +Anglophobia/M +Angola/M +Angolan/S +angora/MS +Angora/MS +angrily +angriness/M +angry/RTP +angst/MS +Ĺngström/M +angstrom/MS +Anguilla/M +anguish/DSMG +angularity/MS +angular/Y +Angus/M +Angy/M +Anheuser/M +anhydride/M +anhydrite/M +anhydrous/Y +Aniakchak/M +Ania/M +Anibal/M +Anica/M +aniline/SM +animadversion/SM +animadvert/DSG +animalcule/MS +animal/MYPS +animated/A +animatedly +animately/I +animateness/MI +animates/A +animate/YNGXDSP +animating/A +animation/AMS +animator/SM +animism/SM +animistic +animist/S +animized +animosity/MS +animus/SM +anionic/S +anion/MS +aniseed/MS +aniseikonic +anise/MS +anisette/SM +anisotropic +anisotropy/MS +Anissa/M +Anita/M +Anitra/M +Anjanette/M +Anjela/M +Ankara/M +ankh/M +ankhs +anklebone/SM +ankle/GMDS +anklet/MS +Annabal/M +Annabela/M +Annabella/M +Annabelle/M +Annabell/M +Annabel/M +Annadiana/M +Annadiane/M +Annalee/M +Annaliese/M +Annalise/M +annalist/MS +annal/MNS +Anna/M +Annamaria/M +Annamarie/M +Annapolis/M +Annapurna/M +anneal/DRSZG +annealer/M +Annecorinne/M +annelid/MS +Anneliese/M +Annelise/M +Anne/M +Annemarie/M +Annetta/M +Annette/M +annexation/SM +annexe/M +annex/GSD +Annice/M +Annie/M +annihilate/XSDVGN +annihilation/M +annihilator/MS +Anni/MS +Annissa/M +anniversary/MS +Ann/M +Annmaria/M +Annmarie/M +Annnora/M +Annora/M +annotated/U +annotate/VNGXSD +annotation/M +annotator/MS +announced/U +announcement/SM +announcer/M +announce/ZGLRSD +annoyance/MS +annoyer/M +annoying/Y +annoy/ZGSRD +annualized +annual/YS +annuitant/MS +annuity/MS +annular/YS +annuli +annulled +annulling +annulment/MS +annul/SL +annulus/M +annum +annunciate/XNGSD +annunciation/M +Annunciation/S +annunciator/SM +Anny/M +anode/SM +anodic +anodize/GDS +anodyne/SM +anoint/DRLGS +anointer/M +anointment/SM +anomalousness/M +anomalous/YP +anomaly/MS +anomic +anomie/M +anon/S +anonymity/MS +anonymousness/M +anonymous/YP +anopheles/M +anorak/SM +anorectic/S +anorexia/SM +anorexic/S +another/M +Anouilh/M +Ansell/M +Ansel/M +Anselma/M +Anselm/M +Anselmo/M +Anshan/M +ANSI/M +Ansley/M +ans/M +Anson/M +Anstice/M +answerable/U +answered/U +answerer/M +answer/MZGBSDR +antacid/MS +Antaeus/M +antagonism/MS +antagonistic +antagonistically +antagonist/MS +antagonized/U +antagonize/GZRSD +antagonizing/U +Antananarivo/M +antarctic +Antarctica/M +Antarctic/M +Antares +anteater/MS +antebellum +antecedence/MS +antecedent/SMY +antechamber/SM +antedate/GDS +antediluvian/S +anteing +antelope/MS +ante/MS +antenatal +antennae +antenna/MS +anterior/SY +anteroom/SM +ant/GSMD +Anthea/M +Anthe/M +anthem/MGDS +anther/MS +Anthia/M +Anthiathia/M +anthill/S +anthologist/MS +anthologize/GDS +anthology/SM +Anthony/M +anthraces +anthracite/MS +anthrax/M +anthropic +anthropocentric +anthropogenic +anthropoid/S +anthropological/Y +anthropologist/MS +anthropology/SM +anthropometric/S +anthropometry/M +anthropomorphic +anthropomorphically +anthropomorphism/SM +anthropomorphizing +anthropomorphous +antiabortion +antiabortionist/S +antiaircraft +antibacterial/S +antibiotic/SM +antibody/MS +anticancer +Antichrist/MS +anticipated/U +anticipate/XVGNSD +anticipation/M +anticipative/Y +anticipatory +anticked +anticking +anticlerical/S +anticlimactic +anticlimactically +anticlimax/SM +anticline/SM +anticlockwise +antic/MS +anticoagulant/S +anticoagulation/M +anticommunism/SM +anticommunist/SM +anticompetitive +anticyclone/MS +anticyclonic +antidemocratic +antidepressant/SM +antidisestablishmentarianism/M +antidote/DSMG +Antietam/M +antifascist/SM +antiformant +antifreeze/SM +antifundamentalist/M +antigenic +antigenicity/SM +antigen/MS +antigone +Antigone/M +Antigua/M +antiheroes +antihero/M +antihistamine/MS +antihistorical +antiknock/MS +antilabor +Antillean +Antilles +antilogarithm/SM +antilogs +antimacassar/SM +antimalarial/S +antimatter/SM +antimicrobial/S +antimissile/S +antimony/SM +anting/M +Antin/M +antinomian +antinomy/M +antinuclear +Antioch/M +antioxidant/MS +antiparticle/SM +Antipas/M +antipasti +antipasto/MS +antipathetic +antipathy/SM +antipersonnel +antiperspirant/MS +antiphonal/SY +antiphon/SM +antipodal/S +antipodean/S +antipode/MS +Antipodes +antipollution/S +antipoverty +antiquarianism/MS +antiquarian/MS +antiquary/SM +antiquate/NGSD +antiquation/M +antique/MGDS +antiquity/SM +antiredeposition +antiresonance/M +antiresonator +anti/S +antisemitic +antisemitism/M +antisepses +antisepsis/M +antiseptically +antiseptic/S +antiserum/SM +antislavery/S +antisocial/Y +antispasmodic/S +antisubmarine +antisymmetric +antisymmetry +antitank +antitheses +antithesis/M +antithetic +antithetical/Y +antithyroid +antitoxin/MS +antitrust/MR +antivenin/MS +antiviral/S +antivivisectionist/S +antiwar +antler/SDM +Antofagasta/M +Antoine/M +Antoinette/M +Antonella/M +Antone/M +Antonetta/M +Antonia/M +Antonie/M +Antonietta/M +Antoni/M +Antonina/M +Antonin/M +Antonino/M +Antoninus/M +Antonio/M +Antonius/M +Anton/MS +Antonovics/M +Antony/M +antonymous +antonym/SM +antral +antsy/RT +Antwan/M +Antwerp/M +Anubis/M +anus/SM +anvil/MDSG +anxiety/MS +anxiousness/SM +anxious/PY +any +Anya/M +anybody/S +anyhow +Any/M +anymore +anyone/MS +anyplace +anything/S +anytime +anyway/S +anywhere/S +anywise +AOL/M +aorta/MS +aortic +AP +apace +apache/MS +Apache/MS +Apalachicola/M +apartheid/SM +apart/LP +apartment/MS +apartness/M +apathetic +apathetically +apathy/SM +apatite/MS +APB +aped/A +apelike +ape/MDRSG +Apennines +aper/A +aperiodic +aperiodically +aperiodicity/M +aperitif/S +aperture/MDS +apex/MS +aphasia/SM +aphasic/S +aphelia +aphelion/SM +aphid/MS +aphonic +aphorism/MS +aphoristic +aphoristically +aphrodisiac/SM +Aphrodite/M +Apia/M +apiarist/SM +apiary/SM +apical/YS +apices's +apiece +apishness/M +apish/YP +aplenty +aplomb/SM +APO +Apocalypse/M +apocalypse/MS +apocalyptic +apocryphalness/M +apocryphal/YP +apocrypha/M +Apocrypha/M +apogee/MS +apolar +apolitical/Y +Apollinaire/M +Apollonian +Apollo/SM +apologetically/U +apologetic/S +apologetics/M +apologia/SM +apologist/MS +apologize/GZSRD +apologizer/M +apologizes/A +apologizing/U +apology/MS +apoplectic +apoplexy/SM +apostasy/SM +apostate/SM +apostatize/DSG +apostleship/SM +apostle/SM +apostolic +apostrophe/SM +apostrophized +apothecary/MS +apothegm/MS +apotheoses +apotheosis/M +apotheosized +apotheosizes +apotheosizing +Appalachia/M +Appalachian/MS +appalling/Y +appall/SDG +Appaloosa/MS +appaloosa/S +appanage/M +apparatus/SM +apparel/SGMD +apparency +apparently/I +apparentness/M +apparent/U +apparition/SM +appealer/M +appealing/UY +appeal/SGMDRZ +appear/AEGDS +appearance/AMES +appearer/S +appease/DSRGZL +appeased/U +appeasement/MS +appeaser/M +appellant/MS +appellate/VNX +appellation/M +appellative/MY +appendage/MS +appendectomy/SM +appendices +appendicitis/SM +appendix/SM +append/SGZDR +appertain/DSG +appetite/MVS +appetizer/SM +appetizing/YU +Appia/M +Appian/M +applauder/M +applaud/ZGSDR +applause/MS +applecart/M +applejack/MS +Apple/M +apple/MS +applesauce/SM +Appleseed/M +Appleton/M +applet/S +appliance/SM +applicabilities +applicability/IM +applicable/I +applicably +applicant/MS +applicate/V +application/MA +applicative/Y +applicator/MS +applier/SM +appliquéd +appliqué/MSG +apply/AGSDXN +appointee/SM +appoint/ELSADG +appointer/MS +appointive +appointment/ASEM +Appolonia/M +Appomattox/M +apportion/GADLS +apportionment/SAM +appose/SDG +appositeness/MS +apposite/XYNVP +apposition/M +appositive/SY +appraisal/SAM +appraised/A +appraisees +appraiser/M +appraises/A +appraise/ZGDRS +appraising/Y +appreciable/I +appreciably/I +appreciated/U +appreciate/XDSNGV +appreciation/M +appreciativeness/MI +appreciative/PIY +appreciator/MS +appreciatory +apprehend/DRSG +apprehender/M +apprehensible +apprehension/SM +apprehensiveness/SM +apprehensive/YP +apprentice/DSGM +apprenticeship/SM +apprise/DSG +apprizer/SM +apprizingly +apprizings +approachability/UM +approachable/UI +approach/BRSDZG +approacher/M +approbate/NX +approbation/EMS +appropriable +appropriated/U +appropriately/I +appropriateness/SMI +appropriate/XDSGNVYTP +appropriation/M +appropriator/SM +approval/ESM +approve/DSREG +approved/U +approver's/E +approver/SM +approving/YE +approx +approximate/XGNVYDS +approximation/M +approximative/Y +appurtenance/MS +appurtenant/S +APR +apricot/MS +Aprilette/M +April/MS +Apr/M +apron/SDMG +apropos +apse/MS +apsis/M +apter +aptest +aptitude/SM +aptness/SMI +aptness's/U +apt/UPYI +Apuleius/M +aquaculture/MS +aqualung/SM +aquamarine/SM +aquanaut/SM +aquaplane/GSDM +aquarium/MS +Aquarius/MS +aqua/SM +aquatically +aquatic/S +aquavit/SM +aqueduct/MS +aqueous/Y +aquiculture's +aquifer/SM +Aquila/M +aquiline +Aquinas/M +Aquino/M +Aquitaine/M +AR +Arabela/M +Arabele/M +Arabella/M +Arabelle/M +Arabel/M +arabesque/SM +Arabia/M +Arabian/MS +Arabic/M +arability/MS +Arabist/MS +arable/S +Arab/MS +Araby/M +Araceli/M +arachnid/MS +arachnoid/M +arachnophobia +Arafat/M +Araguaya/M +Araldo/M +Aral/M +Ara/M +Aramaic/M +Aramco/M +Arapahoes +Arapahoe's +Arapaho/MS +Ararat/M +Araucanian/M +Arawakan/M +Arawak/M +arbiter/MS +arbitrage/GMZRSD +arbitrager/M +arbitrageur/S +arbitrament/MS +arbitrarily +arbitrariness/MS +arbitrary/P +arbitrate/SDXVNG +arbitration/M +arbitrator/SM +arbor/DMS +arboreal/Y +arbores +arboretum/MS +arborvitae/MS +arbutus/SM +ARC +arcade/SDMG +Arcadia/M +Arcadian +arcana/M +arcane/P +arc/DSGM +archaeological/Y +archaeologist/SM +archaically +archaic/P +Archaimbaud/M +archaism/SM +archaist/MS +archaize/GDRSZ +archaizer/M +Archambault/M +archangel/SM +archbishopric/SM +archbishop/SM +archdeacon/MS +archdiocesan +archdiocese/SM +archduchess/MS +archduke/MS +Archean +archenemy/SM +archeologist's +archeology/MS +archer/M +Archer/M +archery/MS +archetypal +archetype/SM +archfiend/SM +archfool +Archibald/M +Archibaldo/M +Archibold/M +Archie/M +archiepiscopal +Archimedes/M +arching/M +archipelago/SM +architect/MS +architectonic/S +architectonics/M +architectural/Y +architecture/SM +architrave/MS +archival +archive/DRSGMZ +archived/U +archivist/MS +Arch/MR +archness/MS +arch/PGVZTMYDSR +archway/SM +Archy/M +arclike +ARCO/M +arcsine +arctangent +Arctic/M +arctic/S +Arcturus/M +Ardabil +Arda/MH +Ardath/M +Ardeen/M +Ardelia/M +Ardelis/M +Ardella/M +Ardelle/M +ardency/M +Ardene/M +Ardenia/M +Arden/M +ardent/Y +Ardine/M +Ardisj/M +Ardis/M +Ardith/M +ardor/SM +Ardra/M +arduousness/SM +arduous/YP +Ardyce/M +Ardys +Ardyth/M +areal +area/SM +areawide +are/BS +Arel/M +arenaceous +arena/SM +aren't +Arequipa/M +Ares +Aretha/M +Argentina/M +Argentinean/S +Argentine/SM +Argentinian/S +argent/MS +arginine/MS +Argonaut/MS +argonaut/S +argon/MS +Argonne/M +Argo/SM +argosy/SM +argot/SM +arguable/IU +arguably/IU +argue/DSRGZ +arguer/M +argumentation/SM +argumentativeness/MS +argumentative/YP +argument/SM +Argus/M +argyle/S +Ariadne/M +Ariana/M +Arianism/M +Arianist/SM +aria/SM +Aridatha/M +aridity/SM +aridness/M +arid/TYRP +Ariela/M +Ariella/M +Arielle/M +Ariel/M +Arie/SM +Aries/S +aright +Ari/M +Arin/M +Ario/M +Ariosto/M +arise/GJSR +arisen +Aristarchus/M +Aristides +aristocracy/SM +aristocratic +aristocratically +aristocrat/MS +Aristophanes/M +Aristotelean +Aristotelian/M +Aristotle/M +arithmetical/Y +arithmetician/SM +arithmetic/MS +arithmetize/SD +Arius/M +Ariz/M +Arizona/M +Arizonan/S +Arizonian/S +Arjuna/M +Arkansan/MS +Arkansas/M +Arkhangelsk/M +Ark/M +ark/MS +Arkwright/M +Arlana/M +Arlan/M +Arlee/M +Arleen/M +Arlena/M +Arlene/M +Arlen/M +Arleta/M +Arlette/M +Arley/M +Arleyne/M +Arlie/M +Arliene/M +Arlina/M +Arlinda/M +Arline/M +Arlington/M +Arlin/M +Arluene/M +Arly/M +Arlyne/M +Arlyn/M +Armada/M +armada/SM +armadillo/MS +Armageddon/SM +Armagnac/M +armament/EAS +armament's/E +Armand/M +Armando/M +Arman/M +arm/ASEDG +Armata/M +armature/MGSD +armband/SM +armchair/MS +Armco/M +armed/U +Armenia/M +Armenian/MS +armer/MES +armful/SM +armhole/MS +arming/M +Arminius/M +Armin/M +armistice/MS +armless +armlet/SM +armload/M +Armonk/M +armored/U +armorer/M +armorial/S +armory/DSM +armor/ZRDMGS +Armour/M +armpit/MS +armrest/MS +arm's +Armstrong/M +Ar/MY +army/SM +Arnaldo/M +Arneb/M +Arne/M +Arney/M +Arnhem/M +Arnie/M +Arni/M +Arnold/M +Arnoldo/M +Arno/M +Arnuad/M +Arnulfo/M +Arny/M +aroma/SM +aromatherapist/S +aromatherapy/S +aromatically +aromaticity/M +aromaticness/M +aromatic/SP +Aron/M +arose +around +arousal/MS +aroused/U +arouse/GSD +ARPA/M +Arpanet/M +ARPANET/M +arpeggio/SM +arrack/M +Arragon/M +arraignment/MS +arraign/SDGL +arrangeable/A +arranged/EA +arrangement/AMSE +arranger/M +arranges/EA +arrange/ZDSRLG +arranging/EA +arrant/Y +arras/SM +arrayer +array/ESGMD +arrear/SM +arrest/ADSG +arrestee/MS +arrester/MS +arresting/Y +arrestor/MS +Arrhenius/M +arrhythmia/SM +arrhythmic +arrhythmical +Arri/M +arrival/MS +arriver/M +arrive/SRDG +arrogance/MS +arrogant/Y +arrogate/XNGDS +arrogation/M +Arron/M +arrowhead/SM +arrowroot/MS +arrow/SDMG +arroyo/MS +arr/TV +arsenal/MS +arsenate/M +arsenic/MS +arsenide/M +arsine/MS +arsonist/MS +arson/SM +Artair/M +Artaxerxes/M +artefact's +Arte/M +Artemas +Artemis/M +Artemus/M +arterial/SY +arteriolar +arteriole/SM +arterioscleroses +arteriosclerosis/M +artery/SM +artesian +artfulness/SM +artful/YP +Arther/M +arthritic/S +arthritides +arthritis/M +arthrogram/MS +arthropod/SM +arthroscope/S +arthroscopic +Arthurian +Arthur/M +artichoke/SM +article/GMDS +articulable/I +articular +articulated/EU +articulately/I +articulateness/IMS +articulates/I +articulate/VGNYXPSD +articulation/M +articulator/SM +articulatory +Artie/M +artifact/MS +artificer/M +artifice/ZRSM +artificiality/MS +artificialness/M +artificial/PY +artillerist +artilleryman/M +artillerymen +artillery/SM +artiness/MS +artisan/SM +artiste/SM +artistically/I +artistic/I +artist/MS +artistry/SM +artlessness/MS +artless/YP +Art/M +art/SM +artsy/RT +Artur/M +Arturo/M +Artus/M +artwork/MS +Arty/M +arty/TPR +Aruba/M +arum/MS +Arvie/M +Arvin/M +Arv/M +Arvy/M +Aryan/MS +Aryn/M +as +As +A's +Asa/M +Asama/M +asap +ASAP +asbestos/MS +Ascella/M +ascend/ADGS +ascendancy/MS +ascendant/SY +ascender/SM +Ascension/M +ascension/SM +ascent/SM +ascertain/DSBLG +ascertainment/MS +ascetically +asceticism/MS +ascetic/SM +ASCII +ascot/MS +ascribe/GSDB +ascription/MS +ascriptive +Ase/M +aseptically +aseptic/S +asexuality/MS +asexual/Y +Asgard/M +ashame/D +ashamed/UY +Ashanti/M +Ashbey/M +Ashby/M +ashcan/SM +Ashely/M +Asher/M +Asheville/M +Ashia/M +Ashien/M +Ashil/M +Ashkenazim +Ashkhabad/M +Ashla/M +Ashland/M +Ashlan/M +ashlar/GSDM +Ashlee/M +Ashleigh/M +Ashlen/M +Ashley/M +Ashlie/M +Ashli/M +Ashlin/M +Ashly/M +ashman/M +ash/MNDRSG +Ashmolean/M +Ash/MRY +ashore +ashram/SM +Ashton/M +ashtray/MS +Ashurbanipal/M +ashy/RT +Asia/M +Asian/MS +Asiatic/SM +aside/S +Asilomar/M +Asimov +asinine/Y +asininity/MS +askance +ask/DRZGS +asked/U +asker/M +askew/P +ASL +aslant +asleep +Asmara/M +asocial/S +Asoka/M +asparagus/MS +aspartame/S +ASPCA +aspect/SM +Aspell/M +aspen/M +Aspen/M +asperity/SM +asper/M +aspersion/SM +asphalt/MDRSG +asphodel/MS +asphyxia/MS +asphyxiate/GNXSD +asphyxiation/M +aspic/MS +Aspidiske/M +aspidistra/MS +aspirant/MS +aspirate/NGDSX +aspirational +aspiration/M +aspirator/SM +aspire/GSRD +aspirer/M +aspirin/SM +asplenium +asp/MNRXS +Asquith/M +Assad/M +assailable/U +assailant/SM +assail/BGDS +Assamese/M +Assam/M +assassinate/DSGNX +assassination/M +assassin/MS +assaulter/M +assaultive/YP +assault/SGVMDR +assayer/M +assay/SZGRD +assemblage/MS +assemble/ADSREG +assembled/U +assembler/EMS +assemblies/A +assembly/EAM +assemblyman/M +assemblymen +Assembly/MS +assemblywoman +assemblywomen +assent/SGMRD +assert/ADGS +asserter/MS +assertional +assertion/AMS +assertiveness/SM +assertive/PY +assess/BLSDG +assessed/A +assesses/A +assessment/SAM +assessor/MS +asset/SM +asseverate/XSDNG +asseveration/M +asshole/MS! +assiduity/SM +assiduousness/SM +assiduous/PY +assign/ALBSGD +assignation/MS +assigned/U +assignee/MS +assigner/MS +assignment/MAS +assignor/MS +assigns/CU +assimilate/VNGXSD +assimilationist/M +assimilation/M +Assisi/M +assistance/SM +assistantship/SM +assistant/SM +assisted/U +assister/M +assist/RDGS +assize/MGSD +ass/MNS +assn +assoc +associable +associated/U +associate/SDEXNG +associateship +associational +association/ME +associative/Y +associativity/S +associator/MS +assonance/SM +assonant/S +assorter/M +assort/LRDSG +assortment/SM +asst +assuaged/U +assuage/SDG +assumability +assumer/M +assume/SRDBJG +assuming/UA +assumption/SM +assumptive +assurance/AMS +assure/AGSD +assuredness/M +assured/PYS +assurer/SM +assuring/YA +Assyria/M +Assyrian/SM +Assyriology/M +Astaire/SM +Astarte/M +astatine/MS +aster/ESM +asteria +asterisked/U +asterisk/SGMD +astern +asteroidal +asteroid/SM +asthma/MS +asthmatic/S +astigmatic/S +astigmatism/SM +astir +astonish/GSDL +astonishing/Y +astonishment/SM +Aston/M +Astoria/M +Astor/M +astounding/Y +astound/SDG +astraddle +Astrakhan/M +astrakhan/SM +astral/SY +Astra/M +astray +astride +Astrid/M +astringency/SM +astringent/YS +Astrix/M +astrolabe/MS +astrologer/MS +astrological/Y +astrologist/M +astrology/SM +astronautical +astronautic/S +astronautics/M +astronaut/SM +astronomer/MS +astronomic +astronomical/Y +astronomy/SM +astrophysical +astrophysicist/SM +astrophysics/M +Astroturf/M +AstroTurf/S +Asturias/M +astuteness/MS +astute/RTYP +Asunción/M +asunder +Aswan/M +asylum/MS +asymmetric +asymmetrical/Y +asymmetry/MS +asymptomatic +asymptomatically +asymptote/MS +asymptotically +asymptotic/Y +asynchronism/M +asynchronous/Y +asynchrony +at +Atacama/M +Atahualpa/M +Atalanta/M +Atari/M +Atatürk/M +atavism/MS +atavistic +atavist/MS +ataxia/MS +ataxic/S +atelier/SM +atemporal +ate/S +Athabasca/M +Athabascan's +Athabaskan/MS +Athabaska's +atheism/SM +atheistic +atheist/SM +Athena/M +Athene/M +Athenian/SM +Athens/M +atheroscleroses +atherosclerosis/M +athirst +athlete/MS +athletically +athleticism/M +athletic/S +athletics/M +athwart +atilt +Atkins/M +Atkinson/M +Atlanta/M +Atlante/MS +atlantes +Atlantic/M +Atlantis/M +atlas/SM +Atlas/SM +At/M +Atman +ATM/M +atmosphere/DSM +atmospherically +atmospheric/S +atoll/MS +atomically +atomicity/M +atomic/S +atomics/M +atomistic +atomization/SM +atomize/GZDRS +atomizer/M +atom/SM +atonality/MS +atonal/Y +atone/LDSG +atonement/SM +atop +ATP +Atreus/M +atria +atrial +Atria/M +atrium/M +atrociousness/SM +atrocious/YP +atrocity/SM +atrophic +atrophy/DSGM +atropine/SM +Atropos/M +Ats +attach/BLGZMDRS +attached/UA +attacher/M +attaché/S +attachment/ASM +attacker/M +attack/GBZSDR +attainabilities +attainability/UM +attainableness/M +attainable/U +attainably/U +attain/AGSD +attainder/MS +attained/U +attainer/MS +attainment/MS +attar/MS +attempt/ADSG +attempter/MS +attendance/MS +attendant/SM +attended/U +attendee/SM +attender/M +attend/SGZDR +attentional +attentionality +attention/IMS +attentiveness/IMS +attentive/YIP +attenuated/U +attenuate/SDXGN +attenuation/M +attenuator/MS +attestation/SM +attested/U +attester/M +attest/GSDR +Attic +Attica/M +attic/MS +Attila/M +attire/SDG +attitude/MS +attitudinal/Y +attitudinize/SDG +Attlee/M +attn +Attn +attorney/SM +attractant/SM +attract/BSDGV +attraction/MS +attractivenesses +attractiveness/UM +attractive/UYP +attractor/MS +attributable/U +attribute/BVNGRSDX +attributed/U +attributer/M +attributional +attribution/M +attributive/SY +attrition/MS +Attucks +attune/SDG +atty +ATV/S +atwitter +Atwood/M +atypical/Y +Aube/M +Auberge/M +aubergine/MS +Auberon/M +Auberta/M +Aubert/M +Aubine/M +Aubree/M +Aubrette/M +Aubrey/M +Aubrie/M +Aubry/M +auburn/SM +Auckland/M +auctioneer/SDMG +auction/MDSG +audaciousness/SM +audacious/PY +audacity/MS +Auden/M +audibility/MSI +audible/I +audibles +audibly/I +Audie/M +audience/MS +Audi/M +audiogram/SM +audiological +audiologist/MS +audiology/SM +audiometer/MS +audiometric +audiometry/M +audiophile/SM +audio/SM +audiotape/S +audiovisual/S +audited/U +audition/MDSG +auditorium/MS +auditor/MS +auditory/S +audit/SMDVG +Audra/M +Audre/M +Audrey/M +Audrie/M +Audrye/M +Audry/M +Audubon/M +Audy/M +Auerbach/M +Augean +auger/SM +aught/S +Augie/M +Aug/M +augmentation/SM +augmentative/S +augment/DRZGS +augmenter/M +augur/GDMS +augury/SM +Augusta/M +Augustan/S +Auguste/M +Augustina/M +Augustine/M +Augustinian/S +Augustin/M +augustness/SM +Augusto/M +August/SM +august/STPYR +Augustus/M +Augy/M +auk/MS +Au/M +Aundrea/M +auntie/MS +aunt/MYS +aunty's +aural/Y +Aura/M +aura/SM +Aurea/M +Aurelea/M +Aurelia/M +Aurelie/M +Aurelio/M +Aurelius/M +Aurel/M +aureole/GMSD +aureomycin +Aureomycin/M +Auria/M +auric +auricle/SM +auricular +Aurie/M +Auriga/M +Aurilia/M +Aurlie/M +Auroora/M +auroral +Aurora/M +aurora/SM +Aurore/M +Aurthur/M +Auschwitz/M +auscultate/XDSNG +auscultation/M +auspice/SM +auspicious/IPY +auspiciousnesses +auspiciousness/IM +Aussie/MS +Austen/M +austereness/M +austere/TYRP +austerity/SM +Austina/M +Austine/M +Austin/SM +austral +Australasia/M +Australasian/S +australes +Australia/M +Australian/MS +Australis/M +australites +Australoid +Australopithecus/M +Austria/M +Austrian/SM +Austronesian +authentically +authenticated/U +authenticate/GNDSX +authentication/M +authenticator/MS +authenticity/MS +authentic/UI +author/DMGS +authoress/S +authorial +authoritarianism/MS +authoritarian/S +authoritativeness/SM +authoritative/PY +authority/SM +authorization/MAS +authorize/AGDS +authorized/U +authorizer/SM +authorizes/U +authorship/MS +autism/MS +autistic/S +autobahn/MS +autobiographer/MS +autobiographic +autobiographical/Y +autobiography/MS +autoclave/SDGM +autocollimator/M +autocorrelate/GNSDX +autocorrelation/M +autocracy/SM +autocratic +autocratically +autocrat/SM +autodial/R +autodidact/MS +autofluorescence +autograph/MDG +autographs +autoignition/M +autoimmune +autoimmunity/S +autoloader +automaker/S +automata's +automate/NGDSX +automatically +automatic/S +automation/M +automatism/SM +automatize/DSG +automaton/SM +automobile/GDSM +automorphism/SM +automotive +autonavigator/SM +autonomic/S +autonomous/Y +autonomy/MS +autopilot/SM +autopsy/MDSG +autoregressive +autorepeat/GS +auto/SDMG +autostart +autosuggestibility/M +autotransformer/M +autoworker/S +autumnal/Y +Autumn/M +autumn/MS +aux +auxiliary/S +auxin/MS +AV +availability/USM +availableness/M +available/U +availably +avail/BSZGRD +availing/U +avalanche/MGSD +Avalon/M +Ava/M +avant +avarice/SM +avariciousness/M +avaricious/PY +avast/S +avatar/MS +avaunt/S +avdp +Aveline/M +Ave/MS +avenged/U +avenger/M +avenge/ZGSRD +Aventine/M +Aventino/M +avenue/MS +average/DSPGYM +Averell/M +Averill/M +Averil/M +Avernus/M +averred +averrer +averring +Averroes/M +averseness/M +averse/YNXP +aversion/M +avers/V +avert/GSD +Averyl/M +Avery/M +ave/S +aves/C +Avesta/M +avg +avian/S +aviary/SM +aviate/NX +aviation/M +aviator/SM +aviatrices +aviatrix/SM +Avicenna/M +Avictor/M +avidity/MS +avid/TPYR +Avie/M +Avigdor/M +Avignon/M +Avila/M +avionic/S +avionics/M +Avior/M +Avis +avitaminoses +avitaminosis/M +Avivah/M +Aviva/M +Aviv/M +avocado/MS +avocational +avocation/SM +Avogadro/M +avoidable/U +avoidably/U +avoidance/SM +avoider/M +avoid/ZRDBGS +avoirdupois/MS +Avon/M +avouch/GDS +avowal/EMS +avowed/Y +avower/M +avow/GEDS +Avram/M +Avril/M +Avrit/M +Avrom/M +avuncular +av/ZR +AWACS +await/SDG +awake/GS +awakened/U +awakener/M +awakening/S +awaken/SADG +awarder/M +award/RDSZG +awareness/MSU +aware/TRP +awash +away/PS +aweigh +awe/SM +awesomeness/SM +awesome/PY +awestruck +awfuller +awfullest +awfulness/SM +awful/YP +aw/GD +awhile/S +awkwardness/MS +awkward/PRYT +awl/MS +awning/DM +awn/MDJGS +awoke +awoken +AWOL +awry/RT +ax/DRSZGM +axehead/S +Axel/M +Axe/M +axeman +axial/Y +axillary +axiological/Y +axiology/M +axiomatically +axiomatic/S +axiomatization/MS +axiomatize/GDS +axiom/SM +axion/SM +axis/SM +axle/MS +axletree/MS +Ax/M +axolotl/SM +axon/SM +ayah/M +ayahs +Ayala/M +ayatollah +ayatollahs +aye/MZRS +Ayers +Aylmar/M +Aylmer/M +Aymara/M +Aymer/M +Ayn/M +AZ +azalea/SM +Azania/M +Azazel/M +Azerbaijan/M +azimuthal/Y +azimuth/M +azimuths +Azores +Azov/M +AZT +Aztecan +Aztec/MS +azure/MS +BA +Baal/SM +baa/SDG +Babara/M +Babar's +Babbage/M +Babbette/M +Babbie/M +babbitt/GDS +Babbitt/M +babbler/M +babble/RSDGZ +Babb/M +Babcock/M +Babel/MS +babel/S +babe/SM +Babette/M +Babita/M +Babka/M +baboon/MS +Bab/SM +babushka/MS +babyhood/MS +babyish +Babylonia/M +Babylonian/SM +Babylon/MS +babysat +babysit/S +babysitter/S +babysitting +baby/TDSRMG +Bacall/M +Bacardi/M +baccalaureate/MS +baccarat/SM +bacchanalia +Bacchanalia/M +bacchanalian/S +bacchanal/SM +Bacchic +Bacchus/M +bachelorhood/SM +bachelor/SM +Bach/M +bacillary +bacilli +bacillus/MS +backache/SM +backarrow +backbencher/M +backbench/ZR +backbiter/M +backbite/S +backbitten +backbit/ZGJR +backboard/SM +backbone/SM +backbreaking +backchaining +backcloth/M +backdate/GDS +backdrop/MS +backdropped +backdropping +backed/U +backer/M +backfield/SM +backfill/SDG +backfire/GDS +backgammon/MS +background/SDRMZG +back/GZDRMSJ +backhanded/Y +backhander/M +backhand/RDMSZG +backhoe/S +backing/M +backlash/GRSDM +backless +backlogged +backlogging +backlog/MS +backorder +backpacker/M +backpack/ZGSMRD +backpedal/DGS +backplane/MS +backplate/SM +backrest/MS +backscatter/SMDG +backseat/S +backside/SM +backslapper/MS +backslapping/M +backslash/DSG +backslider/M +backslide/S +backslid/RZG +backspace/GSD +backspin/SM +backstabber/M +backstabbing +backstage +backstair/S +backstitch/GDSM +backstop/MS +backstopped +backstopping +backstreet/M +backstretch/SM +backstroke/GMDS +backtalk/S +backtrack/SDRGZ +backup/SM +Backus/M +backwardness/MS +backward/YSP +backwash/SDMG +backwater/SM +backwood/S +backwoodsman/M +backwoodsmen +backyard/MS +baconer/M +Bacon/M +bacon/SRM +bacterial/Y +bacteria/MS +bactericidal +bactericide/SM +bacteriologic +bacteriological +bacteriologist/MS +bacteriology/SM +bacterium/M +Bactria/M +badder +baddest +baddie/MS +bade +Baden/M +badge/DSRGMZ +badger/DMG +badinage/DSMG +badland/S +Badlands/M +badman/M +badmen +badminton/MS +badmouth/DG +badmouths +badness/SM +bad/PSNY +Baedeker/SM +Baez/M +Baffin/M +bafflement/MS +baffler/M +baffle/RSDGZL +baffling/Y +bagatelle/MS +bagel/SM +bagful/MS +baggageman +baggagemen +baggage/SM +bagged/M +bagger/SM +baggily +bagginess/MS +bagging/M +baggy/PRST +Baghdad/M +bagpiper/M +bagpipe/RSMZ +Bagrodia/MS +bag/SM +baguette/SM +Baguio/M +bah +Baha'i +Bahama/MS +Bahamanian/S +Bahamian/MS +Baha'ullah +Bahia/M +Bahrain/M +bahs +Baikal/M +Bailey/SM +bail/GSMYDRB +Bailie/M +bailiff/SM +bailiwick/MS +Baillie/M +Bail/M +bailout/MS +bailsman/M +bailsmen +Baily/M +Baird/M +bairn/SM +baiter/M +bait/GSMDR +baize/GMDS +Baja/M +baked/U +bakehouse/M +Bakelite/M +baker/M +Baker/M +Bakersfield/M +bakery/SM +bakeshop/S +bake/ZGJDRS +baking/M +baklava/M +baksheesh/SM +Baku/M +Bakunin/M +balaclava/MS +balalaika/MS +balanced/A +balancedness +balancer/MS +balance's +balance/USDG +Balanchine/M +Balboa/M +balboa/SM +balcony/MSD +balderdash/MS +Balder/M +baldfaced +Bald/MR +baldness/MS +bald/PYDRGST +baldric/SM +Balduin/M +Baldwin/M +baldy +Balearic/M +baleen/MS +balefuller +balefullest +balefulness/MS +baleful/YP +Bale/M +bale/MZGDRS +baler/M +Balfour/M +Bali/M +Balinese +balkanization +balkanize/DG +Balkan/SM +balker/M +balk/GDRS +Balkhash/M +balkiness/M +balky/PRT +balladeer/MS +ballade/MS +balladry/MS +ballad/SM +Ballard/SM +ballast/SGMD +ballcock/S +ballerina/MS +baller/M +balletic +ballet/MS +ballfields +ballgame/S +ball/GZMSDR +ballistic/S +ballistics/M +Ball/M +balloonist/S +balloon/RDMZGS +balloter/M +ballot/MRDGS +ballpark/SM +ballplayer/SM +ballpoint/SM +ballroom/SM +ballsy/TR +ballyhoo/SGMD +balminess/SM +balm/MS +balmy/PRT +baloney/SM +balsam/GMDS +balsamic +balsa/MS +Balthazar/M +Baltic/M +Baltimore/M +Baluchistan/M +baluster/MS +balustrade/SM +Balzac/M +Ba/M +Bamako/M +Bamberger/M +Bambie/M +Bambi/M +bamboo/SM +bamboozle/GSD +Bamby/M +Banach/M +banality/MS +banal/TYR +banana/SM +Bancroft/M +bandager/M +bandage/RSDMG +bandanna/SM +bandbox/MS +bandeau/M +bandeaux +band/EDGS +bander/M +banding/M +bandit/MS +banditry/MS +bandmaster/MS +bandoleer/SM +bandpass +band's +bandsman/M +bandsmen +bandstand/SM +bandstop +Bandung/M +bandwagon/MS +bandwidth/M +bandwidths +bandy/TGRSD +banefuller +banefullest +baneful/Y +bane/MS +Bangalore/M +banger/M +bang/GDRZMS +bangkok +Bangkok/M +Bangladeshi/S +Bangladesh/M +bangle/MS +Bangor/M +Bangui/M +bani +banisher/M +banishment/MS +banish/RSDGL +banister/MS +Banjarmasin/M +banjoist/SM +banjo/MS +Banjul/M +bankbook/SM +bankcard/S +banker/M +bank/GZJDRMBS +banking/M +Bank/MS +banknote/S +bankroll/DMSG +bankruptcy/MS +bankrupt/DMGS +Banky/M +Ban/M +banned/U +Banneker/M +banner/SDMG +banning/U +Bannister/M +bannister's +bannock/SM +banns +banqueter/M +banquet/SZGJMRD +banquette/MS +ban/SGMD +banshee/MS +bans/U +bantam/MS +bantamweight/MS +banterer/M +bantering/Y +banter/RDSG +Banting/M +Bantu/SM +banyan/MS +banzai/S +baobab/SM +Baotou/M +baptismal/Y +baptism/SM +Baptiste/M +baptistery/MS +baptist/MS +Baptist/MS +baptistry's +baptized/U +baptizer/M +baptize/SRDZG +baptizes/U +Barabbas/M +Barbabas/M +Barbabra/M +Barbadian/S +Barbados/M +Barbaraanne/M +Barbara/M +Barbarella/M +barbarianism/MS +barbarian/MS +barbaric +barbarically +barbarism/MS +barbarity/SM +barbarize/SDG +Barbarossa/M +barbarousness/M +barbarous/PY +Barbary/M +barb/DRMSGZ +barbecue/DRSMG +barbed/P +Barbee/M +barbell/SM +barbel/MS +Barbe/M +barbeque's +barber/DMG +barbered/U +Barber/M +barberry/MS +barbershop/MS +Barbette/M +Barbey/M +Barbie/M +Barbi/M +barbital/M +barbiturate/MS +Barbour/M +Barbra/M +Barb/RM +Barbuda/M +barbwire/SM +Barby/M +barcarole/SM +Barcelona/M +Barclay/M +Bardeen/M +Barde/M +bardic +Bard/M +bard/MDSG +bareback/D +barefacedness/M +barefaced/YP +barefoot/D +barehanded +bareheaded +barelegged +bareness/MS +Barents/M +bare/YSP +barfly/SM +barf/YDSG +bargainer/M +bargain/ZGSDRM +barge/DSGM +bargeman/M +bargemen +bargepole/M +barhopped +barhopping +barhop/S +Bari/M +baritone/MS +barium/MS +barked/C +barkeeper/M +barkeep/SRZ +barker/M +Barker/M +bark/GZDRMS +Barkley/M +barks/C +barleycorn/MS +barley/MS +Barlow/M +barmaid/SM +barman/M +barmen +Bar/MH +Barnabas +Barnabe/M +Barnaby/M +barnacle/MDS +Barnard/M +Barnaul/M +Barnebas/M +Barnes +Barnett/M +Barney/M +barnful +barn/GDSM +Barnhard/M +Barnie/M +Barn/M +barnsful +barnstorm/DRGZS +barnstormer/M +Barnum/M +barnyard/MS +Barny/M +Baroda/M +barometer/MS +barometric +barometrically +baronage/MS +baroness/MS +baronetcy/SM +baronet/MS +baronial +Baron/M +baron/SM +barony/SM +baroque/SPMY +barque's +Barquisimeto/M +barracker/M +barrack/SDRG +barracuda/MS +barrage/MGSD +Barranquilla/M +barred/ECU +barre/GMDSJ +barrel/SGMD +barrenness/SM +barren/SPRT +Barrera/M +Barret/M +barrette/SM +Barrett/M +barricade/SDMG +Barrie/M +barrier/MS +barring/R +barrio/SM +Barri/SM +barrister/MS +Barr/M +Barron/M +barroom/SM +barrow/MS +Barry/M +Barrymore/MS +bars/ECU +barstool/SM +Barstow/M +Bartel/M +bartender/M +bartend/ZR +barterer/M +barter/SRDZG +bar/TGMDRS +Barthel/M +Barth/M +Bartholdi/M +Bartholemy/M +Bartholomeo/M +Bartholomeus/M +Bartholomew/M +Bartie/M +Bartlet/M +Bartlett/M +Bart/M +Bartók/M +Bartolemo/M +Bartolomeo/M +Barton/M +Bartram/M +Barty/M +barycenter +barycentre's +barycentric +Bary/M +baryon/SM +Baryram/M +Baryshnikov/M +basaltic +basalt/SM +basal/Y +Bascom/M +bas/DRSTG +baseball/MS +baseband +baseboard/MS +base/CGRSDL +baseless +baseline/SM +Basel/M +basely +Base/M +baseman/M +basemen +basement/CSM +baseness/MS +baseplate/M +base's +basetting +bashfulness/MS +bashful/PY +bash/JGDSR +Basho/M +Basia/M +BASIC +basically +basic/S +Basie/M +basilar +Basile/M +basilica/SM +Basilio/M +basilisk/SM +Basilius/M +Basil/M +basil/MS +basin/DMS +basinful/S +basis/M +basketball/MS +basketry/MS +basket/SM +basketwork/SM +bask/GSD +basophilic +Basque/SM +Basra/M +Basseterre/M +basset/GMDS +Bassett/M +bassinet/SM +bassist/MS +Bass/M +basso/MS +bassoonist/MS +bassoon/MS +bass/SM +basswood/SM +bastardization/MS +bastardized/U +bastardize/SDG +bastard/MYS +bastardy/MS +baste/NXS +baster/M +Bastian/M +Bastien/M +Bastille/M +basting/M +bastion/DM +bast/SGZMDR +Basutoland/M +Bataan/M +Batavia/M +batch/MRSDG +bated/U +bate/KGSADC +bater/AC +Bates +bathe +bather/M +bathetic +bathhouse/SM +bath/JMDSRGZ +bathmat/S +Batholomew/M +bathos/SM +bathrobe/MS +bathroom/SDM +baths +Bathsheba/M +bathtub/MS +bathwater +bathyscaphe's +bathysphere/MS +batik/DMSG +Batista/M +batiste/SM +Bat/M +batman/M +Batman/M +batmen +baton/SM +Batsheva/M +batsman/M +bat/SMDRG +batsmen +battalion/MS +batted +batten/SDMG +batter/SRDZG +battery/MS +batting/MS +battledore/MS +battledress +battlefield/SM +battlefront/SM +battle/GMZRSDL +battleground/SM +Battle/M +battlement/SMD +battler/M +battleship/MS +batty/RT +Batu/M +batwings +bauble/SM +Baudelaire/M +baud/M +Baudoin/M +Baudouin/M +Bauer/M +Bauhaus/M +baulk/GSDM +Bausch/M +bauxite/SM +Bavaria/M +Bavarian/S +bawdily +bawdiness/MS +bawd/SM +bawdy/PRST +bawler/M +bawl/SGDR +Baxie/M +Bax/M +Baxter/M +Baxy/M +Bayamon +Bayard/M +bayberry/MS +Bayda/M +Bayer/M +Bayes +Bayesian +bay/GSMDY +Baylor/M +Bay/MR +bayonet/SGMD +Bayonne/M +bayou/MS +Bayreuth/M +bazaar/MS +bazillion/S +bazooka/MS +BB +BBB +BBC +bbl +BBQ +BBS +BC +BCD +bdrm +beachcomber/SM +beachhead/SM +Beach/M +beach/MSDG +beachwear/M +beacon/DMSG +beading/M +Beadle/M +beadle/SM +bead/SJGMD +beadsman/M +beadworker +beady/TR +beagle/SDGM +beaker/M +beak/ZSDRM +Beale/M +Bealle/M +Bea/M +beam/MDRSGZ +beanbag/SM +bean/DRMGZS +beanie/SM +Bean/M +beanpole/MS +beanstalk/SM +bearable/U +bearably/U +beard/DSGM +bearded/P +beardless +Beard/M +Beardmore/M +Beardsley/M +bearer/M +bearing/M +bearishness/SM +bearish/PY +bearlike +Bear/M +Bearnaise/M +Bearnard/M +bearskin/MS +bear/ZBRSJG +Beasley/M +beasties +beastings/M +beastliness/MS +beastly/PTR +beast/SJMY +beatable/U +beatably/U +beaten/U +beater/M +beatific +beatifically +beatification/M +beatify/GNXDS +beating/M +beatitude/MS +Beatlemania/M +Beatles/M +beatnik/SM +beat/NRGSBZJ +Beatrice/M +Beatrisa/M +Beatrix/M +Beatriz/M +Beauchamps +Beaufort/M +Beaujolais/M +Beau/M +Beaumarchais/M +Beaumont/M +beau/MS +Beauregard/M +beauteousness/M +beauteous/YP +beautician/MS +beautification/M +beautifier/M +beautifully/U +beautifulness/M +beautiful/PTYR +beautify/SRDNGXZ +beaut/SM +beauty/SM +Beauvoir/M +beaux's +beaver/DMSG +Beaverton/M +Bebe/M +bebop/MS +becalm/GDS +became +because +Becca/M +Bechtel/M +Becka/M +Becker/M +Becket/M +Beckett/M +beck/GSDM +Beckie/M +Becki/M +beckon/SDG +Beck/RM +Becky/M +becloud/SGD +become/GJS +becoming/UY +Becquerel/M +bedaub/GDS +bedazzle/GLDS +bedazzlement/SM +bedbug/SM +bedchamber/M +bedclothes +bedded +bedder/MS +bedding/MS +bedeck/DGS +Bede/M +bedevil/DGLS +bedevilment/SM +bedfast +bedfellow/MS +Bedford/M +bedimmed +bedimming +bedim/S +bedizen/DGS +bedlam/MS +bedlinen +bedmaker/SM +bedmate/MS +bed/MS +Bedouin/SM +bedpan/SM +bedpost/SM +bedraggle/GSD +bedridden +bedrock/SM +bedroll/SM +bedroom/DMS +bedsheets +bedside/MS +bedsit +bedsitter/M +bedsore/MS +bedspread/SM +bedspring/SM +bedstead/SM +bedstraw/M +bedtime/SM +Beebe/M +beebread/MS +Beecher/M +beech/MRSN +beechnut/MS +beechwood +beefburger/SM +beefcake/MS +beef/GZSDRM +beefiness/MS +beefsteak/MS +beefy/TRP +beehive/MS +beekeeper/MS +beekeeping/SM +beeline/MGSD +Beelzebub/M +Bee/M +bee/MZGJRS +been/S +beeper/M +beep/GZSMDR +Beerbohm/M +beer/M +beermat/S +beery/TR +beeswax/DSMG +Beethoven/M +beetle/GMRSD +Beeton/M +beetroot/M +beet/SM +beeves/M +befall/SGN +befell +befit/SM +befitted +befitting/Y +befogged +befogging +befog/S +before +beforehand +befoul/GSD +befriend/DGS +befuddle/GLDS +befuddlement/SM +began +beget/S +begetting +beggar/DYMSG +beggarliness/M +beggarly/P +beggary/MS +begged +begging +Begin/M +beginner/MS +beginning/MS +begin/S +begone/S +begonia/SM +begot +begotten +begrime/SDG +begrudge/GDRS +begrudging/Y +beg/S +beguilement/SM +beguiler/M +beguile/RSDLZG +beguiling/Y +beguine/SM +begum/MS +begun +behalf/M +behalves +Behan/M +behave/GRSD +behavioral/Y +behaviorism/MS +behavioristic/S +behaviorist/S +behavior/SMD +behead/GSD +beheld +behemoth/M +behemoths +behest/SM +behindhand +behind/S +beholder/M +behold/ZGRNS +behoofs +behoove/SDJMG +behooving/YM +Behring/M +Beiderbecke/M +beige/MS +Beijing +Beilul/M +being/M +Beirut/M +Beitris/M +bejewel/SDG +Bekesy/M +Bekki/M +be/KS +belabor/MDSG +Bela/M +Belarus +belate/D +belatedness/M +belated/PY +Belau/M +belay/GSD +belch/GSD +beleaguer/GDS +Belem/M +Belfast/M +belfry/SM +Belgian/MS +Belgium/M +Belg/M +Belgrade/M +Belia/M +Belicia/M +belie +belief/ESUM +belier/M +believability's +believability/U +believable/U +believably/U +believed/U +believe/EZGDRS +believer/MUSE +believing/U +Belinda/M +Belita/M +belittlement/MS +belittler/M +belittle/RSDGL +Belize/M +belladonna/MS +Bella/M +Bellamy/M +Bellanca/M +Bellatrix/M +bellboy/MS +belled/A +Belle/M +belle/MS +belletristic +belletrist/SM +Belleville/M +bellflower/M +bell/GSMD +bellhop/MS +bellicoseness/M +bellicose/YP +bellicosity/MS +belligerence/SM +belligerency/MS +belligerent/SMY +Bellina/M +belling/A +Bellini/M +Bell/M +bellman/M +bellmen +Bellovin/M +bellow/DGS +Bellow/M +bellows/M +bells/A +bellwether/MS +Bellwood/M +bellyacher/M +bellyache/SRDGM +bellybutton/MS +bellyfull +bellyful/MS +belly/SDGM +Bel/M +Belmont/M +Belmopan/M +Beloit/M +belong/DGJS +belonging/MP +Belorussian/S +Belorussia's +belove/D +beloved/S +below/S +Belshazzar/M +belted/U +belt/GSMD +belting/M +Belton/M +Beltran/M +Beltsville/M +beltway/SM +beluga/SM +Belushi/M +Belva/M +belvedere/M +Belvia/M +bely/DSRG +beman +Be/MH +bemire/SDG +bemoan/GDS +bemused/Y +bemuse/GSDL +bemusement/SM +Benacerraf/M +Benares's +bencher/M +benchmark/GDMS +bench/MRSDG +bend/BUSG +bended +Bender/M +bender/MS +Bendick/M +Bendicty/M +Bendite/M +Bendix/M +beneath +Benedetta/M +Benedetto/M +Benedick/M +Benedicta/M +Benedictine/MS +benediction/MS +Benedict/M +Benedicto/M +benedictory +Benedikta/M +Benedikt/M +benefaction/MS +benefactor/MS +benefactress/S +benefice/MGSD +beneficence/SM +beneficent/Y +beneficialness/M +beneficial/PY +beneficiary/MS +benefiter/M +benefit/SRDMZG +Benelux/M +Benet/M +Benetta/M +Benetton/M +benevolence/SM +benevolentness/M +benevolent/YP +Bengali/M +Bengal/SM +Benghazi/M +Bengt/M +Beniamino/M +benightedness/M +benighted/YP +benignant +benignity/MS +benign/Y +Beninese +Benin/M +Benita/M +Benito/M +Benjamen/M +Benjamin/M +Benjie/M +Benji/M +Benjy/M +Ben/M +Bennett/M +Bennie/M +Benni/M +Bennington/M +Benn/M +Benny/M +Benoite/M +Benoit/M +Benson/M +Bentham/M +Bentlee/M +Bentley/MS +Bent/M +Benton/M +bents +bent/U +bentwood/SM +benumb/SGD +Benyamin/M +Benzedrine/M +benzene/MS +benzine/SM +Benz/M +Beograd's +Beowulf/M +bequeath/GSD +bequeaths +bequest/MS +berate/GSD +Berber/MS +bereave/GLSD +bereavement/MS +bereft +Berenice/M +Beret/M +beret/SM +Bergen/M +Bergerac/M +Berger/M +Berget/M +Berglund/M +Bergman/M +Berg/NRM +berg/NRSM +Bergson/M +Bergsten/M +Bergstrom/M +beribbon/D +beriberi/SM +Beringer/M +Bering/RM +Berkeley/M +berkelium/SM +Berke/M +Berkie/M +Berkley/M +Berkly/M +Berkowitz/M +Berkshire/SM +Berky/M +Berk/YM +Berle/M +Berliner/M +Berlin/SZRM +Berlioz/M +Berlitz/M +Berman/M +Ber/MG +berm/SM +Bermuda/MS +Bermudan/S +Bermudian/S +Bernadene/M +Bernadette/M +Bernadina/M +Bernadine/M +Berna/M +Bernardina/M +Bernardine/M +Bernardino/M +Bernard/M +Bernardo/M +Bernarr/M +Bernays/M +Bernbach/M +Bernelle/M +Berne's +Bernese +Bernete/M +Bernetta/M +Bernette/M +Bernhard/M +Bernhardt/M +Bernice/M +Berniece/M +Bernie/M +Berni/M +Bernini/M +Bernita/M +Bern/M +Bernoulli/M +Bernstein/M +Berny/M +Berra/M +Berrie/M +Berri/M +berrylike +Berry/M +berry/SDMG +berserker/M +berserk/SR +Berta/M +Berte/M +Bertha/M +Berthe/M +berth/MDGJ +berths +Bertie/M +Bertillon/M +Berti/M +Bertina/M +Bertine/M +Bert/M +Berton/M +Bertram/M +Bertrand/M +Bertrando/M +Berty/M +Beryle/M +beryllium/MS +Beryl/M +beryl/SM +Berzelius/M +bes +beseecher/M +beseeching/Y +beseech/RSJZG +beseem/GDS +beset/S +besetting +beside/S +besieger/M +besiege/SRDZG +besmear/GSD +besmirch/GSD +besom/GMDS +besot/S +besotted +besotting +besought +bespangle/GSD +bespatter/SGD +bespeak/SG +bespectacled +bespoke +bespoken +Bess +Bessel/M +Bessemer/M +Bessie/M +Bessy/M +best/DRSG +bestiality/MS +bestial/Y +bestiary/MS +bestirred +bestirring +bestir/S +Best/M +bestowal/SM +bestow/SGD +bestrew/DGS +bestrewn +bestridden +bestride/SG +bestrode +bestseller/MS +bestselling +bestubble/D +betaken +betake/SG +beta/SM +betatron/M +betcha +Betelgeuse/M +betel/MS +Bethanne/M +Bethany/M +bethel/M +Bethe/M +Bethena/M +Bethesda/M +Bethina/M +bethink/GS +Bethlehem/M +beth/M +Beth/M +bethought +Bethune +betide/GSD +betimes +bet/MS +betoken/GSD +betook +betrayal/SM +betrayer/M +betray/SRDZG +betrothal/SM +betrothed/U +betroth/GD +betroths +Betsey/M +Betsy/M +Betta/M +Betteanne/M +Betteann/M +Bette/M +betterment/MS +better/SDLG +Bettie/M +Betti/M +Bettina/M +Bettine/M +betting +bettor/SM +Bettye/M +Betty/SM +betweenness/M +between/SP +betwixt +Beulah/M +Bevan/M +bevel/SJGMRD +beverage/MS +Beverie/M +Beverlee/M +Beverley/M +Beverlie/M +Beverly/M +Bevin/M +Bevon/M +Bev's +Bevvy/M +bevy/SM +bewail/GDS +beware/GSD +bewhisker/D +bewigged +bewildered/PY +bewildering/Y +bewilder/LDSG +bewilderment/SM +bewitching/Y +bewitch/LGDS +bewitchment/SM +bey/MS +beyond/S +bezel/MS +bf +B/GT +Bhopal/M +Bhutanese +Bhutan/M +Bhutto/M +Bialystok/M +Bianca/M +Bianco/M +Bianka/M +biannual/Y +bias/DSMPG +biased/U +biathlon/MS +biaxial/Y +bibbed +Bibbie/M +bibbing +Bibbye/M +Bibby/M +Bibi/M +bible/MS +Bible/MS +biblical/Y +biblicists +bibliographer/MS +bibliographical/Y +bibliographic/S +bibliography/MS +bibliophile/MS +Bib/M +bib/MS +bibulous +bicameral +bicameralism/MS +bicarb/MS +bicarbonate/MS +bicentenary/S +bicentennial/S +bicep/S +biceps/M +bichromate/DM +bickerer/M +bickering/M +bicker/SRDZG +biconcave +biconnected +biconvex +bicuspid/S +bicycler/M +bicycle/RSDMZG +bicyclist/SM +biddable +bidden/U +bidder/MS +Biddie/M +bidding/MS +Biddle/M +Biddy/M +biddy/SM +bider/M +bide/S +bidet/SM +Bidget/M +bid/GMRS +bidiagonal +bidirectional/Y +bids/A +biennial/SY +biennium/SM +Bienville/M +Bierce/M +bier/M +bifocal/S +bifurcate/SDXGNY +bifurcation/M +bigamist/SM +bigamous +bigamy/SM +Bigelow/M +Bigfoot +bigged +bigger +biggest +biggie/SM +bigging +biggish +bighead/MS +bigheartedness/S +bighearted/P +bighorn/MS +bight/SMDG +bigmouth/M +bigmouths +bigness/SM +bigoted/Y +bigot/MDSG +bigotry/MS +big/PYS +bigwig/MS +biharmonic +bijection/MS +bijective/Y +bijou/M +bijoux +bike/MZGDRS +biker/M +bikini/SMD +Biko/M +bilabial/S +bilateralness/M +bilateral/PY +bilayer/S +Bilbao/M +bilberry/MS +Bilbo/M +bile/SM +bilge/GMDS +biliary +Bili/M +bilinear +bilingualism/SM +bilingual/SY +biliousness/SM +bilious/P +bilker/M +bilk/GZSDR +billboard/MDGS +biller/M +billet/MDGS +billfold/MS +billiard/SM +Billie/M +Billi/M +billing/M +billingsgate/SM +Billings/M +billionaire/MS +billion/SHM +billionths +bill/JGZSBMDR +Bill/JM +billow/DMGS +billowy/RT +billposters +Billye/M +Billy/M +billy/SM +Bil/MY +bi/M +Bi/M +bimbo/MS +bimetallic/S +bimetallism/MS +Bimini/M +bimodal +bimolecular/Y +bimonthly/S +binary/S +binaural/Y +binder/M +bindery/MS +binding/MPY +bindingness/M +bind/JDRGZS +bindle/M +binds/AU +bindweed/MS +binge/MS +bing/GNDM +Bingham/M +Binghamton/M +Bing/M +bingo/MS +Bini/M +Bink/M +Binky/M +binnacle/MS +binned +Binnie/M +Binni/M +binning +Binny/M +binocular/SY +binodal +binomial/SYM +bin/SM +binuclear +biochemical/SY +biochemist/MS +biochemistry/MS +biodegradability/S +biodegradable +biodiversity/S +bioengineering/M +bioethics +biofeedback/SM +biographer/M +biographic +biographical/Y +biograph/RZ +biography/MS +biog/S +Bioko/M +biol +biological/SY +biologic/S +biologist/SM +biology/MS +biomass/SM +biomedical +biomedicine/M +biometric/S +biometrics/M +biometry/M +biomolecule/S +biomorph +bionically +bionic/S +bionics/M +biophysical/Y +biophysicist/SM +biophysic/S +biophysics/M +biopic/S +biopsy/SDGM +biorhythm/S +BIOS +bioscience/S +biosphere/MS +biostatistic/S +biosynthesized +biotechnological +biotechnologist +biotechnology/SM +biotic +biotin/SM +bipartisan +bipartisanship/MS +bipartite/YN +bipartition/M +bipedal +biped/MS +biplane/MS +bipolar +bipolarity/MS +biracial +Birch/M +birch/MRSDNG +birdbath/M +birdbaths +birdbrain/SDM +birdcage/SM +birder/M +birdhouse/MS +birdieing +Birdie/M +birdie/MSD +birdlike +birdlime/MGDS +Bird/M +birdseed/MS +Birdseye/M +bird/SMDRGZ +birdsong +birdtables +birdwatch/GZR +birefringence/M +birefringent +biretta/SM +Birgit/M +Birgitta/M +Birkenstock/M +Birk/M +Birmingham/M +Biro/M +Biron/M +birthday/SM +birthmark/MS +birth/MDG +birthplace/SM +birthrate/MS +birthright/MS +birth's/A +births/A +birthstone/SM +bis +Biscay/M +Biscayne/M +biscuit/MS +bisect/DSG +bisection/MS +bisector/MS +biserial +bisexuality/MS +bisexual/YMS +Bishkek +bishop/DGSM +Bishop/M +bishopric/SM +Bismarck/M +Bismark/M +bismuth/M +bismuths +bison/M +bisque/SM +Bissau/M +bistable +bistate +bistro/SM +bisyllabic +bitblt/S +bitchily +bitchiness/MS +bitch/MSDG +bitchy/PTR +biter/M +bite/S +biting/Y +bitmap/SM +bit/MRJSZG +BITNET/M +bit's/C +bits/C +bitser/M +bitted +bitten +bitterness/SM +bittern/SM +bitternut/M +bitter/PSRDYTG +bitterroot/M +bittersweet/YMSP +bitting +bitty/PRT +bitumen/MS +bituminous +bitwise +bivalent/S +bivalve/MSD +bivariate +bivouacked +bivouacking +bivouac/MS +biweekly/S +biyearly +bizarreness/M +bizarre/YSP +Bizet/M +biz/M +bizzes +Bjorn/M +bk +b/KGD +Bk/M +blabbed +blabber/GMDS +blabbermouth/M +blabbermouths +blabbing +blab/S +blackamoor/SM +blackball/SDMG +blackberry/GMS +blackbirder/M +blackbird/SGDRM +blackboard/SM +blackbody/S +Blackburn/M +blackcurrant/M +blackener/M +blacken/GDR +Blackfeet +Blackfoot/M +blackguard/MDSG +blackhead/SM +blacking/M +blackish +blackjack/SGMD +blackleg/M +blacklist/DRMSG +blackmail/DRMGZS +blackmailer/M +Blackman/M +Blackmer/M +blackness/MS +blackout/SM +Blackpool/M +Black's +black/SJTXPYRDNG +blacksmith/MG +blacksmiths +blacksnake/MS +blackspot +Blackstone/M +blackthorn/MS +blacktop/MS +blacktopped +blacktopping +Blackwell/MS +bladder/MS +bladdernut/M +bladderwort/M +blade/DSGM +blah/MDG +blahs +Blaine/M +Blaire/M +Blair/M +Blakelee/M +Blakeley/M +Blake/M +Blakey/M +blame/DSRBGMZ +blamelessness/SM +blameless/YP +blamer/M +blameworthiness/SM +blameworthy/P +Blanca/M +Blancha/M +Blanchard/M +blanch/DRSG +Blanche/M +blancher/M +Blanch/M +blanc/M +blancmange/SM +blandishment/MS +blandish/SDGL +blandness/MS +bland/PYRT +Blane/M +Blankenship/M +blanketing/M +blanket/SDRMZG +blankness/MS +blank/SPGTYRD +Blanton/M +Blantyre/M +blare/DSG +blarney/DMGS +blasé +blasphemer/M +blaspheme/RSDZG +blasphemousness/M +blasphemous/PY +blasphemy/SM +blaster/M +blasting/M +blastoff/SM +blast/SMRDGZ +blatancy/SM +blatant/YP +blather/DRGS +blatting +Blatz/M +Blavatsky/M +Blayne/M +blaze/DSRGMZ +blazer/M +blazing/Y +blazoner/M +blazon/SGDR +bl/D +bldg +bleach/DRSZG +bleached/U +bleacher/M +bleakness/MS +bleak/TPYRS +blear/GDS +blearily +bleariness/SM +bleary/PRT +bleater/M +bleat/RDGS +bleeder/M +bleed/ZRJSG +Bleeker/M +bleep/GMRDZS +blemish/DSMG +blemished/U +blench/DSG +blender/M +blend/GZRDS +Blenheim/M +blessedness/MS +blessed/PRYT +blessing/M +bless/JGSD +Blevins/M +blew +Bligh/M +blighter/M +blight/GSMDR +blimey/S +blimp/MS +blinded/U +blinder/M +blindfold/SDG +blinding/MY +blind/JGTZPYRDS +blindness/MS +blindside/SDG +blinker/MDG +blinking/U +blink/RDGSZ +blinks/M +Blinnie/M +Blinni/M +Blinny/M +blintze/M +blintz/SM +blip/MS +blipped +blipping +Blisse/M +blissfulness/MS +blissful/PY +Bliss/M +bliss/SDMG +blistering/Y +blister/SMDG +blistery +Blithe/M +blitheness/SM +blither/G +blithesome +blithe/TYPR +blitz/GSDM +blitzkrieg/SM +blizzard/MS +bloater/M +bloat/SRDGZ +blobbed +blobbing +blob/MS +Bloch/M +blockader/M +blockade/ZMGRSD +blockage/MS +blockbuster/SM +blockbusting/MS +blocker/MS +blockhead/MS +blockhouse/SM +block's +block/USDG +blocky/R +bloc/MS +Bloemfontein/M +bloke/SM +Blomberg/M +Blomquist/M +Blondelle/M +Blondell/M +blonde's +Blondie/M +blondish +blondness/MS +blond/SPMRT +Blondy/M +bloodbath +bloodbaths +bloodcurdling +bloodhound/SM +bloodied/U +bloodiness/MS +bloodlessness/SM +bloodless/PY +bloodletting/MS +bloodline/SM +bloodmobile/MS +bloodroot/M +bloodshed/SM +bloodshot +blood/SMDG +bloodsport/S +bloodstain/MDS +bloodstock/SM +bloodstone/M +bloodstream/SM +bloodsucker/SM +bloodsucking/S +bloodthirstily +bloodthirstiness/MS +bloodthirsty/RTP +bloodworm/M +bloodymindedness +bloody/TPGDRS +bloomer/M +Bloomer/M +Bloomfield/M +Bloomington/M +Bloom/MR +bloom/SMRDGZ +blooper/M +bloop/GSZRD +blossom/DMGS +blossomy +blotch/GMDS +blotchy/RT +blot/MS +blotted +blotter/MS +blotting +blotto +blouse/GMSD +blower/M +blowfish/M +blowfly/MS +blowgun/SM +blow/GZRS +blowing/M +blown/U +blowout/MS +blowpipe/SM +blowtorch/SM +blowup/MS +blowy/RST +blowzy/RT +BLT +blubber/GSDR +blubbery +Blucher/M +bludgeon/GSMD +blueback +Bluebeard/M +bluebell/MS +blueberry/SM +bluebill/M +bluebird/MS +bluebonnet/SM +bluebook/M +bluebottle/MS +bluebush +bluefish/SM +bluegill/SM +bluegrass/MS +blueing's +blueish +bluejacket/MS +bluejeans +blue/JMYTGDRSP +blueness/MS +bluenose/MS +bluepoint/SM +blueprint/GDMS +bluer/M +bluest/M +bluestocking/SM +bluesy/TR +bluet/MS +bluffer/M +bluffness/MS +bluff/SPGTZYRD +bluing/M +bluishness/M +bluish/P +Blumenthal/M +Blum/M +blunderbuss/MS +blunderer/M +blunder/GSMDRJZ +blundering/Y +bluntness/MS +blunt/PSGTYRD +blurb/GSDM +blur/MS +blurred/Y +blurriness/S +blurring/Y +blurry/RPT +blurt/GSRD +blusher/M +blushing/UY +blush/RSDGZ +blusterer/M +blustering/Y +blusterous +bluster/SDRZG +blustery +blvd +Blvd +Blythe/M +BM +BMW/M +BO +boarded +boarder/SM +boardgames +boardinghouse/SM +boarding/SM +board/IS +boardroom/MS +board's +boardwalk/SM +boar/MS +boa/SM +boaster/M +boastfulness/MS +boastful/YP +boast/SJRDGZ +boatclubs +boater/M +boathouse/SM +boating/M +boatload/SM +boatman/M +boat/MDRGZJS +boatmen +boatswain/SM +boatyard/SM +bobbed +Bobbee/M +Bobbe/M +Bobbette/M +Bobbie/M +Bobbi/M +bobbing/M +bobbin/MS +Bobbitt/M +bobble/SDGM +Bobbsey/M +Bobbye/M +Bobby/M +bobby/SM +bobbysoxer's +bobcat/MS +Bobette/M +Bobina/M +Bobine/M +Bobinette/M +Bob/M +bobolink/SM +Bobrow/M +bobsledded +bobsledder/MS +bobsledding/M +bobsled/MS +bobsleigh/M +bobsleighs +bobs/M +bob/SM +bobtail/SGDM +bobwhite/SM +Boca/M +Boccaccio/M +boccie/SM +bock/GDS +bockwurst +bodega/MS +Bodenheim/M +bode/S +Bodhidharma/M +bodhisattva +Bodhisattva/M +bodice/SM +bodied/M +bodiless +bodily +boding/M +bodkin/SM +bod/SGMD +bodybuilder/SM +bodybuilding/S +body/DSMG +bodyguard/MS +bodying/M +bodysuit/S +bodyweight +bodywork/SM +Boeing/M +Boeotia/M +Boeotian +Boer/M +Bogartian/M +Bogart/M +Bogey/M +bogeyman/M +bogeymen +bogey/SGMD +bogged +bogging +boggle/SDG +boggling/Y +boggy/RT +bogie's +bog/MS +Bogotá/M +bogus +bogyman +bogymen +bogy's +Boheme/M +bohemianism/S +bohemian/S +Bohemian/SM +Bohemia/SM +Bohr/M +Boigie/M +boiled/AU +boiler/M +boilermaker/MS +boilerplate/SM +boil/JSGZDR +boils/A +Boise/M +Bois/M +boisterousness/MS +boisterous/YP +bola/SM +boldface/SDMG +boldness/MS +bold/YRPST +bole/MS +bolero/MS +Boleyn/M +bolivares +Bolivar/M +bolivar/MS +Bolivia/M +Bolivian/S +bollard/SM +bollix/GSD +boll/MDSG +Bologna/M +bologna/MS +bolometer/MS +bolo/MS +boloney's +Bolshevik/MS +Bolshevism/MS +Bolshevistic/M +Bolshevist/MS +Bolshoi/M +bolsterer/M +bolster/SRDG +bolted/U +bolter/M +bolt/MDRGS +Bolton/M +bolts/U +Boltzmann/M +bolus/SM +bombardier/MS +bombard/LDSG +bombardment/SM +bombastic +bombastically +bombast/RMS +Bombay/M +bomber/M +bombproof +bomb/SGZDRJ +bombshell/SM +Bo/MRZ +bona +bonanza/MS +Bonaparte/M +Bonaventure/M +bonbon/SM +bondage/SM +bonder/M +bondholder/SM +Bondie/M +bond/JMDRSGZ +Bond/M +bondman/M +bondmen +Bondon/M +bonds/A +bondsman/M +bondsmen +bondwoman/M +bondwomen +Bondy/M +boned/U +bonehead/SDM +boneless +Bone/M +bone/MZDRSG +boner/M +bonfire/MS +bong/GDMS +bongo/MS +Bonham/M +bonhomie/MS +Boniface/M +boniness/MS +Bonita/M +bonito/MS +bonjour +bonkers +Bonnee/M +Bonner/M +bonneted/U +bonnet/SGMD +Bonneville/M +Bonnibelle/M +bonnie +Bonnie/M +Bonni/M +Bonn/RM +Bonny/M +bonny/RT +bonsai/SM +Bontempo/M +bonus/SM +bony/RTP +bonzes +boob/DMSG +booby/SM +boodle/GMSD +boogeyman's +boogieing +boogie/SD +boo/GSDH +boohoo/GDS +bookbinder/M +bookbindery/SM +bookbinding/M +bookbind/JRGZ +bookcase/MS +booked/U +bookend/SGD +Booker/M +book/GZDRMJSB +bookie/SM +booking/M +bookishness/M +bookish/PY +bookkeeper/M +bookkeep/GZJR +bookkeeping/M +booklet/MS +bookmaker/MS +bookmaking/MS +bookmark/MDGS +bookmobile/MS +bookplate/SM +bookseller/SM +bookshelf/M +bookshelves +bookshop/MS +bookstall/MS +bookstore/SM +bookwork/M +bookworm/MS +Boolean +boolean/S +Boole/M +boom/DRGJS +boomerang/MDSG +boomer/M +boomtown/S +boondocks +boondoggle/DRSGZ +boondoggler/M +Boone/M +Boonie/M +boonies +boon/MS +Boony/M +boorishness/SM +boorish/PY +boor/MS +boosterism +booster/M +boost/SGZMRD +boot/AGDS +bootblack/MS +bootee/MS +Boote/M +Boötes +Boothe/M +booth/M +Booth/M +booths +bootie's +bootlaces +bootlegged/M +bootlegger/SM +bootlegging/M +bootleg/S +Bootle/M +bootless +Boot/M +bootprints +boot's +bootstrapped +bootstrapping +bootstrap/SM +booty/SM +booze/DSRGMZ +boozer/M +boozy/TR +bopped +bopping +bop/S +borate/MSD +borax/MS +Bordeaux/M +bordello/MS +Borden/M +borderer/M +border/JRDMGS +borderland/SM +borderline/MS +Bordie/M +Bord/MN +Bordon/M +Bordy/M +Borealis/M +Boreas/M +boredom/MS +boreholes +borer/M +bore/ZGJDRS +Borges +Borgia/M +Borg/M +boric +boring/YMP +Boris +Bork/M +born/AIU +Borneo/M +borne/U +Born/M +Borodin/M +boron/SM +borosilicate/M +borough/M +boroughs +Borroughs/M +borrower/M +borrowing/M +borrow/JZRDGBS +borscht/SM +borstal/MS +Boru/M +borzoi/MS +Bosch/M +Bose/M +bosh/MS +Bosnia/M +Bosnian/S +bosom's +bosom/SGUD +bosomy/RT +boson/SM +Bosporus/M +boss/DSRMG +bossily +bossiness/MS +bossism/MS +bossy/PTSR +Bostitch/M +Bostonian/SM +Boston/MS +bosun's +Boswell/MS +botanical/SY +botanic/S +botanist/SM +botany/SM +botcher/M +botch/SRDGZ +botfly/M +bother/DG +bothersome +bothy/M +both/ZR +bot/S +Botswana/M +Botticelli/M +bottle/GMZSRD +bottleneck/GSDM +bottler/M +bottomlessness/M +bottomless/YP +bottommost +bottom/SMRDG +botulin/M +botulinus/M +botulism/SM +Boucher/M +boudoir/MS +bouffant/S +bougainvillea/SM +bough/MD +boughs +bought/N +bouillabaisse/MS +bouillon/MS +boulder/GMDS +Boulder/M +boulevard/MS +bouncer/M +bounce/SRDGZ +bouncily +bouncing/Y +bouncy/TRP +boundary/MS +bound/AUDI +boundedness/MU +bounded/UP +bounden +bounder/AM +bounders +bounding +boundlessness/SM +boundless/YP +bounds/IA +bounteousness/MS +bounteous/PY +bountifulness/SM +bountiful/PY +bounty/SDM +bouquet/SM +Bourbaki/M +bourbon/SM +Bourbon/SM +bourgeoisie/SM +bourgeois/M +Bourke/M +Bourne/M +Bournemouth/M +boutique/MS +bout/MS +boutonničre/MS +Bouvier +Bovary/M +bovine/YS +Bowditch/M +bowdlerization/MS +bowdlerize/GRSD +bowed/U +bowel/GMDS +Bowell/M +Bowen/M +bower/DMG +Bowers +Bowery/M +Bowes +bowie +Bowie/M +bowing/M +bowlder's +bowlegged +bowleg/SM +bowler/M +bowlful/S +bowl/GZSMDR +bowline/MS +bowling/M +bowman/M +Bowman/M +bowmen +bowser/M +bowsprit/SM +bows/R +bowstring/GSMD +bow/SZGNDR +bowwow/DMGS +boxcar/SM +box/DRSJZGM +boxer/M +boxful/M +boxing/M +boxlike +boxtops +boxwood/SM +boxy/TPR +Boyce/M +Boycey/M +Boycie/M +boycotter/M +boycott/RDGS +Boyd/M +Boyer/M +boyfriend/MS +boyhood/SM +boyishness/MS +boyish/PY +Boyle/M +Boy/MR +boy/MRS +boyscout +boysenberry/SM +bozo/SM +bpi +bps +BR +brace/DSRJGM +braced/U +bracelet/MS +bracer/M +brachia +brachium/M +bracken/SM +bracketed/U +bracketing/M +bracket/SGMD +brackishness/SM +brackish/P +bract/SM +Bradan/M +bradawl/M +Bradbury/M +Bradburys +bradded +bradding +Braddock/M +Brade/M +Braden/M +Bradford/M +Bradley/M +Bradly/M +Brad/MYN +Bradney/M +Bradshaw/M +brad/SM +Bradstreet/M +Brady/M +brae/SM +braggadocio/SM +braggart/SM +bragged +bragger/MS +braggest +bragging +Bragg/M +brag/S +Brahe/M +Brahma/MS +Brahmanism/MS +Brahman/SM +Brahmaputra/M +Brahmin's +Brahms +braider/M +braiding/M +braid/RDSJG +braille/DSG +Braille/GDSM +Brainard/SM +braincell/S +brainchild/M +brainchildren +brain/GSDM +braininess/MS +brainlessness/M +brainless/YP +Brain/M +brainpower/M +brainstorm/DRMGJS +brainstorming/M +brainteaser/S +brainteasing +brainwasher/M +brainwashing/M +brainwash/JGRSD +brainwave/S +brainy/RPT +braise/SDG +brake/DSGM +brakeman/M +brakemen/M +bramble/DSGM +brambling/M +brambly/RT +Bram/M +Brampton/M +bra/MS +Brana/M +branched/U +branching/M +branchlike +Branch/M +branch/MDSJG +Branchville/M +Brandais/M +Brandea/M +branded/U +Brandeis/M +Brandel/M +Brande/M +Brandenburg/M +Branden/M +brander/GDM +Brander/M +Brandice/M +Brandie/M +Brandi/M +Brandise/M +brandish/GSD +Brand/MRN +Brando/M +Brandon/M +brand/SMRDGZ +Brandt/M +Brandtr/M +brandy/GDSM +Brandy/M +Brandyn/M +brandywine +Braniff/M +Bran/M +branned +branning +Brannon/M +bran/SM +Brantley/M +Brant/M +Braque/M +brashness/MS +brash/PYSRT +Brasilia +brasserie/SM +brass/GSDM +brassiere/MS +brassily +brassiness/SM +brassy/RSPT +Bratislava/M +brat/SM +Brattain/M +bratty/RT +bratwurst/MS +Braun/M +bravadoes +bravado/M +brave/DSRGYTP +braveness/MS +bravery/MS +bravest/M +bravo/SDG +bravura/SM +brawler/M +brawl/MRDSGZ +brawniness/SM +brawn/MS +brawny/TRP +brayer/M +Bray/M +bray/SDRG +braze/GZDSR +brazenness/MS +brazen/PYDSG +brazer/M +brazier/SM +Brazilian/MS +Brazil/M +Brazos/M +Brazzaville/M +breacher/M +breach/MDRSGZ +breadbasket/SM +breadboard/SMDG +breadbox/S +breadcrumb/S +breadfruit/MS +breadline/MS +bread/SMDHG +breadth/M +breadths +breadwinner/MS +breakables +breakable/U +breakage/MS +breakaway/MS +breakdown/MS +breaker/M +breakfaster/M +breakfast/RDMGZS +breakfront/S +breaking/M +breakneck +breakout/MS +breakpoint/SMDG +break/SZRBG +breakthroughs +breakthrough/SM +breakup/SM +breakwater/SM +bream/SDG +Breanne/M +Brear/M +breastbone/MS +breastfed +breastfeed/G +breasting/M +breast/MDSG +breastplate/SM +breaststroke/SM +breastwork/MS +breathable/U +breathalyser/S +Breathalyzer/SM +breathe +breather/M +breathing/M +breathlessness/SM +breathless/PY +breaths +breathtaking/Y +breathy/TR +breath/ZBJMDRSG +Brecht/M +Breckenridge/M +bred/DG +bredes +breeching/M +breech/MDSG +breeder/I +breeder's +breeding/IM +breeds/I +breed/SZJRG +Bree/M +Breena/M +breeze/GMSD +breezeway/SM +breezily +breeziness/SM +breezy/RPT +Bremen/M +bremsstrahlung/M +Brena/M +Brenda/M +Brendan/M +Brenden/M +Brendin/M +Brendis/M +Brendon/M +Bren/M +Brenna/M +Brennan/M +Brennen/M +Brenner/M +Brenn/RNM +Brent/M +Brenton/M +Bresenham/M +Brest/M +brethren +Bret/M +Breton +Brett/M +breve/SM +brevet/MS +brevetted +brevetting +breviary/SM +brevity/MS +brew/DRGZS +brewer/M +Brewer/M +brewery/MS +brewing/M +brewpub/S +Brew/RM +Brewster/M +Brezhnev/M +Bria/M +Briana/M +Brian/M +Brianna/M +Brianne/M +Briano/M +Briant/M +briar's +bribe/GZDSR +briber/M +bribery/MS +Brice/M +brickbat/SM +brick/GRDSM +bricklayer/MS +bricklaying/SM +brickmason/S +brickwork/SM +brickyard/M +bridal/S +Bridalveil/M +bridegroom/MS +Bride/M +bride/MS +bridesmaid/MS +Bridewell/M +bridgeable/U +bridged/U +bridgehead/MS +Bridgeport/M +Bridger/M +Bridges +bridge/SDGM +Bridget/M +Bridgetown/M +Bridgette/M +Bridgett/M +Bridgewater/M +bridgework/MS +bridging/M +Bridgman/M +Bridie/M +bridled/U +bridle/SDGM +bridleway/S +briefcase/SM +briefed/C +briefing/M +briefness/MS +briefs/C +brief/YRDJPGTS +Brien/M +Brier/M +brier/MS +Brie/RSM +Brietta/M +brigade/GDSM +brigadier/MS +Brigadoon +brigandage/MS +brigand/MS +brigantine/MS +Brigg/MS +Brigham/M +brightener/M +brighten/RDZG +bright/GXTPSYNR +Bright/M +brightness/SM +Brighton/M +Brigida/M +Brigid/M +Brigit/M +Brigitta/M +Brigitte/M +Brig/M +brig/SM +brilliance/MS +brilliancy/MS +brilliantine/MS +brilliantness/M +brilliant/PSY +Brillo +Brillouin/M +brimful +brimless +brimmed +brimming +brim/SM +brimstone/MS +Brina/M +Brindisi/M +brindle/DSM +brine/GMDSR +briner/M +Briney/M +bringer/M +bring/RGZS +brininess/MS +Brinkley/M +brinkmanship/SM +brink/MS +Brinna/M +Brinn/M +Briny/M +briny/PTSR +brioche/SM +Brion/M +briquet's +briquette/MGSD +Brisbane/M +brisket/SM +briskness/MS +brisk/YRDPGTS +bristle/DSGM +bristly/TR +Bristol/M +bristol/S +Britain/M +Brita/M +Britannia/M +Britannic +Britannica/M +britches +Briticism/MS +Britisher/M +Britishly/M +British/RYZ +Brit/MS +Britney/M +Britni/M +Briton/MS +Britta/M +Brittaney/M +Brittani/M +Brittan/M +Brittany/MS +Britte/M +Britten/M +Britteny/M +brittleness/MS +brittle/YTPDRSG +Britt/MN +Brittne/M +Brittney/M +Brittni/M +Brnaba/M +Brnaby/M +Brno/M +broach/DRSG +broacher/M +broadband +broadcaster/M +broadcast/RSGZJ +broadcasts/A +broadcloth/M +broadcloths +broaden/JGRDZ +broadleaved +broadloom/SM +broadminded/P +broadness/S +broadsheet/MS +broadside/SDGM +broadsword/MS +broad/TXSYRNP +Broadway/SM +Brobdingnagian +Brobdingnag/M +brocade/DSGM +broccoli/MS +brochette/SM +brochure/SM +Brockie/M +Brock/M +Brocky/M +Broddie/M +Broddy/M +Broderick/M +Broderic/M +Brodie/M +Brod/M +Brody/M +brogan/MS +Broglie/M +brogue/MS +broiler/M +broil/RDSGZ +brokenhearted/Y +brokenness/MS +broken/YP +brokerage/MS +broker/DMG +broke/RGZ +Brok/M +bromide/MS +bromidic +bromine/MS +bronchial +bronchi/M +bronchiolar +bronchiole/MS +bronchiolitis +bronchitic/S +bronchitis/MS +broncho's +bronchus/M +broncobuster/SM +bronco/SM +bronc/S +Bron/M +Bronnie/M +Bronny/M +Bronson/M +Bronte +brontosaur/SM +brontosaurus/SM +Bronx/M +bronzed/M +bronze/SRDGM +bronzing/M +brooch/MS +brooder/M +broodiness/M +brooding/Y +broodmare/SM +brood/SMRDGZ +broody/PTR +Brookdale/M +Brooke/M +Brookfield/M +Brookhaven/M +brooklet/MS +Brooklyn/M +Brookmont/M +brook/SGDM +brookside +Brook/SM +broom/SMDG +broomstick/MS +Bros +Brose/M +bro/SH +bros/S +brothel/MS +brother/DYMG +brotherhood/SM +brotherliness/MS +brotherly/P +broths +broth/ZMR +brougham/MS +brought +brouhaha/MS +browbeat/NSG +brow/MS +Brownell/M +Browne/M +Brownian/M +Brownie/MS +brownie/MTRS +browning/M +Browning/M +brownish +Brown/MG +brownness/MS +brownout/MS +brownstone/MS +Brownsville/M +brown/YRDMSJGTP +browse +browser/M +brows/SRDGZ +brr +Br/TMN +Brubeck/M +brucellosis/M +Bruce/M +Brucie/M +Bruckner/M +Bruegel/M +Brueghel's +bruin/MS +bruised/U +bruise/JGSRDZ +bruiser/M +Bruis/M +bruit/DSG +Brumidi/M +Brummel/M +brunch/MDSG +Brunei/M +Brunelleschi/M +brunet/S +brunette/SM +Brunhilda/M +Brunhilde/M +Bruno/M +Brunswick/M +brunt/GSMD +brusher/M +brushfire/MS +brushlike +brush/MSRDG +brushoff/S +brushwood/SM +brushwork/MS +brushy/R +brusqueness/MS +brusque/PYTR +Brussels +brutality/SM +brutalization/SM +brutalized/U +brutalizes/AU +brutalize/SDG +brutal/Y +brute/DSRGM +brutishness/SM +brutish/YP +Brutus/M +Bruxelles/M +Bryana/M +Bryan/M +Bryant/M +Bryanty/M +Bryce/M +Bryna/M +Bryn/M +Brynna/M +Brynne/M +Brynner/M +Brynn/RM +Bryon/M +Brzezinski/M +B's +BS +BSA +BSD +Btu +BTU +BTW +bu +bubblegum/S +bubbler/M +bubble/RSDGM +bubbly/TRS +Buber/M +bub/MS +buboes +bubo/M +bubonic +buccaneer/GMDS +Buchanan/M +Bucharest/M +Buchenwald/M +Buchwald/M +buckaroo/SM +buckboard/SM +bucker/M +bucketful/MS +bucket/SGMD +buckeye/SM +buck/GSDRM +buckhorn/M +Buckie/M +Buckingham/M +buckled/U +buckler/MDG +buckle/RSDGMZ +buckles/U +Buckley/M +buckling's +buckling/U +Buck/M +Buckner/M +buckram/GSDM +bucksaw/SM +buckshot/MS +buckskin/SM +buckteeth +bucktooth/DM +buckwheat/SM +Bucky/M +bucolically +bucolic/S +Budapest/M +budded +Buddha/MS +Buddhism/SM +Buddhist/SM +Buddie/M +budding/S +Budd/M +buddy/GSDM +Buddy/M +budge/GDS +budgerigar/MS +budgetary +budgeter/M +budget/GMRDZS +budgie/MS +budging/U +Bud/M +bud/MS +Budweiser/MS +Buehring/M +Buena/M +buffaloes +Buffalo/M +buffalo/MDG +buff/ASGD +buffered/U +bufferer/M +buffer/RDMSGZ +buffet/GMDJS +bufflehead/M +buffoonery/MS +buffoonish +buffoon/SM +buff's +Buffy/M +Buford/M +bugaboo/SM +Bugatti/M +bugbear/SM +bug/CS +bugeyed +bugged/C +buggered +buggering +bugger/SCM! +buggery/M +bugging/C +buggy/RSMT +bugle/GMDSRZ +bugler/M +bug's +Buick/M +builder/SM +building/SM +build/SAG +buildup/MS +built/AUI +Buiron/M +Bujumbura/M +Bukhara/M +Bukharin/M +Bulawayo/M +Bulba/M +bulb/DMGS +bulblet +bulbous +Bulfinch/M +Bulganin/M +Bulgaria/M +Bulgarian/S +bulge/DSGM +bulgy/RT +bulimarexia/S +bulimia/MS +bulimic/S +bulk/GDRMS +bulkhead/SDM +bulkiness/SM +bulky/RPT +bulldogged +bulldogger +bulldogging +bulldog/SM +bulldoze/GRSDZ +bulldozer/M +bullet/GMDS +bulletin/SGMD +bulletproof/SGD +bullfighter/M +bullfighting/M +bullfight/SJGZMR +bullfinch/MS +bullfrog/SM +bullhead/DMS +bullheadedness/SM +bullheaded/YP +bullhide +bullhorn/SM +bullied/M +bullion/SM +bullishness/SM +bullish/PY +bull/MDGS +Bullock/M +bullock/MS +bullpen/MS +bullring/SM +bullseye +bullshit/MS! +bullshitted/! +bullshitter/S! +bullshitting/! +bullwhackers +Bullwinkle/M +bullyboy/MS +bullying/M +bully/TRSDGM +bulrush/SM +Bultmann/M +bulwark/GMDS +bumblebee/MS +bumble/JGZRSD +bumbler/M +bumbling/Y +Bumbry/M +bummed/M +bummer/MS +bummest +bumming/M +bumper/DMG +bump/GZDRS +bumpiness/MS +bumpkin/MS +Bumppo/M +bumptiousness/SM +bumptious/PY +bumpy/PRT +bum/SM +Bunche/M +bunch/MSDG +bunchy/RT +buncombe's +bunco's +Bundestag/M +bundled/U +bundle/GMRSD +bundler/M +Bundy/M +bungalow/MS +bungee/SM +bung/GDMS +bunghole/MS +bungle/GZRSD +bungler/M +bungling/Y +Bunin/M +bunion/SM +bunk/CSGDR +Bunker/M +bunker's/C +bunker/SDMG +bunkhouse/SM +bunkmate/MS +bunko's +bunk's +bunkum/SM +Bunnie/M +Bunni/M +Bunny/M +bunny/SM +Bunsen/SM +bun/SM +bunt/GJZDRS +bunting/M +Buńuel/M +Bunyan/M +buoyancy/MS +buoyant/Y +buoy/SMDG +Burbank/M +burbler/M +burble/RSDG +burbs +Burch/M +burden's +burdensomeness/M +burdensome/PY +burden/UGDS +burdock/SM +bureaucracy/MS +bureaucratically +bureaucratic/U +bureaucratization/MS +bureaucratize/SDG +bureaucrat/MS +bureau/MS +burgeon/GDS +burger/M +Burger/M +Burgess/M +burgess/MS +burgher/M +burgh/MRZ +burghs +burglarize/GDS +burglarproof/DGS +burglar/SM +burglary/MS +burgle/SDG +burgomaster/SM +Burgoyne/M +Burg/RM +burg/SZRM +Burgundian/S +Burgundy/MS +burgundy/S +burial/ASM +buried/U +burier/M +Burke/M +Burk/SM +burlap/MS +burler/M +burlesquer/M +burlesque/SRDMYG +burley/M +Burlie/M +burliness/SM +Burlingame/M +Burlington/M +Burl/M +burl/SMDRG +burly/PRT +Burma/M +Burmese +bur/MYS +burnable/S +Burnaby/M +Burnard/M +burned/U +Burne/MS +burner/M +Burnett/M +burn/GZSDRBJ +burning/Y +burnisher/M +burnish/GDRSZ +burnoose/MS +burnout/MS +Burns +Burnside/MS +burnt/YP +burp/SGMD +burr/GSDRM +Burris/M +burrito/S +Burr/M +burro/SM +Burroughs/M +burrower/M +burrow/GRDMZS +bursae +bursa/M +Bursa/M +bursar/MS +bursary/MS +bursitis/MS +burster/M +burst/SRG +Burtie/M +Burt/M +Burton/M +Burty/M +Burundian/S +Burundi/M +bury/ASDG +busboy/MS +busby/SM +Busch/M +buses/A +busgirl/S +bus/GMDSJ +bushel/MDJSG +Bushido/M +bushiness/MS +bushing/M +bush/JMDSRG +bushland +Bush/M +bushman/M +bushmaster/SM +bushmen +Bushnell/M +bushwhacker/M +bushwhacking/M +bushwhack/RDGSZ +bushy/PTR +busily +businesslike +businessman/M +businessmen +business/MS +businesspeople +businessperson/S +businesswoman/M +businesswomen +busker/M +busk/GRM +buskin/SM +bus's/A +buss/D +bustard/MS +buster/M +bustle/GSD +bustling/Y +bust/MSDRGZ +busty/RT +busybody/MS +busy/DSRPTG +busyness/MS +busywork/SM +but/ACS +butane/MS +butcherer/M +butcher/MDRYG +butchery/MS +Butch/M +butch/RSZ +butene/M +Butler/M +butler/SDMG +butted/A +butte/MS +butterball/MS +buttercup/SM +buttered/U +butterfat/MS +Butterfield/M +butterfingered +butterfingers/M +butterfly/MGSD +buttermilk/MS +butternut/MS +butter/RDMGZ +butterscotch/SM +buttery/TRS +butting/M +buttock/SGMD +buttoner/M +buttonhole/GMRSD +buttonholer/M +button's +button/SUDG +buttonweed +buttonwood/SM +buttress/MSDG +butt/SGZMDR +butyl/M +butyrate/M +buxomness/M +buxom/TPYR +Buxtehude/M +buyback/S +buyer/M +buyout/S +buy/ZGRS +buzzard/MS +buzz/DSRMGZ +buzzer/M +buzzword/SM +buzzy +bx +bxs +byelaw's +Byelorussia's +bye/MZS +Byers/M +bygone/S +bylaw/SM +byliner/M +byline/RSDGM +BYOB +bypass/GSDM +bypath/M +bypaths +byplay/S +byproduct/SM +Byram/M +Byran/M +Byrann/M +Byrd/M +byre/SM +Byrle/M +Byrne/M +byroad/MS +Byrom/M +Byronic +Byronism/M +Byron/M +bystander/SM +byte/SM +byway/SM +byword/SM +byzantine +Byzantine/S +Byzantium/M +by/ZR +C +ca +CA +cabala/MS +caballed +caballero/SM +caballing +cabal/SM +cabana/MS +cabaret/SM +cabbage/MGSD +cabbed +cabbing +cabby's +cabdriver/SM +caber/M +Cabernet/M +cabinetmaker/SM +cabinetmaking/MS +cabinet/MS +cabinetry/SM +cabinetwork/MS +cabin/GDMS +cablecast/SG +cable/GMDS +cablegram/SM +cabochon/MS +caboodle/SM +caboose/MS +Cabot/M +Cabrera/M +Cabrini/M +cabriolet/MS +cab/SMR +cabstand/MS +cacao/SM +cacciatore +cache/DSRGM +cachepot/MS +cachet/MDGS +Cacilia/M +Cacilie/M +cackler/M +cackle/RSDGZ +cackly +CACM +cacophonist +cacophonous +cacophony/SM +cacti +cactus/M +CAD +cadaverous/Y +cadaver/SM +caddishness/SM +caddish/PY +Caddric/M +caddy/GSDM +cadence/CSM +cadenced +cadencing +cadent/C +cadenza/MS +cadet/SM +Cadette/S +cadge/DSRGZ +cadger/M +Cadillac/MS +Cadiz/M +Cad/M +cadmium/MS +cadre/SM +cad/SM +caducei +caduceus/M +Caedmon/M +Caesar/MS +caesura/SM +café/MS +cafeteria/SM +caffeine/SM +caftan/SM +caged/U +Cage/M +cage/MZGDRS +cager/M +cagey/P +cagier +cagiest +cagily +caginess/MS +Cagney/M +Cahokia/M +cahoot/MS +Cahra/M +CAI +Caiaphas/M +caiman's +Caine/M +Cain/MS +Cairistiona/M +cairn/SDM +Cairo/M +caisson/SM +caitiff/MS +Caitlin/M +Caitrin/M +cajole/LGZRSD +cajolement/MS +cajoler/M +cajolery/SM +Cajun/MS +cake/MGDS +cakewalk/SMDG +calabash/SM +calaboose/MS +Calais/M +calamari/S +calamine/GSDM +calamitousness/M +calamitous/YP +calamity/MS +cal/C +calcareousness/M +calcareous/PY +calciferous +calcification/M +calcify/XGNSD +calcimine/GMSD +calcine/SDG +calcite/SM +calcium/SM +Calcomp/M +CalComp/M +CALCOMP/M +calculability/IM +calculable/IP +calculate/AXNGDS +calculated/PY +calculatingly +calculating/U +calculation/AM +calculative +calculator/SM +calculi +calculus/M +Calcutta/M +caldera/SM +Calder/M +Calderon/M +caldron's +Caldwell/M +Caleb/M +Caledonia/M +Cale/M +calendar/MDGS +calender/MDGS +calf/M +calfskin/SM +Calgary/M +Calhoun/M +Caliban/M +caliber/SM +calibrated/U +calibrater's +calibrate/XNGSD +calibrating/A +calibration/M +calibrator/MS +calicoes +calico/M +Calida/M +Calif/M +California/M +Californian/MS +californium/SM +calif's +Caligula/M +Cali/M +caliper/SDMG +caliphate/SM +caliph/M +caliphs +calisthenic/S +calisthenics/M +Callaghan/M +call/AGRDBS +Callahan/M +calla/MS +Calla/MS +Callao/M +callback/S +Callean/M +called/U +callee/M +caller/MS +Calley/M +Callida/M +Callie/M +calligrapher/M +calligraphic +calligraphist/MS +calligraph/RZ +calligraphy/MS +Calli/M +calling/SM +Calliope/M +calliope/SM +callisthenics's +Callisto/M +callosity/MS +callousness/SM +callous/PGSDY +callowness/MS +callow/RTSP +callus/SDMG +Cally/M +calming/Y +calmness/MS +calm/PGTYDRS +Cal/MY +Caloocan/M +caloric/S +calorie/SM +calorific +calorimeter/MS +calorimetric +calorimetry/M +Caltech/M +Calumet/M +calumet/MS +calumniate/NGSDX +calumniation/M +calumniator/SM +calumnious +calumny/MS +calvary/M +Calvary/M +calve/GDS +Calvert/M +calves/M +Calvinism/MS +Calvinistic +Calvinist/MS +Calvin/M +Calv/M +calyces's +Calypso/M +calypso/SM +calyx/MS +Ca/M +CAM +Camacho/M +Camala/M +camaraderie/SM +camber/DMSG +cambial +cambium/SM +Cambodia/M +Cambodian/S +Cambrian/S +cambric/MS +Cambridge/M +camcorder/S +Camden/M +camelhair's +Camella/M +Camellia/M +camellia/MS +Camel/M +Camelopardalis/M +Camelot/M +camel/SM +Camembert/MS +cameo/GSDM +camerae +cameraman/M +cameramen +camera/MS +camerawoman +camerawomen +Cameron/M +Cameroonian/S +Cameroon/SM +came/N +Camey/M +Camila/M +Camile/M +Camilla/M +Camille/M +Cami/M +Camino/M +camion/M +camisole/MS +Cam/M +cammed +Cammie/M +Cammi/M +cam/MS +Cammy/M +Camoens/M +camomile's +camouflage/DRSGZM +camouflager/M +campaigner/M +campaign/ZMRDSG +campanile/SM +campanological +campanologist/SM +campanology/MS +Campbell/M +Campbellsport/M +camper/SM +campesinos +campest +campfire/SM +campground/MS +camphor/MS +Campinas/M +camping/S +Campos +camp's +camp/SCGD +campsite/MS +campus/GSDM +campy/RT +Camry/M +camshaft/SM +Camus/M +Canaanite/SM +Canaan/M +Canada/M +Canadianism/SM +Canadian/S +Canad/M +Canaletto/M +canalization/MS +canalize/GSD +canal/SGMD +canapé/S +canard/MS +Canaries +canary/SM +canasta/SM +Canaveral/M +Canberra/M +cancan/SM +cancelate/D +canceled/U +canceler/M +cancellation/MS +cancel/RDZGS +cancer/MS +Cancer/MS +cancerous/Y +Cancun/M +Candace/M +candelabra/S +candelabrum/M +Candice/M +candidacy/MS +Candida/M +candidate/SM +candidature/S +Candide/M +candidly/U +candidness/SM +candid/TRYPS +Candie/M +Candi/SM +candle/GMZRSD +candlelight/SMR +candlelit +candlepower/SM +candler/M +candlestick/SM +Candlewick/M +candlewick/MS +candor/MS +Candra/M +candy/GSDM +Candy/M +canebrake/SM +caner/M +cane/SM +canine/S +caning/M +Canis/M +canister/SGMD +cankerous +canker/SDMG +Can/M +can/MDRSZGJ +cannabis/MS +canned +cannelloni +canner/SM +cannery/MS +Cannes +cannibalism/MS +cannibalistic +cannibalization/SM +cannibalize/GSD +cannibal/SM +cannily/U +canninesses +canniness/UM +canning/M +cannister/SM +cannonade/SDGM +cannonball/SGDM +Cannon/M +cannon/SDMG +cannot +canny/RPUT +canoe/DSGM +canoeist/SM +Canoga/M +canonic +canonicalization +canonicalize/GSD +canonical/SY +canonist/M +canonization/MS +canonized/U +canonize/SDG +canon/SM +Canopus/M +canopy/GSDM +canst +can't +cantabile/S +Cantabrigian +cantaloupe/MS +cantankerousness/SM +cantankerous/PY +cantata/SM +cant/CZGSRD +canted/IA +canteen/MS +Canterbury/M +canter/CM +cantered +cantering +canticle/SM +cantilever/SDMG +canto/MS +cantonal +Cantonese/M +Canton/M +cantonment/SM +canton/MGSLD +Cantor/M +cantor/MS +Cantrell/M +cant's +cants/A +Cantu/M +Canute/M +canvasback/MS +canvas/RSDMG +canvasser/M +canvass/RSDZG +canyon/MS +CAP +capability/ISM +capableness/IM +capable/PI +capabler +capablest +capably/I +capaciousness/MS +capacious/PY +capacitance/SM +capacitate/V +capacitive/Y +capacitor/MS +capacity/IMS +caparison/SDMG +Capek/M +Capella/M +caper/GDM +capeskin/SM +cape/SM +Capet/M +Capetown/M +Caph/M +capillarity/MS +capillary/S +Capistrano/M +capitalism/SM +capitalistic +capitalistically +capitalist/SM +capitalization/SMA +capitalized/AU +capitalizer/M +capitalize/RSDGZ +capitalizes/A +capital/SMY +capita/M +Capitan/M +capitation/CSM +Capitoline/M +Capitol/MS +capitol/SM +capitulate/AXNGSD +capitulation/MA +caplet/S +cap/MDRSZB +Capone/M +capon/SM +capo/SM +Capote/M +capped/UA +capping/M +cappuccino/MS +Cappy/M +Capra/M +Caprice/M +caprice/MS +capriciousness/MS +capricious/PY +Capricorn/MS +Capri/M +caps/AU +capsicum/MS +capsize/SDG +capstan/MS +capstone/MS +capsular +capsule/MGSD +capsulize/GSD +captaincy/MS +captain/SGDM +caption/GSDRM +captiousness/SM +captious/PY +captivate/XGNSD +captivation/M +captivator/SM +captive/MS +captivity/SM +Capt/M +captor/SM +capture/AGSD +capturer/MS +capt/V +Capulet/M +Caputo/M +Caracalla/M +Caracas/M +caracul's +carafe/SM +Caralie/M +Cara/M +caramelize/SDG +caramel/MS +carapace/SM +carapaxes +carat/SM +Caravaggio/M +caravan/DRMGS +caravaner/M +caravansary/MS +caravanserai's +caravel/MS +caraway/MS +carbide/MS +carbine/MS +carbohydrate/MS +carbolic +Carboloy/M +carbonaceous +carbonate/SDXMNG +carbonation/M +Carbondale/M +Carbone/MS +carbonic +carboniferous +Carboniferous +carbonization/SAM +carbonizer/AS +carbonizer's +carbonizes/A +carbonize/ZGRSD +carbon/MS +carbonyl/M +carborundum +Carborundum/MS +carboy/MS +carbuncle/SDM +carbuncular +carburetor/MS +carburetter/S +carburettor/SM +carcase/MS +carcass/SM +Carce/M +carcinogenic +carcinogenicity/MS +carcinogen/SM +carcinoma/SM +cardamom/MS +cardboard/MS +card/EDRSG +Cardenas/M +carder/MS +carder's/E +cardholders +cardiac/S +Cardiff/M +cardigan/SM +cardinality/SM +cardinal/SYM +carding/M +Cardin/M +Cardiod/M +cardiogram/MS +cardiograph/M +cardiographs +cardioid/M +cardiologist/SM +cardiology/MS +cardiomegaly/M +cardiopulmonary +cardiovascular +card's +cardsharp/ZSMR +CARE +cared/U +careen/DSG +careerism/M +careerist/MS +career/SGRDM +carefree +carefuller +carefullest +carefulness/MS +careful/PY +caregiver/S +carelessness/MS +careless/YP +Care/M +Carena/M +Caren/M +carer/M +care/S +Caresa/M +Caressa/M +Caresse/M +caresser/M +caressing/Y +caressive/Y +caress/SRDMVG +caretaker/SM +caret/SM +careworn +Carey/M +carfare/MS +cargoes +cargo/M +carhopped +carhopping +carhop/SM +Caria/M +Caribbean/S +Carib/M +caribou/MS +caricature/GMSD +caricaturisation +caricaturist/MS +caricaturization +Carie/M +caries/M +carillonned +carillonning +carillon/SM +Caril/M +Carilyn/M +Cari/M +Carina/M +Carine/M +caring/U +Carin/M +Cariotta/M +carious +Carissa/M +Carita/M +Caritta/M +carjack/GSJDRZ +Carla/M +Carlee/M +Carleen/M +Carlene/M +Carlen/M +Carletonian/M +Carleton/M +Carley/M +Carlie/M +Carlina/M +Carline/M +Carling/M +Carlin/M +Carlita/M +Carl/MNG +carload/MSG +Carlo/SM +Carlota/M +Carlotta/M +Carlsbad/M +Carlson/M +Carlton/M +Carlye/M +Carlyle/M +Carly/M +Carlyn/M +Carlynne/M +Carlynn/M +Carma/M +Carmela/M +Carmelia/M +Carmelina/M +Carmelita/M +Carmella/M +Carmelle/M +Carmel/M +Carmelo/M +Carmencita/M +Carmen/M +Carmichael/M +Carmina/M +Carmine/M +carmine/MS +Carmita/M +Car/MNY +Carmon/M +carnage/MS +carnality/SM +carnal/Y +Carnap/M +carnation/IMS +Carnegie/M +carnelian/SM +Carney/M +carney's +carnival/MS +carnivore/SM +carnivorousness/MS +carnivorous/YP +Carnot/M +Carny/M +carny/SDG +carob/SM +Carola/M +Carolan/M +Carolann/M +Carolee/M +Carole/M +caroler/M +Carolina/MS +Caroline/M +Carolingian +Carolinian/S +Carolin/M +Caroljean/M +Carol/M +carol/SGZMRD +Carolus/M +Carolyne/M +Carolyn/M +Carolynn/M +Caro/M +carom/GSMD +Caron/M +carotene/MS +carotid/MS +carousal/MS +carousel/MS +carouser/M +carouse/SRDZG +carpal/SM +Carpathian/MS +carpel/SM +carpenter/DSMG +carpentering/M +Carpenter/M +carpentry/MS +carper/M +carpetbagged +carpetbagger/MS +carpetbagging +carpetbag/MS +carpeting/M +carpet/MDJGS +carpi/M +carping/Y +carp/MDRSGZ +carpool/DGS +carport/MS +carpus/M +carrageen/M +Carree/M +carrel/SM +carriage/SM +carriageway/SM +Carrie/M +carrier/M +Carrier/M +Carrillo/M +Carri/M +carrion/SM +Carrissa/M +Carr/M +Carroll/M +Carrol/M +carrot/MS +carroty/RT +carrousel's +carryall/MS +Carry/MR +carryout/S +carryover/S +carry/RSDZG +carsickness/SM +carsick/P +Carson/M +cartage/MS +cartel/SM +carte/M +carter/M +Carter/M +Cartesian +Carthage/M +Carthaginian/S +carthorse/MS +Cartier/M +cartilage/MS +cartilaginous +cartload/MS +cart/MDRGSZ +Cart/MR +cartographer/MS +cartographic +cartography/MS +carton/GSDM +cartoon/GSDM +cartoonist/MS +cartridge/SM +cartwheel/MRDGS +Cartwright/M +Carty/RM +Caruso/M +carve/DSRJGZ +carven +carver/M +Carver/M +carving/M +caryatid/MS +Caryl/M +Cary/M +Caryn/M +car/ZGSMDR +casaba/SM +Casablanca/M +Casals/M +Casandra/M +Casanova/SM +Casar/M +casbah/M +cascade/MSDG +Cascades/M +cascara/MS +casebook/SM +case/DSJMGL +cased/U +caseharden/SGD +casein/SM +caseload/MS +Case/M +casement/SM +caseworker/M +casework/ZMRS +Casey/M +cashbook/SM +cashew/MS +cash/GZMDSR +cashier/SDMG +cashless +Cash/M +cashmere/MS +Casie/M +Casi/M +casing/M +casino/MS +casket/SGMD +cask/GSDM +Caspar/M +Casper/M +Caspian +Cass +Cassandra/SM +Cassandre/M +Cassandry/M +Cassatt/M +Cassaundra/M +cassava/MS +casserole/MGSD +cassette/SM +Cassey/M +cassia/MS +Cassie/M +Cassi/M +cassino's +Cassiopeia/M +Cassite/M +Cassius/M +cassock/SDM +Cassondra/M +cassowary/SM +Cassy/M +Castaneda/M +castanet/SM +castaway/SM +castellated +caste/MHS +caster/M +cast/GZSJMDR +castigate/XGNSD +castigation/M +castigator/SM +Castile's +Castillo/M +casting/M +castle/GMSD +castoff/S +Castor/M +castor's +castrate/DSNGX +castration/M +Castries/M +Castro/M +casts/A +casualness/SM +casual/SYP +casualty/SM +casuistic +casuist/MS +casuistry/SM +cataclysmal +cataclysmic +cataclysm/MS +catacomb/MS +catafalque/SM +Catalan/MS +catalepsy/MS +cataleptic/S +Catalina/M +cataloger/M +catalog/SDRMZG +Catalonia/M +catalpa/SM +catalysis/M +catalyst/SM +catalytic +catalytically +catalyze/DSG +catamaran/MS +catapult/MGSD +cataract/MS +Catarina/M +catarrh/M +catarrhs +catastrophe/SM +catastrophic +catastrophically +catatonia/MS +catatonic/S +Catawba/M +catbird/MS +catboat/SM +catcall/SMDG +catchable/U +catchall/MS +catch/BRSJLGZ +catcher/M +catchment/SM +catchpenny/S +catchphrase/S +catchup/MS +catchword/MS +catchy/TR +catechism/MS +catechist/SM +catechize/SDG +catecholamine/MS +categoric +categorical/Y +categorization/MS +categorized/AU +categorize/RSDGZ +category/MS +Cate/M +catenate/NF +catenation/MF +catercorner +caterer/M +cater/GRDZ +Caterina/M +catering/M +Caterpillar +caterpillar/SM +caterwaul/DSG +catfish/MS +catgut/SM +Catha/M +Catharina/M +Catharine/M +catharses +catharsis/M +cathartic/S +Cathay/M +cathedral/SM +Cathee/M +Catherina/M +Catherine/M +Catherin/M +Cather/M +Cathe/RM +catheterize/GSD +catheter/SM +Cathie/M +Cathi/M +Cathleen/M +Cathlene/M +cathode/MS +cathodic +catholicism +Catholicism/SM +catholicity/MS +catholic/MS +Catholic/S +Cathrine/M +Cathrin/M +Cathryn/M +Cathyleen/M +Cathy/M +Catie/M +Catiline/M +Cati/M +Catina/M +cationic +cation/MS +catkin/SM +Catlaina/M +Catlee/M +catlike +Catlin/M +catnapped +catnapping +catnap/SM +catnip/MS +Cato/M +Catrina/M +Catriona/M +Catskill/SM +cat/SMRZ +catsup's +cattail/SM +catted +cattery/M +cattily +cattiness/SM +catting +cattle/M +cattleman/M +cattlemen +Catt/M +catty/PRST +Catullus/M +CATV +catwalk/MS +Caty/M +Caucasian/S +Caucasoid/S +Caucasus/M +Cauchy/M +caucus/SDMG +caudal/Y +caught/U +cauldron/MS +cauliflower/MS +caulker/M +caulk/JSGZRD +causality/SM +causal/YS +causate/XVN +causation/M +causative/SY +cause/DSRGMZ +caused/U +causeless +causerie/MS +causer/M +causeway/SGDM +caustically +causticity/MS +caustic/YS +cauterization/SM +cauterized/U +cauterize/GSD +cautionary +cautioner/M +caution/GJDRMSZ +cautiousness's/I +cautiousness/SM +cautious/PIY +cavalcade/MS +cavalierness/M +cavalier/SGYDP +cavalryman/M +cavalrymen +cavalry/MS +caveat/SM +caveatted +caveatting +cave/GFRSD +caveman/M +cavemen +Cavendish/M +caver/M +cavern/GSDM +cavernous/Y +cave's +caviar/MS +caviler/M +cavil/SJRDGZ +caving/MS +cavity/MFS +cavort/SDG +Cavour/M +caw/SMDG +Caxton/M +Caye/M +Cayenne/M +cayenne/SM +Cayla/M +Cayman/M +cayman/SM +cay's +cay/SC +Cayuga/M +cayuse/SM +Caz/M +Cazzie/M +c/B +CB +CBC +Cb/M +CBS +cc +Cchaddie/M +CCTV +CCU +CD +CDC/M +Cd/M +CDT +Ce +cease/DSCG +ceasefire/S +ceaselessness/SM +ceaseless/YP +ceasing/U +Ceausescu/M +Cebuano/M +Cebu/M +ceca +cecal +Cecelia/M +Cece/M +Cecile/M +Ceciley/M +Cecilia/M +Cecilio/M +Cecilius/M +Cecilla/M +Cecil/M +Cecily/M +cecum/M +cedar/SM +ceded/A +cede/FRSDG +ceder's/F +ceder/SM +cedes/A +cedilla/SM +ceding/A +Ced/M +Cedric/M +ceilidh/M +ceiling/MDS +Ceil/M +celandine/MS +Celanese/M +Celebes's +celebrant/MS +celebratedness/M +celebrated/P +celebrate/XSDGN +celebration/M +celebrator/MS +celebratory +celebrity/MS +Cele/M +Celene/M +celerity/SM +celery/SM +Celesta/M +celesta/SM +Celeste/M +celestial/YS +Celestia/M +Celestina/M +Celestine/M +Celestyna/M +Celestyn/M +Celia/M +celibacy/MS +celibate/SM +Celie/M +Celina/M +Celinda/M +Celine/M +Celinka/M +Celisse/M +Celka/M +cellarer/M +cellar/RDMGS +Celle/M +cell/GMDS +Cellini/M +cellist/SM +Cello/M +cello/MS +cellophane/SM +cellphone/S +cellular/SY +cellulite/S +celluloid/SM +cellulose/SM +Celsius/S +Celtic/SM +Celt/MS +cementa +cementer/M +cementum/SM +cement/ZGMRDS +cemetery/MS +cenobite/MS +cenobitic +cenotaph/M +cenotaphs +Cenozoic +censer/MS +censored/U +censor/GDMS +censorial +censoriousness/MS +censorious/YP +censorship/MS +censure/BRSDZMG +censurer/M +census/SDMG +centaur/SM +Centaurus/M +centavo/SM +centenarian/MS +centenary/S +centennial/YS +center/AC +centerboard/SM +centered +centerer/S +centerfold/S +centering/SM +centerline/SM +centerpiece/SM +center's +Centigrade +centigrade/S +centigram/SM +centiliter/MS +centime/SM +centimeter/SM +centipede/MS +Centralia/M +centralism/M +centralist/M +centrality/MS +centralization/CAMS +centralize/CGSD +centralizer/SM +centralizes/A +central/STRY +centrefold's +Centrex +CENTREX/M +centric/F +centrifugal/SY +centrifugate/NM +centrifugation/M +centrifuge/GMSD +centripetal/Y +centrist/MS +centroid/MS +cent/SZMR +centurion/MS +century/MS +CEO +cephalic/S +Cepheid +Cepheus/M +ceramicist/S +ceramic/MS +ceramist/MS +cerate/MD +Cerberus/M +cereal/MS +cerebellar +cerebellum/MS +cerebra +cerebral/SY +cerebrate/XSDGN +cerebration/M +cerebrum/MS +cerement/SM +ceremonial/YSP +ceremoniousness/MS +ceremoniousness's/U +ceremonious/YUP +ceremony/MS +Cerenkov/M +Ceres/M +Cerf/M +cerise/SM +cerium/MS +cermet/SM +CERN/M +certainer +certainest +certainty/UMS +certain/UY +cert/FS +certifiable +certifiably +certificate/SDGM +certification/AMC +certified/U +certifier/M +certify/DRSZGNX +certiorari/M +certitude/ISM +cerulean/MS +Cervantes/M +cervical +cervices/M +cervix/M +Cesarean +cesarean/S +Cesare/M +Cesar/M +Cesaro/M +cesium/MS +cessation/SM +cession/FAMSK +Cessna/M +cesspit/M +cesspool/SM +Cesya/M +cetacean/S +cetera/S +Cetus/M +Ceylonese +Ceylon/M +Cezanne/S +cf +CF +CFC +Cf/M +CFO +cg +Chablis/SM +Chaddie/M +Chadd/M +Chaddy/M +Chadian/S +Chad/M +Chadwick/M +chafe/GDSR +chafer/M +chaffer/DRG +chafferer/M +Chaffey/M +chaff/GRDMS +chaffinch/SM +Chagall/M +chagrin/DGMS +Chaim/M +chainlike +chain's +chainsaw/SGD +chain/SGUD +chairlady/M +chairlift/MS +chairman/MDGS +chairmanship/MS +chairmen +chairperson/MS +chair/SGDM +chairwoman/M +chairwomen +chaise/SM +chalcedony/MS +Chaldea/M +Chaldean/M +chalet/SM +chalice/DSM +chalkboard/SM +chalk/DSMG +chalkiness/S +chalkline +chalky/RPT +challenged/U +challenger/M +challenge/ZGSRD +challenging/Y +challis/SM +Chalmers +chamberer/M +Chamberlain/M +chamberlain/MS +chambermaid/MS +chamberpot/S +Chambers/M +chamber/SZGDRM +chambray/MS +chameleon/SM +chamfer/DMGS +chammy's +chamois/DSMG +chamomile/MS +champagne/MS +champaign/M +champ/DGSZ +champion/MDGS +championship/MS +Champlain/M +chanced/M +chance/GMRSD +chancellery/SM +chancellorship/SM +chancellor/SM +Chancellorsville/M +chancel/SM +Chance/M +chancery/SM +Chancey/M +chanciness/S +chancing/M +chancre/SM +chancy/RPT +Chandal/M +Chanda/M +chandelier/SM +Chandigarh/M +Chandler/M +chandler/MS +Chandragupta/M +Chandra/M +Chandrasekhar/M +Chandy/M +Chanel/M +Chane/M +Chaney/M +Changchun/M +changeabilities +changeability/UM +changeableness/SM +changeable/U +changeably/U +changed/U +change/GZRSD +changeless +changeling/M +changeover/SM +changer/M +changing/U +Chang/M +Changsha/M +Chan/M +Channa/M +channeler/M +channeling/M +channelization/SM +channelize/GDS +channellings +channel/MDRZSG +Channing/M +chanson/SM +Chantalle/M +Chantal/M +chanter/M +chanteuse/MS +chantey/SM +chanticleer/SM +Chantilly/M +chantry/MS +chant/SJGZMRD +chanty's +Chanukah's +Chao/M +chaos/SM +chaotic +chaotically +chaparral/MS +chapbook/SM +chapeau/MS +chapel/MS +chaperonage/MS +chaperoned/U +chaperone's +chaperon/GMDS +chaplaincy/MS +chaplain/MS +chaplet/SM +Chaplin/M +Chapman/M +chap/MS +Chappaquiddick/M +chapped +chapping +chapter/SGDM +Chara +charabanc/MS +characterful +characteristically/U +characteristic/SM +characterizable/MS +characterization/MS +characterize/DRSBZG +characterized/U +characterizer/M +characterless +character/MDSG +charade/SM +charbroil/SDG +charcoal/MGSD +Chardonnay +chardonnay/S +chard/SM +chargeableness/M +chargeable/P +charged/U +charge/EGRSDA +charger/AME +chargers +char/GS +Charil/M +charily +chariness/MS +Charin/M +charioteer/GSDM +Chariot/M +chariot/SMDG +Charis +charisma/M +charismata +charismatically +charismatic/S +Charissa/M +Charisse/M +charitablenesses +charitableness/UM +charitable/UP +charitably/U +Charita/M +Charity/M +charity/MS +charlady/M +Charla/M +charlatanism/MS +charlatanry/SM +charlatan/SM +Charlean/M +Charleen/M +Charlemagne/M +Charlena/M +Charlene/M +Charles/M +Charleston/SM +Charley/M +Charlie/M +Charline/M +Charlot/M +Charlotta/M +Charlotte/M +Charlottesville/M +Charlottetown/M +Charlton/M +Charmaine/M +Charmain/M +Charmane/M +charmer/M +Charmian/M +Charmine/M +charming/RYT +Charmin/M +Charmion/M +charmless +charm/SGMZRD +Charolais +Charo/M +Charon/M +charred +charring +charted/U +charter/AGDS +chartered/U +charterer/SM +charter's +chartist/SM +Chartres/M +chartreuse/MS +chartroom/S +chart/SJMRDGBZ +charwoman/M +charwomen +Charybdis/M +Charyl/M +chary/PTR +Chas +chase/DSRGZ +Chase/M +chaser/M +chasing/M +Chasity/M +chasm/SM +chassis/M +chastely +chasteness/SM +chasten/GSD +chaste/UTR +chastisement/SM +chastiser/M +chastise/ZGLDRS +Chastity/M +chastity/SM +chastity's/U +chasuble/SM +Chateaubriand +château/M +chateaus +châteaux +châtelaine/SM +chat/MS +Chattahoochee/M +Chattanooga/M +chatted +chattel/MS +chatterbox/MS +chatterer/M +Chatterley/M +chatter/SZGDRY +Chatterton/M +chattily +chattiness/SM +chatting +chatty/RTP +Chaucer/M +chauffeur/GSMD +Chaunce/M +Chauncey/M +Chautauqua/M +chauvinism/MS +chauvinistic +chauvinistically +chauvinist/MS +Chavez/M +chaw +Chayefsky/M +cheapen/DG +cheapish +cheapness/MS +cheapskate/MS +cheap/YRNTXSP +cheater/M +cheat/RDSGZ +Chechen/M +Chechnya/M +checkable/U +checkbook/MS +checked/UA +checkerboard/MS +checker/DMG +check/GZBSRDM +checklist/S +checkmate/MSDG +checkoff/SM +checkout/S +checkpoint/MS +checkroom/MS +check's/A +checks/A +checksummed +checksumming +checksum/SM +checkup/MS +Cheddar/MS +cheddar/S +cheekbone/SM +cheek/DMGS +cheekily +cheekiness/SM +cheeky/PRT +cheep/GMDS +cheerer/M +cheerfuller +cheerfullest +cheerfulness/MS +cheerful/YP +cheerily +cheeriness/SM +cheerio/S +Cheerios/M +cheerleader/SM +cheerlessness/SM +cheerless/PY +cheers/S +cheery/PTR +cheer/YRDGZS +cheeseburger/SM +cheesecake/SM +cheesecloth/M +cheesecloths +cheeseparing/S +cheese/SDGM +cheesiness/SM +cheesy/PRT +cheetah/M +cheetahs +Cheeto/M +Cheever/M +cheffed +cheffing +chef/SM +Chekhov/M +chelate/XDMNG +chelation/M +Chelsae/M +Chelsea/M +Chelsey/M +Chelsie/M +Chelsy/M +Chelyabinsk/M +chem +Che/M +chemic +chemical/SYM +chemiluminescence/M +chemiluminescent +chemise/SM +chemistry/SM +chemist/SM +chemotherapeutic/S +chemotherapy/SM +chemurgy/SM +Chengdu +Cheng/M +chenille/SM +Chen/M +Cheops/M +Chere/M +Cherey/M +Cherianne/M +Cherice/M +Cherida/M +Cherie/M +Cherilyn/M +Cherilynn/M +Cheri/M +Cherin/M +Cherise/M +cherisher/M +cherish/GDRS +Cherish/M +Cheriton/M +Cherlyn/M +Cher/M +Chernenko/M +Chernobyl/M +Cherokee/MS +cheroot/MS +Cherri/M +Cherrita/M +Cherry/M +cherry/SM +chert/MS +cherubic +cherubim/S +cherub/SM +chervil/MS +Cherye/M +Cheryl/M +Chery/M +Chesapeake/M +Cheshire/M +Cheslie/M +chessboard/SM +chessman/M +chessmen +chess/SM +Chesterfield/M +chesterfield/MS +Chester/M +Chesterton/M +chestful/S +chest/MRDS +chestnut/SM +Cheston/M +chesty/TR +Chet/M +Chevalier/M +chevalier/SM +Cheviot/M +cheviot/S +Chev/M +Chevrolet/M +chevron/DMS +Chevy/M +chewer/M +chew/GZSDR +chewiness/S +chewy/RTP +Cheyenne/SM +chg +chge +Chiang/M +chianti/M +Chianti/S +chiaroscuro/SM +Chiarra/M +Chiba/M +Chicagoan/SM +Chicago/M +Chicana/MS +chicane/MGDS +chicanery/MS +Chicano/MS +chichi/RTS +chickadee/SM +Chickasaw/SM +chickenfeed +chicken/GDM +chickenhearted +chickenpox/MS +Chickie/M +Chick/M +chickpea/MS +chickweed/MS +chick/XSNM +Chicky/M +chicle/MS +Chic/M +chicness/S +Chico/M +chicory/MS +chic/SYRPT +chide/GDS +chiding/Y +chiefdom/MS +chieftain/SM +chief/YRMST +chiffonier/MS +chiffon/MS +chigger/MS +chignon/MS +Chihuahua/MS +chihuahua/S +chilblain/MS +childbearing/MS +childbirth/M +childbirths +childcare/S +childes +child/GMYD +childhood/MS +childishness/SM +childish/YP +childlessness/SM +childless/P +childlikeness/M +childlike/P +childminders +childproof/GSD +childrearing +children/M +Chilean/S +Chile/MS +chile's +chilies +chili/M +chiller/M +chilliness/MS +chilling/Y +chilli's +chill/MRDJGTZPS +chillness/MS +chilly/TPRS +Chilton/M +Chi/M +chimaera's +chimaerical +Chimborazo/M +chime/DSRGMZ +Chimera/S +chimera/SM +chimeric +chimerical +chimer/M +Chimiques +chimney/SMD +chimpanzee/SM +chimp/MS +chi/MS +Chimu/M +Ch'in +China/M +Chinaman/M +Chinamen +china/MS +Chinatown/SM +chinchilla/SM +chine/MS +Chinese/M +Ching/M +chink/DMSG +chinless +Chin/M +chinned +chinner/S +chinning +chino/MS +Chinook/MS +chin/SGDM +chinstrap/S +chintz/SM +chintzy/TR +chipboard/M +Chipewyan/M +Chip/M +chipmunk/SM +chipped +Chippendale/M +chipper/DGS +Chippewa/MS +chipping/MS +chip/SM +Chiquia/M +Chiquita/M +chiral +Chirico/M +chirography/SM +chiropodist/SM +chiropody/MS +chiropractic/MS +chiropractor/SM +chirp/GDS +chirpy/RT +chirrup/DGS +chiseler/M +chisel/ZGSJMDR +Chisholm/M +Chisinau/M +chitchat/SM +chitchatted +chitchatting +chitinous +chitin/SM +chit/SM +Chittagong/M +chitterlings +chivalric +chivalrously/U +chivalrousness/MS +chivalrous/YP +chivalry/SM +chive/GMDS +chivvy/D +chivying +chlamydiae +chlamydia/S +Chloe/M +Chloette/M +Chlo/M +chloral/MS +chlorate/M +chlordane/MS +chloride/MS +chlorinated/C +chlorinates/C +chlorinate/XDSGN +chlorination/M +chlorine/MS +Chloris +chlorofluorocarbon/S +chloroform/DMSG +chlorophyll/SM +chloroplast/MS +chloroquine/M +chm +Ch/MGNRS +chockablock +chock/SGRDM +chocoholic/S +chocolate/MS +chocolaty +Choctaw/MS +choiceness/M +choice/RSMTYP +choirboy/MS +choirmaster/SM +choir/SDMG +chokeberry/M +chokecherry/SM +choke/DSRGZ +choker/M +chokes/M +choking/Y +cholera/SM +choleric +choler/SM +cholesterol/SM +choline/M +cholinesterase/M +chomp/DSG +Chomsky/M +Chongqing +choose/GZRS +chooser/M +choosiness/S +choosy/RPT +chophouse/SM +Chopin/M +chopped +chopper/SDMG +choppily +choppiness/MS +chopping +choppy/RPT +chop/S +chopstick/SM +chorale/MS +choral/SY +chordal +chordata +chordate/MS +chording/M +chord/SGMD +chorea/MS +chore/DSGNM +choreographer/M +choreographic +choreographically +choreographs +choreography/MS +choreograph/ZGDR +chorines +chorion/M +chorister/SM +choroid/S +chortler/M +chortle/ZGDRS +chorus/GDSM +chosen/U +chose/S +Chou/M +chowder/SGDM +chow/DGMS +Chretien/M +Chris/M +chrism/SM +chrissake +Chrisse/M +Chrissie/M +Chrissy/M +Christabella/M +Christabel/M +Christalle/M +Christal/M +Christa/M +Christan/M +Christchurch/M +Christean/M +Christel/M +Christendom/MS +christened/U +christening/SM +Christen/M +christen/SAGD +Christensen/M +Christenson/M +Christiana/M +Christiane/M +Christianity/SM +Christianize/GSD +Christian/MS +Christiano/M +Christiansen/M +Christians/N +Christie/SM +Christi/M +Christina/M +Christine/M +Christin/M +Christlike +Christmas/SM +Christmastide/SM +Christmastime/S +Christoffel/M +Christoffer/M +Christoforo/M +Christoper/M +Christophe/M +Christopher/M +Christoph/MR +Christophorus/M +Christos/M +Christ/SMN +Christye/M +Christyna/M +Christy's +Chrisy/M +chroma/M +chromate/M +chromatically +chromaticism/M +chromaticness/M +chromatic/PS +chromatics/M +chromatin/MS +chromatogram/MS +chromatograph +chromatographic +chromatography/M +chrome/GMSD +chromic +chromite/M +chromium/SM +chromosomal +chromosome/MS +chromosphere/M +chronically +chronicled/U +chronicler/M +chronicle/SRDMZG +chronic/S +chronograph/M +chronographs +chronography +chronological/Y +chronologist/MS +chronology/MS +chronometer/MS +chronometric +Chrotoem/M +chrysalids +chrysalis/SM +Chrysa/M +chrysanthemum/MS +Chrysler/M +Chrysostom/M +Chrystal/M +Chrystel/M +Chryste/M +chubbiness/SM +chubby/RTP +chub/MS +Chucho/M +chuck/GSDM +chuckhole/SM +chuckle/DSG +chuckling/Y +Chuck/M +chuff/DM +chugged +chugging +chug/MS +Chukchi/M +chukka/S +Chumash/M +chummed +chummily +chumminess/MS +chumming +chum/MS +chummy/SRTP +chumping/M +chump/MDGS +Chungking's +Chung/M +chunkiness/MS +chunk/SGDM +chunky/RPT +chuntering +churchgoer/SM +churchgoing/SM +Churchillian +Churchill/M +churchliness/M +churchly/P +churchman/M +church/MDSYG +churchmen +Church/MS +churchwarden/SM +churchwoman/M +churchwomen +churchyard/SM +churlishness/SM +churlish/YP +churl/SM +churner/M +churning/M +churn/SGZRDM +chute/DSGM +chutney/MS +chutzpah/M +chutzpahs +chutzpa/SM +Chuvash/M +ch/VT +chyme/SM +Ci +CIA +ciao/S +cicada/MS +cicatrice/S +cicatrix's +Cicely/M +Cicero/M +cicerone/MS +ciceroni +Ciceronian +Cicily/M +CID +cider's/C +cider/SM +Cid/M +Ciel/M +cigarette/MS +cigarillo/MS +cigar/SM +cilantro/S +cilia/M +ciliate/FDS +ciliately +cilium/M +Cilka/M +cinch/MSDG +cinchona/SM +Cincinnati/M +cincture/MGSD +Cinda/M +Cindee/M +Cindelyn/M +cinder/DMGS +Cinderella/MS +Cindie/M +Cindi/M +Cindra/M +Cindy/M +cine/M +cinema/SM +cinematic +cinematographer/MS +cinematographic +cinematography/MS +Cinerama/M +cinnabar/MS +Cinnamon/M +cinnamon/MS +ciphered/C +cipher/MSGD +ciphers/C +cir +circa +circadian +Circe/M +circler/M +circle/RSDGM +circlet/MS +circuital +circuit/GSMD +circuitousness/MS +circuitous/YP +circuitry/SM +circuity/MS +circulant +circularity/SM +circularize/GSD +circularness/M +circular/PSMY +circulate/ASDNG +circulation/MA +circulations +circulative +circulatory +circumcise/DRSXNG +circumcised/U +circumciser/M +circumcision/M +circumference/SM +circumferential/Y +circumflex/MSDG +circumlocution/MS +circumlocutory +circumnavigate/DSNGX +circumnavigational +circumnavigation/M +circumpolar +circumscribe/GSD +circumscription/SM +circumspection/SM +circumspect/Y +circumsphere +circumstance/SDMG +circumstantial/YS +circumvention/MS +circumvent/SBGD +circus/SM +Cirillo/M +Cirilo/M +Ciro/M +cirque/SM +cirrhoses +cirrhosis/M +cirrhotic/S +cirri/M +cirrus/M +Cissiee/M +Cissy/M +cistern/SM +citadel/SM +citations/I +citation/SMA +cit/DSG +cite/ISDAG +Citibank/M +citified +citizenry/SM +citizenship/MS +citizen/SYM +citrate/DM +citric +Citroen/M +citronella/MS +citron/MS +citrus/SM +city/DSM +cityscape/MS +citywide +civet/SM +civic/S +civics/M +civilian/SM +civility/IMS +civilizational/MS +civilization/AMS +civilizedness/M +civilized/PU +civilize/DRSZG +civilizer/M +civilizes/AU +civil/UY +civvies +ck/C +clack/SDG +cladding/SM +clads +clad/U +Claiborne/M +Claiborn/M +claimable +claimant/MS +claim/CDRSKAEGZ +claimed/U +claimer/KMACE +Claire/M +Clair/M +Clairol/M +clairvoyance/MS +clairvoyant/YS +clambake/MS +clamberer/M +clamber/SDRZG +clammed +clammily +clamminess/MS +clamming +clam/MS +clammy/TPR +clamorer/M +clamor/GDRMSZ +clamorousness/UM +clamorous/PUY +clampdown/SM +clamper/M +clamp/MRDGS +clamshell/MS +Clancy/M +clandestineness/M +clandestine/YP +clanger/M +clangor/MDSG +clangorous/Y +clang/SGZRD +clanking/Y +clank/SGDM +clan/MS +clannishness/SM +clannish/PY +clansman/M +clansmen +clapboard/SDGM +Clapeyron/M +clapped +clapper/GMDS +clapping +clap/S +Clapton/M +claptrap/SM +claque/MS +Clarabelle/M +Clara/M +Clarance/M +Clare/M +Claremont/M +Clarence/M +Clarendon/M +Claresta/M +Clareta/M +claret/MDGS +Claretta/M +Clarette/M +Clarey/M +Claribel/M +Clarice/M +Clarie/M +clarification/M +clarifier/M +clarify/NGXDRS +Clari/M +Clarinda/M +Clarine/M +clarinetist/SM +clarinet/SM +clarinettist's +clarion/GSMD +Clarissa/M +Clarisse/M +Clarita/M +clarities +clarity/UM +Clarke/M +Clark/M +Clarridge/M +Clary/M +clasher/M +clash/RSDG +clasped/M +clasper/M +clasp's +clasp/UGSD +classer/M +class/GRSDM +classical/Y +classicism/SM +classicist/SM +classic/S +classics/M +classifiable/U +classification/AMC +classificatory +classified/S +classifier/SM +classify/CNXASDG +classiness/SM +classless/P +classmate/MS +classroom/MS +classwork/M +classy/PRT +clatterer/M +clattering/Y +clatter/SGDR +clattery +Claudelle/M +Claudell/M +Claude/M +Claudetta/M +Claudette/M +Claudia/M +Claudian/M +Claudianus/M +Claudie/M +Claudina/M +Claudine/M +Claudio/M +Claudius/M +clausal +clause/MS +Clausen/M +Clausewitz/M +Clausius/M +Claus/NM +claustrophobia/SM +claustrophobic +clave/RM +clave's/F +clavichord/SM +clavicle/MS +clavier/MS +clawer/M +claw/GDRMS +Clayborne/M +Clayborn/M +Claybourne/M +clayey +clayier +clayiest +Clay/M +clay/MDGS +claymore/MS +Clayson/M +Clayton/M +Clea/M +cleanable +cleaner/MS +cleaning/SM +cleanliness/UMS +cleanly/PRTU +cleanness/MSU +cleanse +cleanser/M +cleans/GDRSZ +cleanup/MS +clean/UYRDPT +clearance/MS +clearcut +clearer/M +clearheadedness/M +clearheaded/PY +clearinghouse/S +clearing/MS +clearly +clearness/MS +clears +clear/UTRD +Clearwater/M +clearway/M +cleat/MDSG +cleavage/MS +cleaver/M +cleave/RSDGZ +Cleavland/M +clef/SM +cleft/MDGS +clematis/MS +clemence +Clemenceau/M +Clemence/M +clemency/ISM +Clemente/M +Clementia/M +Clementina/M +Clementine/M +Clementius/M +clement/IY +Clement/MS +clements +Clemmie/M +Clemmy/M +Clemons +Clemson/M +Clem/XM +clenches +clenching +clench/UD +Cleo/M +Cleon/M +Cleopatra/M +Clerc/M +clerestory/MS +clergyman/M +clergymen +clergy/MS +clergywoman +clergywomen +clericalism/SM +clerical/YS +cleric/SM +Clerissa/M +clerk/SGYDM +clerkship/MS +Cletis +Cletus/M +Cleveland/M +Cleve/M +cleverness/SM +clever/RYPT +Clevey/M +Clevie/M +clevis/SM +clew/DMGS +cl/GJ +Cliburn/M +clichéd +cliché/SM +clicker/M +click/GZSRDM +clientčle/SM +client/SM +cliffhanger/MS +cliffhanging +Cliff/M +Clifford/M +cliff/SM +Clifton/M +climacteric/SM +climactic +climate/MS +climatic +climatically +climatological/Y +climatologist/SM +climatology/MS +climax/MDSG +climbable/U +climb/BGZSJRD +climbdown +climbed/U +climber/M +clime/SM +Clim/M +clinch/DRSZG +clincher/M +clinching/Y +Cline/M +clinger/MS +clinging +cling/U +clingy/TR +clinical/Y +clinician/MS +clinic/MS +clinker/GMD +clink/RDGSZ +clinometer/MIS +Clint/M +Clinton/M +Clio/M +cliometrician/S +cliometric/S +clipboard/SM +clipped/U +clipper/MS +clipping/SM +clip/SM +clique/SDGM +cliquey +cliquier +cliquiest +cliquishness/SM +cliquish/YP +clitoral +clitorides +clitoris/MS +Clive/M +cloacae +cloaca/M +cloakroom/MS +cloak's +cloak/USDG +clobber/DGS +cloche/MS +clocker/M +clockmaker/M +clock/SGZRDMJ +clockwatcher +clockwise +clockwork/MS +clodded +clodding +cloddishness/M +cloddish/P +clodhopper/SM +clod/MS +Cloe/M +clogged/U +clogging/U +clog's +clog/US +cloisonné +cloisonnes +cloister/MDGS +cloistral +Clo/M +clomp/MDSG +clonal +clone/DSRGMZ +clonk/SGD +clopped +clopping +clop/S +Cloris/M +closed/U +close/EDSRG +closefisted +closely +closemouthed +closeness/MS +closeout/MS +closer/EM +closers +closest +closet/MDSG +closeup/S +closing/S +closured +closure/EMS +closure's/I +closuring +clothbound +clothesbrush +clotheshorse/MS +clothesline/SDGM +clothesman +clothesmen +clothespin/MS +clothe/UDSG +cloth/GJMSD +clothier/MS +clothing/M +Clotho/M +cloths +Clotilda/M +clot/MS +clotted +clotting +cloture/MDSG +cloudburst/MS +clouded/U +cloudiness/SM +cloudlessness/M +cloudless/YP +cloudscape/SM +cloud/SGMD +cloudy/TPR +clout/GSMD +cloven +cloverleaf/MS +clover/M +clove/SRMZ +Clovis/M +clown/DMSG +clownishness/SM +clownish/PY +cloy/DSG +cloying/Y +clubbed/M +clubbing/M +clubfeet +clubfoot/DM +clubhouse/SM +club/MS +clubroom/SM +cluck/GSDM +clueless +clue/MGDS +Cluj/M +clump/MDGS +clumpy/RT +clumsily +clumsiness/MS +clumsy/PRT +clung +clunk/SGZRDM +clunky/PRYT +clustered/AU +clusters/A +cluster/SGJMD +clutch/DSG +cluttered/U +clutter/GSD +Cl/VM +Clyde/M +Clydesdale/M +Cly/M +Clytemnestra/M +Clyve/M +Clywd/M +cm +Cm/M +CMOS +cnidarian/MS +CNN +CNS +CO +coacher/M +coachman/M +coachmen +coach/MSRDG +coachwork/M +coadjutor/MS +coagulable +coagulant/SM +coagulate/GNXSD +coagulation/M +coagulator/S +coaler/M +coalesce/GDS +coalescence/SM +coalescent +coalface/SM +coalfield/MS +coalitionist/SM +coalition/MS +coal/MDRGS +coalminers +coarseness/SM +coarsen/SGD +coarse/TYRP +coastal +coaster/M +coastguard/MS +coastline/SM +coast/SMRDGZ +coated/U +Coates/M +coating/M +coat/MDRGZJS +coattail/S +coattest +coauthor/MDGS +coaxer/M +coax/GZDSR +coaxial/Y +coaxing/Y +Cobain/M +cobalt/MS +cobbed +Cobbie/M +cobbing +cobbler/M +cobble/SRDGMZ +cobblestone/MSD +Cobb/M +Cobby/M +coble/M +Cob/M +COBOL +Cobol/M +cobra/MS +cob/SM +cobwebbed +cobwebbing +cobwebby/RT +cobweb/SM +cocaine/MS +coca/MS +cocci/MS +coccus/M +coccyges +coccyx/M +Cochabamba/M +cochineal/SM +Cochin/M +Cochise/M +cochleae +cochlear +cochlea/SM +Cochran/M +cockade/SM +cockamamie +cockatoo/SM +cockatrice/MS +cockcrow/MS +cockerel/MS +cocker/M +cockeye/DM +cockeyed/PY +cockfighting/M +cockfight/MJSG +cock/GDRMS +cockily +cockiness/MS +cocklebur/M +cockle/SDGM +cockleshell/SM +Cockney +cockney/MS +cockpit/MS +cockroach/SM +cockscomb/SM +cockshies +cocksucker/S! +cocksure +cocktail/GDMS +cocky/RPT +cocoa/SM +coco/MS +coconut/SM +cocoon/GDMS +Cocteau/M +COD +coda/SM +codded +codding +coddle/GSRD +coddler/M +codebook/S +codebreak/R +coded/UA +Codee/M +codeine/MS +codename/D +codependency/S +codependent/S +coder/CM +code's +co/DES +codes/A +code/SCZGJRD +codetermine/S +codeword/SM +codex/M +codfish/SM +codger/MS +codices/M +codicil/SM +Codie/M +codification/M +codifier/M +codify/NZXGRSD +Codi/M +coding/M +codling/M +Cod/M +cod/MDRSZGJ +codpiece/MS +Cody/M +coedited +coediting +coeditor/MS +coedits +coed/SM +coeducational +coeducation/SM +coefficient/SYM +coelenterate/MS +coequal/SY +coercer/M +coerce/SRDXVGNZ +coercible/I +coercion/M +coerciveness/M +coercive/PY +coeval/YS +coexistence/MS +coexistent +coexist/GDS +coextensive/Y +cofactor/MS +coffeecake/SM +coffeecup +coffeehouse/SM +coffeemaker/S +coffeepot/MS +coffee/SM +cofferdam/SM +coffer/DMSG +Coffey/M +coffin/DMGS +Coffman/M +cogency/MS +cogent/Y +cogged +cogging +cogitate/DSXNGV +cogitation/M +cogitator/MS +cog/MS +Cognac/M +cognac/SM +cognate/SXYN +cognation/M +cognitional +cognition/SAM +cognitive/SY +cognizable +cognizance/MAI +cognizances/A +cognizant/I +cognomen/SM +cognoscente +cognoscenti +cogwheel/SM +cohabitant/MS +cohabitational +cohabitation/SM +cohabit/SDG +Cohan/M +coheir/MS +Cohen/M +cohere/GSRD +coherence/SIM +coherencies +coherency/I +coherent/IY +coherer/M +cohesion/MS +cohesiveness/SM +cohesive/PY +Cohn/M +cohoes +coho/MS +cohort/SM +coiffed +coiffing +coiffure/MGSD +coif/SM +coil/UGSAD +Coimbatore/M +coinage's/A +coinage/SM +coincide/GSD +coincidence/MS +coincidental/Y +coincident/Y +coined/U +coiner/M +coin/GZSDRM +coinsurance/SM +Cointon/M +cointreau +coital/Y +coitus/SM +coke/MGDS +Coke/MS +COL +COLA +colander/SM +Colan/M +Colas +cola/SM +colatitude/MS +Colbert/M +Colby/M +coldblooded +coldish +coldness/MS +cold/YRPST +Coleen/M +Cole/M +Coleman/M +Colene/M +Coleridge/M +coleslaw/SM +Colet/M +Coletta/M +Colette/M +coleus/SM +Colfax/M +Colgate/M +colicky +colic/SM +coliform +Colin/M +coliseum/SM +colitis/MS +collaborate/VGNXSD +collaboration/M +collaborative/SY +collaborator/SM +collage/MGSD +collagen/M +collapse/SDG +collapsibility/M +collapsible +collarbone/MS +collar/DMGS +collard/SM +collarless +collated/U +collateral/SYM +collate/SDVNGX +collation/M +collator/MS +colleague/SDGM +collectedness/M +collected/PY +collectible/S +collection/AMS +collective/SY +collectivism/SM +collectivist/MS +collectivity/MS +collectivization/MS +collectivize/DSG +collector/MS +collect/SAGD +Colleen/M +colleen/SM +college/SM +collegiality/S +collegian/SM +collegiate/Y +Collen/M +Collete/M +Collette/M +coll/G +collide/SDG +Collie/M +collie/MZSRD +collier/M +Collier/M +colliery/MS +collimate/C +collimated/U +collimates +collimating +collimation/M +collimator/M +collinear +collinearity/M +Colline/M +Collin/MS +collisional +collision/SM +collocate/XSDGN +collocation/M +colloidal/Y +colloid/MS +colloq +colloquialism/MS +colloquial/SY +colloquies +colloquium/SM +colloquy/M +collude/SDG +collusion/SM +collusive +collying +Colly/RM +Colman/M +Col/MY +Cologne/M +cologne/MSD +Colo/M +Colombia/M +Colombian/S +Colombo/M +colonelcy/MS +colonel/MS +colonialism/MS +colonialist/MS +colonial/SPY +colonist/SM +colonization/ACSM +colonize/ACSDG +colonized/U +colonizer/MS +colonizes/U +Colon/M +colonnade/MSD +colon/SM +colony/SM +colophon/SM +Coloradan/S +Coloradoan/S +Colorado/M +colorant/SM +coloration/EMS +coloratura/SM +colorblindness/S +colorblind/P +colored/USE +colorer/M +colorfastness/SM +colorfast/P +colorfulness/MS +colorful/PY +colorimeter/SM +colorimetry +coloring/M +colorization/S +colorize/GSD +colorizing/C +colorlessness/SM +colorless/PY +colors/EA +color/SRDMGZJ +colossal/Y +Colosseum/M +colossi +colossus/M +colostomy/SM +colostrum/SM +col/SD +colter/M +coltishness/M +coltish/PY +Colt/M +colt/MRS +Coltrane/M +Columbia/M +Columbian +Columbine/M +columbine/SM +Columbus/M +columnar +columnist/MS +columnize/GSD +column/SDM +Colver/M +Co/M +comae +comaker/SM +Comanche/MS +coma/SM +comatose +combatant/SM +combativeness/MS +combative/PY +combat/SVGMD +combed/U +comber/M +combinational/A +combination/ASM +combinatorial/Y +combinatoric/S +combinator/SM +combined/AU +combiner/M +combines/A +combine/ZGBRSD +combining/A +combo/MS +comb/SGZDRMJ +Combs/M +combusted +combustibility/SM +combustible/SI +combustion/MS +combustive +Comdex/M +Comdr/M +comeback/SM +comedian/SM +comedic +comedienne/SM +comedown/MS +comedy/SM +come/IZSRGJ +comeliness/SM +comely/TPR +comer/IM +comes/M +comestible/MS +cometary +cometh +comet/SM +comeuppance/SM +comfit's +comfit/SE +comfortability/S +comfortableness/MS +comfortable/U +comfortably/U +comforted/U +comforter/MS +comfort/ESMDG +comforting/YE +comfy/RT +comicality/MS +comical/Y +comic/MS +Cominform/M +comity/SM +com/LJRTZG +comm +Com/M +comma/MS +commandant/MS +commandeer/SDG +commander/M +commanding/Y +commandment/SM +commando/SM +command/SZRDMGL +commemorate/SDVNGX +commemoration/M +commemorative/YS +commemorator/S +commence/ALDSG +commencement/AMS +commencer/M +commendably +commendation/ASM +commendatory/A +commender/AM +commend/GSADRB +commensurable/I +commensurate/IY +commensurates +commensuration/SM +commentary/MS +commentate/GSD +commentator/SM +commenter/M +comment's +comment/SUGD +commerce/MGSD +commercialism/MS +commercialization/SM +commercialize/GSD +commercial/PYS +Commie +commie/SM +commingle/GSD +commiserate/VGNXSD +commiseration/M +commissariat/MS +commissar/MS +commissary/MS +commission/ASCGD +commissioner/SM +commission's/A +commitment/SM +commit/SA +committable +committal/MA +committals +committed/UA +committeeman/M +committeemen +committee/MS +committeewoman/M +committeewomen +committing/A +commode/MS +commodes/IE +commodiousness/MI +commodious/YIP +commodity/MS +commodore/SM +commonality/MS +commonalty/MS +commoner/MS +commonness/MSU +commonplaceness/M +commonplace/SP +common/RYUPT +commonsense +commons/M +Commons/M +commonweal/SHM +commonwealth/M +Commonwealth/M +commonwealths +Commonwealths +commotion/MS +communality/M +communal/Y +commune/XSDNG +communicability/MS +communicable/IU +communicably +communicant/MS +communicate/VNGXSD +communicational +communication/M +communicativeness/M +communicative/PY +communicator/SM +communion/M +Communion/SM +communique/S +communism/MS +Communism/S +communistic +communist/MS +Communist/S +communitarian/M +community/MS +communize/SDG +commutable/I +commutate/XVGNSD +commutation/M +commutative/Y +commutativity +commutator/MS +commute/BZGRSD +commuter/M +Comoros +compaction/M +compactness/MS +compactor/MS +compact/TZGSPRDY +companionableness/M +companionable/P +companionably +companion/GBSMD +companionship/MS +companionway/MS +company/MSDG +Compaq/M +comparabilities +comparability/IM +comparableness/M +comparable/P +comparably/I +comparativeness/M +comparative/PYS +comparator/SM +compare/GRSDB +comparer/M +comparison/MS +compartmental +compartmentalization/SM +compartmentalize/DSG +compartment/SDMG +compassionateness/M +compassionate/PSDGY +compassion/MS +compass/MSDG +compatibility/IMS +compatibleness/M +compatible/SI +compatibly/I +compatriot/SM +compeer/DSGM +compellable +compelled +compelling/YM +compel/S +compendious +compendium/MS +compensable +compensated/U +compensate/XVNGSD +compensation/M +compensator/M +compensatory +compete/GSD +competence/ISM +competency/IS +competency's +competent/IY +competition/SM +competitiveness/SM +competitive/YP +competitor/MS +comp/GSYD +compilable/U +compilation/SAM +compile/ASDCG +compiler/CS +compiler's +complacence/S +complacency/SM +complacent/Y +complainant/MS +complainer/M +complain/GZRDS +complaining/YU +complaint/MS +complaisance/SM +complaisant/Y +complected +complementariness/M +complementarity +complementary/SP +complementation/M +complementer/M +complement/ZSMRDG +complete/BTYVNGPRSDX +completed/U +completely/I +completeness/ISM +completer/M +completion/MI +complexional +complexion/DMS +complexity/MS +complexness/M +complex/TGPRSDY +compliance/SM +compliant/Y +complicatedness/M +complicated/YP +complicate/SDG +complication/M +complicator/SM +complicit +complicity/MS +complier/M +complimentary/U +complimenter/M +compliment/ZSMRDG +comply/ZXRSDNG +component/SM +comport/GLSD +comportment/SM +compose/CGASDE +composedness/M +composed/PY +composer/CM +composers +composite/YSDXNG +compositional/Y +composition/CMA +compositions/C +compositor/MS +compost/DMGS +composure/ESM +compote/MS +compounded/U +compounder/M +compound/RDMBGS +comprehend/DGS +comprehending/U +comprehensibility/SIM +comprehensibleness/IM +comprehensible/PI +comprehensibly/I +comprehension/IMS +comprehensiveness/SM +comprehensive/YPS +compressed/Y +compressibility/IM +compressible/I +compressional +compression/CSM +compressive/Y +compressor/MS +compress/SDUGC +comprise/GSD +compromiser/M +compromise/SRDGMZ +compromising/UY +Compton/M +comptroller/SM +compulsion/SM +compulsiveness/MS +compulsive/PYS +compulsivity +compulsorily +compulsory/S +compunction/MS +Compuserve/M +CompuServe/M +computability/M +computable/UI +computably +computational/Y +computation/SM +computed/A +computerese +computerization/MS +computerize/SDG +computer/M +compute/RSDZBG +computes/A +computing/A +comradely/P +comradeship/MS +comrade/YMS +Comte/M +Conakry/M +Conan/M +Conant/M +concatenate/XSDG +concaveness/MS +concave/YP +conceal/BSZGRDL +concealed/U +concealer/M +concealing/Y +concealment/MS +conceded/Y +conceitedness/SM +conceited/YP +conceit/SGDM +conceivable/IU +conceivably/I +conceive/BGRSD +conceiver/M +concentrate/VNGSDX +concentration/M +concentrator/MS +concentrically +Concepción/M +conceptional +conception/MS +concept/SVM +conceptuality/M +conceptualization/A +conceptualizations +conceptualization's +conceptualize/DRSG +conceptualizing/A +conceptual/Y +concerned/YU +concern/USGD +concerted/PY +concert/EDSG +concertina/MDGS +concertize/GDS +concertmaster/MS +concerto/SM +concert's +concessionaire/SM +concessional +concessionary +concession/R +Concetta/M +Concettina/M +Conchita/M +conch/MDG +conchs +concierge/SM +conciliar +conciliate/GNVX +conciliation/ASM +conciliator/MS +conciliatory/A +conciseness/SM +concise/TYRNPX +concision/M +conclave/S +concluder/M +conclude/RSDG +conclusion/SM +conclusive/IPY +conclusiveness/ISM +concocter/M +concoction/SM +concoct/RDVGS +concomitant/YS +concordance/MS +concordant/Y +concordat/SM +Concorde/M +Concordia/M +Concord/MS +concourse +concreteness/MS +concrete/NGXRSDPYM +concretion/M +concubinage/SM +concubine/SM +concupiscence/SM +concupiscent +concurrence/MS +concur/S +concussion/MS +concuss/VD +condemnate/XN +condemnation/M +condemnatory +condemner/M +condemn/ZSGRDB +condensate/NMXS +condensation/M +condenser/M +condense/ZGSD +condensible +condescend +condescending/Y +condescension/MS +condign +condiment/SM +condition/AGSJD +conditionals +conditional/UY +conditioned/U +conditioner/MS +conditioning/M +condition's +condole +condolence/MS +condominium/MS +condom/SM +condone/GRSD +condoner/M +Condorcet/M +condor/MS +condo/SM +conduce/VGSD +conduciveness/M +conducive/P +conductance/SM +conductibility/SM +conductible +conduction/MS +conductive/Y +conductivity/MS +conductor/MS +conductress/MS +conduct/V +conduit/MS +coneflower/M +Conestoga +coney's +confabbed +confabbing +confab/MS +confabulate/XSDGN +confabulation/M +confectioner/M +confectionery/SM +confectionist +confection/RDMGZS +confect/S +Confederacy/M +confederacy/MS +confederate/M +Confederate/S +conferee/MS +conference/DSGM +conferrable +conferral/SM +conferred +conferrer/SM +conferring +confer/SB +confessed/Y +confessional/SY +confession/MS +confessor/SM +confetti/M +confidante/SM +confidant/SM +confidence/SM +confidentiality/MS +confidentialness/M +confidential/PY +confident/Y +confider/M +confide/ZGRSD +confiding/PY +configuration/ASM +configure/AGSDB +confined/U +confine/L +confinement/MS +confiner/M +confirm/AGDS +confirmation/ASM +confirmatory +confirmedness/M +confirmed/YP +confiscate/DSGNX +confiscation/M +confiscator/MS +confiscatory +conflagration/MS +conflate/NGSDX +conflation/M +conflicting/Y +conflict/SVGDM +confluence/MS +conformable/U +conformal +conformance/SM +conformational/Y +conform/B +conformer/M +conformism/SM +conformist/SM +conformities +conformity/MUI +confounded/Y +confound/R +confrčre/MS +confrontational +confrontation/SM +confronter/M +confront/Z +Confucianism/SM +Confucian/S +Confucius/M +confusedness/M +confused/PY +confuse/RBZ +confusing/Y +confutation/MS +confute/GRSD +confuter/M +conga/MDG +congeal/GSDL +congealment/MS +congeniality/UM +congenial/U +congeries/M +conger/SM +congestion/MS +congest/VGSD +conglomerate/XDSNGVM +conglomeration/M +Cong/M +Congolese +Congo/M +congrats +congratulate/NGXSD +congratulation/M +congratulatory +congregate/DSXGN +congregational +Congregational +congregationalism/MS +congregationalist/MS +Congregationalist/S +congregation/M +congressional/Y +congressman/M +congressmen +Congress/MS +congress/MSDG +congresspeople +congressperson/S +congresswoman/M +congresswomen +Congreve/M +congruence/IM +congruences +congruency/M +congruential +congruent/YI +congruity/MSI +congruousness/IM +congruous/YIP +conicalness/M +conical/PSY +conic/S +conics/M +conifer/MS +coniferous +conjectural/Y +conjecture/GMDRS +conjecturer/M +conjoint +conjugacy +conjugal/Y +conjugate/XVNGYSDP +conjugation/M +conjunct/DSV +conjunctiva/MS +conjunctive/YS +conjunctivitis/SM +conjuration/MS +conjurer/M +conjure/RSDZG +conjuring/M +conker/M +conk/ZDR +Conley/M +Con/M +conman +connect/ADGES +connectedly/E +connectedness/ME +connected/U +connectible +Connecticut/M +connection/AME +connectionless +connections/E +connective/SYM +connectivity/MS +connector/MS +Connelly/M +Conner/M +Connery/M +connexion/MS +Conney/M +conn/GVDR +Connie/M +Conni/M +conniption/MS +connivance/MS +conniver/M +connive/ZGRSD +connoisseur/MS +Connor/SM +connotative/Y +Conn/RM +connubial/Y +Conny/M +conquerable/U +conquered/AU +conqueror/MS +conquer/RDSBZG +conquers/A +conquest/ASM +conquistador/MS +Conrade/M +Conrad/M +Conrado/M +Conrail/M +Conroy/M +Consalve/M +consanguineous/Y +consanguinity/SM +conscienceless +conscientiousness/MS +conscientious/YP +conscionable/U +consciousness/MUS +conscious/UYSP +conscription/SM +consecrated/AU +consecrates/A +consecrate/XDSNGV +consecrating/A +consecration/AMS +consecutiveness/M +consecutive/YP +consensus/SM +consenter/M +consenting/Y +consent/SZGRD +consequence +consequentiality/S +consequential/IY +consequentialness/M +consequently/I +consequent/PSY +conservancy/SM +conservationism +conservationist/SM +conservation/SM +conservatism/SM +conservativeness/M +Conservative/S +conservative/SYP +conservator/MS +conservatory/MS +con/SGM +considerable/I +considerables +considerably/I +considerateness/MSI +considerate/XIPNY +consideration/ASMI +considered/U +considerer/M +consider/GASD +considering/S +consign/ASGD +consignee/SM +consignment/SM +consist/DSG +consistence/S +consistency/IMS +consistent/IY +consistory/MS +consolable/I +Consolata/M +consolation/MS +consolation's/E +consolatory +consoled/U +consoler/M +console/ZBG +consolidated/AU +consolidate/NGDSX +consolidates/A +consolidation/M +consolidator/SM +consoling/Y +consommé/S +consonance/IM +consonances +consonantal +consonant/MYS +consortia +consortium/M +conspectus/MS +conspicuousness/IMS +conspicuous/YIP +conspiracy/MS +conspiratorial/Y +conspirator/SM +constable +Constable/M +constabulary/MS +constance +Constance/M +Constancia/M +constancy/IMS +Constancy/M +Constanta/M +Constantia/M +Constantina/M +Constantine/M +Constantin/M +Constantino/M +Constantinople/M +constant/IY +constants +constellation/SM +consternate/XNGSD +consternation/M +constipate/XDSNG +constipation/M +constituency/MS +constituent/SYM +constituted/A +constitute/NGVXDS +constitutes/A +constituting/A +Constitution +constitutionality's +constitutionality/US +constitutionally/U +constitutional/SY +constitution/AMS +constitutive/Y +constrain +constrainedly +constrained/U +constraint/MS +constriction/MS +constrictor/MS +constrict/SDGV +construable +construct/ASDGV +constructibility +constructible/A +constructional/Y +constructionist/MS +construction/MAS +constructions/C +constructiveness/SM +constructive/YP +constructor/MS +construe/GSD +Consuela/M +Consuelo/M +consular/S +consulate/MS +consul/KMS +consulship/MS +consultancy/S +consultant/MS +consultation/SM +consultative +consulted/A +consulter/M +consult/RDVGS +consumable/S +consumed/Y +consume/JZGSDB +consumerism/MS +consumerist/S +consumer/M +consuming/Y +consummate/DSGVY +consummated/U +consumption/SM +consumptive/YS +cont +contact/BGD +contacted/A +contact's/A +contacts/A +contagion/SM +contagiousness/MS +contagious/YP +containerization/SM +containerize/GSD +container/M +containment/SM +contain/SLZGBRD +contaminant/SM +contaminated/AU +contaminates/A +contaminate/SDCXNG +contaminating/A +contamination/CM +contaminative +contaminator/MS +contd +cont'd +contemn/SGD +contemplate/DVNGX +contemplation/M +contemplativeness/M +contemplative/PSY +contemporaneity/MS +contemporaneousness/M +contemporaneous/PY +contemptibleness/M +contemptible/P +contemptibly +contempt/M +contemptuousness/SM +contemptuous/PY +contentedly/E +contentedness/SM +contented/YP +content/EMDLSG +contention/MS +contentiousness/SM +contentious/PY +contently +contentment/ES +contentment's +conterminous/Y +contestable/I +contestant/SM +contested/U +contextualize/GDS +contiguity/MS +contiguousness/M +contiguous/YP +continence/ISM +Continental/S +continental/SY +continent/IY +Continent/M +continents +continent's +contingency/SM +contingent/SMY +continua +continuable +continual/Y +continuance/ESM +continuant/M +continuation/ESM +continue/ESDG +continuer/M +continuity/SEM +continuousness/M +continuous/YE +continuum/M +contortionist/SM +contortion/MS +contort/VGD +contour +contraband/SM +contrabass/M +contraception/SM +contraceptive/S +contract/DG +contractible +contractile +contractual/Y +contradict/GDS +contradiction/MS +contradictorily +contradictoriness/M +contradictory/PS +contradistinction/MS +contraflow/S +contrail/M +contraindicate/SDVNGX +contraindication/M +contralto/SM +contrapositive/S +contraption/MS +contrapuntal/Y +contrariety/MS +contrarily +contrariness/MS +contrariwise +contrary/PS +contra/S +contrasting/Y +contrastive/Y +contrast/SRDVGZ +contravene/GSRD +contravener/M +contravention/MS +Contreras/M +contretemps/M +contribute/XVNZRD +contribution/M +contributive/Y +contributorily +contributor/SM +contributory/S +contriteness/M +contrite/NXP +contrition/M +contrivance/SM +contriver/M +contrive/ZGRSD +control/CS +controllability/M +controllable/IU +controllably/U +controlled/CU +controller/SM +controlling/C +control's +controversialists +controversial/UY +controversy/MS +controvert/DGS +controvertible/I +contumacious/Y +contumacy/MS +contumelious +contumely/MS +contuse/NGXSD +contusion/M +conundrum/SM +conurbation/MS +convalesce/GDS +convalescence/SM +convalescent/S +convect/DSVG +convectional +convection/MS +convector +convene/ASDG +convener/MS +convenience/ISM +convenient/IY +conventicle/SM +conventionalism/M +conventionalist/M +conventionality/SUM +conventionalize/GDS +conventional/UY +convention/MA +conventions +convergence/MS +convergent +conversant/Y +conversationalist/SM +conversational/Y +conversation/SM +conversazione/M +converse/Y +conversion/AM +conversioning +converted/U +converter/MS +convert/GADS +convertibility's/I +convertibility/SM +convertibleness/M +convertible/PS +convexity/MS +convex/Y +conveyance/DRSGMZ +conveyancer/M +conveyancing/M +convey/BDGS +conveyor/MS +conviction/MS +convict/SVGD +convinced/U +convincer/M +convince/RSDZG +convincingness/M +convincing/PUY +conviviality/MS +convivial/Y +convoke/GSD +convolute/XDNY +convolution/M +convolve/C +convolved +convolves +convolving +convoy/GMDS +convulse/SDXVNG +convulsion/M +convulsiveness/M +convulsive/YP +Conway/M +cony/SM +coo/GSD +cookbook/SM +cooked/AU +Cooke/M +cooker/M +cookery/MS +cook/GZDRMJS +Cookie/M +cookie/SM +cooking/M +Cook/M +cookout/SM +cooks/A +cookware/SM +cooky's +coolant/SM +cooled/U +cooler/M +Cooley/M +coolheaded +Coolidge/M +coolie/MS +coolness/MS +cool/YDRPJGZTS +coon/MS! +coonskin/MS +cooperage/MS +cooperate/VNGXSD +cooperation/M +cooperativeness/SM +cooperative/PSY +cooperator/MS +cooper/GDM +Cooper/M +coop/MDRGZS +Coop/MR +coordinated/U +coordinateness/M +coordinate/XNGVYPDS +coordination/M +coordinator/MS +Coors/M +cootie/SM +coot/MS +copay/S +Copeland/M +Copenhagen/M +coper/M +Copernican +Copernicus/M +cope/S +copied/A +copier/M +copies/A +copilot/SM +coping/M +copiousness/SM +copious/YP +coplanar +Copland/M +Copley/M +copolymer/MS +copora +copped +Copperfield/M +copperhead/MS +copper/MSGD +copperplate/MS +coppersmith/M +coppersmiths +coppery +coppice's +copping +Coppola/M +copra/MS +coprolite/M +coprophagous +copse/M +cops/GDS +cop/SJMDRG +copter/SM +Coptic/M +copula/MS +copulate/XDSNGV +copulation/M +copulative/S +copybook/MS +copycat/SM +copycatted +copycatting +copyist/SM +copy/MZBDSRG +copyrighter/M +copyright/MSRDGZ +copywriter/MS +coquetry/MS +coquette/DSMG +coquettish/Y +Corabella/M +Corabelle/M +Corabel/M +coracle/SM +Coralie/M +Coraline/M +coralline +Coral/M +coral/SM +Coralyn/M +Cora/M +corbel/GMDJS +Corbet/M +Corbett/M +Corbie/M +Corbin/M +Corby/M +cordage/MS +corded/AE +Cordelia/M +Cordelie/M +Cordell/M +corder/AM +Cordey/M +cord/FSAEM +cordiality/MS +cordialness/M +cordial/PYS +Cordie/M +cordillera/MS +Cordilleras +Cordi/M +cording/MA +cordite/MS +cordless +Cord/M +Cordoba +cordon/DMSG +cordovan/SM +Cordula/M +corduroy/GDMS +Cordy/M +cored/A +Coreen/M +Corella/M +core/MZGDRS +Corenda/M +Corene/M +corer/M +corespondent/MS +Coretta/M +Corette/M +Corey/M +Corfu/M +corgi/MS +coriander/SM +Corie/M +Corilla/M +Cori/M +Corina/M +Corine/M +coring/M +Corinna/M +Corinne/M +Corinthian/S +Corinthians/M +Corinth/M +Coriolanus/M +Coriolis/M +Corissa/M +Coriss/M +corked/U +corker/M +cork/GZDRMS +Cork/M +corkscrew/DMGS +corks/U +Corliss/M +Corly/M +Cormack/M +corm/MS +cormorant/MS +Cornall/M +cornball/SM +cornbread/S +corncob/SM +corncrake/M +corneal +cornea/SM +Corneille/M +Cornela/M +Cornelia/M +Cornelius/M +Cornelle/M +Cornell/M +corner/GDM +cornerstone/MS +cornet/SM +Corney/M +cornfield/SM +cornflake/S +cornflour/M +cornflower/SM +corn/GZDRMS +cornice/GSDM +Cornie/M +cornily +corniness/S +Cornish/S +cornmeal/S +cornrow/GDS +cornstalk/MS +cornstarch/SM +cornucopia/MS +Cornwallis/M +Cornwall/M +Corny/M +corny/RPT +corolla/MS +corollary/SM +Coronado/M +coronal/MS +coronary/S +corona/SM +coronate/NX +coronation/M +coroner/MS +coronet/DMS +Corot/M +coroutine/SM +Corp +corporal/SYM +corpora/MS +corporate/INVXS +corporately +corporation/MI +corporatism/M +corporatist +corporeality/MS +corporeal/IY +corporealness/M +corp/S +corpse/M +corpsman/M +corpsmen +corps/SM +corpulence/MS +corpulentness/S +corpulent/YP +corpuscle/SM +corpuscular +corpus/M +corr +corralled +corralling +corral/MS +correctable/U +correct/BPSDRYTGV +corrected/U +correctional +correction/MS +corrective/YPS +correctly/I +correctness/MSI +corrector/MS +Correggio/M +correlated/U +correlate/SDXVNG +correlation/M +correlative/YS +Correna/M +correspond/DSG +correspondence/MS +correspondent/SM +corresponding/Y +Correy/M +Corrianne/M +corridor/SM +Corrie/M +corrigenda +corrigendum/M +corrigible/I +Corri/M +Corrina/M +Corrine/M +Corrinne/M +corroborated/U +corroborate/GNVXDS +corroboration/M +corroborative/Y +corroborator/MS +corroboratory +corrode/SDG +corrodible +corrosion/SM +corrosiveness/M +corrosive/YPS +corrugate/NGXSD +corrugation/M +corrupt/DRYPTSGV +corrupted/U +corrupter/M +corruptibility/SMI +corruptible/I +corruption/IM +corruptions +corruptive/Y +corruptness/MS +Corry/M +corsage/MS +corsair/SM +corset/GMDS +Corsica/M +Corsican/S +cortčge/MS +Cortes/S +cortex/M +Cortez's +cortical/Y +cortices +corticosteroid/SM +Cortie/M +cortisone/SM +Cortland/M +Cort/M +Cortney/M +Corty/M +corundum/MS +coruscate/XSDGN +coruscation/M +Corvallis/M +corvette/MS +Corvus/M +Cory/M +Cos +Cosby/M +Cosetta/M +Cosette/M +cos/GDS +cosignatory/MS +cosign/SRDZG +cosily +Cosimo/M +cosine/MS +cosiness/MS +Cosme/M +cosmetically +cosmetician/MS +cosmetic/SM +cosmetologist/MS +cosmetology/MS +cosmic +cosmical/Y +cosmogonist/MS +cosmogony/SM +cosmological/Y +cosmologist/MS +cosmology/SM +Cosmo/M +cosmonaut/MS +cosmopolitanism/MS +cosmopolitan/SM +cosmos/SM +cosponsor/DSG +cossack/S +Cossack/SM +cosset/GDS +Costa/M +Costanza/M +costarred +costarring +costar/S +Costello/M +costiveness/M +costive/PY +costless +costliness/SM +costly/RTP +cost/MYGVJS +Costner/M +costumer/M +costume/ZMGSRD +cotangent/SM +Cote/M +cote/MS +coterie/MS +coterminous/Y +cotillion/SM +Cotonou/M +Cotopaxi/M +cot/SGMD +cottager/M +cottage/ZMGSRD +cottar's +cotted +cotter/SDM +cotton/GSDM +Cotton/M +cottonmouth/M +cottonmouths +cottonseed/MS +cottontail/SM +cottonwood/SM +cottony +cotyledon/MS +couching/M +couch/MSDG +cougar/MS +cougher/M +cough/RDG +coughs +couldn't +could/T +could've +coulée/MS +Coulomb/M +coulomb/SM +councilman/M +councilmen +councilor/MS +councilperson/S +council/SM +councilwoman/M +councilwomen +counsel/GSDM +counsellings +counselor/MS +countability/E +countable/U +countably/U +countdown/SM +counted/U +count/EGARDS +countenance/EGDS +countenancer/M +countenance's +counteract/DSVG +counteraction/SM +counterargument/SM +counterattack/DRMGS +counterbalance/MSDG +counterclaim/GSDM +counterclockwise +counterculture/MS +countercyclical +counterespionage/MS +counterexample/S +counterfeiter/M +counterfeit/ZSGRD +counterflow +counterfoil/MS +counterforce/M +counter/GSMD +counterinsurgency/MS +counterintelligence/MS +counterintuitive +countermand/DSG +counterman/M +countermeasure/SM +countermen +counteroffensive/SM +counteroffer/SM +counterpane/SM +counterpart/SM +counterpoint/GSDM +counterpoise/GMSD +counterproductive +counterproposal/M +counterrevolutionary/MS +counterrevolution/MS +counter's/E +counters/E +countersignature/MS +countersign/SDG +countersink/SG +counterspy/MS +counterstrike +countersunk +countertenor/SM +countervail/DSG +counterweight/GMDS +countess/MS +countless/Y +countrify/D +countryman/M +countrymen +country/MS +countryside/MS +countrywide +countrywoman/M +countrywomen +county/SM +coup/ASDG +coupe/MS +Couperin/M +couple/ACU +coupled/CU +coupler/C +couplers +coupler's +couple's +couples/CU +couplet/SM +coupling's/C +coupling/SM +coupon/SM +coup's +courage/MS +courageously +courageousness/MS +courageous/U +courages/E +Courbet/M +courgette/MS +courier/GMDS +course/EGSRDM +courser's/E +courser/SM +course's/AF +courses/FA +coursework +coursing/M +Courtenay/M +courteousness/EM +courteousnesses +courteous/PEY +courtesan/MS +courtesied +courtesy/ESM +courtesying +court/GZMYRDS +courthouse/MS +courtier/SM +courtliness/MS +courtly/RTP +Court/M +Courtnay/M +Courtney/M +courtroom/MS +courtship/SM +courtyard/SM +couscous/MS +cousinly/U +cousin/YMS +Cousteau/M +couture/SM +couturier/SM +covalent/Y +covariance/SM +covariant/S +covariate/SN +covary +cove/DRSMZG +covenanted/U +covenanter/M +covenant/SGRDM +coven/SM +Covent/M +Coventry/MS +coverable/E +cover/AEGUDS +coverage/MS +coverall/DMS +coverer/AME +covering/MS +coverlet/MS +coversheet +covers/M +covertness/SM +covert/YPS +coveter/M +coveting/Y +covetousness/SM +covetous/PY +covet/SGRD +covey/SM +covington +cowardice/MS +cowardliness/MS +cowardly/P +Coward/M +coward/MYS +cowbell/MS +cowbird/MS +cowboy/MS +cowcatcher/SM +cowed/Y +cowering/Y +cower/RDGZ +cowgirl/MS +cowhand/S +cowherd/SM +cowhide/MGSD +Cowley/M +cowlick/MS +cowling/M +cowl/SGMD +cowman/M +cow/MDRSZG +cowmen +coworker/MS +Cowper/M +cowpoke/MS +cowpony +cowpox/MS +cowpuncher/M +cowpunch/RZ +cowrie/SM +cowshed/SM +cowslip/MS +coxcomb/MS +Cox/M +cox/MDSG +coxswain/GSMD +coy/CDSG +coyer +coyest +coyly +Coy/M +coyness/MS +coyote/SM +coypu/SM +cozenage/MS +cozen/SGD +cozily +coziness/MS +Cozmo/M +Cozumel/M +cozy/DSRTPG +CPA +cpd +CPI +cpl +Cpl +CPO +CPR +cps +CPU/SM +crabapple +crabbedness/M +crabbed/YP +Crabbe/M +crabber/MS +crabbily +crabbiness/S +crabbing/M +crabby/PRT +crabgrass/S +crablike +crab/MS +crackable/U +crackdown/MS +crackerjack/S +cracker/M +crackle/GJDS +crackling/M +crackly/RT +crackpot/SM +crackup/S +crack/ZSBYRDG +cradler/M +cradle/SRDGM +cradling/M +craftily +craftiness/SM +Craft/M +craft/MRDSG +craftsman/M +craftsmanship/SM +craftsmen +craftspeople +craftspersons +craftswoman +craftswomen +crafty/TRP +Craggie/M +cragginess/SM +Craggy/M +craggy/RTP +crag/SM +Craig/M +Cramer/M +crammed +crammer/M +cramming +cramper/M +cramp/MRDGS +crampon/SM +cram/S +Cranach/M +cranberry/SM +Crandall/M +crane/DSGM +cranelike +Crane/M +Cranford/M +cranial +cranium/MS +crankcase/MS +crankily +crankiness/MS +crank/SGTRDM +crankshaft/MS +cranky/TRP +Cranmer/M +cranny/DSGM +Cranston/M +crape/SM +crapped +crappie/M +crapping +crappy/RST +crapshooter/SM +crap/SMDG! +crasher/M +crashing/Y +crash/SRDGZ +crassness/MS +crass/TYRP +crate/DSRGMZ +crater/DMG +Crater/M +cravat/SM +cravatted +cravatting +crave/DSRGJ +cravenness/SM +craven/SPYDG +craver/M +craving/M +crawdad/S +crawfish's +Crawford/M +crawler/M +crawl/RDSGZ +crawlspace/S +crawlway +crawly/TRS +craw/SYM +crayfish/GSDM +Crayola/M +crayon/GSDM +Cray/SM +craze/GMDS +crazily +craziness/MS +crazy/SRTP +creakily +creakiness/SM +creak/SDG +creaky/PTR +creamer/M +creamery/MS +creamily +creaminess/SM +cream/SMRDGZ +creamy/TRP +creased/CU +crease/IDRSG +crease's +creases/C +creasing/C +created/U +create/XKVNGADS +creationism/MS +creationist/MS +Creation/M +creation/MAK +creativeness/SM +creative/YP +creativities +creativity/K +creativity's +Creator/M +creator/MS +creatureliness/M +creaturely/P +creature/YMS +crčche/SM +credence/MS +credent +credential/SGMD +credenza/SM +credibility/IMS +credible/I +credibly/I +creditability/M +creditableness/M +creditable/P +creditably/E +credited/U +credit/EGBSD +creditor/MS +credit's +creditworthiness +credo/SM +credulity/ISM +credulous/IY +credulousness/SM +creedal +creed/C +creeds +creed's +creekside +creek/SM +Creek/SM +creel/SMDG +Cree/MDS +creeper/M +creepily +creepiness/SM +creep/SGZR +creepy/PRST +Creigh/M +Creight/M +Creighton/M +cremate/XDSNG +cremation/M +crematoria +crematorium/MS +crematory/S +creme/S +crenelate/XGNSD +crenelation/M +Creole/MS +creole/SM +Creon/M +creosote/MGDS +crepe/DSGM +crept +crescendoed +crescendoing +crescendo/SCM +crescent/MS +cress/S +crestfallenness/M +crestfallen/PY +cresting/M +crestless +crest/SGMD +Crestview/M +cretaceous +Cretaceously/M +Cretaceous/Y +Cretan/S +Crete/M +cretinism/MS +cretin/MS +cretinous +cretonne/SM +crevasse/DSMG +crevice/SM +crew/DMGS +crewel/SM +crewelwork/SM +crewman/M +crewmen +cribbage/SM +cribbed +cribber/SM +cribbing/M +crib/SM +Crichton/M +cricketer/M +cricket/SMZRDG +crick/GDSM +Crick/M +cried/C +crier/CM +cries/C +Crimea/M +Crimean +crime/GMDS +criminality/MS +criminalization/C +criminalize/GC +criminal/SYM +criminologist/SM +criminology/MS +crimper/M +crimp/RDGS +crimson/DMSG +cringer/M +cringe/SRDG +crinkle/DSG +crinkly/TRS +Crin/M +crinoline/SM +cripple/GMZDRS +crippler/M +crippling/Y +Crisco/M +crises +crisis/M +Cris/M +crisper/M +crispiness/SM +crispness/MS +crisp/PGTYRDS +crispy/RPT +criss +crisscross/GDS +Crissie/M +Crissy/M +Cristabel/M +Cristal/M +Crista/M +Cristen/M +Cristian/M +Cristiano/M +Cristie/M +Cristi/M +Cristina/M +Cristine/M +Cristin/M +Cristionna/M +Cristobal/M +Cristy/M +criteria +criterion/M +criticality +critically/U +criticalness/M +critical/YP +criticism/MS +criticized/U +criticize/GSRDZ +criticizer/M +criticizes/A +criticizingly/S +criticizing/UY +critic/MS +critique/MGSD +critter/SM +Cr/M +croaker/M +croak/SRDGZ +croaky/RT +Croatia/M +Croatian/S +Croat/SM +Croce/M +crocheter/M +crochet/RDSZJG +crockery/SM +Crockett/M +Crockpot/M +crock/SGRDM +crocodile/MS +crocus/SM +Croesus/SM +crofter/M +croft/MRGZS +croissant/MS +Croix/M +Cromwellian +Cromwell/M +crone/SM +Cronin/M +Cronkite/M +Cronus/M +crony/SM +crookedness/SM +crooked/TPRY +Crookes/M +crookneck/MS +crook/SGDM +crooner/M +croon/SRDGZ +cropland/MS +crop/MS +cropped +cropper/SM +cropping +croquet/MDSG +croquette/SM +Crosby/M +crosier/SM +crossarm +crossbarred +crossbarring +crossbar/SM +crossbeam/MS +crossbones +crossbowman/M +crossbowmen +crossbow/SM +crossbred/S +crossbreed/SG +crosscheck/SGD +crosscurrent/SM +crosscut/SM +crosscutting +crossed/UA +crosses/UA +crossfire/SM +crosshatch/GDS +crossing/M +Cross/M +crossness/MS +crossover/MS +crosspatch/MS +crosspiece/SM +crosspoint +crossproduct/S +crossroad/GSM +crossroads/M +crosstalk/M +crosstown +crosswalk/MS +crossway/M +crosswind/SM +crosswise +crossword/MS +cross/ZTYSRDMPBJG +crotchetiness/M +crotchet/MS +crotchety/P +crotchless +crotch/MDS +crouch/DSG +croupier/M +croup/SMDG +croupy/TZR +croűton/MS +crowbait +crowbarred +crowbarring +crowbar/SM +crowdedness/M +crowded/P +crowd/MRDSG +crowfeet +crowfoot/M +crow/GDMS +Crowley/M +crowned/U +crowner/M +crown/RDMSJG +crozier's +CRT/S +crucial/Y +crucible/MS +crucifiable +crucifixion/MS +Crucifixion/MS +crucifix/SM +cruciform/S +crucify/NGDS +crudded +crudding +cruddy/TR +crudeness/MS +crude/YSP +crudités +crudity/MS +crud/STMR +cruelness/MS +cruelty/SM +cruel/YRTSP +cruet/MS +cruft +crufty +Cruikshank/M +cruise/GZSRD +cruiser/M +cruller/SM +crumb/GSYDM +crumble/DSJG +crumbliness/MS +crumbly/PTRS +crumby/RT +crumminess/S +crummy/SRTP +crump +crumpet/SM +crumple/DSG +crunch/DSRGZ +crunchiness/MS +crunchy/TRP +crupper/MS +crusade/GDSRMZ +crusader/M +cruse/MS +crushable/U +crusher/M +crushing/Y +crushproof +crush/SRDBGZ +Crusoe/M +crustacean/MS +crustal +crust/GMDS +crustily +crustiness/SM +crusty/SRTP +crutch/MDSG +Crux/M +crux/MS +Cruz/M +crybaby/MS +cry/JGDRSZ +cryogenic/S +cryogenics/M +cryostat/M +cryosurgery/SM +cryptanalysis/M +cryptanalyst/M +cryptanalytic +crypt/CS +cryptic +cryptically +cryptogram/MS +cryptographer/MS +cryptographic +cryptographically +cryptography/MS +cryptologic +cryptological +cryptologist/M +cryptology/M +Cryptozoic/M +crypt's +crystalline/S +crystallite/SM +crystallization/AMS +crystallized/UA +crystallizes/A +crystallize/SRDZG +crystallizing/A +crystallographer/MS +crystallographic +crystallography/M +Crystal/M +crystal/SM +Crysta/M +Crystie/M +Cs +C's +cs/EA +cs's +CST +ct +CT +Cthrine/M +Ct/M +ctn +ctr +Cuba/M +Cuban/S +cubbed +cubbing +cubbyhole/MS +cuber/M +cube/SM +cubical/Y +cubicle/SM +cubic/YS +cubism/SM +cubist/MS +cubit/MS +cub/MDRSZG +cuboid +Cuchulain/M +cuckold/GSDM +cuckoldry/MS +cuckoo/SGDM +cucumber/MS +cuddle/GSD +cuddly/TRP +cu/DG +cudgel/GSJMD +cud/MS +cue/MS +cuff/GSDM +Cuisinart/M +cuisine/MS +Culbertson/M +culinary +Cullan/M +cull/DRGS +cullender's +Cullen/M +culler/M +Culley/M +Cullie/M +Cullin/M +Cull/MN +Cully/M +culminate/XSDGN +culmination/M +culotte/S +culpability/MS +culpable/I +culpableness/M +culpably +culpa/SM +culprit/SM +cultism/SM +cultist/SM +cultivable +cultivated/U +cultivate/XBSDGN +cultivation/M +cultivator/SM +cult/MS +cultural/Y +cultured/U +culture/SDGM +Culver/MS +culvert/SM +Cu/M +cumber/DSG +Cumberland/M +cumbersomeness/MS +cumbersome/YP +cumbrous +cumin/MS +cummerbund/MS +Cummings +cumquat's +cum/S +cumulate/XVNGSD +cumulation/M +cumulative/Y +cumuli +cumulonimbi +cumulonimbus/M +cumulus/M +Cunard/M +cuneiform/S +cunnilingus/SM +Cunningham/M +cunningness/M +cunning/RYSPT +cunt/SM! +cupboard/SM +cupcake/SM +Cupertino/M +cupful/SM +cupidinously +cupidity/MS +Cupid/M +cupid/S +cup/MS +cupola/MDGS +cupped +cupping/M +cupric +cuprous +curability/MS +curable/IP +curableness/MI +curably/I +Curacao/M +curacy/SM +curare/MS +curate/VGMSD +curative/YS +curatorial +curator/KMS +curbing/M +curbside +curb/SJDMG +curbstone/MS +Curcio/M +curdle/SDG +curd/SMDG +cured/U +cure/KBDRSGZ +curer/MK +curettage/SM +curfew/SM +curfs +curiae +curia/M +cur/IBS +Curie/M +curie/SM +curiosity/SM +curio/SM +curiousness/SM +curious/TPRY +Curitiba/M +curium/MS +curler/SM +curlew/MS +curlicue/MGDS +curliness/SM +curling/M +curl/UDSG +curlycue's +curly/PRT +curmudgeon/MYS +Curran/M +currant/SM +curred/AFI +currency's +currency/SF +current/FSY +currently/A +currentness/M +Currey/M +curricle/M +curricula +curricular +curriculum/M +Currie/M +currier/M +Currier/M +curring/FAI +Curr/M +currycomb/DMGS +Curry/MR +curry/RSDMG +cur's +curs/ASDVG +curse/A +cursedness/M +cursed/YRPT +curse's +cursive/EPYA +cursiveness/EM +cursives +cursor/DMSG +cursorily +cursoriness/SM +cursory/P +curtailer/M +curtail/LSGDR +curtailment/SM +curtain/GSMD +Curtice/M +Curtis/M +Curt/M +curtness/MS +curtsey's +curtsy/SDMG +curt/TYRP +curvaceousness/S +curvaceous/YP +curvature/MS +curved/A +curved's +curve/DSGM +curvilinearity/M +curvilinear/Y +curving/M +curvy/RT +cushion/SMDG +Cushman/M +cushy/TR +cuspid/MS +cuspidor/MS +cusp/MS +cussedness/M +cussed/YP +cuss/EGDSR +cusses/F +cussing/F +cuss's +custard/MS +Custer/M +custodial +custodianship/MS +custodian/SM +custody/MS +customarily +customariness/M +customary/PS +customer/M +customhouse/S +customization/SM +customize/ZGBSRD +custom/SMRZ +cutaneous/Y +cutaway/SM +cutback/SM +cuteness/MS +cute/SPY +cutesy/RT +cuticle/SM +cutlass/MS +cutler/SM +cutlery/MS +cutlet/SM +cut/MRST +cutoff/MS +cutout/SM +cutter/SM +cutthroat/SM +cutting/MYS +cuttlebone/SM +cuttlefish/MS +cuttle/M +cutup/MS +cutworm/MS +Cuvier/M +Cuzco/M +CV +cw +cwt +Cyanamid/M +cyanate/M +cyanic +cyanide/GMSD +cyan/MS +cyanogen/M +Cybele/M +cybernetic/S +cybernetics/M +cyberpunk/S +cyberspace/S +Cybill/M +Cybil/M +Cyb/M +cyborg/S +Cyclades +cyclamen/MS +cycle/ASDG +cycler +cycle's +cycleway/S +cyclic +cyclical/SY +cycling/M +cyclist/MS +cyclohexanol +cycloidal +cycloid/SM +cyclometer/MS +cyclone/SM +cyclonic +cyclopean +cyclopedia/MS +cyclopes +Cyclopes +cyclops +Cyclops/M +cyclotron/MS +cyder/SM +cygnet/MS +Cygnus/M +cylinder/GMDS +cylindric +cylindrical/Y +Cy/M +cymbalist/MS +cymbal/SM +Cymbre/M +Cynde/M +Cyndia/M +Cyndie/M +Cyndi/M +Cyndy/M +cynical/UY +cynicism/MS +cynic/MS +cynosure/SM +Cynthea/M +Cynthia/M +Cynthie/M +Cynthy/M +cypher/MGSD +cypreses +cypress/SM +Cyprian +Cypriot/SM +Cyprus/M +Cyrano/M +Cyrille/M +Cyrillic +Cyrill/M +Cyrillus/M +Cyril/M +Cyrus/M +cystic +cyst/MS +cytochemistry/M +cytochrome/M +cytologist/MS +cytology/MS +cytolysis/M +cytoplasmic +cytoplasm/SM +cytosine/MS +cytotoxic +CZ +czarevitch/M +czarina/SM +czarism/M +czarist/S +czarship +czar/SM +Czech +Czechoslovakia/M +Czechoslovakian/S +Czechoslovak/S +Czechs +Czerniak/M +Czerny/M +D +DA +dabbed +dabber/MS +dabbing +dabbler/M +dabble/RSDZG +dab/S +Dacca's +dace/MS +Dacey/M +dacha/SM +Dachau/M +dachshund/SM +Dacia/M +Dacie/M +Dacron/MS +dactylic/S +dactyl/MS +Dacy/M +Dadaism/M +dadaism/S +Dadaist/M +dadaist/S +Dada/M +daddy/SM +Dade/M +dado/DMG +dadoes +dad/SM +Daedalus/M +Dael/M +daemonic +daemon/SM +Daffie/M +Daffi/M +daffiness/S +daffodil/MS +Daffy/M +daffy/PTR +daftness/MS +daft/TYRP +DAG +dagger/DMSG +Dag/M +Dagmar/M +Dagny/M +Daguerre/M +daguerreotype/MGDS +Dagwood/M +Dahlia/M +dahlia/MS +Dahl/M +Dahomey/M +Daile/M +dailiness/MS +daily/PS +Daimler/M +daintily +daintiness/MS +dainty/TPRS +daiquiri/SM +dairying/M +dairyland +dairymaid/SM +dairyman/M +dairymen +dairy/MJGS +dairywoman/M +dairywomen +Daisey/M +Daisie/M +Daisi/M +dais/SM +Daisy/M +daisy/SM +Dakar/M +Dakotan +Dakota/SM +Dale/M +Dalenna/M +dale/SMH +daleth/M +Daley/M +Dalhousie/M +Dalia/M +Dalian/M +Dalila/M +Dali/SM +Dallas/M +dalliance/SM +dallier/M +Dalli/MS +Dall/M +Dallon/M +dally/ZRSDG +Dal/M +Dalmatia/M +dalmatian/S +Dalmatian/SM +Daloris/M +Dalston/M +Dalt/M +Dalton/M +Daly/M +damageable +damaged/U +damage/MZGRSD +damager/M +damaging/Y +Damara/M +Damaris/M +Damascus/M +damask/DMGS +dame/SM +Dame/SMN +Damian/M +Damiano/M +Damien/M +Damion/M +Damita/M +dam/MDS +dammed +damming +dammit/S +damnably +damnation/MS +damnedest/MS +damned/TR +damn/GSBRD +damning/Y +Damocles/M +Damon/M +damped/U +dampener/M +dampen/RDZG +damper/M +dampness/MS +damp/SGZTXYRDNP +damselfly/MS +damsel/MS +damson/MS +Danaë +Dana/M +Danbury/M +dancelike +dancer/M +dance/SRDJGZ +dandelion/MS +dander/DMGS +dandify/SDG +dandily +dandle/GSD +dandruff/MS +dandy/TRSM +Danelaw/M +Danella/M +Danell/M +Dane/SM +Danette/M +danger/DMG +Dangerfield/M +dangerousness/M +dangerous/YP +dangler/M +dangle/ZGRSD +dangling/Y +dang/SGZRD +Danial/M +Dania/M +Danica/M +Danice/M +Daniela/M +Daniele/M +Daniella/M +Danielle/M +Daniel/SM +Danielson/M +Danie/M +Danika/M +Danila/M +Dani/M +Danish +danish/S +Danita/M +Danit/M +dankness/MS +dank/TPYR +Danna/M +Dannel/M +Dannie/M +Danni/M +Dannye/M +Danny/M +danseuse/SM +Dan/SM +Dante/M +Danton/M +Danube/M +Danubian +Danville/M +Danya/M +Danyelle/M +Danyette/M +Danzig/M +Daphene/M +Daphna/M +Daphne/M +dapperness/M +dapper/PSTRY +dapple/SDG +Dara/M +Darbee/M +Darbie/M +Darb/M +Darby/M +Darcee/M +Darcey/M +Darcie/M +Darci/M +D'Arcy +Darcy/M +Darda/M +Dardanelles +daredevil/MS +daredevilry/S +Dareen/M +Darelle/M +Darell/M +Dare/M +Daren/M +darer/M +daresay +dare/ZGDRSJ +d'Arezzo +Daria/M +Darice/M +Darill/M +Dari/M +daringness/M +daring/PY +Darin/M +Dario/M +Darius/M +Darjeeling/M +darkener/M +darken/RDZG +dark/GTXYRDNSP +darkish +darkly/TR +darkness/MS +darkroom/SM +Darla/M +Darleen/M +Darlene/M +Darline/M +Darling/M +darlingness/M +Darlington/M +darling/YMSP +Darlleen/M +Dar/MNH +Darnall/M +darned/TR +Darnell/M +darner/M +darn/GRDZS +darning/M +Darn/M +Daron/M +DARPA/M +Darrelle/M +Darrell/M +Darrel/M +Darren/M +Darrick/M +Darrin/M +Darrow/M +Darryl/M +Darsey/M +Darsie/M +d'art +dartboard/SM +darter/M +Darth/M +Dartmouth/M +dart/MRDGZS +Darvon/M +Darwinian/S +Darwinism/MS +Darwinist/MS +Darwin/M +Darya/M +Daryle/M +Daryl/M +Daryn/M +Dasha/M +dashboard/SM +dasher/M +dash/GZSRD +dashiki/SM +dashing/Y +Dasie/M +Dasi/M +dastardliness/SM +dastardly/P +dastard/MYS +Dasya/M +DAT +database/DSMG +datafile +datagram/MS +data/M +Datamation/M +Datamedia/M +dataset/S +datedly +datedness +date/DRSMZGV +dated/U +dateless +dateline/DSMG +dater/M +Datha/M +dative/S +Datsun/M +datum/MS +dauber/M +daub/RDSGZ +Daugherty/M +daughter/MYS +Daumier/M +Daune/M +daunt/DSG +daunted/U +daunting/Y +dauntlessness/SM +dauntless/PY +dauphin/SM +Davao/M +Daveen/M +Dave/M +Daven/M +Davenport/M +davenport/MS +Daveta/M +Davey/M +Davida/M +Davidde/M +Davide/M +David/SM +Davidson/M +Davie/M +Davina/M +Davine/M +Davinich/M +Davin/M +Davis/M +Davita/M +davit/SM +Dav/MN +Davon/M +Davy/SM +dawdler/M +dawdle/ZGRSD +Dawes/M +Dawna/M +dawn/GSDM +Dawn/M +Dawson/M +daybed/S +daybreak/SM +daycare/S +daydreamer/M +daydream/RDMSZG +Dayle/M +daylight/GSDM +Day/M +Dayna/M +daysack +day/SM +daytime/SM +Dayton/M +dazed/PY +daze/DSG +dazzler/M +dazzle/ZGJRSD +dazzling/Y +db +DB +dbl +dB/M +DBMS +DC +DD +Ddene/M +DDS +DDT +DE +deacon/DSMG +deaconess/MS +deadbeat/SM +deadbolt/S +deadener/M +deadening/MY +deaden/RDG +deadhead/MS +deadline/MGDS +deadliness/SM +deadlock/MGDS +deadly/RPT +deadness/M +deadpanned +deadpanner +deadpanning +deadpan/S +dead/PTXYRN +deadwood/SM +deafening/MY +deafen/JGD +deafness/MS +deaf/TXPYRN +dealer/M +dealership/MS +dealing/M +deallocator +deal/RSGZJ +dealt +Deana/M +dean/DMG +Deandre/M +Deane/M +deanery/MS +Dean/M +Deanna/M +Deanne/M +Deann/M +deanship/SM +Dearborn/M +dearness/MS +dearth/M +dearths +dear/TYRHPS +deary/MS +deassign +deathbed/MS +deathblow/SM +deathless/Y +deathlike +deathly/TR +death/MY +deaths +deathtrap/SM +deathward +deathwatch/MS +debacle/SM +debarkation/SM +debark/G +debar/L +debarment/SM +debarring +debaser/M +debatable/U +debate/BMZ +debater/M +debauchedness/M +debauched/PY +debauchee/SM +debaucher/M +debauchery/SM +debauch/GDRS +Debbie/M +Debbi/M +Debby/M +Debee/M +debenture/MS +Debera/M +debilitate/NGXSD +debilitation/M +debility/MS +Debi/M +debit/DG +deb/MS +Deb/MS +debonairness/SM +debonair/PY +Deborah/M +Debora/M +Debor/M +debouch/DSG +Debra/M +debrief/GJ +debris/M +debtor/SM +debt/SM +Debussy/M +débutante/SM +debut/MDG +decade/MS +decadency/S +decadent/YS +decaffeinate/DSG +decaf/S +decagon/MS +Decalogue/M +decal/SM +decamp/L +decampment/MS +decapitate/GSD +decapitator/SM +decathlon/SM +Decatur/M +decay/GRD +Decca/M +Deccan/M +decease/M +decedent/MS +deceitfulness/SM +deceitful/PY +deceit/SM +deceived/U +deceiver/M +deceives/U +deceive/ZGRSD +deceivingly +deceiving/U +decelerate/XNGSD +deceleration/M +decelerator/SM +December/SM +decency/ISM +decennial/SY +decent/TIYR +deception/SM +deceptiveness/SM +deceptive/YP +decertify/N +dechlorinate/N +decibel/MS +decidability/U +decidable/U +decidedness/M +decided/PY +decide/GRSDB +deciduousness/M +deciduous/YP +decile/SM +deciliter/SM +decimal/SYM +decimate/XNGDS +decimation/M +decimeter/MS +decipherable/IU +decipher/BRZG +decipherer/M +decisional +decisioned +decisioning +decision/ISM +decisive/IPY +decisiveness/MSI +deckchair +decker/M +Decker/M +deck/GRDMSJ +deckhand/S +decking/M +Deck/RM +declamation/SM +declamatory +declarable +declaration/MS +declaration's/A +declarative/SY +declarator/MS +declaratory +declare/AGSD +declared/U +declarer/MS +declension/SM +declination/MS +decliner/M +decline/ZGRSD +declivity/SM +Dec/M +DEC/M +DECNET +DECnet/M +deco +décolletage/S +décolleté +decolletes +decolorising +decomposability/M +decomposable/IU +decompose/B +decompress/R +decongestant/S +deconstruction +deconvolution +decorated/AU +decorate/NGVDSX +decorates/A +decorating/A +decoration/ASM +decorativeness/M +decorative/YP +decorator/SM +decorousness/MS +decorousness's/I +decorous/PIY +decor/S +decorticate/GNDS +decortication/M +decorum/MS +decoupage/MGSD +decouple/G +decoy/M +decrease +decreasing/Y +decreeing +decree/RSM +decremental +decrement/DMGS +decrepit +decrepitude/SM +decriminalization/S +decriminalize/DS +decry/G +decrypt/GD +decryption +DECstation/M +DECsystem/M +DECtape/M +decustomised +Dedekind/M +Dede/M +dedicate/AGDS +dedicated/Y +dedication/MS +dedicative +dedicator/MS +dedicatory +Dedie/M +Dedra/M +deduce/RSDG +deducible +deductibility/M +deductible/S +deduction/SM +deductive/Y +deduct/VG +Deeanne/M +Deeann/M +deeded +Deedee/M +deeding +deed/IS +deed's +deejay/MDSG +Dee/M +deem/ADGS +deemphasis +Deena/M +deepen/DG +deepish +deepness/MS +deep/PTXSYRN +Deerdre/M +Deere/M +deerskin/MS +deer/SM +deerstalker/SM +deerstalking/M +Deeyn/M +deface/LZ +defacement/SM +defaecate +defalcate/NGXSD +defalcation/M +defamation/SM +defamatory +defamer/M +defame/ZR +defaulter/M +default/ZR +defeated/U +defeater/M +defeatism/SM +defeatist/SM +defeat/ZGD +defecate/DSNGX +defecation/M +defection/SM +defectiveness/MS +defective/PYS +defect/MDSVG +defector/MS +defendant/SM +defended/U +defenestrate/GSD +defenselessness/MS +defenseless/PY +defenses/U +defense/VGSDM +defensibility/M +defensible/I +defensibly/I +defensiveness/MS +defensive/PSY +deference/MS +deferential/Y +deferent/S +deferrable +deferral/SM +deferred +deferrer/MS +deferring +deffer +defiance/MS +defiant/Y +defibrillator/M +deficiency/MS +deficient/SY +deficit/MS +defier/M +defile/L +defilement/MS +definable/UI +definably/I +define/AGDRS +defined/U +definer/SM +definite/IPY +definiteness/IMS +definitional +definition/ASM +definitiveness/M +definitive/SYP +defis +deflate/XNGRSDB +deflationary +deflation/M +deflect/DSGV +deflected/U +deflection/MS +deflector/MS +defocus +defocussing +Defoe/M +defog +defogger/S +defoliant/SM +defoliator/SM +deformational +deform/B +deformed/U +deformity/SM +defrauder/M +defraud/ZGDR +defrayal/SM +defroster/M +defrost/RZ +deftness/MS +deft/TYRP +defunct/S +defying/Y +defy/RDG +def/Z +deg +Degas/M +degassing +degauss/GD +degeneracy/MS +degenerateness/M +degenerate/PY +degrade/B +degradedness/M +degraded/YP +degrading/Y +degrease +degree/SM +degum +Dehlia/M +dehumanize +dehydrator/MS +deicer/M +deice/ZR +deictic +Deidre/M +deification/M +deify/SDXGN +deign/DGS +Deimos/M +Deina/M +Deirdre/MS +deistic +deist/SM +Deity/M +deity/SM +deja +deject/DSG +dejectedness/M +dejected/PY +dejection/SM +Dejesus/M +DeKalb/M +DeKastere/M +Delacroix/M +Delacruz/M +Delainey/M +Dela/M +Delaney/M +Delano/M +Delawarean/SM +Delaware/MS +delay/D +delayer/G +Delbert/M +Delcina/M +Delcine/M +delectableness/M +delectable/SP +delectably +delectation/MS +delegable +Deleon/M +deleted/U +deleteriousness/M +deleterious/PY +delete/XBRSDNG +deletion/M +delfs +Delft/M +delft/MS +delftware/S +Delgado/M +Delhi/M +Delia/M +deliberateness/SM +deliberate/PVY +deliberativeness/M +deliberative/PY +Delibes/M +delicacy/IMS +delicate/IYP +delicatenesses +delicateness/IM +delicates +delicatessen/MS +deliciousness/MS +delicious/YSP +delicti +delightedness/M +delighted/YP +delightfulness/M +delightful/YP +Delilah/M +Delilahs +Delila/M +Delinda/M +delineate/SDXVNG +delineation/M +delinquency/MS +delinquent/SYM +deliquesce/GSD +deliquescent +deliriousness/MS +delirious/PY +delirium/SM +deli/SM +Delius/M +deliverables +deliverable/U +deliver/AGSD +deliverance/SM +delivered/U +deliverer/SM +delivery/AM +deliverymen/M +Della/M +Dell/M +dell/SM +Dellwood/M +Delly/M +Delmar/M +Delmarva/M +Delmer/M +Delmonico +Delmore/M +Delmor/M +Del/MY +Delora/M +Delores/M +Deloria/M +Deloris/M +Delphic +Delphi/M +Delphine/M +Delphinia/M +delphinium/SM +Delphinus/M +Delta/M +delta/MS +deltoid/SM +deluder/M +delude/RSDG +deluding/Y +deluge/SDG +delusional +delusion/SM +delusiveness/M +delusive/PY +deluxe +delve/GZSRD +delver/M +demagnify/N +demagogic +demagogue/GSDM +demagoguery/SM +demagogy/MS +demander/M +demand/GSRD +demandingly +demanding/U +demarcate/SDNGX +demarcation/M +Demavend/M +demean/GDS +demeanor/SM +dementedness/M +demented/YP +dementia/MS +Demerol/M +demesne/SM +Demeter/M +Demetra/M +Demetre/M +Demetria/M +Demetri/MS +Demetrius/M +demigod/MS +demijohn/MS +demimondaine/SM +demimonde/SM +demineralization/SM +Deming/M +demise/DMG +demit +demitasse/MS +demitted +demitting +Dem/MG +democracy/MS +Democratic +democratically/U +democratic/U +democratization/MS +democratize/DRSG +democratizes/U +Democrat/MS +democrat/SM +Democritus/M +démodé +demo/DMPG +demographer/MS +demographical/Y +demographic/S +demography/MS +demolisher/M +demolish/GSRD +demolition/MS +demonetization/S +demoniacal/Y +demoniac/S +demonic +demonology/M +demon/SM +demonstrable/I +demonstrableness/M +demonstrably/I +demonstrate/XDSNGV +demonstration/M +demonstrativenesses +demonstrativeness/UM +demonstratives +demonstrative/YUP +demonstrator/MS +demoralization/M +demoralizer/M +demoralizing/Y +DeMorgan/M +Demosthenes/M +demote/DGX +demotic/S +Demott/M +demount/B +Dempsey/M +demulcent/S +demultiplex +demureness/SM +demure/YP +demurral/MS +demurred +demurrer/MS +demurring +demur/RTS +demythologization/M +demythologize/R +den +Dena/M +dendrite/MS +Deneb/M +Denebola/M +Deneen/M +Dene/M +Deng/M +dengue/MS +deniable/U +denial/SM +Denice/M +denier/M +denigrate/VNGXSD +denigration/M +denim/SM +Denise/M +Deni/SM +denizen/SMDG +Den/M +De/NM +Denmark/M +Denna/M +denned +Dennet/M +Denney/M +Dennie/M +Denni/MS +denning +Dennison/M +Denny/M +denominate/V +denominational/Y +denote/B +denouement/MS +denounce/LZRSDG +denouncement/SM +denouncer/M +dense/FR +densely +denseness/SM +densitometer/MS +densitometric +densitometry/M +density/MS +dens/RT +dental/YS +dentifrice/SM +dentine's +dentin/SM +dent/ISGD +dentistry/MS +dentist/SM +dentition/MS +dent's +denture/IMS +denuclearize/GSD +denudation/SM +denude/DG +denuder/M +denunciate/VNGSDX +denunciation/M +Denver/M +denying/Y +Deny/M +Denys +Denyse/M +deny/SRDZG +deodorant/SM +deodorization/SM +deodorize/GZSRD +deodorizer/M +Deon/M +Deonne/M +deoxyribonucleic +depart/L +departmentalization/SM +departmentalize/DSG +departmental/Y +department/MS +departure/MS +dependability/MS +dependableness/M +dependable/P +dependably +Dependant/MS +depend/B +dependence/ISM +dependency/MS +dependent/IYS +dependent's +depicted/U +depicter/M +depiction/SM +depict/RDSG +depilatory/S +deplete/VGNSDX +depletion/M +deplorableness/M +deplorable/P +deplorably +deplorer/M +deplore/SRDBG +deploring/Y +deployable +deploy/AGDLS +deployment/SAM +depolarize +deponent/S +deportation/MS +deportee/SM +deport/LG +deportment/MS +depose +deposit/ADGS +depositary/M +deposition/A +depositor/SAM +depository/MS +depravedness/M +depraved/PY +deprave/GSRD +depraver/M +depravity/SM +deprecate/XSDNG +deprecating/Y +deprecation/M +deprecatory +depreciable +depreciate/XDSNGV +depreciating/Y +depreciation/M +depreciative/Y +depressant/S +depressible +depression/MS +depressive/YS +depressor/MS +depress/V +deprive/GSD +depth/M +depths +Dept/M +deputation/SM +depute/SDG +deputize/DSG +deputy/MS +dequeue +derail/L +dérailleur/MS +derailment/MS +derange/L +derangement/MS +Derbyshire/M +derby/SM +Derby/SM +dereference/Z +Derek/M +dereliction/SM +derelict/S +Derick/M +deride/D +deriding/Y +derision/SM +derisiveness/MS +derisive/PY +derisory +derivable/U +derivate/XNV +derivation/M +derivativeness/M +derivative/SPYM +derive/B +derived/U +Derk/M +Der/M +dermal +dermatitides +dermatitis/MS +dermatological +dermatologist/MS +dermatology/MS +dermis/SM +Dermot/M +derogate/XDSNGV +derogation/M +derogatorily +derogatory +Derrek/M +Derrick/M +derrick/SMDG +Derrida/M +derričre/S +Derrik/M +Derril/M +derringer/SM +Derron/M +Derry/M +dervish/SM +Derward/M +Derwin/M +Des +desalinate/NGSDX +desalination/M +desalinization/MS +desalinize/GSD +desalt/G +descant/M +Descartes/M +descendant/SM +descended/FU +descendent's +descender/M +descending/F +descends/F +descend/ZGSDR +descent +describable/I +describe/ZB +description/MS +descriptiveness/MS +descriptive/SYP +descriptor/SM +descry/SDG +Desdemona/M +desecrater/M +desecrate/SRDGNX +desecration/M +deserter/M +desertification +desertion/MS +desert/ZGMRDS +deservedness/M +deserved/YU +deserve/J +deserving/Y +déshabillé's +desiccant/S +desiccate/XNGSD +desiccation/M +desiccator/SM +desiderata +desideratum/M +designable +design/ADGS +designate/VNGSDX +designational +designation/M +designator/SM +designed/Y +designer/M +designing/U +Desi/M +desirabilia +desirability's +desirability/US +desirableness/SM +desirableness's/U +desirable/UPS +desirably/U +Desirae/M +desire/BR +desired/U +Desiree/M +desirer/M +Desiri/M +desirousness/M +desirous/PY +desist/DSG +desk/SM +desktop/S +Desmond/M +Desmund/M +desolateness/SM +desolate/PXDRSYNG +desolater/M +desolating/Y +desolation/M +desorption/M +despairer/M +despairing/Y +despair/SGDR +desperadoes +desperado/M +desperateness/SM +desperate/YNXP +desperation/M +despicable +despicably +despiser/M +despise/SRDG +despoil/L +despoilment/MS +despond +despondence/S +despondency/MS +despondent/Y +despotic +despotically +despotism/SM +dessert/SM +dessicate/DN +d'Estaing +destinate/NX +destination/M +destine/GSD +destiny/MS +destituteness/M +destitute/NXP +destitution/M +destroy/BZGDRS +destroyer/M +destructibility/SMI +destructible/I +destruction/SM +destructiveness/MS +destructive/YP +destructor/M +destruct/VGSD +desuetude/MS +desultorily +desultoriness/M +desultory/P +detachedness/M +detached/YP +detacher/M +detach/LSRDBG +detachment/SM +detailedness/M +detailed/YP +detainee/S +detainer/M +detain/LGRDS +detainment/MS +d'etat +detectability/U +detectable/U +detectably/U +detect/DBSVG +detected/U +detection/SM +detective/MS +detector/MS +détente +detentes +detention/SM +detergency/M +detergent/SM +deteriorate/XDSNGV +deterioration/M +determent/SM +determinability/M +determinable/IP +determinableness/IM +determinacy/I +determinant/MS +determinateness/IM +determinate/PYIN +determination/IM +determinativeness/M +determinative/P +determinedly +determinedness/M +determined/U +determine/GASD +determiner/SM +determinism/MS +determinism's/I +deterministically +deterministic/I +deterred/U +deterrence/SM +deterrent/SMY +deterring +detersive/S +deter/SL +deters/V +detestableness/M +detestable/P +detestably +detestation/SM +dethrone/L +dethronement/SM +detonable +detonated/U +detonate/XDSNGV +detonation/M +detonator/MS +detour/G +detoxification/M +detoxify/NXGSD +detox/SDG +detract/GVD +detractive/Y +d'etre +detribalize/GSD +detrimental/SY +detriment/SM +detritus/M +Detroit/M +deuced/Y +deuce/SDGM +deus +deuterium/MS +deuteron/M +Deuteronomy/M +Deutsch/M +Deva/M +Devanagari/M +Devan/M +devastate/XVNGSD +devastating/Y +devastation/M +devastator/SM +develop/ALZSGDR +developed/U +developer/MA +developmental/Y +development/ASM +deviance/MS +deviancy/S +deviant/YMS +deviated/U +deviate/XSDGN +deviating/U +deviation/M +devilishness/MS +devilish/PY +devilment/SM +devilry/MS +devil/SLMDG +deviltry/MS +Devi/M +Devina/M +Devin/M +Devinne/M +deviousness/SM +devious/YP +devise/JR +deviser/M +Devland/M +Devlen/M +Devlin/M +Dev/M +devoice +devolution/MS +devolve/GSD +Devondra/M +Devonian +Devon/M +Devonna/M +Devonne/M +Devonshire/M +Devora/M +devoted/Y +devotee/MS +devote/XN +devotional/YS +devotion/M +devourer/M +devour/SRDZG +devoutness/MS +devout/PRYT +Devy/M +Dewain/M +dewar +Dewar/M +Dewayne/M +dewberry/MS +dewclaw/SM +dewdrop/MS +Dewey/M +Dewie/M +dewiness/MS +Dewitt/M +dewlap/MS +Dew/M +dew/MDGS +dewy/TPR +Dexedrine/M +dexes/I +Dex/M +dexter +dexterity/MS +Dexter/M +dexterousness/MS +dexterous/PY +dextrose/SM +DH +Dhaka +Dhaulagiri/M +dhoti/SM +dhow/MS +DI +diabase/M +diabetes/M +diabetic/S +diabolic +diabolicalness/M +diabolical/YP +diabolism/M +diachronic/P +diacritical/YS +diacritic/MS +diadem/GMDS +diaereses +diaeresis/M +Diaghilev/M +diagnometer/SM +diagnosable/U +diagnose/BGDS +diagnosed/U +diagnosis/M +diagnostically +diagnostician/SM +diagnostic/MS +diagnostics/M +diagonalize/GDSB +diagonal/YS +diagrammable +diagrammatic +diagrammaticality +diagrammatically +diagrammed +diagrammer/SM +diagramming +diagram/MS +Diahann/M +dialectal/Y +dialectical/Y +dialectic/MS +dialect/MS +dialed/A +dialer/M +dialing/M +dial/MRDSGZJ +dialogged +dialogging +dialog/MS +dials/A +dialysis/M +dialyzed/U +dialyzes +diam +diamagnetic +diameter/MS +diametric +diametrical/Y +diamondback/SM +diamond/GSMD +Diana/M +Diandra/M +Diane/M +Dianemarie/M +Dian/M +Dianna/M +Dianne/M +Diann/M +Diannne/M +diapason/MS +diaper/SGDM +diaphanousness/M +diaphanous/YP +diaphragmatic +diaphragm/SM +diarist/SM +Diarmid/M +diarrheal +diarrhea/MS +diary/MS +diaspora +Diaspora/SM +diastase/SM +diastole/MS +diastolic +diathermy/SM +diathesis/M +diatomic +diatom/SM +diatonic +diatribe/MS +Diaz's +dibble/SDMG +dibs +DiCaprio/M +dice/GDRS +dicer/M +dicey +dichloride/M +dichotomization/M +dichotomize/DSG +dichotomous/PY +dichotomy/SM +dicier +diciest +dicing/M +Dickensian/S +dickens/M +Dickens/M +dicker/DG +Dickerson/M +dickey/SM +dick/GZXRDMS! +Dickie/M +dickier +dickiest +Dickinson/M +Dickson/M +Dick/XM +Dicky/M +dicky's +dicotyledonous +dicotyledon/SM +dicta/M +Dictaphone/SM +dictate/SDNGX +dictation/M +dictatorialness/M +dictatorial/YP +dictator/MS +dictatorship/SM +dictionary/SM +diction/MS +dictum/M +didactically +didactic/S +didactics/M +did/AU +diddler/M +diddle/ZGRSD +Diderot/M +Didi/M +didn't +didoes +dido/M +Dido/M +didst +die/DS +Diefenbaker/M +Diego/M +dieing +dielectric/MS +diem +Diem/M +Diena/M +Dierdre/M +diereses +dieresis/M +diesel/GMDS +Diesel's +dies's +dies/U +dietary/S +dieter/M +Dieter/M +dietetic/S +dietetics/M +diethylaminoethyl +diethylstilbestrol/M +dietitian/MS +diet/RDGZSM +Dietrich/M +Dietz/M +difference/DSGM +difference's/I +differences/I +differentiability +differentiable +differential/SMY +differentiated/U +differentiate/XSDNG +differentiation/M +differentiator/SM +differentness +different/YI +differ/SZGRD +difficile +difficult/Y +difficulty/SM +diffidence/MS +diffident/Y +diffract/GSD +diffraction/SM +diffractometer/SM +diffuseness/MS +diffuse/PRSDZYVXNG +diffuser/M +diffusible +diffusional +diffusion/M +diffusiveness/M +diffusive/YP +diffusivity/M +digerati +digested/IU +digester/M +digestibility/MS +digestible/I +digestifs +digestion/ISM +digestive/YSP +digest/RDVGS +digger/MS +digging/S +digitalis/M +digitalization/MS +digitalized +digitalizes +digitalizing +digital/SY +digitization/M +digitizer/M +digitize/ZGDRS +digit/SM +dignified/U +dignify/DSG +dignitary/SM +dignity/ISM +digram +digraph/M +digraphs +digress/GVDS +digression/SM +digressiveness/M +digressive/PY +dig/TS +dihedral +Dijkstra/M +Dijon/M +dike/DRSMG +diker/M +diktat/SM +Dilan/M +dilapidate/XGNSD +dilapidation/M +dilatation/SM +dilated/YP +dilate/XVNGSD +dilation/M +dilatoriness/M +dilator/SM +dilatory/P +Dilbert/M +dilemma/MS +dilettante/MS +dilettantish +dilettantism/MS +diligence/SM +diligentness/M +diligent/YP +dilithium +Dillard/M +Dillie/M +Dillinger/M +dilling/R +dillis +Dill/M +Dillon/M +dill/SGMD +dillydally/GSD +Dilly/M +dilly/SM +dilogarithm +diluent +diluted/U +diluteness/M +dilute/RSDPXYVNG +dilution/M +Di/M +DiMaggio/M +dimensionality/M +dimensional/Y +dimensionless +dimension/MDGS +dimer/M +dime/SM +dimethylglyoxime +dimethyl/M +diminished/U +diminish/SDGBJ +diminuendo/SM +diminution/SM +diminutiveness/M +diminutive/SYP +Dimitri/M +Dimitry/M +dimity/MS +dimmed/U +dimmer/MS +dimmest +dimming +dimness/SM +dimorphism/M +dimple/MGSD +dimply/RT +dim/RYPZS +dimwit/MS +dimwitted +Dinah/M +Dina/M +dinar/SM +diner/M +dine/S +dinette/MS +dingbat/MS +ding/GD +dinghy/SM +dingily +dinginess/SM +dingle/MS +dingoes +dingo/MS +dingus/SM +dingy/PRST +dinky/RST +din/MDRZGS +dinned +dinner/SM +dinnertime/S +dinnerware/MS +Dinnie/M +dinning +Dinny/M +Dino/M +dinosaur/MS +dint/SGMD +diocesan/S +diocese/SM +Diocletian/M +diode/SM +Diogenes/M +Dione/M +Dionisio/M +Dionis/M +Dion/M +Dionne/M +Dionysian +Dionysus/M +Diophantine/M +diopter/MS +diorama/SM +Dior/M +dioxalate +dioxide/MS +dioxin/S +diphtheria/SM +diphthong/SM +diplexers +diploid/S +diplomacy/SM +diploma/SMDG +diplomata +diplomatically +diplomatic/S +diplomatics/M +diplomatist/SM +diplomat/MS +dipodic +dipody/M +dipole/MS +dipped +Dipper/M +dipper/SM +dipping/S +dippy/TR +dip/S +dipsomaniac/MS +dipsomania/SM +dipstick/MS +dipterous +diptych/M +diptychs +Dir +Dirac/M +directed/IUA +directionality +directional/SY +direction/MIS +directions/A +directive/SM +directivity/M +directly/I +directness/ISM +director/AMS +directorate/SM +directorial +directorship/SM +directory/SM +direct/RDYPTSVG +directrix/MS +directs/IA +direful/Y +direness/M +dire/YTRP +dirge/GSDM +Dirichlet/M +dirigible/S +dirk/GDMS +Dirk/M +dirndl/MS +dirtily +dirtiness/SM +dirt/MS +dirty/GPRSDT +Dis +disable/LZGD +disablement/MS +disabler/M +disabuse +disadvantaged/P +disagreeable/S +disallow/D +disambiguate/DSGNX +disappointed/Y +disappointing/Y +disarming/Y +disarrange/L +disastrous/Y +disband/L +disbandment/SM +disbar/L +disbarment/MS +disbarring +disbelieving/Y +disbursal/S +disburse/GDRSL +disbursement/MS +disburser/M +discerner/M +discernibility +discernible/I +discernibly +discerning/Y +discernment/MS +discern/SDRGL +disc/GDM +discharged/U +disciple/DSMG +discipleship/SM +disciplinarian/SM +disciplinary +disciplined/U +discipline/IDM +discipliner/M +disciplines +disciplining +disclosed/U +discography/MS +discolored/MP +discoloreds/U +discolor/G +discombobulate/SDGNX +discomfit/DG +discomfiture/MS +disco/MG +discommode/DG +disconcerting/Y +disconnectedness/S +disconnected/P +disconnecter/M +disconnect/R +disconsolate/YN +discordance/SM +discordant/Y +discord/G +discorporate/D +discotheque/MS +discount/B +discourage/LGDR +discouragement/MS +discouraging/Y +discoverable/I +discover/ADGS +discovered/U +discoverer/S +discovery/SAM +discreetly/I +discreetness's/I +discreetness/SM +discreet/TRYP +discrepancy/SM +discrepant/Y +discreteness/SM +discrete/YPNX +discretionary +discretion/IMS +discretization +discretized +discriminable +discriminant/MS +discriminated/U +discriminate/SDVNGX +discriminating/YI +discrimination/MI +discriminator/MS +discriminatory +discursiveness/S +discussant/MS +discussed/UA +discusser/M +discussion/SM +discus/SM +disdainfulness/M +disdainful/YP +disdain/MGSD +disease/G +disembowelment/SM +disembowel/SLGD +disengage/L +disfigure/L +disfigurement/MS +disfranchise/L +disfranchisement/MS +disgorge +disgrace/R +disgracer/M +disgruntle/DSLG +disgruntlement/MS +disguised/UY +disguise/R +disguiser/M +disgust +disgusted/Y +disgustful/Y +disgusting/Y +dishabille/SM +disharmonious +dishcloth/M +dishcloths +dishevel/LDGS +dishevelment/MS +dish/GD +dishonest +dishonored/U +dishpan/MS +dishrag/SM +dishtowel/SM +dishwasher/MS +dishwater/SM +disillusion/LGD +disillusionment/SM +disinfectant/MS +disinherit +disinterestedness/SM +disinterested/P +disinvest/L +disjoin +disjointedness/S +disjunctive/YS +disjunct/VS +disk/D +diskette/S +dislike/G +dislodge/LG +dislodgement/M +dismalness/M +dismal/PSTRY +dismantle/L +dismantlement/SM +dismay/D +dismayed/U +dismaying/Y +dis/MB +dismember/LG +dismemberment/MS +dismissive/Y +dismiss/RZ +Disneyland/M +Disney/M +disoblige/G +disorderedness/M +disordered/YP +disorderliness/M +disorderly/P +disorder/Y +disorganize +disorganized/U +disparagement/MS +disparager/M +disparage/RSDLG +disparaging/Y +disparateness/M +disparate/PSY +dispatch/Z +dispelled +dispelling +dispel/S +dispensable/I +dispensary/MS +dispensate/NX +dispensation/M +dispenser/M +dispense/ZGDRSB +dispersal/MS +dispersant/M +dispersed/Y +disperser/M +disperse/XDRSZLNGV +dispersible +dispersion/M +dispersiveness/M +dispersive/PY +dispirit/DSG +displace/L +display/AGDS +displayed/U +displeased/Y +displease/G +displeasure +disport +disposable/S +disposal/SM +dispose/IGSD +dispositional +disposition/ISM +disproportional +disproportionate/N +disproportionation/M +disprove/B +disputable/I +disputably/I +disputant/SM +disputation/SM +disputatious/Y +disputed/U +disputer/M +dispute/ZBGSRD +disquieting/Y +disquiet/M +disquisition/SM +Disraeli/M +disregardful +disrepair/M +disreputableness/M +disreputable/P +disrepute/M +disrespect +disrupted/U +disrupter/M +disrupt/GVDRS +disruption/MS +disruptive/YP +disruptor/M +dissatisfy +dissect/DG +dissed +dissembler/M +dissemble/ZGRSD +disseminate/XGNSD +dissemination/M +dissension/SM +dissenter/M +dissent/ZGSDR +dissertation/SM +disservice +disses +dissever +dissidence/SM +dissident/MS +dissimilar/S +dissing +dissipatedly +dissipatedness/M +dissipated/U +dissipater/M +dissipate/XRSDVNG +dissipation/M +dissociable/I +dissociate/DSXNGV +dissociated/U +dissociation/M +dissociative/Y +dissoluble/I +dissoluteness/SM +dissolute/PY +dissolve/ASDG +dissolved/U +dissonance/SM +dissonant/Y +dissuade/GDRS +dissuader/M +dissuasive +dist +distaff/SM +distal/Y +distance/DSMG +distantness/M +distant/YP +distaste +distemper +distend +distension +distention/SM +distillate/XNMS +distillation/M +distillery/MS +distincter +distinctest +distinction/MS +distinctiveness/MS +distinctive/YP +distinct/IYVP +distinctness/MSI +distinguishable/I +distinguishably/I +distinguish/BDRSG +distinguished/U +distinguisher/M +distort/BGDR +distorted/U +distorter/M +distortion/MS +distract/DG +distractedness/M +distracted/YP +distracting/Y +distrait +distraught/Y +distress +distressful +distressing/Y +distribute/ADXSVNGB +distributed/U +distributer +distributional +distribution/AM +distributiveness/M +distributive/SPY +distributivity +distributorship/M +distributor/SM +district/GSAD +district's +distrust/G +disturbance/SM +disturbed/U +disturber/M +disturbing/Y +disturb/ZGDRS +disulfide/M +disuse/M +disyllable/M +Dita/M +ditcher/M +ditch/MRSDG +dither/RDZSG +ditsy/TR +ditto/DMGS +ditty/SDGM +Ditzel/M +ditz/S +diuresis/M +diuretic/S +diurnal/SY +divalent/S +diva/MS +divan/SM +dived/M +divergence/SM +divergent/Y +diverge/SDG +diver/M +diverseness/MS +diverse/XYNP +diversification/M +diversifier/M +diversify/GSRDNX +diversionary +diversion/M +diversity/SM +divert/GSD +diverticulitis/SM +divertimento/M +dive/S +divestiture/MS +divest/LDGS +divestment/S +dividable +divide/AGDS +divided/U +dividend/MS +divider/MS +divination/SM +diviner/M +divine/RSDTZYG +divinity/MS +divisibility/IMS +divisible/I +divisional +division/SM +divisiveness/MS +divisive/PY +divisor/SM +divorcée/MS +divorce/GSDLM +divorcement/MS +divot/MS +div/TZGJDRS +divulge/GSD +divvy/GSDM +Dixiecrat/MS +dixieland +Dixieland/MS +Dixie/M +Dix/M +Dixon/M +dizzily +dizziness/SM +dizzying/Y +dizzy/PGRSDT +DJ +Djakarta's +djellabah's +djellaba/S +d/JGVX +Djibouti/M +DMD +Dmitri/M +DMZ +DNA +Dnepropetrovsk/M +Dnepr's +Dnieper's +Dniester/M +Dniren/M +DOA +doable +DOB +Dobbin/M +dobbin/MS +Doberman +Dobro/M +docent/SM +docile/Y +docility/MS +docker/M +docket/GSMD +dock/GZSRDM +dockland/MS +dockside/M +dockworker/S +dockyard/SM +doc/MS +Doctor +doctoral +doctorate/SM +doctor/GSDM +Doctorow/M +doctrinaire/S +doctrinal/Y +doctrine/SM +docudrama/S +documentary/MS +documentation/MS +documented/U +document/RDMZGS +DOD +dodder/DGS +dodecahedra +dodecahedral +dodecahedron/M +Dode/M +dodge/GZSRD +Dodge/M +dodgem/S +dodger/M +Dodgson/M +Dodie/M +Dodi/M +Dodington/M +Dodoma/M +dodo/SM +Dodson/M +Dody/M +DOE +Doe/M +doe/MS +doer/MU +does/AU +doeskin/MS +doesn't +d'oeuvre +doff/SGD +dogcart/SM +dogcatcher/MS +dogeared +Doge/M +doge/SM +dogfight/GMS +dogfish/SM +dogfought +doggedness/SM +dogged/PY +doggerel/SM +dogging +doggone/RSDTG +doggy/SRMT +doghouse/SM +dogie/SM +doglegged +doglegging +dogleg/SM +dogma/MS +dogmatically/U +dogmatic/S +dogmatics/M +dogmatism/SM +dogmatist/SM +dogsbody/M +dog/SM +dogtooth/M +Dogtown/M +dogtrot/MS +dogtrotted +dogtrotting +dogwood/SM +dogy's +Doha/M +doh's +doily/SM +doing/MU +Dolby/SM +doldrum/S +doldrums/M +doled/F +dolefuller +dolefullest +dolefulness/MS +doleful/PY +Dole/M +dole/MGDS +doles/F +Dolf/M +doling/F +dollar/SM +Dolley/M +Dollie/M +Dolli/M +Doll/M +doll/MDGS +dollop/GSMD +Dolly/M +dolly/SDMG +dolmen/MS +dolomite/SM +dolomitic +Dolores/M +Dolorita/SM +dolorous/Y +dolor/SM +dolphin/SM +Dolph/M +doltishness/SM +doltish/YP +dolt/MS +domain/MS +dome/DSMG +Domenic/M +Domenico/M +Domeniga/M +Domesday/M +domestically +domesticate/DSXGN +domesticated/U +domestication/M +domesticity/MS +domestic/S +domicile/SDMG +domiciliary +dominance/MS +dominant/YS +dominate/VNGXSD +domination/M +dominator/M +dominatrices +dominatrix +domineer/DSG +domineeringness/M +domineering/YP +Dominga/M +Domingo/M +Dominguez/M +Dominica/M +Dominican/MS +Dominick/M +Dominic/M +Dominik/M +Domini/M +dominion/MS +Dominique/M +dominoes +domino/M +Domitian/M +Dom/M +Donahue/M +Donald/M +Donaldson/M +Donall/M +Donal/M +Donalt/M +Dona/M +dona/MS +Donatello/M +donate/XVGNSD +donation/M +donative/M +Donaugh/M +Donavon/M +done/AUF +Donella/M +Donelle/M +Donetsk/M +Donetta/M +dong/GDMS +dongle/S +Donia/M +Donica/M +Donielle/M +Donizetti/M +donkey/MS +Donna/M +Donnamarie/M +donned +Donnell/M +Donnelly/M +Donne/M +Donner/M +Donnie/M +Donni/M +donning +donnishness/M +donnish/YP +Donn/RM +donnybrook/MS +Donny/M +donor/MS +Donovan/M +don/S +Don/SM +don't +donut/MS +donutted +donutting +doodad/MS +doodlebug/MS +doodler/M +doodle/SRDZG +doohickey/MS +Dooley/M +Doolittle/M +doom/MDGS +doomsday/SM +Doonesbury/M +doorbell/SM +door/GDMS +doorhandles +doorkeeper/M +doorkeep/RZ +doorknob/SM +doorman/M +doormat/SM +doormen +doornail/M +doorplate/SM +doors/I +doorstep/MS +doorstepped +doorstepping +doorstop/MS +doorway/MS +dooryard/SM +dopamine +dopant/M +dopa/SM +dope/DRSMZG +doper/M +dopey +dopier +dopiest +dopiness/S +Doppler/M +Dorado/M +Doralia/M +Doralin/M +Doralyn/M +Doralynne/M +Doralynn/M +Dora/M +Dorcas +Dorchester/M +Doreen/M +Dorelia/M +Dorella/M +Dorelle/M +Doré/M +Dorena/M +Dorene/M +Doretta/M +Dorette/M +Dorey/M +Doria/M +Dorian/M +Doric +Dorice/M +Dorie/M +Dori/MS +Dorine/M +Dorisa/M +Dorise/M +Dorita/M +dork/S +dorky/RT +dormancy/MS +dormant/S +dormer/M +dormice +dormitory/SM +dorm/MRZS +dormouse/M +Dorolice/M +Dorolisa/M +Doro/M +Dorotea/M +Doroteya/M +Dorothea/M +Dorothee/M +Dorothy/M +Dorree/M +Dorrie/M +Dorri/SM +Dorry/M +dorsal/YS +Dorsey/M +Dorthea/M +Dorthy/M +Dortmund/M +Dory/M +dory/SM +DOS +dosage/SM +dose/M +dos/GDS +Dosi/M +dosimeter/MS +dosimetry/M +dossier/MS +dost +Dostoevsky/M +DOT +dotage/SM +dotard/MS +doter/M +dote/S +Doti/M +doting/Y +Dot/M +dot/MDRSJZG +Dotson/M +dotted +Dottie/M +Dotti/M +dottiness/M +dotting +Dotty/M +dotty/PRT +do/TZRHGJ +Douala/M +Douay/M +Doubleday/M +doubled/UA +double/GPSRDZ +doubleheader/MS +doubleness/M +doubler/M +doubles/M +doublespeak/S +doublethink/M +doublet/MS +doubleton/M +doubling/A +doubloon/MS +doubly +doubt/AGSDMB +doubted/U +doubter/SM +doubtfulness/SM +doubtful/YP +doubting/Y +doubtlessness/M +doubtless/YP +douche/GSDM +Dougherty/M +dough/M +doughs +doughty/RT +doughy/RT +Dougie/M +Douglas/M +Douglass +Doug/M +Dougy/M +dourness/MS +Douro/M +dour/TYRP +douser/M +douse/SRDG +dovecote/MS +Dover/M +dove/RSM +dovetail/GSDM +dovish +Dov/MR +dowager/SM +dowdily +dowdiness/MS +dowdy/TPSR +dowel/GMDS +dower/GDMS +Dow/M +downbeat/SM +downcast/S +downdraft/M +downer/M +Downey/M +downfall/NMS +downgrade/GSD +down/GZSRD +downheartedness/MS +downhearted/PY +downhill/RS +downland +download/DGS +downpipes +downplay/GDS +downpour/MS +downrange +downrightness/M +downright/YP +downriver +Downs +downscale/GSD +downside/S +downsize/DSG +downslope +downspout/SM +downstage/S +downstairs +downstate/SR +downstream +downswing/MS +downtime/SM +downtowner/M +downtown/MRS +downtrend/M +downtrodden +downturn/MS +downwardness/M +downward/YPS +downwind +downy/RT +dowry/SM +dowse/GZSRD +dowser/M +doxology/MS +doyenne/SM +doyen/SM +Doyle/M +Doy/M +doze +dozen/GHD +dozenths +dozer/M +doz/XGNDRS +dozy +DP +DPs +dpt +DPT +drabbed +drabber +drabbest +drabbing +drabness/MS +drab/YSP +drachma/MS +Draco/M +draconian +Draconian +Dracula/M +draft/AMDGS +draftee/SM +drafter/MS +draftily +draftiness/SM +drafting/S +draftsman/M +draftsmanship/SM +draftsmen +draftsperson +draftswoman +draftswomen +drafty/PTR +dragged +dragger/M +dragging/Y +draggy/RT +drag/MS +dragnet/MS +dragonfly/SM +dragonhead/M +dragon/SM +dragoon/DMGS +drainage/MS +drainboard/SM +drained/U +drainer/M +drainpipe/MS +drain/SZGRDM +Drake/M +drake/SM +Dramamine/MS +drama/SM +dramatically/U +dramatical/Y +dramatic/S +dramatics/M +dramatist/MS +dramatization/MS +dramatized/U +dramatizer/M +dramatize/SRDZG +dramaturgy/M +Drambuie/M +drammed +dramming +dram/MS +drank +Drano/M +draper/M +drapery/MS +drape/SRDGZ +drastic +drastically +drat/S +dratted +dratting +Dravidian/M +drawable +draw/ASG +drawback/MS +drawbridge/SM +drawer/SM +drawing/SM +drawler/M +drawling/Y +drawl/RDSG +drawly +drawn/AI +drawnly +drawnness +drawstring/MS +dray/SMDG +dreadfulness/SM +dreadful/YPS +dreadlocks +dreadnought/SM +dread/SRDG +dreamboat/SM +dreamed/U +dreamer/M +dreamily +dreaminess/SM +dreaming/Y +dreamland/SM +dreamlessness/M +dreamless/PY +dreamlike +dream/SMRDZG +dreamworld/S +dreamy/PTR +drearily +dreariness/SM +drear/S +dreary/TRSP +Dreddy/M +dredge/MZGSRD +dredger/M +Dredi/M +dreg/MS +Dreiser/M +Dre/M +drencher/M +drench/GDRS +Dresden/M +dress/ADRSG +dressage/MS +dressed/U +dresser/MS +dresser's/A +dresses/U +dressiness/SM +dressing/MS +dressmaker/MS +dressmaking/SM +dressy/PTR +drew/A +Drew/M +Drexel/M +Dreyfus/M +Dreyfuss +dribble/DRSGZ +dribbler/M +driblet/SM +drib/SM +dried/U +drier/M +drifter/M +drifting/Y +drift/RDZSG +driftwood/SM +driller/M +drilling/M +drillmaster/SM +drill/MRDZGS +drinkable/S +drink/BRSZG +drinker/M +dripped +dripping/MS +drippy/RT +drip/SM +driveler/M +drivel/GZDRS +driven/P +driver/M +drive/SRBGZJ +driveway/MS +drizzle/DSGM +drizzling/Y +drizzly/TR +Dr/M +drogue/MS +drollery/SM +drollness/MS +droll/RDSPTG +drolly +dromedary/MS +Drona/M +drone/SRDGM +droning/Y +drool/GSRD +droopiness/MS +drooping/Y +droop/SGD +droopy/PRT +drophead +dropkick/S +droplet/SM +dropout/MS +dropped +dropper/SM +dropping/MS +dropsical +drop/SM +dropsy/MS +drosophila/M +dross/SM +drought/SM +drover/M +drove/SRDGZ +drowner/M +drown/RDSJG +drowse/SDG +drowsily +drowsiness/SM +drowsy/PTR +drubbed +drubber/MS +drubbing/SM +drub/S +Drucie/M +Drucill/M +Druci/M +Drucy/M +drudge/MGSRD +drudger/M +drudgery/SM +drudging/Y +Drud/M +drugged +druggie/SRT +drugging +druggist/SM +Drugi/M +drugless +drug/SM +drugstore/SM +druidism/MS +druid/MS +Druid's +Dru/M +drumbeat/SGM +drumhead/M +drumlin/MS +drummed +drummer/SM +drumming +Drummond/M +drum/SM +drumstick/SM +drunkard/SM +drunkenness/SM +drunken/YP +drunk/SRNYMT +drupe/SM +Drury/M +Drusie/M +Drusilla/M +Drusi/M +Drusy/M +druthers +dryad/MS +Dryden/M +dryer/MS +dry/GYDRSTZ +dryish +dryness/SM +drys +drystone +drywall/GSD +D's +d's/A +Dshubba/M +DST +DTP +dualism/MS +dualistic +dualist/M +duality/MS +dual/YS +Duane/M +Dubai/M +dubbed +dubber/S +dubbing/M +dubbin/MS +Dubcek/M +Dubhe/M +dubiety/MS +dubiousness/SM +dubious/YP +Dublin/M +Dubrovnik/M +dub/S +Dubuque/M +ducal +ducat/SM +duce/CAIKF +duce's +Duchamp/M +duchess/MS +duchy/SM +duckbill/SM +ducker/M +duck/GSRDM +duckling/SM +duckpins +duckpond +duckweed/MS +ducky/RSMT +ducted/CFI +ductile/I +ductility/SM +ducting/F +duct/KMSF +ductless +duct's/A +ducts/CI +ductwork/M +dudder +dude/MS +dudgeon/SM +dud/GMDS +Dudley/M +Dud/M +duelist/MS +duel/MRDGZSJ +dueness/M +duenna/MS +due/PMS +duet/MS +duetted +duetting +duffel/M +duffer/M +duff/GZSRDM +Duffie/M +Duff/M +Duffy/M +Dugald/M +dugout/SM +dug/S +duh +DUI +Duisburg/M +dukedom/SM +duke/DSMG +Duke/M +Dukey/M +Dukie/M +Duky/M +Dulcea/M +Dulce/M +dulcet/SY +Dulcia/M +Dulciana/M +Dulcie/M +dulcify +Dulci/M +dulcimer/MS +Dulcinea/M +Dulcine/M +Dulcy/M +dullard/MS +Dulles/M +dullness/MS +dull/SRDPGT +dully +dulness's +Dulsea/M +Duluth/M +duly/U +Du/M +Dumas +dumbbell/MS +dumbfound/GSDR +dumbness/MS +Dumbo/M +dumb/PSGTYRD +dumbstruck +dumbwaiter/SM +dumdum/MS +dummy/SDMG +Dumont/M +dumper/UM +dumpiness/MS +dumpling/MS +dump/SGZRD +dumpster/S +Dumpster/S +Dumpty/M +dumpy/PRST +Dunant/M +Dunbar/M +Duncan/M +dunce/MS +Dunc/M +Dundee/M +dunderhead/MS +Dunedin/M +dune/SM +dungaree/SM +dungeon/GSMD +dunghill/MS +dung/SGDM +Dunham/M +dunker/M +dunk/GSRD +Dunkirk/M +Dunlap/M +Dun/M +dunned +Dunne/M +dunner +dunnest +dunning +Dunn/M +dunno/M +dun/S +Dunstan/M +duodecimal/S +duodena +duodenal +duodenum/M +duologue/M +duo/MS +duopolist +duopoly/M +dupe/NGDRSMZ +duper/M +dupion/M +duple +duplexer/M +duplex/MSRDG +duplicability/M +duplicable +duplicate/ADSGNX +duplication/AM +duplicative +duplicator/MS +duplicitous +duplicity/SM +Dupont/MS +DuPont/MS +durability/MS +durableness/M +durable/PS +durably +Duracell/M +durance/SM +Durand/M +Duran/M +Durante/M +Durant/M +durational +duration/MS +Durban/M +Dürer/M +duress/SM +Durex/M +Durham/MS +during +Durkee/M +Durkheim/M +Dur/M +Durocher/M +durst +durum/MS +Durward/M +Duse/M +Dusenberg/M +Dusenbury/M +Dushanbe/M +dusk/GDMS +duskiness/MS +dusky/RPT +Düsseldorf +dustbin/MS +dustcart/M +dustcover +duster/M +dustily +dustiness/MS +dusting/M +Dustin/M +dustless +dustman/M +dustmen +dust/MRDGZS +dustpan/SM +Dusty/M +dusty/RPT +Dutch/M +Dutchman/M +Dutchmen +dutch/MS +Dutchwoman +Dutchwomen +duteous/Y +dutiable +dutifulness/S +dutiful/UPY +duty/SM +Duvalier/M +duvet/SM +duxes +Dvina/M +Dvorák/M +Dwain/M +dwarfish +dwarfism/MS +dwarf/MTGSPRD +Dwayne/M +dweeb/S +dweller/SM +dwell/IGS +dwelling/MS +dwelt/I +DWI +Dwight/M +dwindle/GSD +dyadic +dyad/MS +Dyana/M +Dyane/M +Dyan/M +Dyanna/M +Dyanne/M +Dyann/M +dybbukim +dybbuk/SM +dyed/A +dyeing/M +dye/JDRSMZG +dyer/M +Dyer/M +dyes/A +dyestuff/SM +dying/UA +Dyke/M +dyke's +Dylan/M +Dy/M +Dynah/M +Dyna/M +dynamical/Y +dynamic/S +dynamics/M +dynamism/SM +dynamiter/M +dynamite/RSDZMG +dynamized +dynamo/MS +dynastic +dynasty/MS +dyne/M +dysentery/SM +dysfunctional +dysfunction/MS +dyslectic/S +dyslexia/MS +dyslexically +dyslexic/S +dyspepsia/MS +dyspeptic/S +dysprosium/MS +dystopia/M +dystrophy/M +dz +Dzerzhinsky/M +E +ea +each +Eachelle/M +Eada/M +Eadie/M +Eadith/M +Eadmund/M +eagerness/MS +eager/TSPRYM +eagle/SDGM +eaglet/SM +Eakins/M +Ealasaid/M +Eal/M +Eamon/M +earache/SM +eardrum/SM +earful/MS +ear/GSMDYH +Earhart/M +earing/M +earldom/MS +Earle/M +Earlene/M +Earlie/M +Earline/M +earliness/SM +Earl/M +earl/MS +earlobe/S +Early/M +early/PRST +earmark/DGSJ +earmuff/SM +earned/U +earner/M +Earnestine/M +Earnest/M +earnestness/MS +earnest/PYS +earn/GRDZTSJ +earning/M +earphone/MS +earpieces +earplug/MS +Earp/M +earring/MS +earshot/MS +earsplitting +Eartha/M +earthbound +earthed/U +earthenware/MS +earthiness/SM +earthliness/M +earthling/MS +earthly/TPR +earth/MDNYG +earthmen +earthmover/M +earthmoving +earthquake/SDGM +earthshaking +earths/U +earthward/S +earthwork/MS +earthworm/MS +earthy/PTR +Earvin/M +earwax/MS +earwigged +earwigging +earwig/MS +eased/E +ease/LDRSMG +easel/MS +easement/MS +easer/M +ease's/EU +eases/UE +easies +easily/U +easiness/MSU +easing/M +eastbound +easterly/S +Easter/M +easterner/M +Easterner/M +easternmost +Eastern/RZ +eastern/ZR +easter/Y +east/GSMR +Easthampton/M +easting/M +Eastland/M +Eastman/M +eastward/S +Eastwick/M +Eastwood/M +East/ZSMR +easygoingness/M +easygoing/P +easy/PUTR +eatables +eatable/U +eaten/U +eater/M +eatery/MS +eating/M +Eaton/M +eat/SJZGNRB +eavesdropped +eavesdropper/MS +eavesdropping +eavesdrop/S +eave/SM +Eba/M +Ebba/M +ebb/DSG +EBCDIC +Ebeneezer/M +Ebeneser/M +Ebenezer/M +Eben/M +Eberhard/M +Eberto/M +Eb/MN +Ebola +Ebonee/M +Ebonics +Ebony/M +ebony/SM +Ebro/M +ebullience/SM +ebullient/Y +ebullition/SM +EC +eccentrically +eccentricity/SM +eccentric/MS +eccl +Eccles +Ecclesiastes/M +ecclesiastical/Y +ecclesiastic/MS +ECG +echelon/SGDM +echinoderm/SM +echo/DMG +echoed/A +echoes/A +echoic +echolocation/SM +éclair/MS +éclat/MS +eclectically +eclecticism/MS +eclectic/S +eclipse/MGSD +ecliptic/MS +eclogue/MS +ecocide/SM +ecol +Ecole/M +ecologic +ecological/Y +ecologist/MS +ecology/MS +Eco/M +econ +Econometrica/M +econometricians +econometric/S +econometrics/M +economical/YU +economic/S +economics/M +economist/MS +economization +economize/GZSRD +economizer/M +economizing/U +economy/MS +ecosystem/MS +ecru/SM +ecstasy/MS +Ecstasy/S +ecstatically +ecstatic/S +ectoplasm/M +Ecuadoran/S +Ecuadorean/S +Ecuadorian/S +Ecuador/M +ecumenical/Y +ecumenicism/SM +ecumenicist/MS +ecumenic/MS +ecumenics/M +ecumenism/SM +ecumenist/MS +eczema/MS +Eda/M +Edam/SM +Edan/M +ed/ASC +Edda/M +Eddie/M +Eddi/M +Edd/M +Eddy/M +eddy/SDMG +Edee/M +Edeline/M +edelweiss/MS +Ede/M +edema/SM +edematous +eden +Eden/M +Edgard/M +Edgardo/M +Edgar/M +edge/DRSMZGJ +edgeless +edger/M +Edgerton/M +Edgewater/M +edgewise +Edgewood/M +edgily +edginess/MS +edging/M +edgy/TRP +edibility/MS +edibleness/SM +edible/SP +edict/SM +Edie/M +edification/M +edifice/SM +edifier/M +edifying/U +edify/ZNXGRSD +Edik/M +Edi/MH +Edinburgh/M +Edin/M +Edison/M +editable +Edita/M +edited/IU +Editha/M +Edithe/M +Edith/M +edition/SM +editorialist/M +editorialize/DRSG +editorializer/M +editorial/YS +editor/MS +editorship/MS +edit/SADG +Ediva/M +Edlin/M +Edmond/M +Edmon/M +Edmonton/M +Edmund/M +Edna/M +Edouard/M +EDP +eds +Edsel/M +Edsger/M +EDT +Eduard/M +Eduardo/M +educability/SM +educable/S +educated/YP +educate/XASDGN +educationalists +educational/Y +education/AM +educationists +educative +educator/MS +educ/DBG +educe/S +eduction/M +Eduino/M +edutainment/S +Edvard/M +Edwardian +Edwardo/M +Edward/SM +Edwina/M +Edwin/M +Ed/XMN +Edy/M +Edythe/M +Edyth/M +EEC +EEG +eek/S +eelgrass/M +eel/MS +e'en +EEO +EEOC +e'er +eerie/RT +eerily +eeriness/MS +Eeyore/M +effaceable/I +effacement/MS +effacer/M +efface/SRDLG +effectiveness/ISM +effectives +effective/YIP +effector/MS +effect/SMDGV +effectual/IYP +effectualness/MI +effectuate/SDGN +effectuation/M +effeminacy/MS +effeminate/SY +effendi/MS +efferent/SY +effervesce/GSD +effervescence/SM +effervescent/Y +effeteness/SM +effete/YP +efficacious/IPY +efficaciousness/MI +efficacy/IMS +efficiency/MIS +efficient/ISY +Effie/M +effigy/SM +effloresce +efflorescence/SM +efflorescent +effluence/SM +effluent/MS +effluvia +effluvium/M +effluxion +efflux/M +effortlessness/SM +effortless/PY +effort/MS +effrontery/MS +effulgence/SM +effulgent +effuse/XSDVGN +effusion/M +effusiveness/MS +effusive/YP +EFL +e/FMDS +Efrain/M +Efrem/M +Efren/M +EFT +egad +egalitarian/I +egalitarianism/MS +egalitarians +EGA/M +Egan/M +Egbert/M +Egerton/M +eggbeater/SM +eggcup/MS +egger/M +egg/GMDRS +eggheaded/P +egghead/SDM +eggnog/SM +eggplant/MS +eggshell/SM +egis's +eglantine/MS +egocentrically +egocentricity/SM +egocentric/S +egoism/SM +egoistic +egoistical/Y +egoist/SM +egomaniac/MS +egomania/MS +Egon/M +Egor/M +ego/SM +egotism/SM +egotistic +egotistical/Y +egotist/MS +egregiousness/MS +egregious/PY +egress/SDMG +egret/SM +Egyptian/S +Egypt/M +Egyptology/M +eh +Ehrlich/M +Eichmann/M +eiderdown/SM +eider/SM +eidetic +Eiffel/M +eigenfunction/MS +eigenstate/S +eigenvalue/SM +eigenvector/MS +eighteen/MHS +eighteenths +eightfold +eighth/MS +eighths +eightieths +eightpence +eight/SM +eighty/SHM +Eileen/M +Eilis/M +Eimile/M +Einsteinian +einsteinium/MS +Einstein/SM +Eire/M +Eirena/M +Eisenhower/M +Eisenstein/M +Eisner/M +eisteddfod/M +either +ejaculate/SDXNG +ejaculation/M +ejaculatory +ejecta +ejection/SM +ejector/SM +eject/VGSD +Ekaterina/M +Ekberg/M +eked/A +eke/DSG +EKG +Ekstrom/M +Ektachrome/M +elaborateness/SM +elaborate/SDYPVNGX +elaboration/M +elaborators +Elaina/M +Elaine/M +Elana/M +eland/SM +Elane/M +élan/M +Elanor/M +elans +elapse/SDG +el/AS +elastically/I +elasticated +elasticity/SM +elasticize/GDS +elastic/S +elastodynamics +elastomer/M +elatedness/M +elated/PY +elater/M +elate/SRDXGN +elation/M +Elayne/M +Elba/MS +Elbe/M +Elberta/M +Elbertina/M +Elbertine/M +Elbert/M +elbow/GDMS +elbowroom/SM +Elbrus/M +Elden/M +elderberry/MS +elderflower +elderliness/M +elderly/PS +elder/SY +eldest +Eldin/M +Eldon/M +Eldorado's +Eldredge/M +Eldridge/M +Eleanora/M +Eleanore/M +Eleanor/M +Eleazar/M +electable/U +elect/ASGD +elected/U +electioneer/GSD +election/SAM +electiveness/M +elective/SPY +electoral/Y +electorate/SM +elector/SM +Electra/M +electress/M +electricalness/M +electrical/PY +electrician/SM +electricity/SM +electric/S +electrification/M +electrifier/M +electrify/ZXGNDRS +electrocardiogram/MS +electrocardiograph/M +electrocardiographs +electrocardiography/MS +electrochemical/Y +electrocute/GNXSD +electrocution/M +electrode/SM +electrodynamics/M +electrodynamic/YS +electroencephalogram/SM +electroencephalographic +electroencephalograph/M +electroencephalographs +electroencephalography/MS +electrologist/MS +electroluminescent +electrolysis/M +electrolyte/SM +electrolytic +electrolytically +electrolyze/SDG +electro/M +electromagnetic +electromagnetically +electromagnetism/SM +electromagnet/SM +electromechanical +electromechanics +electromotive +electromyograph +electromyographic +electromyographically +electromyography/M +electronegative +electronically +electronic/S +electronics/M +electron/MS +electrophoresis/M +electrophorus/M +electroplate/DSG +electroscope/MS +electroscopic +electroshock/GDMS +electrostatic/S +electrostatics/M +electrotherapist/M +electrotype/GSDZM +electroweak +eleemosynary +Eleen/M +elegance/ISM +elegant/YI +elegiacal +elegiac/S +elegy/SM +elem +elemental/YS +elementarily +elementariness/M +elementary/P +element/MS +Elena/M +Elene/M +Eleni/M +Elenore/M +Eleonora/M +Eleonore/M +elephantiases +elephantiasis/M +elephantine +elephant/SM +elevated/S +elevate/XDSNG +elevation/M +elevator/SM +eleven/HM +elevens/S +elevenths +elev/NX +Elfie/M +elfin/S +elfish +elf/M +Elfreda/M +Elfrida/M +Elfrieda/M +Elga/M +Elgar/M +Elianora/M +Elianore/M +Elia/SM +Elicia/M +elicitation/MS +elicit/GSD +elide/GSD +Elie/M +eligibility/ISM +eligible/SI +Elihu/M +Elijah/M +Eli/M +eliminate/XSDYVGN +elimination/M +eliminator/SM +Elinore/M +Elinor/M +Eliot/M +Elisabeth/M +Elisabet/M +Elisabetta/M +Elisa/M +Elise/M +Eliseo/M +Elisha/M +elision/SM +Elissa/M +Elita/M +elite/MPS +elitism/SM +elitist/SM +elixir/MS +Elizabethan/S +Elizabeth/M +Elizabet/M +Eliza/M +Elka/M +Elke/M +Elkhart/M +elk/MS +Elladine/M +Ella/M +Ellary/M +Elle/M +Ellene/M +Ellen/M +Ellerey/M +Ellery/M +Ellesmere/M +Ellette/M +Ellie/M +Ellington/M +Elliot/M +Elliott/M +ellipse/MS +ellipsis/M +ellipsoidal +ellipsoid/MS +ellipsometer/MS +ellipsometry +elliptic +elliptical/YS +ellipticity/M +Elli/SM +Ellison/M +Ellissa/M +ell/MS +Ellswerth/M +Ellsworth/M +Ellwood/M +Elly/M +Ellyn/M +Ellynn/M +Elma/M +Elmer/M +Elmhurst/M +Elmira/M +elm/MRS +Elmo/M +Elmore/M +Elmsford/M +El/MY +Elna/MH +Elnar/M +Elnath/M +Elnora/M +Elnore/M +elocutionary +elocutionist/MS +elocution/SM +elodea/S +Elohim/M +Eloisa/M +Eloise/M +elongate/NGXSD +elongation/M +Elonore/M +elopement/MS +eloper/M +elope/SRDLG +eloquence/SM +eloquent/IY +Elora/M +Eloy/M +Elroy/M +els +Elsa/M +Elsbeth/M +else/M +Else/M +Elset/M +elsewhere +Elsey/M +Elsie/M +Elsi/M +Elsinore/M +Elspeth/M +Elston/M +Elsworth/M +Elsy/M +Eltanin/M +Elton/M +eluate/SM +elucidate/SDVNGX +elucidation/M +elude/GSD +elusiveness/SM +elusive/YP +elute/DGN +elution/M +Elva/M +elven +Elvera/M +elver/SM +elves/M +Elvia/M +Elvina/M +Elvin/M +Elvira/M +elvish +Elvis/M +Elvyn/M +Elwin/M +Elwira/M +Elwood/M +Elwyn/M +Ely/M +Elyn/M +Elysée/M +Elysees +Elyse/M +Elysha/M +Elysia/M +elysian +Elysian +Elysium/SM +Elyssa/M +EM +emaciate/NGXDS +emaciation/M +emacs/M +Emacs/M +email/SMDG +Emalee/M +Emalia/M +Ema/M +emanate/XSDVNG +emanation/M +emancipate/DSXGN +emancipation/M +emancipator/MS +Emanuele/M +Emanuel/M +emasculate/GNDSX +emasculation/M +embalmer/M +embalm/ZGRDS +embank/GLDS +embankment/MS +embarcadero +embargoes +embargo/GMD +embark/ADESG +embarkation/EMS +embarrassedly +embarrassed/U +embarrassing/Y +embarrassment/MS +embarrass/SDLG +embassy/MS +embattle/DSG +embeddable +embedded +embedder +embedding/MS +embed/S +embellished/U +embellisher/M +embellish/LGRSD +embellishment/MS +ember/MS +embezzle/LZGDRS +embezzlement/MS +embezzler/M +embitter/LGDS +embitterment/SM +emblazon/DLGS +emblazonment/SM +emblematic +emblem/GSMD +embodier/M +embodiment/ESM +embody/ESDGA +embolden/DSG +embolism/SM +embosom +embosser/M +emboss/ZGRSD +embouchure/SM +embower/GSD +embraceable +embracer/M +embrace/RSDVG +embracing/Y +embrasure/MS +embrittle +embrocation/SM +embroiderer/M +embroider/SGZDR +embroidery/MS +embroilment/MS +embroil/SLDG +embryologist/SM +embryology/MS +embryonic +embryo/SM +emceeing +emcee/SDM +Emelda/M +Emelen/M +Emelia/M +Emelina/M +Emeline/M +Emelita/M +Emelyne/M +emendation/MS +emend/SRDGB +emerald/SM +Emera/M +emerge/ADSG +emergence/MAS +emergency/SM +emergent/S +emerita +emeritae +emeriti +emeritus +Emerson/M +Emery/M +emery/MGSD +emetic/S +emf/S +emigrant/MS +emigrate/SDXNG +emigration/M +émigré/S +Emilee/M +Emile/M +Emilia/M +Emilie/M +Emili/M +Emiline/M +Emilio/M +Emil/M +Emily/M +eminence/MS +Eminence/MS +eminent/Y +emirate/SM +emir/SM +emissary/SM +emission/AMS +emissivity/MS +emit/S +emittance/M +emitted +emitter/SM +emitting +Emlen/M +Emlyn/M +Emlynne/M +Emlynn/M +em/M +Em/M +Emmalee/M +Emmaline/M +Emmalyn/M +Emmalynne/M +Emmalynn/M +Emma/M +Emmanuel/M +Emmeline/M +Emmerich/M +Emmery/M +Emmet/M +Emmett/M +Emmey/M +Emmie/M +Emmi/M +Emmit/M +Emmott/M +Emmye/M +Emmy/SM +Emogene/M +emollient/S +emolument/SM +Emory/M +emote/SDVGNX +emotionalism/MS +emotionality/M +emotionalize/GDS +emotional/UY +emotionless +emotion/M +emotive/Y +empaneled +empaneling +empath +empathetic +empathetical/Y +empathic +empathize/SDG +empathy/MS +emperor/MS +emphases +emphasis/M +emphasize/ZGCRSDA +emphatically/U +emphatic/U +emphysema/SM +emphysematous +empire/MS +empirical/Y +empiricism/SM +empiricist/SM +empiric/SM +emplace/L +emplacement/MS +employability/UM +employable/US +employed/U +employee/SM +employer/SM +employ/LAGDS +employment/UMAS +emporium/MS +empower/GLSD +empowerment/MS +empress/MS +emptier/M +emptily +emptiness/SM +empty/GRSDPT +empyrean/SM +ems/C +EMT +emulate/SDVGNX +emulation/M +emulative/Y +emulator/MS +emulsification/M +emulsifier/M +emulsify/NZSRDXG +emulsion/SM +emu/SM +Emylee/M +Emyle/M +enabler/M +enable/SRDZG +enactment/ASM +enact/SGALD +enameler/M +enamelware/SM +enamel/ZGJMDRS +enamor/DSG +en/BM +enc +encamp/LSDG +encampment/MS +encapsulate/SDGNX +encapsulation/M +encase/GSDL +encasement/SM +encephalitic +encephalitides +encephalitis/M +encephalographic +encephalopathy/M +enchain/SGD +enchanter/MS +enchant/ESLDG +enchanting/Y +enchantment/MSE +enchantress/MS +enchilada/SM +encipherer/M +encipher/SRDG +encircle/GLDS +encirclement/SM +encl +enclave/MGDS +enclosed/U +enclose/GDS +enclosure/SM +encoder/M +encode/ZJGSRD +encomium/SM +encompass/GDS +encore/GSD +encounter/GSD +encouragement/SM +encourager/M +encourage/SRDGL +encouraging/Y +encroacher/M +encroach/LGRSD +encroachment/MS +encrustation/MS +encrust/DSG +encrypt/DGS +encrypted/U +encryption/SM +encumbered/U +encumber/SEDG +encumbrancer/M +encumbrance/SRM +ency +encyclical/SM +encyclopaedia's +encyclopedia/SM +encyclopedic +encyst/GSLD +encystment/MS +endanger/DGSL +endangerment/SM +endear/GSLD +endearing/Y +endearment/MS +endeavored/U +endeavorer/M +endeavor/GZSMRD +endemically +endemicity +endemic/S +ender/M +endgame/M +Endicott/M +ending/M +endive/SM +endlessness/MS +endless/PY +endmost +endnote/MS +endocrine/S +endocrinologist/SM +endocrinology/SM +endogamous +endogamy/M +endogenous/Y +endomorphism/SM +endorse/DRSZGL +endorsement/MS +endorser/M +endoscope/MS +endoscopic +endoscopy/SM +endosperm/M +endothelial +endothermic +endow/GSDL +endowment/SM +endpoint/MS +endue/SDG +endungeoned +endurable/U +endurably/U +endurance/SM +endure/BSDG +enduringness/M +enduring/YP +endways +Endymion/M +end/ZGVMDRSJ +ENE +enema/SM +enemy/SM +energetically +energetic/S +energetics/M +energized/U +energizer/M +energize/ZGDRS +energy/MS +enervate/XNGVDS +enervation/M +enfeeble/GLDS +enfeeblement/SM +enfilade/MGDS +enfold/SGD +enforceability/M +enforceable/U +enforced/Y +enforce/LDRSZG +enforcement/SM +enforcer/M +enforcible/U +enfranchise/ELDRSG +enfranchisement/EMS +enfranchiser/M +engage/ADSGE +engagement/SEM +engaging/Y +Engelbert/M +Engel/MS +engender/DGS +engineer/GSMDJ +engineering/MY +engine/MGSD +England/M +england/ZR +Englebert/M +Englewood/M +English/GDRSM +Englishman/M +Englishmen +Englishwoman/M +Englishwomen +Eng/M +engorge/LGDS +engorgement/MS +Engracia/M +engram/MS +engraver/M +engrave/ZGDRSJ +engraving/M +engrossed/Y +engrosser/M +engross/GLDRS +engrossing/Y +engrossment/SM +engulf/GDSL +engulfment/SM +enhanceable +enhance/LZGDRS +enhancement/MS +enhancer/M +enharmonic +Enid/M +Enif/M +enigma/MS +enigmatic +enigmatically +Eniwetok/M +enjambement's +enjambment/MS +enjoinder +enjoin/GSD +enjoyability +enjoyableness/M +enjoyable/P +enjoyably +enjoy/GBDSL +enjoyment/SM +Enkidu/M +enlargeable +enlarge/LDRSZG +enlargement/MS +enlarger/M +enlightened/U +enlighten/GDSL +enlightening/U +enlightenment/SM +enlistee/MS +enlister/M +enlistment/SAM +enlist/SAGDL +enliven/LDGS +enlivenment/SM +enmesh/DSLG +enmeshment/SM +enmity/MS +Ennis/M +ennoble/LDRSG +ennoblement/SM +ennobler/M +ennui/SM +Enoch/M +enormity/SM +enormousness/MS +enormous/YP +Enos +enough +enoughs +enplane/DSG +enqueue/DS +enquirer/S +enquiringly +enrage/SDG +enrapture/GSD +Enrica/M +enricher/M +Enrichetta/M +enrich/LDSRG +enrichment/SM +Enrico/M +Enrika/M +Enrique/M +Enriqueta/M +enrobed +enrollee/SM +enroll/LGSD +enrollment/SM +ens +ensconce/DSG +ensemble/MS +enshrine/DSLG +enshrinement/SM +enshroud/DGS +ensign/SM +ensilage/DSMG +enslavement/MS +enslaver/M +enslave/ZGLDSR +ensnare/GLDS +ensnarement/SM +Ensolite/M +ensue/SDG +ensurer/M +ensure/SRDZG +entailer/M +entailment/MS +entail/SDRLG +entangle/EGDRSL +entanglement/ESM +entangler/EM +entente/MS +enter/ASDG +entered/U +enterer/M +enteritides +enteritis/SM +enterprise/GMSR +Enterprise/M +enterpriser/M +enterprising/Y +entertainer/M +entertaining/Y +entertainment/SM +entertain/SGZRDL +enthalpy/SM +enthrall/GDSL +enthrallment/SM +enthrone/GDSL +enthronement/MS +enthuse/DSG +enthusiasm/SM +enthusiastically/U +enthusiastic/U +enthusiast/MS +enticement/SM +entice/SRDJLZG +enticing/Y +entire/SY +entirety/SM +entitle/GLDS +entitlement/MS +entity/SM +entomb/GDSL +entombment/MS +entomological +entomologist/S +entomology/MS +entourage/SM +entr'acte/S +entrails +entrainer/M +entrain/GSLDR +entrancement/MS +entrance/MGDSL +entranceway/M +entrancing/Y +entrant/MS +entrapment/SM +entrapped +entrapping +entrap/SL +entreating/Y +entreat/SGD +entreaty/SM +entrée/S +entrench/LSDG +entrenchment/MS +entrepreneurial +entrepreneur/MS +entrepreneurship/M +entropic +entropy/MS +entrust/DSG +entry/ASM +entryway/SM +entwine/DSG +enumerable +enumerate/AN +enumerated/U +enumerates +enumerating +enumeration's/A +enumeration/SM +enumerative +enumerator/SM +enunciable +enunciated/U +enunciate/XGNSD +enunciation/M +enureses +enuresis/M +envelope/MS +enveloper/M +envelopment/MS +envelop/ZGLSDR +envenom/SDG +enviableness/M +enviable/U +enviably +envied/U +envier/M +enviousness/SM +envious/PY +environ/LGSD +environmentalism/SM +environmentalist/SM +environmental/Y +environment/MS +envisage/DSG +envision/GSD +envoy/SM +envying/Y +envy/SRDMG +enzymatic +enzymatically +enzyme/SM +enzymology/M +Eocene +EOE +eohippus/M +Eolanda/M +Eolande/M +eolian +eon/SM +EPA +epaulet/SM +épée/S +ephedrine/MS +ephemeral/SY +ephemera/MS +ephemerids +ephemeris/M +Ephesian/S +Ephesians/M +Ephesus/M +Ephraim/M +Ephrayim/M +Ephrem/M +epically +epicenter/SM +epic/SM +Epictetus/M +Epicurean +epicurean/S +epicure/SM +Epicurus/M +epicycle/MS +epicyclic +epicyclical/Y +epicycloid/M +epidemically +epidemic/MS +epidemiological/Y +epidemiologist/MS +epidemiology/MS +epidermal +epidermic +epidermis/MS +epidural +epigenetic +epiglottis/SM +epigrammatic +epigram/MS +epigrapher/M +epigraph/RM +epigraphs +epigraphy/MS +epilepsy/SM +epileptic/S +epilogue/SDMG +Epimethius/M +epinephrine/SM +epiphany/SM +Epiphany/SM +epiphenomena +episcopacy/MS +episcopalian +Episcopalian/S +Episcopal/S +episcopal/Y +episcopate/MS +episode/SM +episodic +episodically +epistemic +epistemological/Y +epistemology/M +epistle/MRS +Epistle/SM +epistolary/S +epistolatory +epitaph/GMD +epitaphs +epitaxial/Y +epitaxy/M +epithelial +epithelium/MS +epithet/MS +epitome/MS +epitomized/U +epitomizer/M +epitomize/SRDZG +epochal/Y +epoch/M +epochs +eponymous +epoxy/GSD +epsilon/SM +Epsom/M +Epstein/M +equability/MS +equableness/M +equable/P +equably +equaling +equality/ISM +equalization/MS +equalize/DRSGJZ +equalized/U +equalizer/M +equalizes/U +equal/USDY +equanimity/MS +equate/NGXBSD +equation/M +equatorial/S +equator/SM +equerry/MS +equestrianism/SM +equestrian/S +equestrienne/SM +equiangular +equidistant/Y +equilateral/S +equilibrate/GNSD +equilibration/M +equilibrium/MSE +equine/S +equinoctial/S +equinox/MS +equipage/SM +equipartition/M +equip/AS +equipment/SM +equipoise/GMSD +equipotent +equipped/AU +equipping/A +equiproportional +equiproportionality +equiproportionate +equitable/I +equitableness/M +equitably/I +equitation/SM +equity/IMS +equiv +equivalence/DSMG +equivalent/SY +equivocalness/MS +equivocal/UY +equivocate/NGSDX +equivocation/M +equivocator/SM +Equuleus/M +ER +ERA +eradicable/I +eradicate/SDXVGN +eradication/M +eradicator/SM +era/MS +Eran/M +erase/N +eraser/M +erasion/M +Erasmus/M +eras/SRDBGZ +Erastus/M +erasure/MS +Erato/M +Eratosthenes/M +erbium/SM +Erda/M +ere +Erebus/M +erect/GPSRDY +erectile +erection/SM +erectness/MS +erector/SM +Erek/M +erelong +eremite/MS +Erena/M +ergo +ergodic +ergodicity/M +ergonomically +ergonomics/M +ergonomic/U +ergophobia +ergosterol/SM +ergot/SM +erg/SM +Erhard/M +Erhart/M +Erica/M +Ericha/M +Erich/M +Ericka/M +Erick/M +Erickson/M +Eric/M +Ericson's +Ericsson's +Eridanus/M +Erie/SM +Erika/M +Erik/M +Erikson/M +Erina/M +Erin/M +Erinna/M +Erinn/M +eris +Eris +Eritrea/M +Erlang/M +Erlenmeyer/M +Erl/M +Er/M +Erma/M +Ermanno/M +Ermengarde/M +Ermentrude/M +Ermina/M +ermine/MSD +Erminia/M +Erminie/M +Ermin/M +Ernaline/M +Erna/M +Ernesta/M +Ernestine/M +Ernest/M +Ernesto/M +Ernestus/M +Ernie/M +Ernst/M +Erny/M +erode/SDG +erodible +erogenous +erosible +erosional +erosion/SM +erosiveness/M +erosive/P +Eros/SM +erotically +erotica/M +eroticism/MS +erotic/S +errancy/MS +errand/MS +errantry/M +errant/YS +errata/SM +erratically +erratic/S +erratum/MS +err/DGS +Errick/M +erring/UY +Erroll/M +Errol/M +erroneousness/M +erroneous/YP +error/SM +ersatz/S +Erse/M +Erskine/M +erst +erstwhile +Ertha/M +eructation/MS +eruct/DGS +erudite/NYX +erudition/M +erupt/DSVG +eruption/SM +eruptive/SY +Ervin/M +ErvIn/M +Erv/M +Erwin/M +Eryn/M +erysipelas/SM +erythrocyte/SM +es +e's +Es +E's +Esau/M +escadrille/M +escalate/CDSXGN +escalation/MC +escalator/SM +escallop/SGDM +escapable/I +escapade/SM +escapee/MS +escape/LGSRDB +escapement/MS +escaper/M +escapism/SM +escapist/S +escapology +escarole/MS +escarpment/MS +eschatology/M +Escherichia/M +Escher/M +eschew/SGD +Escondido/M +escort/SGMD +escritoire/SM +escrow/DMGS +escudo/MS +escutcheon/SM +Esdras/M +ESE +Eskimo/SM +ESL +Esma/M +Esmaria/M +Esmark/M +Esme/M +Esmeralda/M +esophageal +esophagi +esophagus/M +esoteric +esoterica +esoterically +esp +ESP +espadrille/MS +Espagnol/M +espalier/SMDG +especial/Y +Esperanto/M +Esperanza/M +Espinoza/M +espionage/SM +esplanade/SM +Esp/M +Esposito/M +espousal/MS +espouser/M +espouse/SRDG +espresso/SM +esprit/SM +espy/GSD +Esq/M +esquire/GMSD +Esquire/S +Esra/M +Essa/M +essayer/M +essayist/SM +essay/SZMGRD +essence/MS +Essene/SM +Essen/M +essentialist/M +essentially +essentialness/M +essential/USI +Essequibo/M +Essex/M +Essie/M +Essy/M +EST +established/U +establisher/M +establish/LAEGSD +establishment/EMAS +Establishment/MS +Esta/M +estate/GSDM +Esteban/M +esteem/EGDS +Estela/M +Estele/M +Estella/M +Estelle/M +Estell/M +Estel/M +Esterházy/M +ester/M +Ester/M +Estes +Estevan/M +Esther/M +esthete's +esthetically +esthetic's +esthetics's +estimable/I +estimableness/M +estimate/XDSNGV +estimating/A +estimation/M +estimator/SM +Estonia/M +Estonian/S +estoppal +Estrada/M +estrange/DRSLG +estrangement/SM +estranger/M +Estrella/M +Estrellita/M +estrogen/SM +estrous +estrus/SM +est/RZ +estuarine +estuary/SM +et +ET +ETA +Etan/M +eta/SM +etc +etcetera/SM +etcher/M +etch/GZJSRD +etching/M +ETD +eternalness/SM +eternal/PSY +eternity/SM +ethane/SM +Ethan/M +ethanol/MS +Ethelbert/M +Ethelda/M +Ethelind/M +Etheline/M +Ethelin/M +Ethel/M +Ethelred/M +Ethelyn/M +Ethe/M +etherealness/M +ethereal/PY +etherized +Ethernet/MS +ether/SM +ethically/U +ethicalness/M +ethical/PYS +ethicist/S +ethic/MS +Ethiopia/M +Ethiopian/S +ethnically +ethnicity/MS +ethnic/S +ethnocentric +ethnocentrism/MS +ethnographers +ethnographic +ethnography/M +ethnological +ethnologist/SM +ethnology/SM +ethnomethodology +ethological +ethologist/MS +ethology/SM +ethos/SM +ethylene/MS +Ethyl/M +ethyl/SM +Etienne/M +etiologic +etiological +etiology/SM +etiquette/SM +Etna/M +Etruria/M +Etruscan/MS +Etta/M +Ettie/M +Etti/M +Ettore/M +Etty/M +étude/MS +etymological/Y +etymologist/SM +etymology/MS +EU +eucalypti +eucalyptus/SM +Eucharistic +Eucharist/SM +euchre/MGSD +euclidean +Euclid/M +Eudora/M +Euell/M +Eugene/M +Eugenia/M +eugenically +eugenicist/SM +eugenic/S +eugenics/M +Eugenie/M +Eugenio/M +Eugenius/M +Eugen/M +Eugine/M +Eulalie/M +Eula/M +Eulerian/M +Euler/M +eulogistic +eulogist/MS +eulogized/U +eulogize/GRSDZ +eulogizer/M +eulogy/MS +Eu/M +Eumenides +Eunice/M +eunuch/M +eunuchs +Euphemia/M +euphemism/MS +euphemistic +euphemistically +euphemist/M +euphonious/Y +euphonium/M +euphony/SM +euphoria/SM +euphoric +euphorically +Euphrates/M +Eurasia/M +Eurasian/S +eureka/S +Euripides/M +Eur/M +Eurodollar/SM +Europa/M +Europeanization/SM +Europeanized +European/MS +Europe/M +europium/MS +Eurydice/M +Eustace/M +Eustachian/M +Eustacia/M +eutectic +Euterpe/M +euthanasia/SM +euthenics/M +evacuate/DSXNGV +evacuation/M +evacuee/MS +evader/M +evade/SRDBGZ +Evaleen/M +evaluable +evaluate/ADSGNX +evaluated/U +evaluational +evaluation/MA +evaluative +evaluator/MS +Eva/M +evanescence/MS +evanescent +Evangelia/M +evangelic +evangelicalism/SM +Evangelical/S +evangelical/YS +Evangelina/M +Evangeline/M +Evangelin/M +evangelism/SM +evangelistic +evangelist/MS +Evangelist/MS +evangelize/GDS +Evania/M +Evan/MS +Evanne/M +Evanston/M +Evansville/M +evaporate/VNGSDX +evaporation/M +evaporative/Y +evaporator/MS +evasion/SM +evasiveness/SM +evasive/PY +Eveleen/M +Evelina/M +Eveline/M +Evelin/M +Evelyn/M +Eve/M +evened +evener/M +evenhanded/YP +evening/SM +Evenki/M +Even/M +evenness/MSU +even/PUYRT +evens +evensong/MS +eventfulness/SM +eventful/YU +eventide/SM +event/SGM +eventuality/MS +eventual/Y +eventuate/GSD +Everard/M +Eveready/M +Evered/M +Everest/M +Everette/M +Everett/M +everglade/MS +Everglades +evergreen/S +Everhart/M +everlastingness/M +everlasting/PYS +everliving +evermore +EverReady/M +eve/RSM +ever/T +every +everybody/M +everydayness/M +everyday/P +everyman +everyone/MS +everyplace +everything +everywhere +eve's/A +eves/A +Evey/M +evict/DGS +eviction/SM +evidence/MGSD +evidential/Y +evident/YS +Evie/M +evildoer/SM +evildoing/MS +evilness/MS +evil/YRPTS +evince/SDG +Evin/M +eviscerate/GNXDS +evisceration/M +Evita/M +Ev/MN +evocable +evocate/NVX +evocation/M +evocativeness/M +evocative/YP +evoke/SDG +evolute/NMXS +evolutionarily +evolutionary +evolutionist/MS +evolution/M +evolve/SDG +Evonne/M +Evvie/M +Evvy/M +Evy/M +Evyn/M +Ewan/M +Eward/M +Ewart/M +Ewell/M +ewe/MZRS +Ewen/M +ewer/M +Ewing/M +exacerbate/NGXDS +exacerbation/M +exacter/M +exactingness/M +exacting/YP +exaction/SM +exactitude/ISM +exactly/I +exactness/MSI +exact/TGSPRDY +exaggerate/DSXNGV +exaggerated/YP +exaggeration/M +exaggerative/Y +exaggerator/MS +exaltation/SM +exalted/Y +exalter/M +exalt/ZRDGS +examen/M +examination/AS +examination's +examine/BGZDRS +examined/AU +examinees +examiner/M +examines/A +examining/A +exam/MNS +example/DSGM +exampled/U +exasperate/DSXGN +exasperated/Y +exasperating/Y +exasperation/M +Excalibur/M +excavate/NGDSX +excavation/M +excavator/SM +Excedrin/M +exceeder/M +exceeding/Y +exceed/SGDR +excelled +excellence/SM +excellency/MS +Excellency/MS +excellent/Y +excelling +excel/S +excelsior/S +except/DSGV +exceptionable/U +exceptionalness/M +exceptional/YU +exception/BMS +excerpter/M +excerpt/GMDRS +excess/GVDSM +excessiveness/M +excessive/PY +exchangeable +exchange/GDRSZ +exchanger/M +exchequer/SM +Exchequer/SM +excise/XMSDNGB +excision/M +excitability/MS +excitableness/M +excitable/P +excitably +excitation/SM +excitatory +excited/Y +excitement/MS +exciter/M +excite/RSDLBZG +excitingly +exciting/U +exciton/M +exclaimer/M +exclaim/SZDRG +exclamation/MS +exclamatory +exclude/DRSG +excluder/M +exclusionary +exclusioner/M +exclusion/SZMR +exclusiveness/SM +exclusive/SPY +exclusivity/MS +excommunicate/XVNGSD +excommunication/M +excoriate/GNXSD +excoriation/M +excremental +excrement/SM +excrescence/MS +excrescent +excreta +excrete/NGDRSX +excreter/M +excretion/M +excretory/S +excruciate/NGDS +excruciating/Y +excruciation/M +exculpate/XSDGN +exculpation/M +exculpatory +excursionist/SM +excursion/MS +excursiveness/SM +excursive/PY +excursus/MS +excusable/IP +excusableness/IM +excusably/I +excuse/BGRSD +excused/U +excuser/M +exec/MS +execrableness/M +execrable/P +execrably +execrate/DSXNGV +execration/M +executable/MS +execute/NGVZBXDRS +executer/M +executional +executioner/M +execution/ZMR +executive/SM +executor/SM +executrices +executrix/M +exegeses +exegesis/M +exegete/M +exegetical +exegetic/S +exemplariness/M +exemplar/MS +exemplary/P +exemplification/M +exemplifier/M +exemplify/ZXNSRDG +exemption/MS +exempt/SDG +exerciser/M +exercise/ZDRSGB +exertion/MS +exert/SGD +Exeter/M +exeunt +exhalation/SM +exhale/GSD +exhausted/Y +exhauster/M +exhaustible/I +exhausting/Y +exhaustion/SM +exhaustiveness/MS +exhaustive/YP +exhaust/VGRDS +exhibitioner/M +exhibitionism/MS +exhibitionist/MS +exhibition/ZMRS +exhibitor/SM +exhibit/VGSD +exhilarate/XSDVNG +exhilarating/Y +exhilaration/M +exhortation/SM +exhort/DRSG +exhorter/M +exhumation/SM +exhume/GRSD +exhumer/M +exigence/S +exigency/SM +exigent/SY +exiguity/SM +exiguous +exile/SDGM +existence/MS +existent/I +existentialism/MS +existentialistic +existentialist/MS +existential/Y +existents +exist/SDG +exit/MDSG +exobiology/MS +exocrine +Exodus/M +exodus/SM +exogamous +exogamy/M +exogenous/Y +exonerate/SDVGNX +exoneration/M +exorbitance/MS +exorbitant/Y +exorcise/SDG +exorcism/SM +exorcist/SM +exorcizer/M +exoskeleton/MS +exosphere/SM +exothermic +exothermically +exotica +exotically +exoticism/SM +exoticness/M +exotic/PS +exp +expandability/M +expand/DRSGZB +expanded/U +expander/M +expanse/DSXGNVM +expansible +expansionary +expansionism/MS +expansionist/MS +expansion/M +expansiveness/S +expansive/YP +expatiate/XSDNG +expatiation/M +expatriate/SDNGX +expatriation/M +expectancy/MS +expectant/YS +expectational +expectation/MS +expected/UPY +expecting/Y +expectorant/S +expectorate/NGXDS +expectoration/M +expect/SBGD +expedience/IS +expediency/IMS +expedients +expedient/YI +expediter/M +expedite/ZDRSNGX +expeditionary +expedition/M +expeditiousness/MS +expeditious/YP +expeditor's +expellable +expelled +expelling +expel/S +expendable/S +expended/U +expender/M +expenditure/SM +expend/SDRGB +expense/DSGVM +expensive/IYP +expensiveness/SMI +experienced/U +experience/ISDM +experiencing +experiential/Y +experimentalism/M +experimentalist/SM +experimental/Y +experimentation/SM +experimenter/M +experiment/GSMDRZ +experted +experting +expertise/SM +expertize/GD +expertnesses +expertness/IM +expert/PISY +expert's +expiable/I +expiate/XGNDS +expiation/M +expiatory +expiration/MS +expired/U +expire/SDG +expiry/MS +explainable/UI +explain/ADSG +explained/U +explainer/SM +explanation/MS +explanatory +expletive/SM +explicable/I +explicate/VGNSDX +explication/M +explicative/Y +explicitness/SM +explicit/PSY +explode/DSRGZ +exploded/U +exploder/M +exploitation/MS +exploitative +exploited/U +exploiter/M +exploit/ZGVSMDRB +exploration/MS +exploratory +explore/DSRBGZ +explored/U +explorer/M +explosion/MS +explosiveness/SM +explosive/YPS +expo/MS +exponential/SY +exponentiate/XSDNG +exponentiation/M +exponent/MS +exportability +exportable +export/AGSD +exportation/SM +exporter/MS +export's +expose +exposed/U +exposer/M +exposit/D +exposition/SM +expositor/MS +expository +expos/RSDZG +expostulate/DSXNG +expostulation/M +exposure/SM +expounder/M +expound/ZGSDR +expressed/U +expresser/M +express/GVDRSY +expressibility/I +expressible/I +expressibly/I +expressionism/SM +expressionistic +expressionist/S +expressionless/YP +expression/MS +expressive/IYP +expressiveness/MS +expressiveness's/I +expressway/SM +expropriate/XDSGN +expropriation/M +expropriator/SM +expulsion/MS +expunge/GDSR +expunger/M +expurgated/U +expurgate/SDGNX +expurgation/M +exquisiteness/SM +exquisite/YPS +ex/S +ext +extant +extemporaneousness/MS +extemporaneous/YP +extempore/S +extemporization/SM +extemporizer/M +extemporize/ZGSRD +extendability/M +extendedly +extendedness/M +extended/U +extender/M +extendibility/M +extendibles +extend/SGZDR +extensibility/M +extensible/I +extensional/Y +extension/SM +extensiveness/SM +extensive/PY +extensor/MS +extent/SM +extenuate/XSDGN +extenuation/M +exterior/MYS +exterminate/XNGDS +extermination/M +exterminator/SM +externalities +externalization/SM +externalize/GDS +external/YS +extern/M +extinct/DGVS +extinction/MS +extinguishable/I +extinguish/BZGDRS +extinguisher/M +extirpate/XSDVNG +extirpation/M +extolled +extoller/M +extolling +extol/S +extort/DRSGV +extorter/M +extortionate/Y +extortioner/M +extortionist/SM +extortion/ZSRM +extracellular/Y +extract/GVSBD +extraction/SM +extractive/Y +extractor/SM +extracurricular/S +extradite/XNGSDB +extradition/M +extragalactic +extralegal/Y +extramarital +extramural +extraneousness/M +extraneous/YP +extraordinarily +extraordinariness/M +extraordinary/PS +extrapolate/XVGNSD +extrapolation/M +extra/S +extrasensory +extraterrestrial/S +extraterritorial +extraterritoriality/MS +extravagance/MS +extravagant/Y +extravaganza/SM +extravehicular +extravert's +extrema +extremal +extreme/DSRYTP +extremeness/MS +extremism/SM +extremist/MS +extremity/SM +extricable/I +extricate/XSDNG +extrication/M +extrinsic +extrinsically +extroversion/SM +extrovert/GMDS +extrude/GDSR +extruder/M +extrusion/MS +extrusive +exuberance/MS +exuberant/Y +exudate/XNM +exudation/M +exude/GSD +exultant/Y +exultation/SM +exult/DGS +exulting/Y +exurban +exurbanite/SM +exurbia/MS +exurb/MS +Exxon/M +Eyck/M +Eyde/M +Eydie/M +eyeball/GSMD +eyebrow/MS +eyed/P +eyedropper/MS +eyeful/MS +eye/GDRSMZ +eyeglass/MS +eyelash/MS +eyeless +eyelet/GSMD +eyelid/SM +eyeliner/MS +eyeopener/MS +eyeopening +eyepiece/SM +eyer/M +eyeshadow +eyesight/MS +eyesore/SM +eyestrain/MS +eyeteeth +eyetooth/M +eyewash/MS +eyewitness/SM +Eyre/M +eyrie's +Eysenck/M +Ezechiel/M +Ezekiel/M +Ezequiel/M +Eziechiele/M +Ezmeralda/M +Ezra/M +Ezri/M +F +FAA +Fabe/MR +Fabergé/M +Faber/M +Fabiano/M +Fabian/S +Fabien/M +Fabio/M +fable/GMSRD +fabler/M +fabricate/SDXNG +fabrication/M +fabricator/MS +fabric/MS +fabulists +fabulousness/M +fabulous/YP +facade/GMSD +face/AGCSD +facecloth +facecloths +faceless/P +faceplate/M +facer/CM +face's +facetiousness/MS +facetious/YP +facet/SGMD +facial/YS +facileness/M +facile/YP +facilitate/VNGXSD +facilitation/M +facilitator/SM +facilitatory +facility/MS +facing/MS +facsimileing +facsimile/MSD +factional +factionalism/SM +faction/SM +factiousness/M +factious/PY +factitious +fact/MS +facto +factoid/S +factorial/MS +factoring/A +factoring's +factorisable +factorization/SM +factorize/GSD +factor/SDMJG +factory/MS +factotum/MS +factuality/M +factualness/M +factual/PY +faculty/MS +faddish +faddist/SM +fadedly +faded/U +fadeout +fader/M +fade/S +fading's +fading/U +fad/ZGSMDR +Fae/M +faerie/MS +Faeroe/M +faery's +Fafnir/M +fagged +fagging +faggoting's +Fagin/M +fag/MS +fagoting/M +fagot/MDSJG +Fahd/M +Fahrenheit/S +faďence/S +failing's +failing/UY +fail/JSGD +faille/MS +failsafe +failure/SM +Faina/M +fain/GTSRD +fainter/M +fainthearted +faintness/MS +faint/YRDSGPT +Fairbanks +Fairchild/M +faired +Fairfax/M +Fairfield/M +fairgoer/S +fairground/MS +fairing/MS +fairish +Fairleigh/M +fairless +Fairlie/M +Fair/M +Fairmont/M +fairness's +fairness/US +Fairport/M +fairs +fair/TURYP +Fairview/M +fairway/MS +fairyland/MS +fairy/MS +fairytale +Faisalabad +Faisal/M +faithed +faithfulness/MSU +faithfuls +faithful/UYP +faithing +faithlessness/SM +faithless/YP +Faith/M +faiths +faith's +faith/U +fajitas +faker/M +fake/ZGDRS +fakir/SM +falafel +falconer/M +falconry/MS +falcon/ZSRM +Falito/M +Falkland/MS +Falk/M +Falkner/M +fallaciousness/M +fallacious/PY +fallacy/MS +faller/M +fallibility/MSI +fallible/I +fallibleness/MS +fallibly/I +falloff/S +Fallon/M +fallopian +Fallopian/M +fallout/MS +fallowness/M +fallow/PSGD +fall/SGZMRN +falsehood/SM +falseness/SM +false/PTYR +falsetto/SM +falsie/MS +falsifiability/M +falsifiable/U +falsification/M +falsifier/M +falsify/ZRSDNXG +falsity/MS +Falstaff/M +falterer/M +faltering/UY +falter/RDSGJ +Falwell/M +fa/M +famed/C +fame/DSMG +fames/C +familial +familiarity/MUS +familiarization/MS +familiarized/U +familiarizer/M +familiarize/ZGRSD +familiarizing/Y +familiarly/U +familiarness/M +familiar/YPS +family/MS +famine/SM +faming/C +famish/GSD +famously/I +famousness/M +famous/PY +fanaticalness/M +fanatical/YP +fanaticism/MS +fanatic/SM +Fanchette/M +Fanchon/M +fancied +Fancie/M +fancier/SM +fanciest +fancifulness/MS +fanciful/YP +fancily +fanciness/SM +fancying +fancy/IS +Fancy/M +fancywork/SM +fandango/SM +Fanechka/M +fanfare/SM +fanfold/M +fang/DMS +fangled +Fania/M +fanlight/SM +Fan/M +fanned +Fannie/M +Fanni/M +fanning +fanny/SM +Fanny/SM +fanout +fan/SM +fantail/SM +fantasia/SM +fantasist/M +fantasize/SRDG +fantastical/Y +fantastic/S +fantasy/GMSD +Fanya/M +fanzine/S +FAQ/SM +Faraday/M +farad/SM +Farah/M +Fara/M +Farand/M +faraway +Farber/M +farce/SDGM +farcical/Y +fare/MS +farer/M +farewell/DGMS +farfetchedness/M +far/GDR +Fargo/M +Farica/M +farinaceous +farina/MS +Farkas/M +Farlay/M +Farlee/M +Farleigh/M +Farley/M +Farlie/M +Farly/M +farmer/M +Farmer/M +farmhand/S +farmhouse/SM +farming/M +Farmington/M +farmland/SM +farm/MRDGZSJ +farmstead/SM +farmworker/S +Far/MY +farmyard/MS +faro/MS +farragoes +farrago/M +Farragut/M +Farrah/M +Farrakhan/M +Farra/M +Farrand/M +Farrell/M +Farrel/M +farrier/SM +Farris/M +Farr/M +farrow/DMGS +farseeing +farsightedness/SM +farsighted/YP +farther +farthermost +farthest +farthing/SM +fart/MDGS! +fas +fascia/SM +fascicle/DSM +fasciculate/DNX +fasciculation/M +fascinate/SDNGX +fascinating/Y +fascination/M +fascism/MS +Fascism's +fascistic +Fascist's +fascist/SM +fashionableness/M +fashionable/PS +fashionably/U +fashion/ADSG +fashioner/SM +fashion's +Fassbinder/M +fastback/MS +fastball/S +fasten/AGUDS +fastener/MS +fastening/SM +fast/GTXSPRND +fastidiousness/MS +fastidious/PY +fastness/MS +fatalism/MS +fatalistic +fatalistically +fatalist/MS +fatality/MS +fatal/SY +fatback/SM +fatefulness/MS +fateful/YP +fate/MS +Fates +fatheaded/P +fathead/SMD +father/DYMGS +fathered/U +fatherhood/MS +fatherland/SM +fatherless +fatherliness/M +fatherly/P +Father/SM +fathomable/U +fathomless +fathom/MDSBG +fatigued/U +fatigue/MGSD +fatiguing/Y +Fatima/M +fatness/SM +fat/PSGMDY +fatso/M +fatted +fattener/M +fatten/JZGSRD +fatter +fattest/M +fattiness/SM +fatting +fatty/RSPT +fatuity/MS +fatuousness/SM +fatuous/YP +fatwa/SM +faucet/SM +Faulknerian +Faulkner/M +fault/CGSMD +faultfinder/MS +faultfinding/MS +faultily +faultiness/MS +faultlessness/SM +faultless/PY +faulty/RTP +fauna/MS +Faunie/M +Faun/M +faun/MS +Fauntleroy/M +Faustian +Faustina/M +Faustine/M +Faustino/M +Faust/M +Faustus/M +fauvism/S +favorableness/MU +favorable/UMPS +favorably/U +favoredness/M +favored's/U +favored/YPSM +favorer/EM +favor/ESMRDGZ +favoring/MYS +favorings/U +favorite/SMU +favoritism/MS +favors/A +Fawkes/M +Fawne/M +fawner/M +fawn/GZRDMS +Fawnia/M +fawning/Y +Fawn/M +fax/GMDS +Fax/M +Faydra/M +Faye/M +Fayette/M +Fayetteville/M +Fayina/M +Fay/M +fay/MDRGS +Fayre/M +Faythe/M +Fayth/M +faze/DSG +FBI +FCC +FD +FDA +FDIC +FDR/M +fealty/MS +fearfuller +fearfullest +fearfulness/MS +fearful/YP +fearlessness/MS +fearless/PY +fear/RDMSG +fearsomeness/M +fearsome/PY +feasibility/SM +feasibleness/M +feasible/UI +feasibly/U +feaster/M +feast/GSMRD +feater/C +featherbed +featherbedding/SM +featherbrain/MD +feathered/U +feathering/M +featherless +featherlight +Featherman/M +feathertop +featherweight/SM +feathery/TR +feather/ZMDRGS +feat/MYRGTS +feats/C +featureless +feature/MGSD +Feb/M +febrile +February/MS +fecal +feces +fecklessness/M +feckless/PY +fecundability +fecundate/XSDGN +fecundation/M +fecund/I +fecundity/SM +federalism/SM +Federalist +federalist/MS +federalization/MS +federalize/GSD +Federal/S +federal/YS +federated/U +federate/FSDXVNG +federation/FM +federative/Y +Federica/M +Federico/M +FedEx/M +Fedora/M +fedora/SM +feds +Fed/SM +fed/U +feebleness/SM +feeble/TPR +feebly +feedback/SM +feedbag/MS +feeder/M +feed/GRZJS +feeding/M +feedlot/SM +feedstock +feedstuffs +feeing +feeler/M +feel/GZJRS +feelingly/U +feeling/MYP +feelingness/M +Fee/M +fee/MDS +feet/M +feigned/U +feigner/M +feign/RDGS +feint/MDSG +feisty/RT +Felder/M +Feldman/M +feldspar/MS +Felecia/M +Felicdad/M +Felice/M +Felicia/M +Felicio/M +felicitate/XGNSD +felicitation/M +felicitous/IY +felicitousness/M +felicity/IMS +Felicity/M +Felicle/M +Felic/M +Felike/M +Feliks/M +feline/SY +Felipa/M +Felipe/M +Felisha/M +Felita/M +Felix/M +Feliza/M +Felizio/M +fella/S +fellatio/SM +felled/A +feller/M +felling/A +Fellini/M +fellness/M +fellowman +fellowmen +fellow/SGDYM +fellowshipped +fellowshipping +fellowship/SM +fell/PSGZTRD +feloniousness/M +felonious/PY +felon/MS +felony/MS +felt/GSD +felting/M +Fe/M +female/MPS +femaleness/SM +feminineness/M +feminine/PYS +femininity/MS +feminism/MS +feminist/MS +femme/MS +femoral +fem/S +femur/MS +fenced/U +fencepost/M +fencer/M +fence/SRDJGMZ +fencing/M +fender/CM +fend/RDSCZG +Fenelia/M +fenestration/CSM +Fenian/M +fenland/M +fen/MS +fennel/SM +Fenwick/M +Feodora/M +Feodor/M +feral +Ferber/M +Ferdie/M +Ferdinanda/M +Ferdinande/M +Ferdinand/M +Ferdinando/M +Ferd/M +Ferdy/M +fer/FLC +Fergus/M +Ferguson/M +Ferlinghetti/M +Fermat/M +fermentation/MS +fermented +fermenter +ferment/FSCM +fermenting +Fermi/M +fermion/MS +fermium/MS +Fernanda/M +Fernande/M +Fernandez/M +Fernandina/M +Fernando/M +Ferne/M +fernery/M +Fern/M +fern/MS +ferny/TR +ferociousness/MS +ferocious/YP +ferocity/MS +Ferrari/M +Ferraro/M +Ferreira/M +Ferrell/M +Ferrel/M +Ferrer/M +ferreter/M +ferret/SMRDG +ferric +ferris +Ferris +ferrite/M +ferro +ferroelectric +ferromagnetic +ferromagnet/M +ferrous +ferrule/MGSD +ferryboat/MS +ferryman/M +ferrymen +ferry/SDMG +fertileness/M +fertile/YP +fertility/IMS +fertilization/ASM +fertilized/U +fertilizer/M +fertilizes/A +fertilize/SRDZG +ferule/SDGM +fervency/MS +fervent/Y +fervidness/M +fervid/YP +fervor/MS +fess/KGFSD +Fess/M +fess's +festal/S +fester/GD +festival/SM +festiveness/SM +festive/PY +festivity/SM +festoon/SMDG +fest/RVZ +fetal +feta/MS +fetcher/M +fetching/Y +fetch/RSDGZ +feted +fęte/MS +fetich's +fetidness/SM +fetid/YP +feting +fetishism/SM +fetishistic +fetishist/SM +fetish/MS +fetlock/MS +fetter's +fetter/UGSD +fettle/GSD +fettling/M +fettuccine/S +fetus/SM +feudalism/MS +feudalistic +feudal/Y +feudatory/M +feud/MDSG +feverishness/SM +feverish/PY +fever/SDMG +fewness/MS +few/PTRS +Fey/M +Feynman/M +fey/RT +fez/M +Fez/M +fezzes +ff +FHA +fiancée/S +fiancé/MS +Fianna/M +Fiann/M +fiascoes +fiasco/M +Fiat/M +fiat/MS +fibbed +fibber/MS +fibbing +fiberboard/MS +fiber/DM +fiberfill/S +Fiberglas/M +fiberglass/DSMG +Fibonacci/M +fibrillate/XGNDS +fibrillation/M +fibril/MS +fibrin/MS +fibroblast/MS +fibroid/S +fibroses +fibrosis/M +fibrousness/M +fibrous/YP +fib/SZMR +fibulae +fibula/M +fibular +FICA +fices +fiche/SM +Fichte/M +fichu/SM +fickleness/MS +fickle/RTP +ficos +fictionalization/MS +fictionalize/DSG +fictional/Y +fiction/SM +fictitiousness/M +fictitious/PY +fictive/Y +ficus +fiddle/GMZJRSD +fiddler/M +fiddlestick/SM +fiddly +fide/F +Fidela/M +Fidelia/M +Fidelio/M +fidelity/IMS +Fidelity/M +Fidel/M +fidget/DSG +fidgety +Fidole/M +Fido/M +fiducial/Y +fiduciary/MS +fiefdom/S +fief/MS +fielded +fielder/IM +fielding +Fielding/M +Field/MGS +fieldstone/M +fieldworker/M +fieldwork/ZMRS +field/ZISMR +fiendishness/M +fiendish/YP +fiend/MS +fierceness/SM +fierce/RPTY +fierily +fieriness/MS +fiery/PTR +fie/S +fies/C +fiesta/MS +fife/DRSMZG +fifer/M +Fifi/M +Fifine/M +FIFO +fifteen/HRMS +fifteenths +fifths +fifth/Y +fiftieths +fifty/HSM +Figaro/M +figged +figging +fightback +fighter/MIS +fighting/IS +fight/ZSJRG +figment/MS +fig/MLS +Figueroa/M +figural +figuration/FSM +figurativeness/M +figurative/YP +figure/GFESD +figurehead/SM +figurer/SM +figure's +figurine/SM +figuring/S +Fijian/SM +Fiji/M +filamentary +filament/MS +filamentous +Filberte/M +Filbert/M +filbert/MS +Filberto/M +filch/SDG +filed/AC +file/KDRSGMZ +filename/SM +filer/KMCS +files/AC +filet's +filial/UY +Filia/M +filibusterer/M +filibuster/MDRSZG +Filide/M +filigreeing +filigree/MSD +filing/AC +filings +Filipino/SM +Filip/M +Filippa/M +Filippo/M +fill/BAJGSD +filled/U +filler/MS +filleting/M +fillet/MDSG +filling/M +fillip/MDGS +Fillmore/M +filly/SM +filmdom/M +Filmer/M +filminess/SM +filming/M +filmmaker/S +Filmore/M +film/SGMD +filmstrip/SM +filmy/RTP +Filofax/S +filtered/U +filterer/M +filter/RDMSZGB +filthily +filthiness/SM +filth/M +filths +filthy/TRSDGP +filtrated/I +filtrate/SDXMNG +filtrates/I +filtrating/I +filtration/IMS +finagler/M +finagle/RSDZG +finale/MS +finalist/MS +finality/MS +finalization/SM +finalize/GSD +final/SY +Fina/M +financed/A +finance/MGSDJ +finances/A +financial/Y +financier/DMGS +financing/A +Finch/M +finch/MS +findable/U +find/BRJSGZ +finder/M +finding/M +Findlay/M +Findley/M +fine/FGSCRDA +finely +fineness/MS +finery/MAS +fine's +finespun +finesse/SDMG +fingerboard/SM +fingerer/M +fingering/M +fingerless +fingerling/M +fingernail/MS +fingerprint/SGDM +finger/SGRDMJ +fingertip/MS +finial/SM +finical +finickiness/S +finicky/RPT +fining/M +finished/UA +finisher/M +finishes/A +finish/JZGRSD +finis/SM +finite/ISPY +finitely/C +finiteness/MIC +fink/GDMS +Finland/M +Finlay/M +Finley/M +Fin/M +Finnbogadottir/M +finned +Finnegan/M +finner +finning +Finnish +Finn/MS +finny/RT +fin/TGMDRS +Fiona/M +Fionna/M +Fionnula/M +fiord's +Fiorello/M +Fiorenze/M +Fiori/M +f/IRAC +firearm/SM +fireball/SM +fireboat/M +firebomb/MDSG +firebox/MS +firebrand/MS +firebreak/SM +firebrick/SM +firebug/SM +firecracker/SM +firedamp/SM +fired/U +firefight/JRGZS +firefly/MS +Firefox/M +fireguard/M +firehouse/MS +firelight/GZSM +fireman/M +firemen +fire/MS +fireplace/MS +fireplug/MS +firepower/SM +fireproof/SGD +firer/M +firesafe +fireside/SM +Firestone/M +firestorm/SM +firetrap/SM +firetruck/S +firewall/S +firewater/SM +firewood/MS +firework/MS +firing/M +firkin/M +firmament/MS +firmer +firmest +firm/ISFDG +firmly/I +firmness/MS +firm's +firmware/MS +firring +firstborn/S +firsthand +first/SY +firth/M +firths +fir/ZGJMDRHS +fiscal/YS +Fischbein/M +Fischer/M +fishbowl/MS +fishcake/S +fisher/M +Fisher/M +fisherman/M +fishermen/M +fishery/MS +fishhook/MS +fishily +fishiness/MS +fishing/M +fish/JGZMSRD +Fishkill/M +fishmeal +fishmonger/MS +fishnet/SM +fishpond/SM +fishtail/DMGS +fishtanks +fishwife/M +fishwives +fishy/TPR +Fiske/M +Fisk/M +fissile +fissionable/S +fission/BSDMG +fissure/MGSD +fistfight/SM +fistful/MS +fisticuff/SM +fist/MDGS +fistula/SM +fistulous +Fitchburg/M +Fitch/M +fitfulness/SM +fitful/PY +fitments +fitness/USM +fits/AK +fit's/K +fitted/UA +fitter/SM +fittest +fitting/AU +fittingly +fittingness/M +fittings +fit/UYPS +Fitzgerald/M +Fitz/M +Fitzpatrick/M +Fitzroy/M +fivefold +five/MRS +fiver/M +fixable +fixate/VNGXSD +fixatifs +fixation/M +fixative/S +fixedness/M +fixed/YP +fixer/SM +fixes/I +fixing/SM +fixity/MS +fixture/SM +fix/USDG +Fizeau/M +fizzer/M +fizzle/GSD +fizz/SRDG +fizzy/RT +fjord/SM +FL +flabbergast/GSD +flabbergasting/Y +flabbily +flabbiness/SM +flabby/TPR +flab/MS +flaccidity/MS +flaccid/Y +flack/SGDM +flagella/M +flagellate/DSNGX +flagellation/M +flagellum/M +flagged +flaggingly/U +flagging/SMY +flagman/M +flagmen +flag/MS +flagon/SM +flagpole/SM +flagrance/MS +flagrancy/SM +flagrant/Y +flagship/MS +flagstaff/MS +flagstone/SM +flail/SGMD +flair/SM +flaker/M +flake/SM +flakiness/MS +flak/RDMGS +flaky/PRT +Fla/M +flambé/D +flambeing +flambes +flamboyance/MS +flamboyancy/MS +flamboyant/YS +flamenco/SM +flamen/M +flameproof/DGS +flamer/IM +flame's +flame/SIGDR +flamethrower/SM +flamingo/SM +flaming/Y +flammability/ISM +flammable/SI +flam/MRNDJGZ +Flanagan/M +Flanders/M +flange/GMSD +flanker/M +flank/SGZRDM +flan/MS +flannel/DMGS +flannelet/MS +flannelette's +flapjack/SM +flap/MS +flapped +flapper/SM +flapping +flaps/M +flare/SDG +flareup/S +flaring/Y +flashback/SM +flashbulb/SM +flashcard/S +flashcube/MS +flasher/M +flashgun/S +flashily +flashiness/SM +flashing/M +flash/JMRSDGZ +flashlight/MS +flashy/TPR +flask/SM +flatbed/S +flatboat/MS +flatcar/MS +flatfeet +flatfish/SM +flatfoot/SGDM +flathead/M +flatiron/SM +flatland/RS +flatmate/M +flat/MYPS +flatness/MS +flatted +flattener/M +flatten/SDRG +flatter/DRSZG +flatterer/M +flattering/YU +flattery/SM +flattest/M +flatting +flattish +Flatt/M +flattop/MS +flatulence/SM +flatulent/Y +flatus/SM +flatware/MS +flatworm/SM +Flaubert/M +flaunting/Y +flaunt/SDG +flautist/SM +flavored/U +flavorer/M +flavorful +flavoring/M +flavorless +flavor/SJDRMZG +flavorsome +flaw/GDMS +flawlessness/MS +flawless/PY +flax/MSN +flaxseed/M +flayer/M +flay/RDGZS +fleabag/MS +fleabites +flea/SM +fleawort/M +fleck/GRDMS +Fledermaus/M +fledged/U +fledge/GSD +fledgling/SM +fleecer/M +fleece/RSDGMZ +fleeciness/SM +fleecy/RTP +fleeing +flee/RS +fleetingly/M +fleetingness/SM +fleeting/YP +fleet/MYRDGTPS +fleetness/MS +Fleischer/M +Fleischman/M +Fleisher/M +Fleming/M +Flemished/M +Flemish/GDSM +Flemishing/M +Flem/JGM +Flemming/M +flesher/M +fleshiness/M +flesh/JMYRSDG +fleshless +fleshly/TR +fleshpot/SM +fleshy/TPR +fletch/DRSGJ +fletcher/M +Fletcher/M +fletching/M +Fletch/MR +Fleurette/M +Fleur/M +flew/S +flews/M +flexed/I +flexibility/MSI +flexible/I +flexibly/I +flexitime's +flex/MSDAG +flextime/S +flexural +flexure/M +fl/GJD +flibbertigibbet/MS +flicker/GD +flickering/Y +flickery +flick/GZSRD +flier/M +flight/GMDS +flightiness/SM +flightless +flightpath +flighty/RTP +flimflammed +flimflamming +flimflam/MS +flimsily +flimsiness/MS +flimsy/PTRS +flincher/M +flinch/GDRS +flinching/U +flinger/M +fling/RMG +Flin/M +Flinn/M +flintiness/M +flintless +flintlock/MS +Flint/M +flint/MDSG +Flintstones +flinty/TRP +flipflop +flippable +flippancy/MS +flippant/Y +flipped +flipper/SM +flippest +flipping +flip/S +flirtation/SM +flirtatiousness/MS +flirtatious/PY +flirt/GRDS +flit/S +flitted +flitting +floater/M +float/SRDGJZ +floaty +flocculate/GNDS +flocculation/M +flock/SJDMG +floe/MS +flogged +flogger/SM +flogging/SM +flog/S +Flo/M +floodgate/MS +floodlight/DGMS +floodlit +floodplain/S +flood/SMRDG +floodwater/SM +floorboard/MS +floorer/M +flooring/M +floor/SJRDMG +floorspace +floorwalker/SM +floozy/SM +flophouse/SM +flop/MS +flopped +flopper/M +floppily +floppiness/SM +flopping +floppy/TMRSP +floral/SY +Flora/M +Florance/M +flora/SM +Florella/M +Florence/M +Florencia/M +Florentia/M +Florentine/S +Florenza/M +florescence/MIS +florescent/I +Flore/SM +floret/MS +Florette/M +Floria/M +Florian/M +Florida/M +Floridan/S +Floridian/S +floridness/SM +florid/YP +Florie/M +Florina/M +Florinda/M +Florine/M +florin/MS +Flori/SM +florist/MS +Flor/M +Florrie/M +Florri/M +Florry/M +Flory/M +floss/GSDM +Flossie/M +Flossi/M +Flossy/M +flossy/RST +flotation/SM +flotilla/SM +flotsam/SM +flounce/GDS +flouncing/M +flouncy/RT +flounder/SDG +flourisher/M +flourish/GSRD +flourishing/Y +flour/SGDM +floury/TR +flouter/M +flout/GZSRD +flowchart/SG +flowed +flowerbed/SM +flower/CSGD +flowerer/M +floweriness/SM +flowerless +flowerpot/MS +flower's +Flowers +flowery/TRP +flowing/Y +flow/ISG +flown +flowstone +Floyd/M +Flss/M +flt +flubbed +flubbing +flub/S +fluctuate/XSDNG +fluctuation/M +fluency/MS +fluently +fluent/SF +flue/SM +fluffiness/SM +fluff/SGDM +fluffy/PRT +fluidity/SM +fluidized +fluid/MYSP +fluidness/M +fluke/SDGM +fluky/RT +flume/SDGM +flummox/DSG +flu/MS +flung +flunkey's +flunk/SRDG +flunky/MS +fluoresce/GSRD +fluorescence/MS +fluorescent/S +fluoridate/XDSGN +fluoridation/M +fluoride/SM +fluorimetric +fluorinated +fluorine/SM +fluorite/MS +fluorocarbon/MS +fluoroscope/MGDS +fluoroscopic +flurry/GMDS +flushness/M +flush/TRSDPBG +fluster/DSG +fluter/M +flute/SRDGMJ +fluting/M +flutist/MS +flutter/DRSG +flutterer/M +fluttery +fluxed/A +fluxes/A +flux/IMS +fluxing +flyaway +flyblown +flyby/M +flybys +flycatcher/MS +flyer's +fly/JGBDRSTZ +flyleaf/M +flyleaves +Flynn/M +flyover/MS +flypaper/MS +flysheet/S +flyspeck/MDGS +flyswatter/S +flyway/MS +flyweight/MS +flywheel/MS +FM +Fm/M +FNMA/M +foal/MDSG +foaminess/MS +foam/MRDSG +foamy/RPT +fobbed +fobbing +fob/SM +focal/F +focally +Foch/M +foci's +focused/AU +focuser/M +focuses/A +focus/SRDMBG +fodder/GDMS +foe/SM +foetid +FOFL +fogbound +fogged/C +foggily +fogginess/MS +fogging/C +foggy/RPT +foghorn/SM +fogs/C +fog/SM +fogyish +fogy/SM +foible/MS +foil/GSD +foist/GDS +Fokker/M +foldaway/S +folded/AU +folder/M +foldout/MS +fold/RDJSGZ +folds/UA +Foley/M +foliage/MSD +foliate/CSDXGN +foliation/CM +folio/SDMG +folklike +folklore/MS +folkloric +folklorist/SM +folk/MS +folksiness/MS +folksinger/S +folksinging/S +folksong/S +folksy/TPR +folktale/S +folkway/S +foll +follicle/SM +follicular +follower/M +follow/JSZBGRD +followup's +folly/SM +Folsom +fol/Y +Fomalhaut/M +fomentation/SM +fomenter/M +foment/RDSG +Fonda/M +fondant/SM +fondle/GSRD +fondler/M +fondness/MS +fond/PMYRDGTS +fondue/MS +Fons +Fonsie/M +Fontainebleau/M +Fontaine/M +Fontana/M +fontanelle's +fontanel/MS +font/MS +Fonzie/M +Fonz/M +foodie/S +food/MS +foodstuff/MS +foolery/MS +foolhardily +foolhardiness/SM +foolhardy/PTR +foolishness/SM +foolish/PRYT +fool/MDGS +foolproof +foolscap/MS +footage/SM +football/SRDMGZ +footbridge/SM +Foote/M +footer/M +footfall/SM +foothill/SM +foothold/MS +footing/M +footless +footlights +footling +footlocker/SM +footloose +footman/M +footmarks +footmen +footnote/MSDG +footpad/SM +footpath/M +footpaths +footplate/M +footprint/MS +footrace/S +footrest/MS +footsie/SM +foot/SMRDGZJ +footsore +footstep/SM +footstool/SM +footwear/M +footwork/SM +fop/MS +fopped +foppery/MS +fopping +foppishness/SM +foppish/YP +forage/GSRDMZ +forager/M +forayer/M +foray/SGMRD +forbade +forbearance/SM +forbearer/M +forbear/MRSG +Forbes/M +forbidden +forbiddingness/M +forbidding/YPS +forbid/S +forbore +forborne +forced/Y +forcefield/MS +forcefulness/MS +forceful/PY +forceps/M +forcer/M +force/SRDGM +forcibleness/M +forcible/P +forcibly +fordable/U +Fordham/M +Ford/M +ford/SMDBG +forearm/GSDM +forebear/MS +forebode/GJDS +forebodingness/M +foreboding/PYM +forecaster/M +forecastle/MS +forecast/SZGR +foreclose/GSD +foreclosure/MS +forecourt/SM +foredoom/SDG +forefather/SM +forefeet +forefinger/MS +forefoot/M +forefront/SM +foregoer/M +foregoing/S +foregone +foregos +foreground/MGDS +forehand/S +forehead/MS +foreigner/M +foreignness/SM +foreign/PRYZS +foreknew +foreknow/GS +foreknowledge/MS +foreknown +foreleg/MS +forelimb/MS +forelock/MDSG +foreman/M +Foreman/M +foremast/SM +foremen +foremost +forename/DSM +forenoon/SM +forensically +forensic/S +forensics/M +foreordain/DSG +forepart/MS +forepaws +forepeople +foreperson/S +foreplay/MS +forequarter/SM +forerunner/MS +fore/S +foresail/SM +foresaw +foreseeable/U +foreseeing +foreseen/U +foreseer/M +foresee/ZSRB +foreshadow/SGD +foreshore/M +foreshorten/DSG +foresightedness/SM +foresighted/PY +foresight/SMD +foreskin/SM +forestaller/M +forestall/LGSRD +forestallment/M +forestation/MCS +forestations/A +forest/CSAGD +Forester/M +forester/SM +forestland/S +Forest/MR +forestry/MS +forest's +foretaste/MGSD +foreteller/M +foretell/RGS +forethought/MS +foretold +forevermore +forever/PS +forewarner/M +forewarn/GSJRD +forewent +forewoman/M +forewomen +foreword/SM +forfeiter/M +forfeiture/MS +forfeit/ZGDRMS +forfend/GSD +forgather/GSD +forgave +forged/A +forge/JVGMZSRD +forger/M +forgery/MS +forges/A +forgetfulness/SM +forgetful/PY +forget/SV +forgettable/U +forgettably/U +forgetting +forging/M +forgivable/U +forgivably/U +forgiven +forgiveness/SM +forgiver/M +forgive/SRPBZG +forgivingly +forgivingness/M +forgiving/UP +forgoer/M +forgoes +forgone +forgo/RSGZ +forgot +forgotten/U +for/HT +forkful/S +fork/GSRDM +forklift/DMSG +forlornness/M +forlorn/PTRY +formability/AM +formaldehyde/SM +formalin/M +formalism/SM +formalistic +formalist/SM +formality/SMI +formal/IY +formalization/SM +formalized/U +formalizer/M +formalizes/I +formalize/ZGSRD +formalness/M +formals +formant/MIS +format/AVS +formate/MXGNSD +formation/AFSCIM +formatively/I +formativeness/IM +formative/SYP +format's +formatted/UA +formatter/A +formatters +formatter's +formatting/A +form/CGSAFDI +formed/U +former/FSAI +formerly +formfitting +formic +Formica/MS +formidableness/M +formidable/P +formidably +formlessness/MS +formless/PY +Formosa/M +Formosan +form's +formulaic +formula/SM +formulate/AGNSDX +formulated/U +formulation/AM +formulator/SM +fornicate/GNXSD +fornication/M +fornicator/SM +Forrester/M +Forrest/RM +forsaken +forsake/SG +forsook +forsooth +Forster/M +forswear/SG +forswore +forsworn +forsythia/MS +Fortaleza/M +forte/MS +forthcome/JG +forthcoming/U +FORTH/M +forthrightness/SM +forthright/PYS +forthwith +fortieths +fortification/MS +fortified/U +fortifier/SM +fortify/ADSG +fortiori +fortissimo/S +fortitude/SM +fortnightly/S +fortnight/MYS +FORTRAN +Fortran/M +fortress/GMSD +fort/SM +fortuitousness/SM +fortuitous/YP +fortuity/MS +fortunateness/M +fortunate/YUS +fortune/MGSD +fortuneteller/SM +fortunetelling/SM +forty/SRMH +forum/MS +forwarder/M +forwarding/M +forwardness/MS +forward/PTZSGDRY +forwent +fossiliferous +fossilization/MS +fossilized/U +fossilize/GSD +fossil/MS +Foss/M +fosterer/M +Foster/M +foster/SRDG +Foucault/M +fought +foulard/SM +foulmouth/D +foulness/MS +fouls/M +foul/SYRDGTP +foundational +foundation/SM +founded/UF +founder/MDG +founder's/F +founding/F +foundling/MS +found/RDGZS +foundry/MS +founds/KF +fountainhead/SM +fountain/SMDG +fount/MS +fourfold +Fourier/M +fourpence/M +fourpenny +fourposter/SM +fourscore/S +four/SHM +foursome/SM +foursquare +fourteener/M +fourteen/SMRH +fourteenths +Fourth +fourths +Fourths +fourth/Y +fovea/M +fowler/M +Fowler/M +fowling/M +fowl/SGMRD +foxfire/SM +foxglove/SM +Foxhall/M +foxhole/SM +foxhound/SM +foxily +foxiness/MS +foxing/M +fox/MDSG +Fox/MS +foxtail/M +foxtrot/MS +foxtrotted +foxtrotting +foxy/TRP +foyer/SM +FPO +fps +fr +fracas/SM +fractal/SM +fractional/Y +fractionate/DNG +fractionation/M +fractioned +fractioning +fraction/ISMA +fractiousness/SM +fractious/PY +fracture/MGDS +fragile/Y +fragility/MS +fragmentarily +fragmentariness/M +fragmentary/P +fragmentation/MS +fragment/SDMG +Fragonard/M +fragrance/SM +fragrant/Y +frailness/MS +frail/STPYR +frailty/MS +framed/U +framer/M +frame/SRDJGMZ +framework/SM +framing/M +Francaise/M +France/MS +Francene/M +Francesca/M +Francesco/M +franchisee/S +franchise/ESDG +franchiser/SM +franchise's +Franchot/M +Francie/M +Francine/M +Francis +Francisca/M +Franciscan/MS +Francisco/M +Franciska/M +Franciskus/M +francium/MS +Francklin/M +Francklyn/M +Franck/M +Francoise/M +Francois/M +Franco/M +francophone/M +franc/SM +Francyne/M +frangibility/SM +frangible +Frankel/M +Frankenstein/MS +franker/M +Frankford/M +Frankfort/M +Frankfurter/M +frankfurter/MS +Frankfurt/RM +Frankie/M +frankincense/MS +Frankish/M +franklin/M +Franklin/M +Franklyn/M +frankness/MS +frank/SGTYRDP +Frank/SM +Franky/M +Fran/MS +Frannie/M +Franni/M +Franny/M +Fransisco/M +frantically +franticness/M +frantic/PY +Frants/M +Franzen/M +Franz/NM +frappé +frappeed +frappeing +frappes +Frasco/M +Fraser/M +Frasier/M +Frasquito/M +fraternal/Y +fraternity/MSF +fraternization/SM +fraternize/GZRSD +fraternizer/M +fraternizing/U +frat/MS +fratricidal +fratricide/MS +fraud/CS +fraud's +fraudsters +fraudulence/S +fraudulent/YP +fraught/SGD +Fraulein/S +Frau/MN +fray/CSDG +Frayda/M +Frayne/M +fray's +Fraze/MR +Frazer/M +Frazier/M +frazzle/GDS +freakishness/SM +freakish/YP +freak/SGDM +freaky/RT +freckle/GMDS +freckly/RT +Freda/M +Freddie/M +Freddi/M +Freddy/M +Fredek/M +Fredelia/M +Frederica/M +Frederich/M +Fredericka/M +Frederick/MS +Frederic/M +Frederico/M +Fredericton/M +Frederigo/M +Frederik/M +Frederique/M +Fredholm/M +Fredia/M +Fredi/M +Fred/M +Fredra/M +Fredrick/M +Fredrickson/M +Fredric/M +Fredrika/M +freebase/GDS +freebie/MS +freebooter/M +freeboot/ZR +freeborn +freedman/M +Freedman/M +freedmen +freedom/MS +freehand/D +freehanded/Y +freeholder/M +freehold/ZSRM +freeing/S +freelance/SRDGZM +Freeland/M +freeloader/M +freeload/SRDGZ +Free/M +freeman/M +Freeman/M +freemasonry/M +Freemasonry/MS +Freemason/SM +freemen +Freemon/M +freeness/M +Freeport/M +freestanding +freestone/SM +freestyle/SM +freethinker/MS +freethinking/S +Freetown/M +freeway/MS +freewheeler/M +freewheeling/P +freewheel/SRDMGZ +freewill +free/YTDRSP +freezable +freezer/SM +freeze/UGSA +freezing/S +Freida/M +freighter/M +freight/ZGMDRS +Fremont/M +Frenchman/M +French/MDSG +Frenchmen +Frenchwoman/M +Frenchwomen +frenetically +frenetic/S +frenzied/Y +frenzy/MDSG +freon/S +Freon/SM +freq +frequency/ISM +frequented/U +frequenter/MS +frequentest +frequenting +frequent/IY +frequentness/M +frequents +fresco/DMG +frescoes +fresh/AZSRNDG +freshener/M +freshen/SZGDR +fresher/MA +freshest +freshet/SM +freshly +freshman/M +freshmen +freshness/MS +freshwater/SM +Fresnel/M +Fresno/M +fretboard +fretfulness/MS +fretful/PY +fret/S +fretsaw/S +fretted +fretting +fretwork/MS +Freudian/S +Freud/M +Freya/M +Frey/M +friableness/M +friable/P +friary/MS +friar/YMS +fricasseeing +fricassee/MSD +frication/M +fricative/MS +Frick/M +frictional/Y +frictionless/Y +friction/MS +Friday/SM +fridge/SM +fried/A +Frieda/M +Friedan/M +friedcake/SM +Friederike/M +Friedman/M +Friedrich/M +Friedrick/M +friendlessness/M +friendless/P +friendlies +friendlily +friendliness/USM +friendly/PUTR +friend/SGMYD +friendship/MS +frier's +fries/M +frieze/SDGM +frigate/SM +Frigga/M +frigged +frigging/S +frighten/DG +frightening/Y +frightfulness/MS +frightful/PY +fright/GXMDNS +Frigidaire/M +frigidity/MS +frigidness/SM +frigid/YP +frig/S +frill/MDGS +frilly/RST +Fri/M +fringe/IGSD +fringe's +frippery/SM +Frisbee/MS +Frisco/M +Frisian/SM +frisker/M +friskily +friskiness/SM +frisk/RDGS +frisky/RTP +frisson/M +Frito/M +fritterer/M +fritter/RDSG +Fritz/M +fritz/SM +frivolity/MS +frivolousness/SM +frivolous/PY +frizz/GYSD +frizzle/DSG +frizzly/RT +frizzy/RT +Fr/MD +Frobisher/M +frocking/M +frock's +frock/SUDGC +frogged +frogging +frogman/M +frogmarched +frogmen +frog/MS +fro/HS +Froissart/M +frolicked +frolicker/SM +frolicking +frolic/SM +frolicsome +from +Fromm/M +frond/SM +frontage/MS +frontal/SY +Frontenac/M +front/GSFRD +frontier/SM +frontiersman/M +frontiersmen +frontispiece/SM +frontrunner's +front's +frontward/S +frosh/M +Frostbelt/M +frostbite/MS +frostbit/G +frostbiting/M +frostbitten +frost/CDSG +frosteds +frosted/U +frostily +frostiness/SM +frosting/MS +Frost/M +frost's +frosty/PTR +froth/GMD +frothiness/SM +froths +frothy/TRP +froufrou/MS +frowardness/MS +froward/P +frowner/M +frowning/Y +frown/RDSG +frowzily +frowziness/SM +frowzy/RPT +frozenness/M +frozen/YP +froze/UA +fructify/GSD +fructose/MS +Fruehauf/M +frugality/SM +frugal/Y +fruitcake/SM +fruiterer/M +fruiter/RM +fruitfuller +fruitfullest +fruitfulness/MS +fruitful/UYP +fruit/GMRDS +fruitiness/MS +fruition/SM +fruitlessness/MS +fruitless/YP +fruity/RPT +frumpish +frump/MS +frumpy/TR +Frunze/M +frustrater/M +frustrate/RSDXNG +frustrating/Y +frustration/M +frustum/SM +Frye/M +fryer/MS +Fry/M +fry/NGDS +F's +f's/KA +FSLIC +ft/C +FTC +FTP +fuchsia/MS +Fuchs/M +fucker/M! +fuck/GZJRDMS! +FUD +fuddle/GSD +fudge/GMSD +fuel/ASDG +fueler/SM +fuel's +Fuentes/M +fugal +Fugger/M +fugitiveness/M +fugitive/SYMP +fugue/GMSD +fuhrer/S +Fuji/M +Fujitsu/M +Fujiyama +Fukuoka/M +Fulani/M +Fulbright/M +fulcrum/SM +fulfilled/U +fulfiller/M +fulfill/GLSRD +fulfillment/MS +fullback/SMG +fuller/DMG +Fuller/M +Fullerton/M +fullish +fullness/MS +full/RDPSGZT +fullstops +fullword/SM +fully +fulminate/XSDGN +fulmination/M +fulness's +fulsomeness/SM +fulsome/PY +Fulton/M +Fulvia/M +fumble/GZRSD +fumbler/M +fumbling/Y +fume/DSG +fumigant/MS +fumigate/NGSDX +fumigation/M +fumigator/SM +fuming/Y +fumy/TR +Funafuti +functionalism/M +functionalist/SM +functionality/S +functional/YS +functionary/MS +function/GSMD +functor/SM +fundamentalism/SM +fundamentalist/SM +fundamental/SY +fund/ASMRDZG +funded/U +fundholders +fundholding +funding/S +Fundy/M +funeral/MS +funerary +funereal/Y +funfair/M +fungal/S +fungible/M +fungicidal +fungicide/SM +fungi/M +fungoid/S +fungous +fungus/M +funicular/SM +funk/GSDM +funkiness/S +funky/RTP +fun/MS +funned +funnel/SGMD +funner +funnest +funnily/U +funniness/SM +funning +funny/RSPT +furbelow/MDSG +furbisher/M +furbish/GDRSA +furiousness/M +furious/RYP +furlong/MS +furlough/DGM +furloughs +furl/UDGS +furn +furnace/GMSD +furnished/U +furnisher/MS +furnish/GASD +furnishing/SM +furniture/SM +furore/MS +furor/MS +fur/PMS +furred +furrier/M +furriness/SM +furring/SM +furrow/DMGS +furry/RTZP +furtherance/MS +furtherer/M +furthermore +furthermost +further/TGDRS +furthest +furtiveness/SM +furtive/PY +fury/SM +furze/SM +fusebox/S +fusee/SM +fuse/FSDAGCI +fuselage/SM +fuse's/A +Fushun/M +fusibility/SM +fusible/I +fusiform +fusilier/MS +fusillade/SDMG +fusion/KMFSI +fussbudget/MS +fusser/M +fussily +fussiness/MS +fusspot/SM +fuss/SRDMG +fussy/PTR +fustian/MS +fustiness/MS +fusty/RPT +fut +futileness/M +futile/PY +futility/MS +futon/S +future/SM +futurism/SM +futuristic/S +futurist/S +futurity/MS +futurologist/S +futurology/MS +futz/GSD +fuze's +Fuzhou/M +Fuzzbuster/M +fuzzily +fuzziness/SM +fuzz/SDMG +fuzzy/PRT +fwd +FWD +fwy +FY +FYI +GA +gabardine/SM +gabbed +Gabbey/M +Gabbie/M +Gabbi/M +gabbiness/S +gabbing +gabble/SDG +Gabby/M +gabby/TRP +Gabe/M +gaberdine's +Gabey/M +gabfest/MS +Gabie/M +Gabi/M +gable/GMSRD +Gable/M +Gabonese +Gabon/M +Gaborone/M +Gabriela/M +Gabriele/M +Gabriella/M +Gabrielle/M +Gabriellia/M +Gabriell/M +Gabriello/M +Gabriel/M +Gabrila/M +gab/S +Gaby/M +Gacrux/M +gadabout/MS +gadded +gadder/MS +gadding +gadfly/MS +gadgetry/MS +gadget/SM +gadolinium/MS +gad/S +Gadsden/M +Gaea/M +Gaelan/M +Gaelic/M +Gael/SM +Gae/M +gaffe/MS +gaffer/M +gaff/SGZRDM +gaga +Gagarin/M +gag/DRSG +Gage/M +gager/M +gage/SM +gagged +gagging +gaggle/SDG +gagwriter/S +gaiety/MS +Gaile/M +Gail/M +gaily +gain/ADGS +gainer/SM +Gaines/M +Gainesville/M +gainfulness/M +gainful/YP +gaining/S +gainly/U +gainsaid +gainsayer/M +gainsay/RSZG +Gainsborough/M +gaiter/M +gait/GSZMRD +Gaithersburg/M +galactic +Galahad/MS +Galapagos/M +gal/AS +gala/SM +Galatea/M +Galatia/M +Galatians/M +Galaxy/M +galaxy/MS +Galbraith/M +Galbreath/M +gale/AS +Gale/M +galen +galena/MS +galenite/M +Galen/M +gale's +Galibi/M +Galilean/MS +Galilee/M +Galileo/M +Galina/M +Gallagher/M +gallanted +gallanting +gallantry/MS +gallants +gallant/UY +Gallard/M +gallbladder/MS +Gallegos/M +galleon/SM +galleria/S +gallery/MSDG +galley/MS +Gallic +Gallicism/SM +gallimaufry/MS +galling/Y +gallium/SM +gallivant/GDS +Gall/M +gallonage/M +gallon/SM +galloper/M +gallop/GSRDZ +Galloway/M +gallows/M +gall/SGMD +gallstone/MS +Gallup/M +Gal/MN +Galois/M +galoot/MS +galore/S +galosh/GMSD +gal's +Galsworthy/M +galumph/GD +galumphs +galvanic +Galvani/M +galvanism/MS +galvanization/SM +galvanize/SDG +Galvan/M +galvanometer/SM +galvanometric +Galven/M +Galveston/M +Galvin/M +Ga/M +Gamaliel/M +Gama/M +Gambia/M +Gambian/S +gambit/MS +gamble/GZRSD +Gamble/M +gambler/M +gambol/SGD +gamecock/SM +gamekeeper/MS +gameness/MS +game/PJDRSMYTZG +gamesmanship/SM +gamesmen +gamester/M +gamest/RZ +gamete/MS +gametic +gamine/SM +gaminess/MS +gaming/M +gamin/MS +gamma/MS +gammon/DMSG +Gamow/M +gamut/MS +gamy/TRP +gander/DMGS +Gandhian +Gandhi/M +gangbusters +ganger/M +Ganges/M +gang/GRDMS +gangland/SM +ganglia/M +gangling +ganglionic +ganglion/M +gangplank/SM +gangrene/SDMG +gangrenous +gangster/SM +Gangtok/M +gangway/MS +Gan/M +gannet/SM +Gannie/M +Gannon/M +Ganny/M +gantlet/GMDS +Gantry/M +gantry/MS +Ganymede/M +GAO +gaoler/M +gaol/MRDGZS +gaper/M +gape/S +gaping/Y +gapped +gapping +gap/SJMDRG +garage/GMSD +Garald/M +garbageman/M +garbage/SDMG +garbanzo/MS +garb/DMGS +garbler/M +garble/RSDG +Garbo/M +Garcia/M +garçon/SM +gardener/M +Gardener/M +gardenia/SM +gardening/M +garden/ZGRDMS +Gardie/M +Gardiner/M +Gard/M +Gardner/M +Gardy/M +Garek/M +Gare/MH +Gareth/M +Garey/M +Garfield/M +garfish/MS +Garfunkel/M +Gargantua/M +gargantuan +gargle/SDG +gargoyle/DSM +Garibaldi/M +Garik/M +garishness/MS +garish/YP +Garland/M +garland/SMDG +garlicked +garlicking +garlicky +garlic/SM +garment/MDGS +Gar/MH +Garner/M +garner/SGD +Garnet/M +garnet/SM +Garnette/M +Garnett/M +garnish/DSLG +garnisheeing +garnishee/SDM +garnishment/MS +Garold/M +garote's +garotte's +Garrard/M +garred +Garrek/M +Garreth/M +Garret/M +garret/SM +Garrett/M +Garrick/M +Garrik/M +garring +Garrison/M +garrison/SGMD +garroter/M +garrote/SRDMZG +Garrot/M +garrotte's +Garrott/M +garrulity/SM +garrulousness/MS +garrulous/PY +Garry/M +gar/SLM +garter/SGDM +Garth/M +Garvey/M +Garvin/M +Garv/M +Garvy/M +Garwin/M +Garwood/M +Gary/M +Garza/M +gasbag/MS +Gascony/M +gaseousness/M +gaseous/YP +gases/C +gas/FC +gash/GTMSRD +gasification/M +gasifier/M +gasify/SRDGXZN +gasket/SM +gaslight/DMS +gasohol/S +gasoline/MS +gasometer/M +Gaspard/M +Gaspar/M +Gasparo/M +gasper/M +Gasper/M +gasp/GZSRD +gasping/Y +gas's +gassed/C +Gasser/M +gasser/MS +Gasset/M +gassiness/M +gassing/SM +gassy/PTR +Gaston/M +gastric +gastritides +gastritis/MS +gastroenteritides +gastroenteritis/M +gastrointestinal +gastronome/SM +gastronomic +gastronomical/Y +gastronomy/MS +gastropod/SM +gasworks/M +gateau/MS +gateaux +gatecrash/GZSRD +gatehouse/MS +gatekeeper/SM +gate/MGDS +gatepost/SM +Gates +gateway/MS +gathered/IA +gatherer/M +gathering/M +gather/JRDZGS +gathers/A +Gatlinburg/M +Gatling/M +Gatorade/M +gator/MS +Gatsby/M +Gatun/M +gaucheness/SM +gaucherie/SM +gauche/TYPR +gaucho/SM +gaudily +gaudiness/MS +gaudy/PRST +gaugeable +gauger/M +Gauguin/M +Gaulish/M +Gaulle/M +Gaul/MS +Gaultiero/M +gauntlet/GSDM +Gauntley/M +gauntness/MS +gaunt/PYRDSGT +gauss/C +gausses +Gaussian +Gauss/M +gauss's +Gautama/M +Gauthier/M +Gautier/M +gauze/SDGM +gauziness/MS +gauzy/TRP +Gavan/M +gave +gavel/GMDS +Gaven/M +Gavin/M +Gav/MN +gavotte/MSDG +Gavra/M +Gavrielle/M +Gawain/M +Gawen/M +gawkily +gawkiness/MS +gawk/SGRDM +gawky/RSPT +Gayel/M +Gayelord/M +Gaye/M +gayety's +Gayla/M +Gayleen/M +Gaylene/M +Gayler/M +Gayle/RM +Gaylord/M +Gaylor/M +Gay/M +gayness/SM +Gaynor/M +gay/RTPS +Gaza/M +gazebo/SM +gaze/DRSZG +gazelle/MS +gazer/M +gazetteer/SGDM +gazette/MGSD +Gaziantep/M +gazillion/S +gazpacho/MS +GB +G/B +Gdansk/M +Gd/M +GDP +Gearalt/M +Gearard/M +gearbox/SM +gear/DMJSG +gearing/M +gearshift/MS +gearstick +gearwheel/SM +Geary/M +gecko/MS +GED +geegaw's +geeing +geek/SM +geeky/RT +geese/M +geest/M +gee/TDS +geezer/MS +Gehenna/M +Gehrig/M +Geiger/M +Geigy/M +geisha/M +gelatinousness/M +gelatinous/PY +gelatin/SM +gelcap +gelding/M +geld/JSGD +gelid +gelignite/MS +gelled +gelling +gel/MBS +Gelya/M +Ge/M +GE/M +Gemini/SM +gemlike +Gemma/M +gemmed +gemming +gem/MS +gemological +gemologist/MS +gemology/MS +gemstone/SM +gen +Gena/M +Genaro/M +gendarme/MS +gender/DMGS +genderless +genealogical/Y +genealogist/SM +genealogy/MS +Gene/M +gene/MS +generalissimo/SM +generalist/MS +generality/MS +generalizable/SM +generalization/MS +generalized/U +generalize/GZBSRD +generalizer/M +general/MSPY +generalness/M +generalship/SM +genera/M +generate/CXAVNGSD +generational +generation/MCA +generative/AY +generators/A +generator/SM +generically +generic/PS +generosity/MS +generously/U +generousness/SM +generous/PY +Genesco/M +genesis/M +Genesis/M +genes/S +genetically +geneticist/MS +genetic/S +genetics/M +Genet/M +Geneva/M +Genevieve/M +Genevra/M +Genghis/M +geniality/FMS +genially/F +genialness/M +genial/PY +Genia/M +genies/K +genie/SM +genii/M +genitalia +genitals +genital/YF +genitive/SM +genitourinary +genius/SM +Gen/M +Genna/M +Gennie/M +Gennifer/M +Genni/M +Genny/M +Genoa/SM +genocidal +genocide/SM +Geno/M +genome/SM +genotype/MS +Genovera/M +genre/MS +gent/AMS +genteelness/MS +genteel/PRYT +gentian/SM +gentile/S +Gentile's +gentility/MS +gentlefolk/S +gentlemanliness/M +gentlemanly/U +gentleman/YM +gentlemen +gentleness/SM +gentle/PRSDGT +gentlewoman/M +gentlewomen/M +gently +gentrification/M +gentrify/NSDGX +Gentry/M +gentry/MS +genuflect/GDS +genuflection/MS +genuineness/SM +genuine/PY +genus +Genvieve/M +geocentric +geocentrically +geocentricism +geochemical/Y +geochemistry/MS +geochronology/M +geodesic/S +geode/SM +geodesy/MS +geodetic/S +Geoff/M +Geoffrey/M +Geoffry/M +geog +geographer/MS +geographic +geographical/Y +geography/MS +geologic +geological/Y +geologist/MS +geology/MS +geom +Geo/M +geomagnetic +geomagnetically +geomagnetism/SM +geometer/MS +geometrical/Y +geometrician/M +geometric/S +geometry/MS +geomorphological +geomorphology/M +geophysical/Y +geophysicist/MS +geophysics/M +geopolitical/Y +geopolitic/S +geopolitics/M +Georas/M +Geordie/M +Georgeanna/M +Georgeanne/M +Georgena/M +George/SM +Georgeta/M +Georgetown/M +Georgetta/M +Georgette/M +Georgia/M +Georgiana/M +Georgianna/M +Georgianne/M +Georgian/S +Georgie/M +Georgi/M +Georgina/M +Georgine/M +Georg/M +Georgy/M +geostationary +geosynchronous +geosyncline/SM +geothermal +geothermic +Geralda/M +Geraldine/M +Gerald/M +geranium/SM +Gerard/M +Gerardo/M +Gerber/M +gerbil/MS +Gerda/M +Gerek/M +Gerhardine/M +Gerhard/M +Gerhardt/M +Gerianna/M +Gerianne/M +geriatric/S +geriatrics/M +Gerick/M +Gerik/M +Geri/M +Geritol/M +Gerladina/M +Ger/M +Germaine/M +Germain/M +Germana/M +germane +Germania/M +Germanic/M +germanium/SM +germanized +German/SM +Germantown/M +Germany/M +Germayne/M +germen/M +germicidal +germicide/MS +germinal/Y +germinated/U +germinate/XVGNSD +germination/M +germinative/Y +germ/MNS +Gerome/M +Geronimo/M +gerontocracy/M +gerontological +gerontologist/SM +gerontology/SM +Gerrard/M +Gerrie/M +Gerrilee/M +Gerri/M +Gerry/M +gerrymander/SGD +Gershwin/MS +Gerta/M +Gertie/M +Gerti/M +Gert/M +Gertruda/M +Gertrude/M +Gertrudis/M +Gertrud/M +Gerty/M +gerundive/M +gerund/SVM +Gery/M +gestalt/M +gestapo/S +Gestapo/SM +gestate/SDGNX +gestational +gestation/M +gesticulate/XSDVGN +gesticulation/M +gesticulative/Y +gestural +gesture/SDMG +gesundheit +getaway/SM +Gethsemane/M +get/S +getter/SDM +getting +Getty/M +Gettysburg/M +getup/MS +gewgaw/MS +Gewürztraminer +geyser/GDMS +Ghanaian/MS +Ghana/M +Ghanian's +ghastliness/MS +ghastly/TPR +ghat/MS +Ghats/M +Ghent/M +Gherardo/M +gherkin/SM +ghetto/DGMS +ghettoize/SDG +Ghibelline/M +ghostlike +ghostliness/MS +ghostly/TRP +ghost/SMYDG +ghostwrite/RSGZ +ghostwritten +ghostwrote +ghoulishness/SM +ghoulish/PY +ghoul/SM +GHQ +GI +Giacinta/M +Giacobo/M +Giacometti/M +Giacomo/M +Giacopo/M +Giana/M +Gianina/M +Gian/M +Gianna/M +Gianni/M +Giannini/M +giantess/MS +giantkiller +giant/SM +Giauque/M +Giavani/M +gibber/DGS +gibberish/MS +gibbet/MDSG +Gibbie/M +Gibb/MS +Gibbon/M +gibbon/MS +gibbousness/M +gibbous/YP +Gibby/M +gibe/GDRS +giber/M +giblet/MS +Gib/M +Gibraltar/MS +Gibson/M +giddap +giddily +giddiness/SM +Giddings/M +giddy/GPRSDT +Gide/M +Gideon/MS +Gielgud/M +Gienah/M +Giffard/M +Giffer/M +Giffie/M +Gifford/M +Giff/RM +Giffy/M +giftedness/M +gifted/PY +gift/SGMD +gigabyte/S +gigacycle/MS +gigahertz/M +gigantically +giganticness/M +gigantic/P +gigavolt +gigawatt/M +gigged +gigging +giggler/M +giggle/RSDGZ +giggling/Y +giggly/TR +Gigi/M +gig/MS +GIGO +gigolo/MS +gila +Gila/M +Gilberta/M +Gilberte/M +Gilbertina/M +Gilbertine/M +gilbert/M +Gilbert/M +Gilberto/M +Gilbertson/M +Gilburt/M +Gilchrist/M +Gilda/M +gilder/M +gilding/M +gild/JSGZRD +Gilead/M +Gilemette/M +Giles +Gilgamesh/M +Gilkson/M +Gillan/M +Gilles +Gillespie/M +Gillette/M +Gilliam/M +Gillian/M +Gillie/M +Gilligan/M +Gilli/M +Gill/M +gill/SGMRD +Gilly/M +Gilmore/M +Gil/MY +gilt/S +gimbaled +gimbals +Gimbel/M +gimcrackery/SM +gimcrack/S +gimlet/MDSG +gimme/S +gimmick/GDMS +gimmickry/MS +gimmicky +gimp/GSMD +gimpy/RT +Gina/M +Ginelle/M +Ginevra/M +gingerbread/SM +gingerliness/M +gingerly/P +Ginger/M +ginger/SGDYM +gingersnap/SM +gingery +gingham/SM +gingivitis/SM +Gingrich/M +ginkgoes +ginkgo/M +ginmill +gin/MS +ginned +Ginnie/M +Ginnifer/M +Ginni/M +ginning +Ginny/M +Gino/M +Ginsberg/M +Ginsburg/M +ginseng/SM +Gioconda/M +Giordano/M +Giorgia/M +Giorgi/M +Giorgio/M +Giorgione/M +Giotto/M +Giovanna/M +Giovanni/M +Gipsy's +giraffe/MS +Giralda/M +Giraldo/M +Giraud/M +Giraudoux/M +girded/U +girder/M +girdle/GMRSD +girdler/M +gird/RDSGZ +girlfriend/MS +girlhood/SM +girlie/M +girlishness/SM +girlish/YP +girl/MS +giro/M +girt/GDS +girth/MDG +girths +Gisela/M +Giselbert/M +Gisele/M +Gisella/M +Giselle/M +Gish/M +gist/MS +git/M +Giuditta/M +Giulia/M +Giuliano/M +Giulietta/M +Giulio/M +Giuseppe/M +Giustina/M +Giustino/M +Giusto/M +giveaway/SM +giveback/S +give/HZGRS +given/SP +giver/M +giving/Y +Giza/M +Gizela/M +gizmo's +gizzard/SM +Gk/M +glacé/DGS +glacial/Y +glaciate/XNGDS +glaciation/M +glacier/SM +glaciological +glaciologist/M +glaciology/M +gladded +gladden/GDS +gladder +gladdest +gladding +gladdy +glade/SM +gladiatorial +gladiator/SM +Gladi/M +gladiola/MS +gladioli +gladiolus/M +gladly/RT +Glad/M +gladness/MS +gladsome/RT +Gladstone/MS +Gladys +glad/YSP +glamor/DMGS +glamorization/MS +glamorizer/M +glamorize/SRDZG +glamorousness/M +glamorous/PY +glance/GJSD +glancing/Y +glanders/M +glandes +glandular/Y +gland/ZSM +glans/M +glare/SDG +glaringness/M +glaring/YP +Glaser/M +Glasgow/M +glasnost/S +glassblower/S +glassblowing/MS +glassful/MS +glass/GSDM +glasshouse/SM +glassily +glassiness/SM +glassless +Glass/M +glassware/SM +glasswort/M +glassy/PRST +Glastonbury/M +Glaswegian/S +glaucoma/SM +glaucous +glazed/U +glazer/M +glaze/SRDGZJ +glazier/SM +glazing/M +gleam/MDGS +gleaner/M +gleaning/M +glean/RDGZJS +Gleason/M +Gleda/M +gleed/M +glee/DSM +gleefulness/MS +gleeful/YP +gleeing +Glendale/M +Glenda/M +Glenden/M +Glendon/M +Glenine/M +Glen/M +Glenna/M +Glennie/M +Glennis/M +Glenn/M +glen/SM +glibber +glibbest +glibness/MS +glib/YP +glide/JGZSRD +glider/M +glim/M +glimmer/DSJG +glimmering/M +glimpse/DRSZMG +glimpser/M +glint/DSG +glissandi +glissando/M +glisten/DSG +glister/DGS +glitch/MS +glitter/GDSJ +glittering/Y +glittery +glitz/GSD +glitzy/TR +gloaming/MS +gloater/M +gloating/Y +gloat/SRDG +globalism/S +globalist/S +global/SY +globe/SM +globetrotter/MS +glob/GDMS +globularity/M +globularness/M +globular/PY +globule/MS +globulin/MS +glockenspiel/SM +glommed +gloom/GSMD +gloomily +gloominess/MS +gloomy/RTP +glop/MS +glopped +glopping +gloppy/TR +Gloria/M +Gloriana/M +Gloriane/M +glorification/M +glorifier/M +glorify/XZRSDNG +Glori/M +glorious/IYP +gloriousness/IM +Glory/M +glory/SDMG +glossary/MS +gloss/GSDM +glossily +glossiness/SM +glossolalia/SM +glossy/RSPT +glottal +glottalization/M +glottis/MS +Gloucester/M +gloveless +glover/M +Glover/M +glove/SRDGMZ +glower/GD +glow/GZRDMS +glowing/Y +glowworm/SM +glucose/SM +glue/DRSMZG +glued/U +gluer/M +gluey +gluier +gluiest +glummer +glummest +glumness/MS +glum/SYP +gluon/M +glutamate/M +gluten/M +glutenous +glutinousness/M +glutinous/PY +glut/SMNX +glutted +glutting +glutton/MS +gluttonous/Y +gluttony/SM +glyceride/M +glycerinate/MD +glycerine's +glycerin/SM +glycerolized/C +glycerol/SM +glycine/M +glycogen/SM +glycol/MS +Glynda/M +Glynis/M +Glyn/M +Glynnis/M +Glynn/M +glyph/M +glyphs +gm +GM +GMT +gnarl/SMDG +gnash/SDG +gnat/MS +gnawer/M +gnaw/GRDSJ +gnawing/M +gneiss/SM +Gnni/M +gnomelike +GNOME/M +gnome/SM +gnomic +gnomish +gnomonic +gnosticism +Gnosticism/M +gnostic/K +Gnostic/M +GNP +gnu/MS +goad/MDSG +goalie/SM +goalkeeper/MS +goalkeeping/M +goalless +goal/MDSG +goalmouth/M +goalpost/S +goalscorer +goalscoring +goaltender/SM +Goa/M +goatee/SM +goatherd/MS +goat/MS +goatskin/SM +gobbed +gobbet/MS +gobbing +gobbledegook's +gobbledygook/S +gobbler/M +gobble/SRDGZ +Gobi/M +goblet/MS +goblin/SM +gob/SM +Godard/M +Godart/M +godchild/M +godchildren +goddammit +goddamn/GS +Goddard/M +Goddart/M +goddaughter/SM +godded +goddess/MS +godding +Gödel/M +godfather/GSDM +godforsaken +Godfree/M +Godfrey/M +Godfry/M +godhead/S +godhood/SM +Godiva/M +godlessness/MS +godless/P +godlikeness/M +godlike/P +godliness/UMS +godly/UTPR +God/M +godmother/MS +Godot/M +godparent/SM +godsend/MS +god/SMY +godson/MS +Godspeed/S +Godthaab/M +Godunov/M +Godwin/M +Godzilla/M +Goebbels/M +Goering/M +goer/MG +goes +Goethals/M +Goethe/M +gofer/SM +Goff/M +goggler/M +goggle/SRDGZ +Gogh/M +Gog/M +Gogol/M +Goiania/M +going/M +goiter/SM +Golan/M +Golconda/M +Golda/M +Goldarina/M +Goldberg/M +goldbricker/M +goldbrick/GZRDMS +Golden/M +goldenness/M +goldenrod/SM +goldenseal/M +golden/TRYP +goldfinch/MS +goldfish/SM +Goldia/M +Goldie/M +Goldilocks/M +Goldi/M +Goldina/M +Golding/M +Goldman/M +goldmine/S +gold/MRNGTS +goldsmith/M +Goldsmith/M +goldsmiths +Goldstein/M +Goldwater/M +Goldwyn/M +Goldy/M +Goleta/M +golfer/M +golf/RDMGZS +Golgotha/M +Goliath/M +Goliaths +golly/S +Gomez/M +Gomorrah/M +Gompers/M +go/MRHZGJ +gonadal +gonad/SM +gondola/SM +gondolier/MS +Gondwanaland/M +goner/M +gone/RZN +gong/SGDM +gonion/M +gonna +gonorrheal +gonorrhea/MS +Gonzales/M +Gonzalez/M +Gonzalo/M +Goober/M +goober/MS +goodbye/MS +goodhearted +goodie's +goodish +goodly/TR +Good/M +Goodman/M +goodness/MS +goodnight +Goodrich/M +good/SYP +goodwill/MS +Goodwin/M +Goodyear/M +goody/SM +gooey +goofiness/MS +goof/SDMG +goofy/RPT +Google/M +gooier +gooiest +gook/SM +goo/MS +goon/SM +goop/SM +gooseberry/MS +goosebumps +goose/M +goos/SDG +GOP +Gopher +gopher/SM +Goran/M +Goraud/M +Gorbachev +Gordan/M +Gorden/M +Gordian/M +Gordie/M +Gordimer/M +Gordon/M +Gordy/M +gore/DSMG +Gore/M +Goren/M +Gorey/M +Gorgas +gorged/E +gorge/GMSRD +gorgeousness/SM +gorgeous/YP +gorger/EM +gorges/E +gorging/E +Gorgon/M +gorgon/S +Gorgonzola/M +Gorham/M +gorilla/MS +gorily +goriness/MS +goring/M +Gorky/M +gormandizer/M +gormandize/SRDGZ +gormless +gorp/S +gorse/SM +gory/PRT +gos +goshawk/MS +gosh/S +gosling/M +gospeler/M +gospel/MRSZ +Gospel/SM +gossamer/SM +gossipy +gossip/ZGMRDS +gotcha/SM +Göteborg/M +Gotham/M +Gothart/M +Gothicism/M +Gothic/S +Goth/M +Goths +got/IU +goto +GOTO/MS +gotta +gotten/U +Gottfried/M +Goucher/M +Gouda/SM +gouge/GZSRD +gouger/M +goulash/SM +Gould/M +Gounod/M +gourde/SM +gourd/MS +gourmand/MS +gourmet/MS +gout/SM +gouty/RT +governable/U +governance/SM +governed/U +governess/SM +govern/LBGSD +governmental/Y +government/MS +Governor +governor/MS +governorship/SM +gov/S +govt +gown/GSDM +Goya/M +GP +GPA +GPO +GPSS +gr +grabbed +grabber/SM +grabbing/S +grab/S +Gracchus/M +grace/ESDMG +graceful/EYPU +gracefuller +gracefullest +gracefulness/ESM +Graceland/M +gracelessness/MS +graceless/PY +Grace/M +Gracia/M +Graciela/M +Gracie/M +graciousness/SM +gracious/UY +grackle/SM +gradate/DSNGX +gradation/MCS +grade/ACSDG +graded/U +Gradeigh/M +gradely +grader/MC +grade's +Gradey/M +gradient/RMS +grad/MRDGZJS +gradualism/MS +gradualist/MS +gradualness/MS +gradual/SYP +graduand/SM +graduate/MNGDSX +graduation/M +Grady/M +Graehme/M +Graeme/M +Graffias/M +graffiti +graffito/M +Graff/M +grafter/M +grafting/M +graft/MRDSGZ +Grafton/M +Grahame/M +Graham/M +graham/SM +Graig/M +grail/S +Grail/SM +grainer/M +grain/IGSD +graininess/MS +graining/M +grain's +grainy/RTP +gram/KSM +Gram/M +grammarian/SM +grammar/MS +grammaticality/M +grammaticalness/M +grammatical/UY +grammatic/K +gramme/SM +Grammy/S +gramophone/SM +Grampians +grampus/SM +Granada/M +granary/MS +grandam/SM +grandaunt/MS +grandchild/M +grandchildren +granddaddy/MS +granddad/SM +granddaughter/MS +grandee/SM +grandeur/MS +grandfather/MYDSG +grandiloquence/SM +grandiloquent/Y +grandiose/YP +grandiosity/MS +grandkid/SM +grandma/MS +grandmaster/MS +grandmother/MYS +grandnephew/MS +grandness/MS +grandniece/SM +grandpa/MS +grandparent/MS +grandson/MS +grandstander/M +grandstand/SRDMG +grand/TPSYR +granduncle/MS +Grange/MR +grange/MSR +Granger/M +granite/MS +granitic +Gran/M +Grannie/M +Granny/M +granny/MS +granola/S +grantee/MS +granter/M +Grantham/M +Granthem/M +Grantley/M +Grant/M +grantor's +grant/SGZMRD +grantsmanship/S +granularity/SM +granular/Y +granulate/SDXVGN +granulation/M +granule/SM +granulocytic +Granville/M +grapefruit/SM +grape/SDGM +grapeshot/M +grapevine/MS +grapheme/M +graph/GMD +graphical/Y +graphicness/M +graphic/PS +graphics/M +graphite/SM +graphologist/SM +graphology/MS +graphs +grapnel/SM +grapple/DRSG +grappler/M +grappling/M +grasper/M +graspingness/M +grasping/PY +grasp/SRDBG +grass/GZSDM +grasshopper/SM +grassland/MS +Grass/M +grassroots +grassy/RT +Grata/M +gratefuller +gratefullest +gratefulness/USM +grateful/YPU +grater/M +grates/I +grate/SRDJGZ +Gratia/M +Gratiana/M +graticule/M +gratification/M +gratified/U +gratifying/Y +gratify/NDSXG +grating/YM +gratis +gratitude/IMS +gratuitousness/MS +gratuitous/PY +gratuity/SM +gravamen/SM +gravedigger/SM +gravel/SGMYD +graven +graveness/MS +graver/M +graveside/S +Graves/M +grave/SRDPGMZTY +gravestone/SM +graveyard/MS +gravidness/M +gravid/PY +gravimeter/SM +gravimetric +gravitas +gravitate/XVGNSD +gravitational/Y +gravitation/M +graviton/SM +gravity/MS +gravy/SM +graybeard/MS +Grayce/M +grayish +Gray/M +grayness/S +gray/PYRDGTS +Grayson/M +graze/GZSRD +grazer/M +Grazia/M +grazing/M +grease/GMZSRD +greasepaint/MS +greaseproof +greaser/M +greasily +greasiness/SM +greasy/PRT +greatcoat/DMS +greaten/DG +greathearted +greatness/MS +great/SPTYRN +grebe/MS +Grecian/S +Greece/M +greed/C +greedily +greediness/SM +greeds +greed's +greedy/RTP +Greek/SM +Greeley/M +greenback/MS +greenbelt/S +Greenberg/M +Greenblatt/M +Greenbriar/M +Greene/M +greenery/MS +Greenfeld/M +greenfield +Greenfield/M +greenfly/M +greengage/SM +greengrocer/SM +greengrocery/M +greenhorn/SM +greenhouse/SM +greening/M +greenish/P +Greenland/M +Green/M +greenmail/GDS +greenness/MS +Greenpeace/M +greenroom/SM +Greensboro/M +Greensleeves/M +Greensville/M +greensward/SM +green/SYRDMPGT +Greentree/M +Greenville/M +Greenwich/M +greenwood/MS +Greer/M +greeter/M +greeting/M +greets/A +greet/SRDJGZ +gregariousness/MS +gregarious/PY +Gregg/M +Greggory/M +Greg/M +Gregoire/M +Gregoor/M +Gregorian +Gregorio/M +Gregorius/M +Gregor/M +Gregory/M +gremlin/SM +Grenada/M +grenade/MS +Grenadian/S +grenadier/SM +Grenadines +grenadine/SM +Grendel/M +Grenier/M +Grenoble/M +Grenville/M +Gresham/M +Gretal/M +Greta/M +Gretchen/M +Gretel/M +Grete/M +Grethel/M +Gretna/M +Gretta/M +Gretzky/M +grew/A +greybeard/M +greyhound/MS +Grey/M +greyness/M +gridded +griddlecake/SM +griddle/DSGM +gridiron/GSMD +gridlock/DSG +grids/A +grid/SGM +grief/MS +Grieg/M +Grier/M +grievance/SM +griever/M +grieve/SRDGZ +grieving/Y +grievousness/SM +grievous/PY +Griffie/M +Griffin/M +griffin/SM +Griffith/M +Griff/M +griffon's +Griffy/M +griller/M +grille/SM +grill/RDGS +grillwork/M +grimace/DRSGM +grimacer/M +Grimaldi/M +grime/MS +Grimes +griminess/MS +grimmer +grimmest +Grimm/M +grimness/MS +grim/PGYD +grimy/TPR +Grinch/M +grind/ASG +grinder/MS +grinding/SY +grindstone/SM +gringo/SM +grinned +grinner/M +grinning/Y +grin/S +griper/M +gripe/S +grippe/GMZSRD +gripper/M +gripping/Y +grip/SGZMRD +Griselda/M +grisliness/SM +grisly/RPT +Gris/M +Grissel/M +gristle/SM +gristliness/M +gristly/TRP +gristmill/MS +grist/MYS +Griswold/M +grit/MS +gritted +gritter/MS +grittiness/SM +gritting +gritty/PRT +Griz/M +grizzle/DSG +grizzling/M +grizzly/TRS +Gr/M +groaner/M +groan/GZSRDM +groat/SM +grocer/MS +grocery/MS +groggily +grogginess/SM +groggy/RPT +grog/MS +groin/MGSD +grokked +grokking +grok/S +grommet/GMDS +Gromyko/M +groofs +groomer/M +groom/GZSMRD +groomsman/M +groomsmen +Groot/M +groover/M +groove/SRDGM +groovy/TR +groper/M +grope/SRDJGZ +Gropius/M +grosbeak/SM +grosgrain/MS +Gross +Grosset/M +gross/GTYSRDP +Grossman/M +grossness/MS +Grosvenor/M +Grosz/M +grotesqueness/MS +grotesque/PSY +Grotius/M +Groton/M +grottoes +grotto/M +grouch/GDS +grouchily +grouchiness/MS +grouchy/RPT +groundbreaking/S +grounded/U +grounder/M +groundhog/SM +ground/JGZMDRS +groundlessness/M +groundless/YP +groundnut/MS +groundsheet/M +groundskeepers +groundsman/M +groundswell/S +groundwater/S +groundwork/SM +grouped/A +grouper/M +groupie/MS +grouping/M +groups/A +group/ZJSMRDG +grouse/GMZSRD +grouser/M +grouter/M +grout/GSMRD +groveler/M +grovelike +groveling/Y +grovel/SDRGZ +Grover/M +Grove/RM +grove/SRMZ +grower/M +grow/GZYRHS +growing/I +growingly +growler/M +growling/Y +growl/RDGZS +growly/RP +grown/IA +grownup/MS +grows/A +growth/IMA +growths/IA +grubbed +grubber/SM +grubbily +grubbiness/SM +grubbing +grubby/RTP +grub/MS +grubstake/MSDG +grudge/GMSRDJ +grudger/M +grudging/Y +grueling/Y +gruel/MDGJS +gruesomeness/SM +gruesome/RYTP +gruffness/MS +gruff/PSGTYRD +grumble/GZJDSR +grumbler/M +grumbling/Y +Grumman/M +grumpily +grumpiness/MS +grump/MDGS +grumpy/TPR +Grundy/M +Grünewald/M +grunge/S +grungy/RT +grunion/SM +grunter/M +grunt/SGRD +Grusky/M +Grus/M +Gruyčre +Gruyeres +gryphon's +g's +G's +gs/A +GSA +gt +GU +guacamole/MS +Guadalajara/M +Guadalcanal/M +Guadalquivir/M +Guadalupe/M +Guadeloupe/M +Guallatiri/M +Gualterio/M +Guamanian/SM +Guam/M +Guangzhou +guanine/MS +guano/MS +Guantanamo/M +Guarani/M +guarani/SM +guaranteeing +guarantee/RSDZM +guarantor/SM +guaranty/MSDG +guardedness/UM +guarded/UYP +guarder/M +guardhouse/SM +Guardia/M +guardianship/MS +guardian/SM +guardrail/SM +guard/RDSGZ +guardroom/SM +guardsman/M +guardsmen +Guarnieri/M +Guatemala/M +Guatemalan/S +guava/SM +Guayaquil/M +gubernatorial +Gucci/M +gudgeon/M +Guelph/M +Guendolen/M +Guenevere/M +Guenna/M +Guenther/M +guernsey/S +Guernsey/SM +Guerra/M +Guerrero/M +guerrilla/MS +guessable/U +guess/BGZRSD +guessed/U +guesser/M +guesstimate/DSMG +guesswork/MS +guest/SGMD +Guevara/M +guffaw/GSDM +guff/SM +Guggenheim/M +Guglielma/M +Guglielmo/M +Guhleman/M +GUI +Guiana/M +guidance/MS +guidebook/SM +guided/U +guide/GZSRD +guideline/SM +guidepost/MS +guider/M +Guido/M +Guilbert/M +guilder/M +guildhall/SM +guild/SZMR +guileful +guilelessness/MS +guileless/YP +guile/SDGM +Guillaume/M +Guillema/M +Guillemette/M +guillemot/MS +Guillermo/M +guillotine/SDGM +guiltily +guiltiness/MS +guiltlessness/M +guiltless/YP +guilt/SM +guilty/PTR +Gui/M +Guinea/M +Guinean/S +guinea/SM +Guinevere/M +Guinna/M +Guinness/M +guise's +guise/SDEG +guitarist/SM +guitar/SM +Guiyang +Guizot/M +Gujarati/M +Gujarat/M +Gujranwala/M +gulag/S +gulch/MS +gulden/MS +gulf/DMGS +Gullah/M +gullet/MS +gulley's +gullibility/MS +gullible +Gulliver/M +gull/MDSG +gully/SDMG +gulp/RDGZS +gumboil/MS +gumbo/MS +gumboots +gumdrop/SM +gummed +gumminess/M +gumming/C +gum/MS +gummy/RTP +gumption/SM +gumshoeing +gumshoe/SDM +gumtree/MS +Gunar/M +gunboat/MS +Gunderson/M +gunfighter/M +gunfight/SRMGZ +gunfire/SM +gunflint/M +gunfought +Gunilla/M +gunk/SM +gunky/RT +Gun/M +gunman/M +gunmen +gunmetal/MS +gun/MS +Gunnar/M +gunned +gunnel's +Gunner/M +gunner/SM +gunnery/MS +gunning/M +gunnysack/SM +gunny/SM +gunpoint/MS +gunpowder/SM +gunrunner/MS +gunrunning/MS +gunship/S +gunshot/SM +gunslinger/M +gunsling/GZR +gunsmith/M +gunsmiths +Guntar/M +Gunter/M +Gunther/M +gunwale/MS +Guofeng/M +guppy/SM +Gupta/M +gurgle/SDG +Gurkha/M +gurney/S +guru/MS +Gusella/M +gusher/M +gush/SRDGZ +gushy/TR +Gus/M +Guss +gusset/MDSG +Gussie/M +Gussi/M +gussy/GSD +Gussy/M +Gustaf/M +Gustafson/M +Gusta/M +gustatory +Gustave/M +Gustav/M +Gustavo/M +Gustavus/M +gusted/E +Gustie/M +gustily +Gusti/M +gustiness/M +gusting/E +gust/MDGS +gustoes +gusto/M +gusts/E +Gusty/M +gusty/RPT +Gutenberg/M +Guthrey/M +Guthrie/M +Guthry/M +Gutierrez/M +gutlessness/S +gutless/P +gutser/M +gutsiness/M +gut/SM +guts/R +gutsy/PTR +gutted +gutter/GSDM +guttering/M +guttersnipe/M +gutting +gutturalness/M +guttural/SPY +gutty/RSMT +Guyana/M +Guyanese +Guy/M +guy/MDRZGS +Guzman/M +guzzle/GZRSD +guzzler/M +g/VBX +Gwalior/M +Gwendolen/M +Gwendoline/M +Gwendolin/M +Gwendolyn/M +Gweneth/M +Gwenette/M +Gwen/M +Gwenneth/M +Gwennie/M +Gwenni/M +Gwenny/M +Gwenora/M +Gwenore/M +Gwyneth/M +Gwyn/M +Gwynne/M +gymkhana/SM +gym/MS +gymnasia's +gymnasium/SM +gymnastically +gymnastic/S +gymnastics/M +gymnast/SM +gymnosperm/SM +gynecologic +gynecological/MS +gynecologist/SM +gynecology/MS +gypped +gypper/S +gypping +gyp/S +gypsite +gypster/S +gypsum/MS +gypsy/SDMG +Gypsy/SM +gyrate/XNGSD +gyration/M +gyrator/MS +gyrfalcon/SM +gyrocompass/M +gyro/MS +gyroscope/SM +gyroscopic +gyve/GDS +H +Haag/M +Haas/M +Habakkuk/M +habeas +haberdasher/SM +haberdashery/SM +Haber/M +Haberman/M +Habib/M +habiliment/SM +habitability/MS +habitableness/M +habitable/P +habitant/ISM +habitation/MI +habitations +habitat/MS +habit/IBDGS +habit's +habitualness/SM +habitual/SYP +habituate/SDNGX +habituation/M +habitué/MS +hacienda/MS +hacker/M +Hackett/M +hack/GZSDRBJ +hackler/M +hackle/RSDMG +hackney/SMDG +hacksaw/SDMG +hackwork/S +Hadamard/M +Hadar/M +Haddad/M +haddock/MS +hades +Hades +had/GD +hadji's +hadj's +Hadlee/M +Hadleigh/M +Hadley/M +Had/M +hadn't +Hadria/M +Hadrian/M +hadron/MS +hadst +haemoglobin's +haemophilia's +haemorrhage's +Hafiz/M +hafnium/MS +haft/GSMD +Hagan/M +Hagar/M +Hagen/M +Hager/M +Haggai/M +haggardness/MS +haggard/SYP +hagged +hagging +haggish +haggis/SM +haggler/M +haggle/RSDZG +Hagiographa/M +hagiographer/SM +hagiography/MS +hag/SMN +Hagstrom/M +Hague/M +ha/H +hahnium/S +Hahn/M +Haifa/M +haiku/M +Hailee/M +hailer/M +Hailey/M +hail/SGMDR +hailstone/SM +hailstorm/SM +Haily/M +Haiphong/M +hairball/SM +hairbreadth/M +hairbreadths +hairbrush/SM +haircare +haircloth/M +haircloths +haircut/MS +haircutting +hairdo/SM +hairdresser/SM +hairdressing/SM +hairdryer/S +hairiness/MS +hairlessness/M +hairless/P +hairlike +hairline/SM +hairnet/MS +hairpiece/MS +hairpin/MS +hairsbreadth +hairsbreadths +hair/SDM +hairsplitter/SM +hairsplitting/MS +hairspray +hairspring/SM +hairstyle/SMG +hairstylist/S +hairy/PTR +Haitian/S +Haiti/M +hajjes +hajji/MS +hajj/M +Hakeem/M +hake/MS +Hakim/M +Hakka/M +Hakluyt/M +halalled +halalling +halal/S +halberd/SM +halcyon/S +Haldane/M +Haleakala/M +Haleigh/M +hale/ISRDG +Hale/M +haler/IM +halest +Halette/M +Haley/M +halfback/SM +halfbreed +halfheartedness/MS +halfhearted/PY +halfpence/S +halfpenny/MS +halfpennyworth +half/PM +halftime/S +halftone/MS +halfway +halfword/MS +halibut/SM +halide/SM +Halie/M +Halifax/M +Hali/M +Halimeda/M +halite/MS +halitoses +halitosis/M +hallelujah +hallelujahs +Halley/M +halliard's +Hallie/M +Halli/M +Hallinan/M +Hall/M +Hallmark/M +hallmark/SGMD +hallo/GDS +halloo's +Halloween/MS +hallowing +hallows +hallow/UD +hall/SMR +Hallsy/M +hallucinate/VNGSDX +hallucination/M +hallucinatory +hallucinogenic/S +hallucinogen/SM +hallway/SM +Hally/M +halocarbon +halogenated +halogen/SM +halon +halo/SDMG +Halpern/M +Halsey/M +Hal/SMY +Halsy/M +halter/GDM +halt/GZJSMDR +halting/Y +halve/GZDS +halves/M +halyard/MS +Ha/M +Hamal/M +Haman/M +hamburger/M +Hamburg/MS +hamburg/SZRM +Hamel/M +Hamey/M +Hamhung/M +Hamid/M +Hamilcar/M +Hamil/M +Hamiltonian/MS +Hamilton/M +Hamish/M +Hamitic/M +Hamlen/M +Hamlet/M +hamlet/MS +Hamlin/M +Ham/M +Hammad/M +Hammarskjold/M +hammed +hammerer/M +hammerhead/SM +hammering/M +hammerless +hammerlock/MS +Hammerstein/M +hammertoe/SM +hammer/ZGSRDM +Hammett/M +hamming +hammock/MS +Hammond/M +Hammurabi/M +hammy/RT +Hamnet/M +hampered/U +hamper/GSD +Hampshire/M +Hampton/M +ham/SM +hamster/MS +hamstring/MGS +hamstrung +Hamsun/M +Hana/M +Hanan/M +Hancock/M +handbagged +handbagging +handbag/MS +handball/SM +handbarrow/MS +handbasin +handbill/MS +handbook/SM +handbrake/M +handcar/SM +handcart/MS +handclasp/MS +handcraft/GMDS +handcuff/GSD +handcuffs/M +handedness/M +handed/PY +Handel/M +hander/S +handful/SM +handgun/SM +handhold/M +handicapped +handicapper/SM +handicapping +handicap/SM +handicraftsman/M +handicraftsmen +handicraft/SMR +handily/U +handiness/SM +handiwork/MS +handkerchief/MS +handleable +handlebar/SM +handle/MZGRSD +handler/M +handless +handling/M +handmade +handmaiden/M +handmaid/NMSX +handout/SM +handover +handpick/GDS +handrail/SM +hand's +handsaw/SM +handset/SM +handshake/GMSR +handshaker/M +handshaking/M +handsomely/U +handsomeness/MS +handsome/RPTY +handspike/SM +handspring/SM +handstand/MS +hand/UDSG +handwork/SM +handwoven +handwrite/GSJ +handwriting/M +handwritten +Handy/M +handyman/M +handymen +handy/URT +Haney/M +hangar/SGDM +hangdog/S +hanged/A +hanger/M +hang/GDRZBSJ +hanging/M +hangman/M +hangmen +hangnail/MS +hangout/MS +hangover/SM +hangs/A +Hangul/M +hangup/S +Hangzhou +Hankel/M +hankerer/M +hanker/GRDJ +hankering/M +hank/GZDRMS +hankie/SM +Hank/M +hanky's +Hannah/M +Hanna/M +Hannibal/M +Hannie/M +Hanni/MS +Hanny/M +Hanoi/M +Hanoverian +Hanover/M +Hansel/M +Hansen/M +Hansiain/M +Han/SM +Hans/N +hansom/MS +Hanson/M +Hanuka/S +Hanukkah/M +Hanukkahs +Hapgood/M +haphazardness/SM +haphazard/SPY +haplessness/MS +hapless/YP +haploid/S +happed +happening/M +happen/JDGS +happenstance/SM +happily/U +happiness/UMS +happing +Happy/M +happy/UTPR +Hapsburg/M +hap/SMY +Harald/M +harangue/GDRS +haranguer/M +Harare +harasser/M +harass/LSRDZG +harassment/SM +Harbert/M +harbinger/DMSG +Harbin/M +harborer/M +harbor/ZGRDMS +Harcourt/M +hardback/SM +hardball/SM +hardboard/SM +hardboiled +hardbound +hardcore/MS +hardcover/SM +hardened/U +hardener/M +hardening/M +harden/ZGRD +hardhat/S +hardheadedness/SM +hardheaded/YP +hardheartedness/SM +hardhearted/YP +hardihood/MS +hardily +hardiness/SM +Harding/M +Hardin/M +hardliner/S +hardness/MS +hardscrabble +hardshell +hardship/MS +hardstand/S +hardtack/MS +hardtop/MS +hardware/SM +hardwire/DSG +hardwood/MS +hardworking +Hardy/M +hard/YNRPJGXTS +hardy/PTRS +harebell/MS +harebrained +harelip/MS +harelipped +hare/MGDS +harem/SM +Hargreaves/M +hark/GDS +Harland/M +Harlan/M +Harlem/M +Harlene/M +Harlen/M +Harlequin +harlequin/MS +Harley/M +Harlie/M +Harli/M +Harlin/M +harlotry/MS +harlot/SM +Harlow/M +Harman/M +harmed/U +harmer/M +harmfulness/MS +harmful/PY +harmlessness/SM +harmless/YP +harm/MDRGS +Harmonia/M +harmonically +harmonica/MS +harmonic/S +harmonics/M +Harmonie/M +harmonious/IPY +harmoniousness/MS +harmoniousness's/I +harmonium/MS +harmonization/A +harmonizations +harmonization's +harmonized/U +harmonizer/M +harmonizes/UA +harmonize/ZGSRD +Harmon/M +harmony/EMS +Harmony/M +harness/DRSMG +harnessed/U +harnesser/M +harnesses/U +Harold/M +Haroun/M +harper/M +Harper/M +harping/M +harpist/SM +harp/MDRJGZS +Harp/MR +harpooner/M +harpoon/SZGDRM +harpsichordist/MS +harpsichord/SM +harpy/SM +Harpy/SM +Harrell/M +harridan/SM +Harrie/M +harrier/M +Harriet/M +Harrietta/M +Harriette/M +Harriett/M +Harrington/M +Harriot/M +Harriott/M +Harrisburg/M +Harri/SM +Harrisonburg/M +Harrison/M +harrower/M +harrow/RDMGS +harrumph/SDG +Harry/M +harry/RSDGZ +harshen/GD +harshness/SM +harsh/TRNYP +Harte/M +Hartford/M +Hartley/M +Hartline/M +Hart/M +Hartman/M +hart/MS +Hartwell/M +Harvard/M +harvested/U +harvester/M +harvestman/M +harvest/MDRZGS +Harvey/MS +Harv/M +Harwell/M +Harwilll/M +has +Hasbro/M +hash/AGSD +Hasheem/M +hasher/M +Hashim/M +hashing/M +hashish/MS +hash's +Hasidim +Haskell/M +Haskel/M +Haskins/M +Haslett/M +hasn't +hasp/GMDS +hassle/MGRSD +hassock/MS +haste/MS +hastener/M +hasten/GRD +hast/GXJDN +Hastie/M +hastily +hastiness/MS +Hastings/M +Hasty/M +hasty/RPT +hatchback/SM +hatcheck/S +hatched/U +hatcher/M +hatchery/MS +hatchet/MDSG +hatching/M +hatch/RSDJG +Hatchure/M +hatchway/MS +hatefulness/MS +hateful/YP +hater/M +hate/S +Hatfield/M +Hathaway/M +hatless +hat/MDRSZG +hatred/SM +hatstands +hatted +Hatteras/M +hatter/SM +Hattie/M +Hatti/M +hatting +Hatty/M +hauberk/SM +Haugen/M +haughtily +haughtiness/SM +haughty/TPR +haulage/MS +hauler/M +haul/SDRGZ +haunch/GMSD +haunter/M +haunting/Y +haunt/JRDSZG +Hauptmann/M +Hausa/M +Hausdorff/M +Hauser/M +hauteur/MS +Havana/SM +Havarti +Havel/M +haven/DMGS +Haven/M +haven't +haver/G +haversack/SM +have/ZGSR +havocked +havocking +havoc/SM +Haw +Hawaiian/S +Hawaii/M +hawker/M +hawk/GZSDRM +Hawking +hawking/M +Hawkins/M +hawkishness/S +hawkish/P +Hawley/M +haw/MDSG +hawser/M +haws/RZ +Hawthorne/M +hawthorn/MS +haycock/SM +Hayden/M +Haydn/M +Haydon/M +Hayes +hayfield/MS +hay/GSMDR +Hayley/M +hayloft/MS +haymow/MS +Haynes +hayrick/MS +hayride/MS +hayseed/MS +Hay/SM +haystack/SM +haywain +Hayward/M +haywire/MS +Haywood/M +Hayyim/M +hazard/MDGS +hazardousness/M +hazardous/PY +haze/DSRJMZG +Hazel/M +hazel/MS +hazelnut/SM +Haze/M +hazer/M +hazily +haziness/MS +hazing/M +Hazlett/M +Hazlitt/M +hazy/PTR +HBO/M +hdqrs +HDTV +headache/MS +headband/SM +headboard/MS +headcount +headdress/MS +header/M +headfirst +headgear/SM +headhunter/M +headhunting/M +headhunt/ZGSRDMJ +headily +headiness/S +heading/M +headlamp/S +headland/MS +headlessness/M +headless/P +headlight/MS +headline/DRSZMG +headliner/M +headlock/MS +headlong +Head/M +headman/M +headmaster/MS +headmastership/M +headmen +headmistress/MS +headphone/SM +headpiece/SM +headpin/MS +headquarter/GDS +headrest/MS +headroom/SM +headscarf/M +headset/SM +headship/SM +headshrinker/MS +head/SJGZMDR +headsman/M +headsmen +headstall/SM +headstand/MS +headstock/M +headstone/MS +headstrong +headwaiter/SM +headwall/S +headwater/S +headway/MS +headwind/SM +headword/MS +heady/PTR +heal/DRHSGZ +healed/U +healer/M +Heall/M +healthfully +healthfulness/SM +healthful/U +healthily/U +healthiness/MSU +health/M +healths +healthy/URPT +heap/SMDG +heard/UA +hearer/M +hearing/AM +hearken/SGD +hearsay/SM +hearse/M +hears/SDAG +Hearst/M +heartache/SM +heartbeat/MS +heartbreak/GMS +heartbreaking/Y +heartbroke +heartbroken +heartburning/M +heartburn/SGM +hearted/Y +hearten/EGDS +heartening/EY +heartfelt +hearth/M +hearthrug +hearths +hearthstone/MS +heartily +heartiness/SM +heartland/SM +heartlessness/SM +heartless/YP +heartrending/Y +heartsickness/MS +heartsick/P +heart/SMDNXG +heartstrings +heartthrob/MS +heartwarming +Heartwood/M +heartwood/SM +hearty/TRSP +hear/ZTSRHJG +heatedly +heated/UA +heater/M +heathendom/SM +heathenish/Y +heathenism/MS +heathen/M +heather/M +Heather/M +heathery +Heathkit/M +heathland +Heathman/M +Heath/MR +heath/MRNZX +heaths +heatproof +heats/A +heat/SMDRGZBJ +heatstroke/MS +heatwave +heave/DSRGZ +heavenliness/M +heavenly/PTR +heaven/SYM +heavenward/S +heaver/M +heaves/M +heavily +heaviness/MS +Heaviside/M +heavyhearted +heavyset +heavy/TPRS +heavyweight/SM +Hebe/M +hebephrenic +Hebert/M +Heb/M +Hebraic +Hebraism/MS +Hebrew/SM +Hebrides/M +Hecate/M +hecatomb/M +heckler/M +heckle/RSDZG +heck/S +hectare/MS +hectically +hectic/S +hectogram/MS +hectometer/SM +Hector/M +hector/SGD +Hecuba/M +he'd +Heda/M +Hedda/M +Heddie/M +Heddi/M +hedge/DSRGMZ +hedgehog/MS +hedgehopped +hedgehopping +hedgehop/S +hedger/M +hedgerow/SM +hedging/Y +Hedi/M +hedonism/SM +hedonistic +hedonist/MS +Hedvige/M +Hedvig/M +Hedwiga/M +Hedwig/M +Hedy/M +heeded/U +heedfulness/M +heedful/PY +heeding/U +heedlessness/SM +heedless/YP +heed/SMGD +heehaw/DGS +heeler/M +heeling/M +heelless +heel/SGZMDR +Heep/M +Hefner/M +heft/GSD +heftily +heftiness/SM +hefty/TRP +Hegelian +Hegel/M +hegemonic +hegemony/MS +Hegira/M +hegira/S +Heida/M +Heidegger/M +Heidelberg/M +Heidie/M +Heidi/M +heifer/MS +Heifetz/M +heighten/GD +height/SMNX +Heimlich/M +Heindrick/M +Heineken/M +Heine/M +Heinlein/M +heinousness/SM +heinous/PY +Heinrich/M +Heinrick/M +Heinrik/M +Heinze/M +Heinz/M +heiress/MS +heirloom/MS +heir/SDMG +Heisenberg/M +Heiser/M +heister/M +heist/GSMRD +Hejira's +Helaina/M +Helaine/M +held +Helena/M +Helene/M +Helenka/M +Helen/M +Helga/M +Helge/M +helical/Y +helices/M +helicon/M +Helicon/M +helicopter/GSMD +heliocentric +heliography/M +Heliopolis/M +Helios/M +heliosphere +heliotrope/SM +heliport/MS +helium/MS +helix/M +he'll +hellbender/M +hellbent +hellcat/SM +hellebore/SM +Hellene/SM +Hellenic +Hellenism/MS +Hellenistic +Hellenist/MS +Hellenization/M +Hellenize +heller/M +Heller/M +Hellespont/M +hellfire/M +hell/GSMDR +hellhole/SM +Helli/M +hellion/SM +hellishness/SM +hellish/PY +Hellman/M +hello/GMS +Hell's +helluva +helmed +helmet/GSMD +Helmholtz/M +helming +helms +helm's +helmsman/M +helmsmen +helm/U +Helmut/M +Héloise/M +helot/S +helper/M +helpfulness/MS +helpful/UY +help/GZSJDR +helping/M +helplessness/SM +helpless/YP +helpline/S +helpmate/SM +helpmeet's +Helsa/M +Helsinki/M +helve/GMDS +Helvetian/S +Helvetius/M +Helyn/M +He/M +hematite/MS +hematologic +hematological +hematologist/SM +hematology/MS +heme/MS +Hemingway/M +hemisphere/MSD +hemispheric +hemispherical +hemline/SM +hemlock/MS +hemmed +hemmer/SM +hemming +hem/MS +hemoglobin/MS +hemolytic +hemophiliac/SM +hemophilia/SM +hemorrhage/GMDS +hemorrhagic +hemorrhoid/MS +hemostat/SM +hemp/MNS +h/EMS +hemstitch/DSMG +henceforth +henceforward +hence/S +Hench/M +henchman/M +henchmen +Henderson/M +Hendrick/SM +Hendrickson/M +Hendrika/M +Hendrik/M +Hendrix/M +henge/M +Henka/M +Henley/M +hen/MS +henna/MDSG +Hennessey/M +henning +henpeck/GSD +Henrie/M +Henrieta/M +Henrietta/M +Henriette/M +Henrik/M +Henri/M +Henryetta/M +henry/M +Henry/M +Hensley/M +Henson/M +heparin/MS +hepatic/S +hepatitides +hepatitis/M +Hepburn/M +Hephaestus/M +Hephzibah/M +hepper +heppest +Hepplewhite +hep/S +heptagonal +heptagon/SM +heptane/M +heptathlon/S +her +Heracles/M +Heraclitus/M +heralded/U +heraldic +herald/MDSG +heraldry/MS +Hera/M +herbaceous +herbage/MS +herbalism +herbalist/MS +herbal/S +Herbart/M +Herbert/M +herbicidal +herbicide/MS +Herbie/M +herbivore/SM +herbivorous/Y +Herb/M +herb/MS +Herby/M +Herc/M +Herculaneum/M +herculean +Herculean +Hercule/MS +Herculie/M +herder/M +Herder/M +herd/MDRGZS +herdsman/M +herdsmen +hereabout/S +hereafter/S +hereby +hereditary +heredity/MS +Hereford/SM +herein +hereinafter +here/IS +hereof +hereon +here's +heres/M +heresy/SM +heretical +heretic/SM +hereto +heretofore +hereunder +hereunto +hereupon +herewith +Heriberto/M +heritable +heritage/MS +heritor/IM +Herkimer/M +Herman/M +Hermann/M +hermaphrodite/SM +hermaphroditic +Hermaphroditus/M +hermeneutic/S +hermeneutics/M +Hermes +hermetical/Y +hermetic/S +Hermia/M +Hermie/M +Hermina/M +Hermine/M +Herminia/M +Hermione/M +hermitage/SM +Hermite/M +hermitian +hermit/MS +Hermon/M +Hermosa/M +Hermosillo/M +Hermy/M +Hernandez/M +Hernando/M +hernial +hernia/MS +herniate/NGXDS +Herod/M +Herodotus/M +heroes +heroically +heroics +heroic/U +heroine/SM +heroin/MS +heroism/SM +Herold/M +hero/M +heron/SM +herpes/M +herpetologist/SM +herpetology/MS +Herrera/M +Herrick/M +herringbone/SDGM +Herring/M +herring/SM +Herrington/M +Herr/MG +Herschel/M +Hersch/M +herself +Hersey/M +Hershel/M +Hershey/M +Hersh/M +Herta/M +Hertha/M +hertz/M +Hertz/M +Hertzog/M +Hertzsprung/M +Herve/M +Hervey/M +Herzegovina/M +Herzl/M +hes +Hesiod/M +hesitance/S +hesitancy/SM +hesitantly +hesitant/U +hesitater/M +hesitate/XDRSNG +hesitating/UY +hesitation/M +Hesperus/M +Hesse/M +Hessian/MS +Hess/M +Hester/M +Hesther/M +Hestia/M +Heston/M +heterodox +heterodoxy/MS +heterodyne +heterogamous +heterogamy/M +heterogeneity/SM +heterogeneousness/M +heterogeneous/PY +heterosexuality/SM +heterosexual/YMS +heterostructure +heterozygous +Hettie/M +Hetti/M +Hetty/M +Heublein/M +heuristically +heuristic/SM +Heusen/M +Heuser/M +he/VMZ +hew/DRZGS +Hewe/M +hewer/M +Hewet/M +Hewett/M +Hewie/M +Hewitt/M +Hewlett/M +Hew/M +hexachloride/M +hexadecimal/YS +hexafluoride/M +hexagonal/Y +hexagon/SM +hexagram/SM +hexameter/SM +hex/DSRG +hexer/M +hey +heyday/MS +Heyerdahl/M +Heywood/M +Hezekiah/M +hf +HF +Hf/M +Hg/M +hgt +hgwy +HHS +HI +Hialeah/M +hiatus/SM +Hiawatha/M +hibachi/MS +hibernate/XGNSD +hibernation/M +hibernator/SM +Hibernia/M +Hibernian/S +hibiscus/MS +hiccup/MDGS +hickey/SM +Hickey/SM +Hickman/M +Hickok/M +hickory/MS +hick/SM +Hicks/M +hi/D +hidden/U +hideaway/SM +hidebound +hideousness/SM +hideous/YP +hideout/MS +hider/M +hide/S +hiding/M +hid/ZDRGJ +hieing +hierarchal +hierarchic +hierarchical/Y +hierarchy/SM +hieratic +hieroglyph +hieroglyphic/S +hieroglyphics/M +hieroglyphs +Hieronymus/M +hie/S +hifalutin +Higashiosaka +Higgins/M +highball/GSDM +highborn +highboy/MS +highbrow/SM +highchair/SM +highfalutin +Highfield/M +highhandedness/SM +highhanded/PY +highish +Highlander/SM +Highlands +highland/ZSRM +highlight/GZRDMS +Highness/M +highness/MS +highpoint +high/PYRT +highroad/MS +highs +hight +hightail/DGS +highwayman/M +highwaymen +highway/MS +hijacker/M +hijack/JZRDGS +hiker/M +hike/ZGDSR +Hilario/M +hilariousness/MS +hilarious/YP +hilarity/MS +Hilarius/M +Hilary/M +Hilbert/M +Hildagarde/M +Hildagard/M +Hilda/M +Hildebrand/M +Hildegaard/M +Hildegarde/M +Hilde/M +Hildy/M +Hillard/M +Hillary/M +hillbilly/MS +Hillcrest/M +Hillel/M +hiller/M +Hillery/M +hill/GSMDR +Hilliard/M +Hilliary/M +Hillie/M +Hillier/M +hilliness/SM +Hill/M +hillman +hillmen +hillock/SM +Hillsboro/M +Hillsdale/M +hillside/SM +hilltop/MS +hillwalking +Hillyer/M +Hilly/RM +hilly/TRP +hilt/MDGS +Hilton/M +Hi/M +Himalaya/MS +Himalayan/S +Himmler/M +him/S +himself +Hinayana/M +Hinda/M +Hindemith/M +Hindenburg/M +hindered/U +hinderer/M +hinder/GRD +Hindi/M +hindmost +hindquarter/SM +hindrance/SM +hind/RSZ +hindsight/SM +Hinduism/SM +Hindu/MS +Hindustani/MS +Hindustan/M +Hines/M +hinger +hinge's +hinge/UDSG +Hinkle/M +Hinsdale/M +hinterland/MS +hinter/M +hint/GZMDRS +Hinton/M +Hinze/M +hipbone/SM +hipness/S +Hipparchus/M +hipped +hipper +hippest +hippie/MTRS +hipping/M +Hippocrates/M +Hippocratic +hippodrome/MS +hippo/MS +hippopotamus/SM +hip/PSM +hippy's +hipster/MS +hiragana +Hiram/M +hire/AGSD +hireling/SM +hirer/SM +Hirey/M +hiring/S +Hirohito/M +Hiroshi/M +Hiroshima/M +Hirsch/M +hirsuteness/MS +hirsute/P +his +Hispanic/SM +Hispaniola/M +hiss/DSRMJG +hisser/M +hissing/M +Hiss/M +histamine/SM +histidine/SM +histochemic +histochemical +histochemistry/M +histogram/MS +histological +histologist/MS +histology/SM +historian/MS +historic +historicalness/M +historical/PY +historicism/M +historicist/M +historicity/MS +historiographer/SM +historiography/MS +history/MS +histrionically +histrionic/S +histrionics/M +hist/SDG +Hitachi/M +Hitchcock/M +hitcher/MS +hitchhike/RSDGZ +hitch/UGSD +hither +hitherto +Hitler/SM +hitless +hit/MS +hittable +hitter/SM +hitting +Hittite/SM +HIV +hive/MGDS +h'm +HM +HMO +Hmong +HMS +hoarder/M +hoarding/M +hoard/RDJZSGM +hoarfrost/SM +hoariness/MS +hoar/M +hoarseness/SM +hoarse/RTYP +hoary/TPR +hoaxer/M +hoax/GZMDSR +Hobard/M +Hobart/M +hobbed +Hobbes/M +hobbing +hobbit +hobbler/M +hobble/ZSRDG +Hobbs/M +hobbyhorse/SM +hobbyist/SM +hobby/SM +Hobday/M +Hobey/M +hobgoblin/MS +Hobie/M +hobnail/GDMS +hobnobbed +hobnobbing +hobnob/S +Hoboken/M +hobo/SDMG +hob/SM +hoc +hocker/M +hockey/SM +hock/GDRMS +Hockney/M +hockshop/SM +hodge/MS +Hodge/MS +hodgepodge/SM +Hodgkin/M +ho/DRYZ +hod/SM +Hoebart/M +hoecake/SM +hoedown/MS +hoeing +hoer/M +hoe/SM +Hoffa/M +Hoff/M +Hoffman/M +Hofstadter/M +Hogan/M +hogan/SM +Hogarth/M +hogback/MS +hogged +hogger +hogging +hoggish/Y +hogshead/SM +hog/SM +hogtie/SD +hogtying +hogwash/SM +Hohenlohe/M +Hohenstaufen/M +Hohenzollern/M +Hohhot/M +hoister/M +hoist/GRDS +hoke/DSG +hokey/PRT +hokier +hokiest +Hokkaido/M +hokum/MS +Hokusai/M +Holbein/M +Holbrook/M +Holcomb/M +holdall/MS +Holden/M +holder/M +Holder/M +holding/IS +holding's +hold/NRBSJGZ +holdout/SM +holdover/SM +holdup/MS +hole/MGDS +holey +holiday/GRDMS +Holiday/M +holidaymaker/S +holier/U +Holiness/MS +holiness/MSU +holistic +holistically +hollandaise +Hollandaise/M +Hollander/M +Holland/RMSZ +holler/GDS +Hollerith/M +Holley/M +Hollie/M +Holli/SM +Hollister/M +Holloway/M +hollowness/MS +hollow/RDYTGSP +hollowware/M +Hollyanne/M +hollyhock/MS +Holly/M +holly/SM +Hollywood/M +Holman/M +Holmes +holmium/MS +Holm/M +Holocaust +holocaust/MS +Holocene +hologram/SM +holograph/GMD +holographic +holographs +holography/MS +Holstein/MS +holster/MDSG +Holst/M +Holt/M +Holyoke/M +holy/SRTP +holystone/MS +Holzman/M +Ho/M +homage/MGSRD +homager/M +hombre/SM +homburg/SM +homebody/MS +homebound +homeboy/S +homebuilder/S +homebuilding +homebuilt +homecoming/MS +home/DSRMYZG +homegrown +homeland/SM +homelessness/SM +homeless/P +homelike +homeliness/SM +homely/RPT +homemade +homemake/JRZG +homemaker/M +homemaking/M +homeomorphic +homeomorphism/MS +homeomorph/M +homeopath +homeopathic +homeopaths +homeopathy/MS +homeostases +homeostasis/M +homeostatic +homeowner/S +homeownership +homepage +Homere/M +homer/GDM +Homeric +homerists +Homer/M +homeroom/MS +Homerus/M +homeschooling/S +homesickness/MS +homesick/P +homespun/S +homesteader/M +homestead/GZSRDM +homestretch/SM +hometown/SM +homeward +homeworker/M +homework/ZSMR +homeyness/MS +homey/PS +homicidal/Y +homicide/SM +homier +homiest +homiletic/S +homily/SM +hominess's +homing/M +hominid/MS +hominy/SM +Hom/MR +homogamy/M +homogenate/MS +homogeneity/ISM +homogeneous/PY +homogenization/MS +homogenize/DRSGZ +homogenizer/M +homograph/M +homographs +homological +homologous +homologue/M +homology/MS +homomorphic +homomorphism/SM +homonym/SM +homophobia/S +homophobic +homophone/MS +homopolymers +homosexuality/SM +homosexual/YMS +homo/SM +homotopy +homozygous/Y +honcho/DSG +Honda/M +Hondo/M +Honduran/S +Honduras/M +Honecker/M +hone/SM +honestly/E +honest/RYT +honesty/ESM +honeybee/SM +honeycomb/SDMG +honeydew/SM +honey/GSMD +honeylocust +Honey/M +honeymooner/M +honeymoon/RDMGZS +honeysuckle/MS +Honeywell/M +hong/M +Honiara/M +honker/M +honk/GZSDRM +honky/SM +Hon/M +hon/MDRSZTG +Honolulu/M +honorableness/SM +honorable/PSM +honorables/U +honorablies/U +honorably/UE +honorarily +honorarium/SM +honorary/S +honored/U +honoree/S +honor/ERDBZGS +honorer/EM +Honoria/M +honorific/S +Honor/M +honor's +honors/A +Honshu/M +hooch/MS +hoodedness/M +hooded/P +hoodlum/SM +Hood/M +hood/MDSG +hoodoo/DMGS +hoodwinker/M +hoodwink/SRDG +hooey/SM +hoof/DRMSG +hoofer/M +hoofmark/S +hookah/M +hookahs +hookedness/M +hooked/P +Hooke/MR +hooker/M +Hooker/M +hookey's +hook/GZDRMS +hooks/U +hookup/SM +hookworm/MS +hooky/SRMT +hooliganism/SM +hooligan/SM +hooper/M +Hooper/M +hoopla/SM +hoop/MDRSG +hooray/SMDG +hoosegow/MS +Hoosier/SM +hootch's +hootenanny/SM +hooter/M +hoot/MDRSGZ +Hoover/MS +hooves/M +hoped/U +hopefulness/MS +hopeful/SPY +hopelessness/SM +hopeless/YP +Hope/M +hoper/M +hope/SM +Hopewell/M +Hopi/SM +Hopkinsian/M +Hopkins/M +hopped +Hopper/M +hopper/MS +hopping/M +hoppled +hopples +hopscotch/MDSG +hop/SMDRG +Horace/M +Horacio/M +Horatia/M +Horatio/M +Horatius/M +horde/DSGM +horehound/MS +horizon/MS +horizontal/YS +Hormel/M +hormonal/Y +hormone/MS +Hormuz/M +hornbeam/M +hornblende/MS +Hornblower/M +hornedness/M +horned/P +Horne/M +hornet/MS +horn/GDRMS +horniness/M +hornless +hornlike +Horn/M +hornpipe/MS +horny/TRP +horologic +horological +horologist/MS +horology/MS +horoscope/MS +Horowitz/M +horrendous/Y +horribleness/SM +horrible/SP +horribly +horridness/M +horrid/PY +horrific +horrifically +horrify/DSG +horrifying/Y +horror/MS +hors/DSGX +horseback/MS +horsedom +horseflesh/M +horsefly/MS +horsehair/SM +horsehide/SM +horselaugh/M +horselaughs +horseless +horselike +horsely +horseman/M +horsemanship/MS +horsemen +horseplayer/M +horseplay/SMR +horsepower/SM +horseradish/SM +horse's +horseshoeing +horseshoe/MRSD +horseshoer/M +horsetail/SM +horse/UGDS +horsewhipped +horsewhipping +horsewhip/SM +horsewoman/M +horsewomen +horsey +horsier +horsiest +horsing/M +Horst/M +hortatory +Horten/M +Hortense/M +Hortensia/M +horticultural +horticulture/SM +horticulturist/SM +Hort/MN +Horton/M +Horus/M +hosanna/SDG +Hosea/M +hose/M +hosepipe +hos/GDS +hosier/MS +hosiery/SM +hosp +hospice/MS +hospitable/I +hospitably/I +hospitality/MS +hospitality's/I +hospitalization/MS +hospitalize/GSD +hospital/MS +hostage/MS +hosteler/M +hostelry/MS +hostel/SZGMRD +hostess/MDSG +hostile/YS +hostility/SM +hostler/MS +Host/MS +host/MYDGS +hotbed/MS +hotblooded +hotbox/MS +hotcake/S +hotchpotch/M +hotelier/MS +hotelman/M +hotel/MS +hotfoot/DGS +hothead/DMS +hotheadedness/SM +hotheaded/PY +hothouse/MGDS +hotness/MS +hotplate/SM +hotpot/M +hot/PSY +hotrod +hotshot/S +hotted +Hottentot/SM +hotter +hottest +hotting +Houdaille/M +Houdini/M +hough/M +hounder/M +hounding/M +hound/MRDSG +hourglass/MS +houri/MS +hourly/S +hour/YMS +house/ASDG +houseboat/SM +housebound +houseboy/SM +housebreaker/M +housebreaking/M +housebreak/JSRZG +housebroke +housebroken +housebuilding +housecleaning/M +houseclean/JDSG +housecoat/MS +housefly/MS +houseful/SM +householder/M +household/ZRMS +househusband/S +housekeeper/M +housekeeping/M +housekeep/JRGZ +houselights +House/M +housemaid/MS +houseman/M +housemen +housemother/MS +housemoving +houseparent/SM +houseplant/S +houser +house's +housetop/MS +housewares +housewarming/MS +housewifeliness/M +housewifely/P +housewife/YM +housewives +houseworker/M +housework/ZSMR +housing/MS +Housman/M +Houston/M +Houyhnhnm/M +HOV +hovel/GSMD +hovercraft/M +hoverer/M +hover/GRD +hove/ZR +Howard/M +howbeit +howdah/M +howdahs +howdy/GSD +Howell/MS +Howe/M +however +Howey/M +Howie/M +howitzer/MS +howler/M +howl/GZSMDR +Howrah/M +how/SM +howsoever +hoyden/DMGS +hoydenish +Hoyle/SM +hoy/M +Hoyt/M +hp +HP +HQ +hr +HR +HRH +Hrothgar/M +hrs +h's +H's +HS +HST +ht +HTML +Hts/M +HTTP +Huang/M +huarache/SM +hubba +Hubbard/M +Hubble/M +hubbub/SM +hubby/SM +hubcap/SM +Huber/M +Hube/RM +Hubert/M +Huberto/M +Hubey/M +Hubie/M +hub/MS +hubris/SM +huckleberry/SM +Huck/M +huckster/SGMD +HUD +Huddersfield/M +huddler/M +huddle/RSDMG +Hudson/M +hue/MDS +Huerta/M +Huey/M +huffily +huffiness/SM +Huff/M +Huffman/M +huff/SGDM +huffy/TRP +hugeness/MS +huge/YP +hugged +hugger +hugging/S +Huggins +Hughie/M +Hugh/MS +Hugibert/M +Hugo/M +hug/RTS +Huguenot/SM +Hugues/M +huh +huhs +Hui/M +Huitzilopitchli/M +hula/MDSG +Hulda/M +hulk/GDMS +hullabaloo/SM +huller/M +hulling/M +Hull/M +hull/MDRGZS +hullo/GSDM +humane/IY +humaneness/SM +humaner +humanest +human/IPY +humanism/SM +humanistic +humanist/SM +humanitarianism/SM +humanitarian/S +humanity/ISM +humanization/CSM +humanized/C +humanizer/M +humanize/RSDZG +humanizes/IAC +humanizing/C +humankind/M +humannesses +humanness/IM +humanoid/S +humans +Humbert/M +Humberto/M +humbleness/SM +humble/TZGPRSDJ +humbly +Humboldt/M +humbugged +humbugging +humbug/MS +humdinger/MS +humdrum/S +Hume/M +humeral/S +humeri +humerus/M +Humfrey/M +Humfrid/M +Humfried/M +humidification/MC +humidifier/CM +humidify/RSDCXGNZ +humidistat/M +humidity/MS +humidor/MS +humid/Y +humiliate/SDXNG +humiliating/Y +humiliation/M +humility/MS +hummed +Hummel/M +hummer/SM +humming +hummingbird/SM +hummock/MDSG +hummocky +hummus/S +humongous +humored/U +humorist/MS +humorlessness/MS +humorless/PY +humorousness/MS +humorous/YP +humor/RDMZGS +humpback/SMD +hump/GSMD +humph/DG +Humphrey/SM +humphs +Humpty/M +hum/S +humus/SM +Humvee +hunchback/DSM +hunch/GMSD +hundredfold/S +hundred/SHRM +hundredths +hundredweight/SM +Hunfredo/M +hung/A +Hungarian/MS +Hungary/M +hunger/SDMG +Hung/M +hungover +hungrily +hungriness/SM +hungry/RTP +hunker/DG +hunky/RST +hunk/ZRMS +Hun/MS +hunter/M +Hunter/M +hunt/GZJDRS +hunting/M +Huntington/M +Huntlee/M +Huntley/M +Hunt/MR +huntress/MS +huntsman/M +huntsmen +Huntsville/M +hurdle/JMZGRSD +hurdler/M +hurl/DRGZJS +Hurlee/M +Hurleigh/M +hurler/M +Hurley/M +hurling/M +Huron/SM +hurray/SDG +hurricane/MS +hurriedness/M +hurried/UY +hurry/RSDG +Hurst/M +hurter/M +hurtfulness/MS +hurtful/PY +hurting/Y +hurtle/SDG +hurts +hurt/U +Hurwitz/M +Hus +Husain's +husbander/M +husband/GSDRYM +husbandman/M +husbandmen +husbandry/SM +Husein/M +hush/DSG +husker/M +huskily +huskiness/MS +husking/M +husk/SGZDRM +husky/RSPT +hussar/MS +Hussein/M +Husserl/M +hussy/SM +hustings/M +hustler/M +hustle/RSDZG +Huston/M +Hutchins/M +Hutchinson/M +Hutchison/M +hutch/MSDG +hut/MS +hutted +hutting +Hutton/M +Hutu/M +Huxley/M +Huygens/M +huzzah/GD +huzzahs +hwy +Hyacintha/M +Hyacinthe/M +Hyacinthia/M +Hyacinthie/M +hyacinth/M +Hyacinth/M +hyacinths +Hyades +hyaena's +Hyannis/M +Hyatt/M +hybridism/SM +hybridization/S +hybridize/GSD +hybrid/MS +Hyde/M +Hyderabad/M +Hydra/M +hydra/MS +hydrangea/SM +hydrant/SM +hydrate/CSDNGX +hydrate's +hydration/MC +hydraulically +hydraulicked +hydraulicking +hydraulic/S +hydraulics/M +hydrazine/M +hydride/MS +hydrocarbon/SM +hydrocephali +hydrocephalus/MS +hydrochemistry +hydrochloric +hydrochloride/M +hydrodynamical +hydrodynamic/S +hydrodynamics/M +hydroelectric +hydroelectrically +hydroelectricity/SM +hydrofluoric +hydrofoil/MS +hydrogenate/CDSGN +hydrogenate's +hydrogenation/MC +hydrogenations +hydrogen/MS +hydrogenous +hydrological/Y +hydrologist/MS +hydrology/SM +hydrolysis/M +hydrolyzed/U +hydrolyze/GSD +hydromagnetic +hydromechanics/M +hydrometer/SM +hydrometry/MS +hydrophilic +hydrophobia/SM +hydrophobic +hydrophone/SM +hydroplane/DSGM +hydroponic/S +hydroponics/M +hydro/SM +hydrosphere/MS +hydrostatic/S +hydrostatics/M +hydrotherapy/SM +hydrothermal/Y +hydrous +hydroxide/MS +hydroxy +hydroxylate/N +hydroxyl/SM +hydroxyzine/M +hyena/MS +hygiene/MS +hygienically +hygienic/S +hygienics/M +hygienist/MS +hygrometer/SM +hygroscopic +hying +Hy/M +Hyman/M +hymeneal/S +Hymen/M +hymen/MS +Hymie/M +hymnal/SM +hymnbook/S +hymn/GSDM +Hynda/M +hype/MZGDSR +hyperactive/S +hyperactivity/SM +hyperbola/MS +hyperbole/MS +hyperbolic +hyperbolically +hyperboloidal +hyperboloid/SM +hypercellularity +hypercritical/Y +hypercube/MS +hyperemia/M +hyperemic +hyperfine +hypergamous/Y +hypergamy/M +hyperglycemia/MS +hyperinflation +Hyperion/M +hypermarket/SM +hypermedia/S +hyperplane/SM +hyperplasia/M +hypersensitiveness/MS +hypersensitive/P +hypersensitivity/MS +hypersonic +hyperspace/M +hypersphere/M +hypertension/MS +hypertensive/S +hypertext/SM +hyperthyroid +hyperthyroidism/MS +hypertrophy/MSDG +hypervelocity +hyperventilate/XSDGN +hyperventilation/M +hyphenated/U +hyphenate/NGXSD +hyphenation/M +hyphen/DMGS +hypnoses +hypnosis/M +hypnotherapy/SM +hypnotically +hypnotic/S +hypnotism/MS +hypnotist/SM +hypnotize/SDG +hypoactive +hypoallergenic +hypocellularity +hypochondriac/SM +hypochondria/MS +hypocrisy/SM +hypocrite/MS +hypocritical/Y +hypodermic/S +hypo/DMSG +hypoglycemia/SM +hypoglycemic/S +hypophyseal +hypophysectomized +hypotenuse/MS +hypothalami +hypothalamic +hypothalamically +hypothalamus/M +hypothermia/SM +hypotheses +hypothesis/M +hypothesizer/M +hypothesize/ZGRSD +hypothetic +hypothetical/Y +hypothyroid +hypothyroidism/SM +hypoxia/M +hyssop/MS +hysterectomy/MS +hysteresis/M +hysteria/SM +hysterical/YU +hysteric/SM +Hyundai/M +Hz +i +I +IA +Iaccoca/M +Iago/M +Iain/M +Ia/M +iambi +iambic/S +iamb/MS +iambus/SM +Ian/M +Ianthe/M +Ibadan/M +Ibbie/M +Ibby/M +Iberia/M +Iberian/MS +Ibero/M +ibex/MS +ibid +ibidem +ibis/SM +IBM/M +Ibo/M +Ibrahim/M +Ibsen/M +ibuprofen/S +Icarus/M +ICBM/S +ICC +iceberg/SM +iceboat/MS +icebound +icebox/MS +icebreaker/SM +icecap/SM +ice/GDSC +Icelander/M +Icelandic +Iceland/MRZ +Ice/M +iceman/M +icemen +icepack +icepick/S +ice's +Ichabod/M +ichneumon/M +ichthyologist/MS +ichthyology/MS +icicle/SM +icily +iciness/SM +icing/MS +icky/RT +iconic +icon/MS +iconoclasm/MS +iconoclastic +iconoclast/MS +iconography/MS +icosahedra +icosahedral +icosahedron/M +ictus/SM +ICU +icy/RPT +I'd +ID +Idahoan/S +Idahoes +Idaho/MS +Idalia/M +Idalina/M +Idaline/M +Ida/M +idealism/MS +idealistic +idealistically +idealist/MS +idealization/MS +idealized/U +idealize/GDRSZ +idealizer/M +ideal/MYS +idealogical +idea/SM +ideate/SN +ideation/M +Idelle/M +Idell/M +idem +idempotent/S +identicalness/M +identical/YP +identifiability +identifiable/U +identifiably +identification/M +identified/U +identifier/M +identify/XZNSRDG +identity/SM +ideogram/MS +ideographic +ideograph/M +ideographs +ideological/Y +ideologist/SM +ideologue/S +ideology/SM +ides +Idette/M +idiocy/MS +idiolect/M +idiomatically +idiomatic/P +idiom/MS +idiopathic +idiosyncrasy/SM +idiosyncratic +idiosyncratically +idiotic +idiotically +idiot/MS +idleness/MS +idle/PZTGDSR +idler/M +id/MY +idolater/MS +idolatress/S +idolatrous +idolatry/SM +idolization/SM +idolized/U +idolizer/M +idolize/ZGDRS +idol/MS +ids +IDs +idyllic +idyllically +idyll/MS +IE +IEEE +Ieyasu/M +if +iffiness/S +iffy/TPR +Ifni/M +ifs +Iggie/M +Iggy/M +igloo/MS +Ignace/M +Ignacio/M +Ignacius/M +Ignatius/M +Ignazio/M +Ignaz/M +igneous +ignitable +ignite/ASDG +igniter/M +ignition/MS +ignobleness/M +ignoble/P +ignobly +ignominious/Y +ignominy/MS +ignoramus/SM +ignorance/MS +ignorantness/M +ignorant/SPY +ignorer/M +ignore/SRDGB +Igor/M +iguana/MS +Iguassu/M +ii +iii +Ijsselmeer/M +Ike/M +Ikey/M +Ikhnaton/M +ikon's +IL +Ilaire/M +Ila/M +Ilario/M +ilea +Ileana/M +Ileane/M +ileitides +ileitis/M +Ilene/M +ileum/M +ilia +iliac +Iliad/MS +Ilise/M +ilium/M +Ilka/M +ilk/MS +I'll +Illa/M +illegality/MS +illegal/YS +illegibility/MS +illegible +illegibly +illegitimacy/SM +illegitimate/SDGY +illiberality/SM +illiberal/Y +illicitness/MS +illicit/YP +illimitableness/M +illimitable/P +Illinoisan/MS +Illinois/M +illiquid +illiteracy/MS +illiterateness/M +illiterate/PSY +Ill/M +illness/MS +illogicality/SM +illogicalness/M +illogical/PY +illogic/M +ill/PS +illume/DG +illuminate/XSDVNG +Illuminati +illuminatingly +illuminating/U +illumination/M +illumine/BGSD +illusionary +illusion/ES +illusionist/MS +illusion's +illusiveness/M +illusive/PY +illusoriness/M +illusory/P +illustrated/U +illustrate/VGNSDX +illustration/M +illustrative/Y +illustrator/SM +illustriousness/SM +illustrious/PY +illus/V +illy +Ilona/M +Ilsa/M +Ilse/M +Ilysa/M +Ilyse/M +Ilyssa/M +Ilyushin/M +I'm +image/DSGM +Imagen/M +imagery/MS +imaginableness +imaginable/U +imaginably/U +imaginariness/M +imaginary/PS +imagination/MS +imaginativeness/M +imaginative/UY +imagined/U +imaginer/M +imagine/RSDJBG +imagoes +imago/M +imam/MS +imbalance/SDM +imbecile/YMS +imbecilic +imbecility/MS +imbiber/M +imbibe/ZRSDG +imbrication/SM +Imbrium/M +imbroglio/MS +imbruing +imbue/GDS +Imelda/M +IMF +IMHO +imitable/I +imitate/SDVNGX +imitation/M +imitativeness/MS +imitative/YP +imitator/SM +immaculateness/SM +immaculate/YP +immanence/S +immanency/MS +immanent/Y +Immanuel/M +immateriality/MS +immaterialness/MS +immaterial/PY +immatureness/M +immature/SPY +immaturity/MS +immeasurableness/M +immeasurable/P +immeasurably +immediacy/MS +immediateness/SM +immediate/YP +immemorial/Y +immenseness/M +immense/PRTY +immensity/MS +immerse/RSDXNG +immersible +immersion/M +immigrant/SM +immigrate/NGSDX +immigration/M +imminence/SM +imminentness/M +imminent/YP +immobile +immobility/MS +immobilization/MS +immobilize/DSRG +immoderateness/M +immoderate/NYP +immoderation/M +immodest/Y +immodesty/SM +immolate/SDNGX +immolation/M +immorality/MS +immoral/Y +immortality/SM +immortalized/U +immortalize/GDS +immortal/SY +immovability/SM +immovableness/M +immovable/PS +immovably +immune/S +immunity/SM +immunization/MS +immunize/GSD +immunoassay/M +immunodeficiency/S +immunodeficient +immunologic +immunological/Y +immunologist/SM +immunology/MS +immure/GSD +immutability/MS +immutableness/M +immutable/P +immutably +IMNSHO +IMO +Imogene/M +Imogen/M +Imojean/M +impaction/SM +impactor/SM +impact/VGMRDS +impaired/U +impairer/M +impair/LGRDS +impairment/SM +impala/MS +impale/GLRSD +impalement/SM +impaler/M +impalpable +impalpably +impanel/DGS +impartation/M +impart/GDS +impartiality/SM +impartial/Y +impassableness/M +impassable/P +impassably +impasse/SXBMVN +impassibility/SM +impassible +impassibly +impassion/DG +impassioned/U +impassiveness/MS +impassive/YP +impassivity/MS +impasto/SM +impatience/SM +impatiens/M +impatient/Y +impeachable/U +impeach/DRSZGLB +impeacher/M +impeachment/MS +impeccability/SM +impeccable/S +impeccably +impecuniousness/MS +impecunious/PY +impedance/MS +impeded/U +impeder/M +impede/S +imped/GRD +impedimenta +impediment/SM +impelled +impeller/MS +impelling +impel/S +impend/DGS +impenetrability/MS +impenetrableness/M +impenetrable/P +impenetrably +impenitence/MS +impenitent/YS +imperativeness/M +imperative/PSY +imperceivable +imperceptibility/MS +imperceptible +imperceptibly +imperceptive +imperf +imperfectability +imperfection/MS +imperfectness/SM +imperfect/YSVP +imperialism/MS +imperialistic +imperialistically +imperialist/SM +imperial/YS +imperil/GSLD +imperilment/SM +imperiousness/MS +imperious/YP +imperishableness/M +imperishable/SP +imperishably +impermanence/MS +impermanent/Y +impermeability/SM +impermeableness/M +impermeable/P +impermeably +impermissible +impersonality/M +impersonalized +impersonal/Y +impersonate/XGNDS +impersonation/M +impersonator/SM +impertinence/SM +impertinent/YS +imperturbability/SM +imperturbable +imperturbably +imperviousness/M +impervious/PY +impetigo/MS +impetuosity/MS +impetuousness/MS +impetuous/YP +impetus/MS +impiety/MS +impinge/LS +impingement/MS +imping/GD +impiousness/SM +impious/PY +impishness/MS +impish/YP +implacability/SM +implacableness/M +implacable/P +implacably +implantation/SM +implant/BGSDR +implanter/M +implausibility/MS +implausible +implausibly +implementability +implementable/U +implementation/A +implementations +implementation's +implemented/AU +implementer/M +implementing/A +implementor/MS +implement/SMRDGZB +implicant/SM +implicate/VGSD +implication/M +implicative/PY +implicitness/SM +implicit/YP +implied/Y +implode/GSD +implore/GSD +imploring/Y +implosion/SM +implosive/S +imply/GNSDX +impoliteness/MS +impolite/YP +impoliticness/M +impolitic/PY +imponderableness/M +imponderable/PS +importance/SM +important/Y +importation/MS +importer/M +importing/A +import/SZGBRD +importunateness/M +importunate/PYGDS +importuner/M +importune/SRDZYG +importunity/SM +imposable +impose/ASDG +imposer/SM +imposingly +imposing/U +imposition/SM +impossibility/SM +impossibleness/M +impossible/PS +impossibly +imposter's +impostor/SM +impost/SGMD +imposture/SM +impotence/MS +impotency/S +impotent/SY +impound/GDS +impoundments +impoverisher/M +impoverish/LGDRS +impoverishment/SM +impracticableness/M +impracticable/P +impracticably +impracticality/SM +impracticalness/M +impractical/PY +imprecate/NGXSD +imprecation/M +impreciseness/MS +imprecise/PYXN +imprecision/M +impregnability/MS +impregnableness/M +impregnable/P +impregnably +impregnate/DSXNG +impregnation/M +impresario/SM +impress/DRSGVL +impressed/U +impresser/M +impressibility/MS +impressible +impressionability/SM +impressionableness/M +impressionable/P +impression/BMS +impressionism/SM +impressionistic +impressionist/MS +impressiveness/MS +impressive/YP +impressment/M +imprimatur/SM +imprinter/M +imprinting/M +imprint/SZDRGM +imprison/GLDS +imprisonment/MS +improbability/MS +improbableness/M +improbable/P +improbably +impromptu/S +improperness/M +improper/PY +impropitious +impropriety/SM +improved/U +improvement/MS +improver/M +improve/SRDGBL +improvidence/SM +improvident/Y +improvisational +improvisation/MS +improvisatory +improviser/M +improvise/RSDZG +imprudence/SM +imprudent/Y +imp/SGMDRY +impudence/MS +impudent/Y +impugner/M +impugn/SRDZGB +impulse/XMVGNSD +impulsion/M +impulsiveness/MS +impulsive/YP +impunity/SM +impureness/M +impure/RPTY +impurity/MS +imputation/SM +impute/SDBG +Imus/M +IN +inaction +inactive +inadequate/S +inadvertence/MS +inadvertent/Y +inalienability/MS +inalienably +inalterableness/M +inalterable/P +Ina/M +inamorata/MS +inane/SRPYT +inanimateness/S +inanimate/P +inanity/MS +inappeasable +inappropriate/P +inarticulate/P +in/AS +inasmuch +inaugural/S +inaugurate/XSDNG +inauguration/M +inauthenticity +inbound/G +inbred/S +inbreed/JG +incalculableness/M +incalculably +incandescence/SM +incandescent/YS +incant +incantation/SM +incantatory +incapable/S +incapacitate/GNSD +incapacitation/M +incarcerate/XGNDS +incarceration/M +incarnadine/GDS +incarnate/AGSDNX +incarnation/AM +Inca/SM +incendiary/S +incense/MGDS +incentive/ESM +incentively +incept/DGVS +inception/MS +inceptive/Y +inceptor/M +incessant/Y +incest/SM +incestuousness/MS +incestuous/PY +inch/GMDS +inchoate/DSG +Inchon/M +inchworm/MS +incidence/MS +incidental/YS +incident/SM +incinerate/XNGSD +incineration/M +incinerator/SM +incipience/SM +incipiency/M +incipient/Y +incise/SDVGNX +incision/M +incisiveness/MS +incisive/YP +incisor/MS +incitement/MS +inciter/M +incite/RZL +incl +inclination/ESM +incline/EGSD +incliner/M +inclining/M +include/GDS +inclusion/MS +inclusiveness/MS +inclusive/PY +Inc/M +incognito/S +incoherency/M +income/M +incommode/DG +incommunicado +incomparable +incompetent/MS +incomplete/P +inconceivability/MS +inconceivableness/M +inconceivable/P +incondensable +incongruousness/S +inconsiderableness/M +inconsiderable/P +inconsistence +inconsolableness/M +inconsolable/P +inconsolably +incontestability/SM +incontestably +incontrovertibly +inconvenience/DG +inconvertibility +inconvertible +incorporable +incorporated/UE +incorporate/GASDXN +incorrect/P +incorrigibility/MS +incorrigibleness/M +incorrigible/SP +incorrigibly +incorruptible/S +incorruptibly +increase/JB +increaser/M +increasing/Y +incredibleness/M +incredible/P +incremental/Y +incrementation +increment/DMGS +incriminate/XNGSD +incrimination/M +incriminatory +incrustation/SM +inc/T +incubate/XNGVDS +incubation/M +incubator/MS +incubus/MS +inculcate/SDGNX +inculcation/M +inculpate/SDG +incumbency/MS +incumbent/S +incunabula +incunabulum +incurable/S +incurious +incursion/SM +ind +indebtedness/SM +indebted/P +indefatigableness/M +indefatigable/P +indefatigably +indefeasible +indefeasibly +indefinableness/M +indefinable/PS +indefinite/S +indelible +indelibly +indemnification/M +indemnify/NXSDG +indemnity/SM +indentation/SM +indented/U +indenter/M +indention/SM +indent/R +indenture/DG +Independence/M +indescribableness/M +indescribable/PS +indescribably +indestructibleness/M +indestructible/P +indestructibly +indeterminably +indeterminacy/MS +indeterminism +indexation/S +indexer/M +index/MRDZGB +India/M +Indiana/M +Indianan/S +Indianapolis/M +Indianian/S +Indian/SM +indicant/MS +indicate/DSNGVX +indication/M +indicative/SY +indicator/MS +indices's +indicter/M +indictment/SM +indict/SGLBDR +indifference +indigence/MS +indigenousness/M +indigenous/YP +indigent/SY +indigestible/S +indignant/Y +indignation/MS +indigo/SM +Indira/M +indirect/PG +indiscreet/P +indiscriminateness/M +indiscriminate/PY +indispensability/MS +indispensableness/M +indispensable/SP +indispensably +indisputableness/M +indisputable/P +indissolubleness/M +indissoluble/P +indissolubly +indistinguishableness/M +indistinguishable/P +indite/SDG +indium/SM +individualism/MS +individualistic +individualistically +individualist/MS +individuality/MS +individualization/SM +individualize/DRSGZ +individualized/U +individualizer/M +individualizes/U +individualizing/Y +individual/YMS +individuate/DSXGN +individuation/M +indivisibleness/M +indivisible/SP +indivisibly +Ind/M +Indochina/M +Indochinese +indoctrinate/GNXSD +indoctrination/M +indoctrinator/SM +indolence/SM +indolent/Y +indomitableness/M +indomitable/P +indomitably +Indonesia/M +Indonesian/S +indoor +Indore/M +Indra/M +indubitableness/M +indubitable/P +indubitably +inducement/MS +inducer/M +induce/ZGLSRD +inducible +inductance/MS +inductee/SM +induct/GV +induction/SM +inductiveness/M +inductive/PY +inductor/MS +indulge/GDRS +indulgence/SDGM +indulgent/Y +indulger/M +Indus/M +industrialism/MS +industrialist/MS +industrialization/MS +industrialized/U +industrialize/SDG +industrial/SY +industriousness/SM +industrious/YP +industry/SM +Indy/SM +inebriate/NGSDX +inebriation/M +inedible +ineducable +ineffability/MS +ineffableness/M +ineffable/P +ineffably +inelastic +ineligibly +ineluctable +ineluctably +ineptitude/SM +ineptness/MS +inept/YP +inequivalent +inerrant +inertial/Y +inertia/SM +inertness/MS +inert/SPY +Ines +inescapably +Inesita/M +Inessa/M +inestimably +inevitability/MS +inevitableness/M +inevitable/P +inevitably +inexact/P +inexhaustibleness/M +inexhaustible/P +inexhaustibly +inexorability/M +inexorableness/M +inexorable/P +inexorably +inexpedience/M +inexplicableness/M +inexplicable/P +inexplicably +inexplicit +inexpressibility/M +inexpressibleness/M +inexpressible/PS +inextricably +Inez/M +infamous +infamy/SM +infancy/M +infanticide/MS +infantile +infant/MS +infantryman/M +infantrymen +infantry/SM +infarction/SM +infarct/SM +infatuate/XNGSD +infatuation/M +infauna +infected/U +infecter +infect/ESGDA +infection/EASM +infectiousness/MS +infectious/PY +infective +infer/B +inference/GMSR +inferential/Y +inferiority/MS +inferior/SMY +infernal/Y +inferno/MS +inferred +inferring +infertile +infestation/MS +infester/M +infest/GSDR +infidel/SM +infighting/M +infill/MG +infiltrate/V +infiltrator/MS +infinitesimal/SY +infinite/V +infinitival +infinitive/YMS +infinitude/MS +infinitum +infinity/SM +infirmary/SM +infirmity/SM +infix/M +inflammableness/M +inflammable/P +inflammation/MS +inflammatory +inflatable/MS +inflate/NGBDRSX +inflater/M +inflationary +inflation/ESM +inflect/GVDS +inflectional/Y +inflection/SM +inflexibleness/M +inflexible/P +inflexion/SM +inflict/DRSGV +inflicter/M +infliction/SM +inflow/M +influenced/U +influencer/M +influence/SRDGM +influent +influential/SY +influenza/MS +infomercial/S +Informatica/M +informatics +informational +information/ES +informativeness/S +informative/UY +informatory +informed/U +informer/M +info/SM +infotainment/S +infra +infrared/SM +infrasonic +infrastructural +infrastructure/MS +infrequence/S +infringe/LR +infringement/SM +infringer/M +infuriate/GNYSD +infuriating/Y +infuriation/M +infuser/M +infuse/RZ +infusibleness/M +infusible/P +inf/ZT +Ingaberg/M +Ingaborg/M +Inga/M +Ingamar/M +Ingar/M +Ingeberg/M +Ingeborg/M +Ingelbert/M +Ingemar/M +ingeniousness/MS +ingenious/YP +ingénue/S +ingenuity/SM +ingenuous/EY +ingenuousness/MS +Inger/M +Inge/RM +Ingersoll/M +ingest/DGVS +ingestible +ingestion/SM +Inglebert/M +inglenook/MS +Inglewood/M +Inglis/M +Ingmar/M +ingoing +ingot/SMDG +ingrained/Y +Ingra/M +Ingram/M +ingrate/M +ingratiate/DSGNX +ingratiating/Y +ingratiation/M +ingredient/SM +Ingres/M +ingression/M +ingress/MS +Ingrid/M +Ingrim/M +ingrown/P +inguinal +Ingunna/M +inhabitable/U +inhabitance +inhabited/U +inhabiter/M +inhabit/R +inhalant/S +inhalation/SM +inhalator/SM +inhale/Z +inhere/DG +inherent/Y +inheritableness/M +inheritable/P +inheritance/EMS +inherit/BDSG +inherited/E +inheriting/E +inheritor/S +inheritress/MS +inheritrix/MS +inherits/E +inhibit/DVGS +inhibited/U +inhibiter's +inhibition/MS +inhibitor/MS +inhibitory +inhomogeneous +inhospitableness/M +inhospitable/P +inhospitality +Inigo/M +inimical/Y +inimitableness/M +inimitable/P +inimitably +inion +iniquitousness/M +iniquitous/PY +iniquity/MS +initialer/M +initial/GSPRDY +initialization/A +initializations +initialization's +initialize/ASDG +initialized/U +initializer/S +initiates +initiate/UD +initiating +initiation/SM +initiative/SM +initiator/MS +initiatory +injectable/U +inject/GVSDB +injection/MS +injector/SM +injunctive +injured/U +injurer/M +injure/SRDZG +injuriousness/M +injurious/YP +inkblot/SM +inker/M +inkiness/MS +inkling/SM +inkstand/SM +inkwell/SM +inky/TP +ink/ZDRJ +inland +inlander/M +inlay/RG +inletting +inly/G +inmost +Inna/M +innards +innateness/SM +innate/YP +innermost/S +innersole/S +innerspring +innervate/GNSDX +innervation/M +inner/Y +inning/M +Innis/M +innkeeper/MS +innocence/SM +Innocent/M +innocent/SYRT +innocuousness/MS +innocuous/PY +innovate/SDVNGX +innovation/M +innovative/P +innovator/MS +innovatory +Innsbruck/M +innuendo/MDGS +innumerability/M +innumerableness/M +innumerable/P +innumerably +innumerate +inn/ZGDRSJ +inoculate/ASDG +inoculation/MS +inoculative +inoffensive/P +Inonu/M +inopportuneness/M +inopportune/P +inordinateness/M +inordinate/PY +inorganic +inpatient +In/PM +input/MRDG +inquirer/M +inquire/ZR +inquiring/Y +inquiry/MS +inquisitional +inquisition/MS +Inquisition/MS +inquisitiveness/MS +inquisitive/YP +inquisitorial/Y +inquisitor/MS +INRI +inrush/M +ins +INS +insalubrious +insanitary +insatiability/MS +insatiableness/M +insatiable/P +insatiably +inscribe/Z +inscription/SM +inscrutability/SM +inscrutableness/SM +inscrutable/P +inscrutably +inseam +insecticidal +insecticide/MS +insectivore/SM +insectivorous +insecureness/M +insecure/P +inseminate/NGXSD +insemination/M +insensateness/M +insensate/P +insensible/P +insentient +inseparable/S +insert/ADSG +inserter/M +insertion/AMS +insetting +inshore +insider/M +inside/Z +insidiousness/MS +insidious/YP +insightful/Y +insigne's +insignia/SM +insignificant +insinuate/VNGXSD +insinuating/Y +insinuation/M +insinuator/SM +insipidity/MS +insipid/Y +insistence/SM +insistent/Y +insisting/Y +insist/SGD +insociable +insofar +insole/M +insolence/SM +insolent/YS +insolubleness/M +insoluble/P +insolubly +insomniac/S +insomnia/MS +insomuch +insouciance/SM +insouciant/Y +inspect/AGSD +inspection/SM +inspective +inspectorate/MS +inspector/SM +inspirational/Y +inspiration/MS +inspired/U +inspire/R +inspirer/M +inspiring/U +inspirit/DG +Inst +installable +install/ADRSG +installation/SM +installer/MS +installment/MS +instance/GD +instantaneousness/M +instantaneous/PY +instantiated/U +instantiate/SDXNG +instantiation/M +instant/SRYMP +instate/AGSD +inst/B +instead +instigate/XSDVGN +instigation/M +instigator/SM +instillation/SM +instinctive/Y +instinctual +instinct/VMS +instituter/M +institutes/M +institute/ZXVGNSRD +institutionalism/M +institutionalist/M +institutionalization/SM +institutionalize/GDS +institutional/Y +institution/AM +institutor's +instr +instruct/DSVG +instructed/U +instructional +instruction/MS +instructiveness/M +instructive/PY +instructor/MS +instrumentalist/MS +instrumentality/SM +instrumental/SY +instrumentation/SM +instrument/GMDS +insubordinate +insubstantial +insufferable +insufferably +insularity/MS +insular/YS +insulate/DSXNG +insulated/U +insulation/M +insulator/MS +insulin/MS +insult/DRSG +insulter/M +insulting/Y +insuperable +insuperably +insupportableness/M +insupportable/P +insurance/MS +insurance's/A +insure/BZGS +insured/S +insurer/M +insurgence/SM +insurgency/MS +insurgent/MS +insurmountably +insurrectionist/SM +insurrection/SM +intactness/M +intact/P +intaglio/GMDS +intake/M +intangible/M +integer/MS +integrability/M +integrable +integral/SYM +integrand/MS +integrate/AGNXEDS +integration/EMA +integrative/E +integrator/MS +integrity/SM +integument/SM +intellective/Y +intellect/MVS +intellectualism/MS +intellectuality/M +intellectualize/GSD +intellectualness/M +intellectual/YPS +intelligence/MSR +intelligencer/M +intelligentsia/MS +intelligent/UY +intelligibilities +intelligibility/UM +intelligibleness/MU +intelligible/PU +intelligibly/U +Intel/M +Intelsat/M +intemperate/P +intendant/MS +intendedness/M +intended/SYP +intender/M +intensification/M +intensifier/M +intensify/GXNZRSD +intensional/Y +intensiveness/MS +intensive/PSY +intentionality/M +intentional/UY +intention/SDM +intentness/SM +intent/YP +interaction/MS +interactive/PY +interactivity +interact/VGDS +interaxial +interbank +interbred +interbreed/GS +intercalate/GNVDS +intercalation/M +intercase +intercaste +interceder/M +intercede/SRDG +intercensal +intercept/DGS +interception/MS +interceptor/MS +intercession/MS +intercessor/SM +intercessory +interchangeability/M +interchangeableness/M +interchangeable/P +interchangeably +interchange/DSRGJ +interchanger/M +intercity +interclass +intercohort +intercollegiate +intercommunicate/SDXNG +intercommunication/M +intercom/SM +interconnectedness/M +interconnected/P +interconnect/GDS +interconnection/SM +interconnectivity +intercontinental +interconversion/M +intercorrelated +intercourse/SM +Interdata/M +interdenominational +interdepartmental/Y +interdependence/MS +interdependency/SM +interdependent/Y +interdiction/MS +interdict/MDVGS +interdisciplinary +interested/UYE +interest/GEMDS +interestingly/U +interestingness/M +interesting/YP +inter/ESTL +interface/SRDGM +interfacing/M +interfaith +interference/MS +interferer/M +interfere/SRDG +interfering/Y +interferometer/SM +interferometric +interferometry/M +interferon/MS +interfile/GSD +intergalactic +intergenerational +intergeneration/M +interglacial +intergovernmental +intergroup +interim/S +interindex +interindustry +interior/SMY +interj +interject/GDS +interjectional +interjection/MS +interlace/GSD +interlard/SGD +interlayer/G +interleave/SDG +interleukin/S +interlibrary +interlinear/S +interline/JGSD +interlingual +interlingua/M +interlining/M +interlink/GDS +interlisp/M +interlobular +interlocker/M +interlock/RDSG +interlocutor/MS +interlocutory +interlope/GZSRD +interloper/M +interlude/MSDG +intermarriage/MS +intermarry/GDS +intermediary/MS +intermediateness/M +intermediate/YMNGSDP +intermediation/M +interment/SME +intermeshed +intermetrics +intermezzi +intermezzo/SM +interminably +intermingle/DSG +intermission/MS +intermittent/Y +intermix/GSRD +intermodule +intermolecular/Y +internalization/SM +internalize/GDS +internal/SY +Internationale/M +internationalism/SM +internationalist/SM +internationality/M +internationalization/MS +internationalize/DSG +international/YS +internecine +internee/SM +interne's +Internet/M +INTERNET/M +internetwork +internist/SM +intern/L +internment/SM +internship/MS +internuclear +interocular +interoffice +interoperability +interpenetrates +interpersonal/Y +interplanetary +interplay/GSMD +interpol +interpolate/XGNVBDS +interpolation/M +Interpol/M +interpose/GSRD +interposer/M +interposition/MS +interpretable/U +interpret/AGSD +interpretation/MSA +interpretative/Y +interpreted/U +interpreter/SM +interpretive/Y +interpretor/S +interprocess +interprocessor +interquartile +interracial +interred/E +interregional +interregnum/MS +interrelatedness/M +interrelated/PY +interrelate/GNDSX +interrelation/M +interrelationship/SM +interring/E +interrogate/DSXGNV +interrogation/M +interrogative/SY +interrogator/SM +interrogatory/S +interrupted/U +interrupter/M +interruptibility +interruptible +interruption/MS +interrupt/VGZRDS +interscholastic +intersect/GDS +intersection/MS +intersession/MS +interspecies +intersperse/GNDSX +interspersion/M +interstage +interstate/S +interstellar +interstice/SM +interstitial/SY +intersurvey +intertask +intertwine/GSD +interurban/S +interval/MS +intervene/GSRD +intervener/M +intervenor/M +interventionism/MS +interventionist/S +intervention/MS +interview/AMD +interviewed/U +interviewee/SM +interviewer/SM +interviewing +interviews +intervocalic +interweave/GS +interwove +interwoven +intestacy/SM +intestinal/Y +intestine/SM +inti +intifada +intimacy/SM +intimal +intimateness/M +intimater/M +intimate/XYNGPDRS +intimation/M +intimidate/SDXNG +intimidating/Y +intimidation/M +into +intolerableness/M +intolerable/P +intolerant/PS +intonate/NX +intonation/M +intoxicant/MS +intoxicate/DSGNX +intoxicated/Y +intoxication/M +intra +intracellular +intracity +intraclass +intracohort +intractability/M +intractableness/M +intractable/P +intradepartmental +intrafamily +intragenerational +intraindustry +intraline +intrametropolitan +intramural/Y +intramuscular/Y +intranasal +intransigence/MS +intransigent/YS +intransitive/S +intraoffice +intraprocess +intrapulmonary +intraregional +intrasectoral +intrastate +intratissue +intrauterine +intravenous/YS +intrepidity/SM +intrepidness/M +intrepid/YP +intricacy/SM +intricateness/M +intricate/PY +intrigue/DRSZG +intriguer/M +intriguing/Y +intrinsically +intrinsic/S +introduce/ADSG +introducer/M +introduction/ASM +introductory +introit/SM +introject/SD +intro/S +introspection/MS +introspectiveness/M +introspective/YP +introspect/SGVD +introversion/SM +introvert/SMDG +intruder/M +intrude/ZGDSR +intrusion/SM +intrusiveness/MS +intrusive/SYP +intubate/NGDS +intubation/M +intuit/GVDSB +intuitionist/M +intuitiveness/MS +intuitive/YP +int/ZR +Inuit/MS +inundate/SXNG +inundation/M +inure/GDS +invader/M +invade/ZSRDG +invalid/GSDM +invalidism/MS +invariable/P +invariant/M +invasion/SM +invasive/P +invectiveness/M +invective/PSMY +inveigh/DRG +inveigher/M +inveighs +inveigle/DRSZG +inveigler/M +invent/ADGS +invented/U +invention/ASM +inventiveness/MS +inventive/YP +inventor/MS +inventory/SDMG +Inverness/M +inverse/YV +inverter/M +invertible +invert/ZSGDR +invest/ADSLG +investigate/XDSNGV +investigation/MA +investigator/MS +investigatory +investiture/SM +investment/ESA +investment's/A +investor/SM +inveteracy/MS +inveterate/Y +inviability +invidiousness/MS +invidious/YP +invigilate/GD +invigilator/SM +invigorate/ANGSD +invigorating/Y +invigoration/AM +invigorations +invincibility/SM +invincibleness/M +invincible/P +invincibly +inviolability/MS +inviolably +inviolateness/M +inviolate/YP +inviscid +invisibleness/M +invisible/S +invitational/S +invitation/MS +invited/U +invitee/S +inviter/M +invite/SRDG +inviting/Y +invocable +invocate +invoked/A +invoke/GSRDBZ +invoker/M +invokes/A +involuntariness/S +involuntary/P +involute/XYN +involution/M +involutorial +involvedly +involved/U +involve/GDSRL +involvement/SM +involver/M +invulnerability/M +invulnerableness/M +inwardness/M +inward/PY +ioctl +iodate/MGND +iodation/M +iodide/MS +iodinate/DNG +iodine/MS +iodize/GSD +Iolande/M +Iolanthe/M +Io/M +Iona/M +Ionesco/M +Ionian/M +ionic/S +Ionic/S +ionization's +ionization/SU +ionized/UC +ionize/GNSRDJXZ +ionizer's +ionizer/US +ionizes/U +ionizing/U +ionosphere/SM +ionospheric +ion's/I +ion/SMU +Iorgo/MS +Iormina/M +Iosep/M +iota/SM +IOU +Iowan/S +Iowa/SM +IPA +ipecac/MS +Iphigenia/M +ipso +Ipswich/M +IQ +Iqbal/M +Iquitos/M +Ira/M +Iranian/MS +Iran/M +Iraqi/SM +Iraq/M +IRA/S +irascibility/SM +irascible +irascibly +irateness/S +irate/RPYT +ireful +Ireland/M +ire/MGDS +Irena/M +Irene/M +irenic/S +iridescence/SM +iridescent/Y +irides/M +iridium/MS +irids +Irina/M +Iris +iris/GDSM +Irishman/M +Irishmen +Irish/R +Irishwoman/M +Irishwomen +Irita/M +irk/GDS +irksomeness/SM +irksome/YP +Irkutsk/M +Ir/M +Irma/M +ironclad/S +iron/DRMPSGJ +ironer/M +ironic +ironicalness/M +ironical/YP +ironing/M +ironmonger/M +ironmongery/M +ironside/MS +ironstone/MS +ironware/SM +ironwood/SM +ironworker/M +ironwork/MRS +irony/SM +Iroquoian/MS +Iroquois/M +irradiate/XSDVNG +irradiation/M +irrationality/MS +irrationalness/M +irrational/YSP +Irrawaddy/M +irreclaimable +irreconcilability/MS +irreconcilableness/M +irreconcilable/PS +irreconcilably +irrecoverableness/M +irrecoverable/P +irrecoverably +irredeemable/S +irredeemably +irredentism/M +irredentist/M +irreducibility/M +irreducible +irreducibly +irreflexive +irrefutable +irrefutably +irregardless +irregularity/SM +irregular/YS +irrelevance/SM +irrelevancy/MS +irrelevant/Y +irreligious +irremediableness/M +irremediable/P +irremediably +irremovable +irreparableness/M +irreparable/P +irreparably +irreplaceable/P +irrepressible +irrepressibly +irreproachableness/M +irreproachable/P +irreproachably +irreproducibility +irreproducible +irresistibility/M +irresistibleness/M +irresistible/P +irresistibly +irresoluteness/SM +irresolute/PNXY +irresolution/M +irresolvable +irrespective/Y +irresponsibility/SM +irresponsibleness/M +irresponsible/PS +irresponsibly +irretrievable +irretrievably +irreverence/MS +irreverent/Y +irreversible +irreversibly +irrevocableness/M +irrevocable/P +irrevocably +irrigable +irrigate/DSXNG +irrigation/M +irritability/MS +irritableness/M +irritable/P +irritably +irritant/S +irritate/DSXNGV +irritated/Y +irritating/Y +irritation/M +irrupt/GVSD +irruption/SM +IRS +Irtish/M +Irvine/M +Irving/M +Irvin/M +Irv/MG +Irwin/M +Irwinn/M +is +i's +Isaac/SM +Isaak/M +Isabelita/M +Isabella/M +Isabelle/M +Isabel/M +Isacco/M +Isac/M +Isadora/M +Isadore/M +Isador/M +Isahella/M +Isaiah/M +Isak/M +Isa/M +ISBN +Iscariot/M +Iseabal/M +Isfahan/M +Isherwood/M +Ishim/M +Ishmael/M +Ishtar/M +Isiahi/M +Isiah/M +Isidora/M +Isidore/M +Isidor/M +Isidoro/M +Isidro/M +isinglass/MS +Isis/M +Islamabad/M +Islamic/S +Islam/SM +islander/M +island/GZMRDS +Islandia/M +isle/MS +islet/SM +isl/GD +Ismael/M +ism/MCS +isn't +ISO +isobaric +isobar/MS +Isobel/M +isochronal/Y +isochronous/Y +isocline/M +isocyanate/M +isodine +isolate/SDXNG +isolationism/SM +isolationistic +isolationist/SM +isolation/M +isolator/MS +Isolde/M +isomeric +isomerism/SM +isomer/SM +isometrically +isometric/S +isometrics/M +isomorphic +isomorphically +isomorphism/MS +isomorph/M +isoperimetrical +isopleth/M +isopleths +isosceles +isostatic +isothermal/Y +isotherm/MS +isotonic +isotope/SM +isotopic +isotropic +isotropically +isotropy/M +Ispahan's +ispell/M +Ispell/M +Israeli/MS +Israelite/SM +Israel/MS +Issac/M +Issiah/M +Issie/M +Issi/M +issuable +issuance/MS +issuant +issued/A +issue/GMZDSR +issuer/AMS +issues/A +issuing/A +Issy/M +Istanbul/M +isthmian/S +isthmus/SM +Istvan/M +Isuzu/M +It +IT +Itaipu/M +ital +Italianate/GSD +Italian/MS +italicization/MS +italicized/U +italicize/GSD +italic/S +Ital/M +Italy/M +Itasca/M +itch/GMDS +itchiness/MS +Itch/M +itchy/RTP +ITcorp/M +ITCorp/M +it'd +Itel/M +itemization/SM +itemized/U +itemize/GZDRS +itemizer/M +itemizes/A +item/MDSG +iterate/ASDXVGN +iteration/M +iterative/YA +iterator/MS +Ithaca/M +Ithacan +itinerant/SY +itinerary/MS +it'll +it/MUS +Ito/M +its +itself +ITT +IUD/S +IV +Iva/M +Ivanhoe/M +Ivan/M +Ivar/M +I've +Ive/MRS +Iver/M +Ivette/M +Ivett/M +Ivie/M +iv/M +Ivonne/M +Ivor/M +Ivory/M +ivory/SM +IVs +Ivy/M +ivy/MDS +ix +Izaak/M +Izabel/M +Izak/M +Izanagi/M +Izanami/M +Izhevsk/M +Izmir/M +Izvestia/M +Izzy/M +jabbed +jabberer/M +jabber/JRDSZG +jabbing +Jabez/M +Jablonsky/M +jabot/MS +jab/SM +jacaranda/MS +Jacenta/M +Jacinda/M +Jacinta/M +Jacintha/M +Jacinthe/M +jackal/SM +jackass/SM +jackboot/DMS +jackdaw/SM +Jackelyn/M +jacketed/U +jacket/GSMD +jack/GDRMS +jackhammer/MDGS +Jackie/M +Jacki/M +jackknife/MGSD +jackknives +Jacklin/M +Jacklyn/M +Jack/M +Jackman/M +jackpot/MS +Jackqueline/M +Jackquelin/M +jackrabbit/DGS +Jacksonian +Jackson/SM +Jacksonville/M +jackstraw/MS +Jacky/M +Jaclin/M +Jaclyn/M +Jacobean +Jacobian/M +Jacobi/M +Jacobin/M +Jacobite/M +Jacobo/M +Jacobsen/M +Jacob/SM +Jacobs/N +Jacobson/M +Jacobus +Jacoby/M +jacquard/MS +Jacquard/SM +Jacqueline/M +Jacquelin/M +Jacquelyn/M +Jacquelynn/M +Jacquenetta/M +Jacquenette/M +Jacques/M +Jacquetta/M +Jacquette/M +Jacquie/M +Jacqui/M +jacuzzi +Jacuzzi/S +Jacynth/M +Jada/M +jadedness/SM +jaded/PY +jadeite/SM +Jade/M +jade/MGDS +Jaeger/M +Jae/M +jaggedness/SM +jagged/RYTP +Jagger/M +jaggers +jagging +jag/S +jaguar/MS +jailbird/MS +jailbreak/SM +jailer/M +jail/GZSMDR +Jaime/M +Jaimie/M +Jaine/M +Jainism/M +Jain/M +Jaipur/M +Jakarta/M +Jake/MS +Jakie/M +Jakob/M +jalapeńo/S +jalopy/SM +jalousie/MS +Jamaal/M +Jamaica/M +Jamaican/S +Jamal/M +Jamar/M +jambalaya/MS +jamb/DMGS +jamboree/MS +Jamel/M +Jame/MS +Jameson/M +Jamestown/M +Jamesy/M +Jamey/M +Jamie/M +Jamill/M +Jamil/M +Jami/M +Jamima/M +Jamison/M +Jammal/M +jammed/U +Jammie/M +jamming/U +jam/SM +Janacek/M +Jana/M +Janaya/M +Janaye/M +Jandy/M +Janean/M +Janeczka/M +Janeen/M +Janeiro/M +Janek/M +Janela/M +Janella/M +Janelle/M +Janell/M +Janel/M +Jane/M +Janene/M +Janenna/M +Janessa/M +Janesville/M +Janeta/M +Janet/M +Janetta/M +Janette/M +Janeva/M +Janey/M +jangler/M +jangle/RSDGZ +jangly +Jania/M +Janice/M +Janie/M +Janifer/M +Janina/M +Janine/M +Janis/M +janissary/MS +Janith/M +janitorial +janitor/SM +Janka/M +Jan/M +Janna/M +Jannelle/M +Jannel/M +Jannie/M +Janos/M +Janot/M +Jansenist/M +Jansen/M +January/MS +Janus/M +Jany/M +Japanese/SM +Japan/M +japanned +japanner +japanning +japan/SM +jape/DSMG +Japura/M +Jaquelin/M +Jaquelyn/M +Jaquenetta/M +Jaquenette/M +Jaquith/M +Jarad/M +jardiničre/MS +Jard/M +Jareb/M +Jared/M +jarful/S +jargon/SGDM +Jarib/M +Jarid/M +Jarlsberg +jar/MS +Jarrad/M +jarred +Jarred/M +Jarret/M +Jarrett/M +Jarrid/M +jarring/SY +Jarrod/M +Jarvis/M +Jase/M +Jasen/M +Jasmina/M +Jasmine/M +jasmine/MS +Jasmin/M +Jason/M +Jasper/M +jasper/MS +Jastrow/M +Jasun/M +jato/SM +jaundice/DSMG +jaundiced/U +jauntily +jauntiness/MS +jaunt/MDGS +jaunty/SRTP +Javanese +Java/SM +javelin/SDMG +Javier/M +jawbone/SDMG +jawbreaker/SM +jawline +jaw/SMDG +Jaxartes/M +Jayapura/M +jaybird/SM +Jaycee/SM +Jaye/M +Jay/M +Jaymee/M +Jayme/M +Jaymie/M +Jaynell/M +Jayne/M +jay/SM +Jayson/M +jaywalker/M +jaywalk/JSRDZG +Jazmin/M +jazziness/M +jazzmen +jazz/MGDS +jazzy/PTR +JCS +jct +JD +Jdavie/M +jealousness/M +jealous/PY +jealousy/MS +Jeana/M +Jeanelle/M +Jeane/M +Jeanette/M +Jeanie/M +Jeanine/M +Jean/M +jean/MS +Jeanna/M +Jeanne/M +Jeannette/M +Jeannie/M +Jeannine/M +Jecho/M +Jedd/M +Jeddy/M +Jedediah/M +Jedidiah/M +Jedi/M +Jed/M +jeep/GZSMD +Jeep/S +jeerer/M +jeering/Y +jeer/SJDRMG +Jeeves/M +jeez +Jefferey/M +Jeffersonian/S +Jefferson/M +Jeffery/M +Jeffie/M +Jeff/M +Jeffrey/SM +Jeffry/M +Jeffy/M +jehad's +Jehanna/M +Jehoshaphat/M +Jehovah/M +Jehu/M +jejuna +jejuneness/M +jejune/PY +jejunum/M +Jekyll/M +Jelene/M +jell/GSD +Jello/M +jello's +jellybean/SM +jellyfish/MS +jellying/M +jellylike +jellyroll/S +jelly/SDMG +Jemie/M +Jemimah/M +Jemima/M +Jemmie/M +jemmy/M +Jemmy/M +Jena/M +Jenda/M +Jenelle/M +Jenica/M +Jeniece/M +Jenifer/M +Jeniffer/M +Jenilee/M +Jeni/M +Jenine/M +Jenkins/M +Jen/M +Jenna/M +Jennee/M +Jenner/M +jennet/SM +Jennette/M +Jennica/M +Jennie/M +Jennifer/M +Jennilee/M +Jenni/M +Jennine/M +Jennings/M +Jenn/RMJ +Jenny/M +jenny/SM +Jeno/M +Jensen/M +Jens/N +jeopard +jeopardize/GSD +jeopardy/MS +Jephthah/M +Jerad/M +Jerald/M +Jeralee/M +Jeramey/M +Jeramie/M +Jere/M +Jereme/M +jeremiad/SM +Jeremiah/M +Jeremiahs +Jeremias/M +Jeremie/M +Jeremy/M +Jericho/M +Jeri/M +jerker/M +jerk/GSDRJ +jerkily +jerkiness/SM +jerkin/SM +jerkwater/S +jerky/RSTP +Jermaine/M +Jermain/M +Jermayne/M +Jeroboam/M +Jerold/M +Jerome/M +Jeromy/M +Jerrie/M +Jerrilee/M +Jerrilyn/M +Jerri/M +Jerrine/M +Jerrod/M +Jerrold/M +Jerrome/M +jerrybuilt +Jerrylee/M +jerry/M +Jerry/M +jersey/MS +Jersey/MS +Jerusalem/M +Jervis/M +Jes +Jessalin/M +Jessalyn/M +Jessa/M +Jessamine/M +jessamine's +Jessamyn/M +Jessee/M +Jesselyn/M +Jesse/M +Jessey/M +Jessica/M +Jessie/M +Jessika/M +Jessi/M +jess/M +Jess/M +Jessy/M +jest/DRSGZM +jester/M +jesting/Y +Jesuit/SM +Jesus +Jeth/M +Jethro/M +jetliner/MS +jet/MS +jetport/SM +jetsam/MS +jetted/M +jetting/M +jettison/DSG +jetty/RSDGMT +jeweler/M +jewelery/S +jewel/GZMRDS +Jewelled/M +Jewelle/M +jewellery's +Jewell/MD +Jewel/M +jewelry/MS +Jewess/SM +Jewishness/MS +Jewish/P +Jew/MS +Jewry/MS +Jezebel/MS +j/F +JFK/M +jg/M +jibbed +jibbing +jibe/S +jib/MDSG +Jidda/M +jiff/S +jiffy/SM +jigged +jigger/SDMG +jigging/M +jiggle/SDG +jiggly/TR +jig/MS +jigsaw/GSDM +jihad/SM +Jilin +Jillana/M +Jillane/M +Jillayne/M +Jilleen/M +Jillene/M +Jillian/M +Jillie/M +Jilli/M +Jill/M +Jilly/M +jilt/DRGS +jilter/M +Jimenez/M +Jim/M +Jimmie/M +jimmy/GSDM +Jimmy/M +jimsonweed/S +Jinan +jingler/M +jingle/RSDG +jingly/TR +jingoism/SM +jingoistic +jingoist/SM +jingo/M +Jinnah/M +jinni's +jinn/MS +Jinny/M +jinrikisha/SM +jinx/GMDS +jitney/MS +jitterbugged +jitterbugger +jitterbugging +jitterbug/SM +jitter/S +jittery/TR +jiujitsu's +Jivaro/M +jive/MGDS +Joachim/M +Joana/M +Joane/M +Joanie/M +Joan/M +Joanna/M +Joanne/SM +Joann/M +Joaquin/M +jobbed +jobber/MS +jobbery/M +jobbing/M +Jobey/M +jobholder/SM +Jobie/M +Jobi/M +Jobina/M +joblessness/MS +jobless/P +Jobrel/M +job/SM +Job/SM +Jobye/M +Joby/M +Jobyna/M +Jocasta/M +Joceline/M +Jocelin/M +Jocelyne/M +Jocelyn/M +jockey/SGMD +jock/GDMS +Jock/M +Jocko/M +jockstrap/MS +jocoseness/MS +jocose/YP +jocosity/SM +jocularity/SM +jocular/Y +jocundity/SM +jocund/Y +Jodee/M +jodhpurs +Jodie/M +Jodi/M +Jody/M +Joeann/M +Joela/M +Joelie/M +Joella/M +Joelle/M +Joellen/M +Joell/MN +Joelly/M +Joellyn/M +Joel/MY +Joelynn/M +Joe/M +Joesph/M +Joete/M +joey/M +Joey/M +jogged +jogger/SM +jogging/S +joggler/M +joggle/SRDG +Jogjakarta/M +jog/S +Johan/M +Johannah/M +Johanna/M +Johannes +Johannesburg/M +Johann/M +Johansen/M +Johanson/M +Johna/MH +Johnathan/M +Johnath/M +Johnathon/M +Johnette/M +Johnie/M +Johnna/M +Johnnie/M +johnnycake/SM +Johnny/M +johnny/SM +Johnsen/M +john/SM +John/SM +Johns/N +Johnson/M +Johnston/M +Johnstown/M +Johny/M +Joice/M +join/ADGFS +joined/U +joiner/FSM +joinery/MS +jointed/EYP +jointedness/ME +joint/EGDYPS +jointer/M +jointly/F +joint's +jointures +joist/GMDS +Jojo/M +joke/MZDSRG +joker/M +jokey +jokier +jokiest +jokily +joking/Y +Jolee/M +Joleen/M +Jolene/M +Joletta/M +Jolie/M +Joliet's +Joli/M +Joline/M +Jolla/M +jollification/MS +jollily +jolliness/SM +jollity/MS +jolly/TSRDGP +Jolson/M +jolt/DRGZS +jolter/M +Joly/M +Jolyn/M +Jolynn/M +Jo/MY +Jonah/M +Jonahs +Jonas +Jonathan/M +Jonathon/M +Jonell/M +Jone/MS +Jones/S +Jonie/M +Joni/MS +Jon/M +jonquil/MS +Jonson/M +Joplin/M +Jordain/M +Jordana/M +Jordanian/S +Jordan/M +Jordanna/M +Jordon/M +Jorey/M +Jorgan/M +Jorge/M +Jorgensen/M +Jorgenson/M +Jorie/M +Jori/M +Jorrie/M +Jorry/M +Jory/M +Joscelin/M +Josee/M +Josefa/M +Josefina/M +Josef/M +Joseito/M +Jose/M +Josepha/M +Josephina/M +Josephine/M +Joseph/M +Josephs +Josephson/M +Josephus/M +Josey/M +josh/DSRGZ +josher/M +Joshia/M +Josh/M +Joshuah/M +Joshua/M +Josiah/M +Josias/M +Josie/M +Josi/M +Josselyn/M +joss/M +jostle/SDG +Josue/M +Josy/M +jot/S +jotted +jotter/SM +jotting/SM +Joule/M +joule/SM +jounce/SDG +jouncy/RT +Jourdain/M +Jourdan/M +journalese/MS +journal/GSDM +journalism/SM +journalistic +journalist/SM +journalize/DRSGZ +journalized/U +journalizer/M +journey/DRMZSGJ +journeyer/M +journeyman/M +journeymen +jouster/M +joust/ZSMRDG +Jovanovich/M +Jove/M +joviality/SM +jovial/Y +Jovian +jowl/SMD +jowly/TR +Joya/M +Joyan/M +Joyann/M +Joycean +Joycelin/M +Joyce/M +Joye/M +joyfuller +joyfullest +joyfulness/SM +joyful/PY +joylessness/MS +joyless/PY +Joy/M +joy/MDSG +Joyner/M +joyousness/MS +joyous/YP +joyridden +joyride/SRZMGJ +joyrode +joystick/S +Jozef/M +JP +Jpn +Jr/M +j's +J's +Jsandye/M +Juana/M +Juanita/M +Juan/M +Juarez +Jubal/M +jubilant/Y +jubilate/XNGDS +jubilation/M +jubilee/SM +Judah/M +Judaic +Judaical +Judaism/SM +Judas/S +juddered +juddering +Judd/M +Judea/M +Jude/M +judge/AGDS +judger/M +judge's +judgeship/SM +judgmental/Y +judgment/MS +judicable +judicatory/S +judicature/MS +judicial/Y +judiciary/S +judicious/IYP +judiciousness/SMI +Judie/M +Judi/MH +Juditha/M +Judith/M +Jud/M +judo/MS +Judon/M +Judson/M +Judye/M +Judy/M +jugate/F +jugful/SM +jugged +Juggernaut/M +juggernaut/SM +jugging +juggler/M +juggle/RSDGZ +jugglery/MS +jug/MS +jugular/S +juice/GMZDSR +juicer/M +juicily +juiciness/MS +juicy/TRP +Juieta/M +jujitsu/MS +jujube/SM +juju/M +jujutsu's +jukebox/SM +juke/GS +Julee/M +Jule/MS +julep/SM +Julia/M +Juliana/M +Juliane/M +Julian/M +Julianna/M +Julianne/M +Juliann/M +Julie/M +julienne/GSD +Julienne/M +Julieta/M +Juliet/M +Julietta/M +Juliette/M +Juli/M +Julina/M +Juline/M +Julio/M +Julissa/M +Julita/M +Julius/M +Jul/M +Julys +July/SM +jumble/GSD +jumbo/MS +jumper/M +jump/GZDRS +jumpily +jumpiness/MS +jumpsuit/S +jumpy/PTR +jun +junco/MS +junction/IMESF +juncture/SFM +Juneau/M +June/MS +Junette/M +Jungfrau/M +Jungian +jungle/SDM +Jung/M +Junia/M +Junie/M +Junina/M +juniority/M +junior/MS +Junior/S +juniper/SM +junkerdom +Junker/SM +junketeer/SGDM +junket/SMDG +junk/GZDRMS +junkie/RSMT +junkyard/MS +Jun/M +Juno/M +junta/MS +Jupiter/M +Jurassic +juridic +juridical/Y +juried +jurisdictional/Y +jurisdiction/SM +jurisprudence/SM +jurisprudent +jurisprudential/Y +juristic +jurist/MS +juror/MS +Jurua/M +jury/IMS +jurying +juryman/M +jurymen +jurywoman/M +jurywomen +justed +Justen/M +juster/M +justest +Justice/M +justice/MIS +justiciable +justifiability/M +justifiable/U +justifiably/U +justification/M +justified/UA +justifier/M +justify/GDRSXZN +Justina/M +Justine/M +justing +Justinian/M +Justin/M +Justinn/M +Justino/M +Justis/M +justness/MS +justness's/U +justs +just/UPY +Justus/M +jute/SM +Jutish +Jutland/M +jut/S +jutted +jutting +Juvenal/M +juvenile/SM +juxtapose/SDG +juxtaposition/SM +JV +J/X +Jyoti/M +Kaaba/M +kabob/SM +kaboom +Kabuki +kabuki/SM +Kabul/M +Kacey/M +Kacie/M +Kacy/M +Kaddish/M +kaddish/S +Kaela/M +kaffeeklatch +kaffeeklatsch/S +Kafkaesque +Kafka/M +kaftan's +Kagoshima/M +Kahaleel/M +Kahlil/M +Kahlua/M +Kahn/M +Kaia/M +Kaifeng/M +Kaila/M +Kaile/M +Kailey/M +Kai/M +Kaine/M +Kain/M +kaiser/MS +Kaiser/SM +Kaitlin/M +Kaitlyn/M +Kaitlynn/M +Kaja/M +Kajar/M +Kakalina/M +Kalahari/M +Kala/M +Kalamazoo/M +Kalashnikov/M +Kalb/M +Kaleb/M +Kaleena/M +kaleidescope +kaleidoscope/SM +kaleidoscopic +kaleidoscopically +Kale/M +kale/MS +Kalgoorlie/M +Kalie/M +Kalila/M +Kalil/M +Kali/M +Kalina/M +Kalinda/M +Kalindi/M +Kalle/M +Kalli/M +Kally/M +Kalmyk +Kalvin/M +Kama/M +Kamchatka/M +Kamehameha/M +Kameko/M +Kamikaze/MS +kamikaze/SM +Kamilah/M +Kamila/M +Kamillah/M +Kampala/M +Kampuchea/M +Kanchenjunga/M +Kandace/M +Kandahar/M +Kandinsky/M +Kandy/M +Kane/M +kangaroo/SGMD +Kania/M +Kankakee/M +Kan/MS +Kannada/M +Kano/M +Kanpur/M +Kansan/S +Kansas +Kantian +Kant/M +Kanya/M +Kaohsiung/M +kaolinite/M +kaolin/MS +Kaplan/M +kapok/SM +Kaposi/M +kappa/MS +kaput/M +Karachi/M +Karaganda/M +Karakorum/M +karakul/MS +Karalee/M +Karalynn/M +Kara/M +Karamazov/M +karaoke/S +karate/MS +karat/SM +Karee/M +Kareem/M +Karel/M +Kare/M +Karena/M +Karenina/M +Karen/M +Karia/M +Karie/M +Karil/M +Karilynn/M +Kari/M +Karim/M +Karina/M +Karine/M +Karin/M +Kariotta/M +Karisa/M +Karissa/M +Karita/M +Karla/M +Karlan/M +Karlee/M +Karleen/M +Karlene/M +Karlen/M +Karlie/M +Karlik/M +Karlis +Karl/MNX +Karloff/M +Karlotta/M +Karlotte/M +Karly/M +Karlyn/M +karma/SM +Karmen/M +karmic +Karna/M +Karney/M +Karola/M +Karole/M +Karolina/M +Karoline/M +Karol/M +Karoly/M +Karon/M +Karo/YM +Karp/M +Karrah/M +Karrie/M +Karroo/M +Karry/M +kart/MS +Karylin/M +Karyl/M +Kary/M +Karyn/M +Kasai/M +Kasey/M +Kashmir/SM +Kaspar/M +Kasparov/M +Kasper/M +Kass +Kassandra/M +Kassey/M +Kassia/M +Kassie/M +Kassi/M +katakana +Katalin/M +Kata/M +Katee/M +Katelyn/M +Kate/M +Katerina/M +Katerine/M +Katey/M +Katha/M +Katharina/M +Katharine/M +Katharyn/M +Kathe/M +Katherina/M +Katherine/M +Katheryn/M +Kathiawar/M +Kathie/M +Kathi/M +Kathleen/M +Kathlin/M +Kath/M +Kathmandu +Kathrine/M +Kathryne/M +Kathryn/M +Kathye/M +Kathy/M +Katie/M +Kati/M +Katina/M +Katine/M +Katinka/M +Katleen/M +Katlin/M +Kat/M +Katmai/M +Katmandu's +Katowice/M +Katrina/M +Katrine/M +Katrinka/M +Kattie/M +Katti/M +Katuscha/M +Katusha/M +Katya/M +katydid/SM +Katy/M +Katz/M +Kauai/M +Kauffman/M +Kaufman/M +Kaunas/M +Kaunda/M +Kawabata/M +Kawasaki/M +kayak/SGDM +Kaycee/M +Kaye/M +Kayla/M +Kaylee/M +Kayle/M +Kayley/M +Kaylil/M +Kaylyn/M +Kay/M +Kayne/M +kayo/DMSG +Kazakh/M +Kazakhstan +Kazan/M +Kazantzakis/M +kazoo/SM +Kb +KB +KC +kcal/M +kc/M +KDE/M +Keane/M +Kean/M +Kearney/M +Keary/M +Keaton/M +Keats/M +kebab/SM +Keck/M +Keefe/MR +Keefer/M +Keegan/M +Keelby/M +Keeley/M +keel/GSMDR +keelhaul/SGD +Keelia/M +Keely/M +Keenan/M +Keene/M +keener/M +keen/GTSPYDR +keening/M +Keen/M +keenness/MS +keeper/M +keep/GZJSR +keeping/M +keepsake/SM +Keewatin/M +kegged +kegging +keg/MS +Keillor/M +Keir/M +Keisha/M +Keith/M +Kelbee/M +Kelby/M +Kelcey/M +Kelcie/M +Kelci/M +Kelcy/M +Kele/M +Kelila/M +Kellby/M +Kellen/M +Keller/M +Kelley/M +Kellia/M +Kellie/M +Kelli/M +Kellina/M +Kellogg/M +Kellsie/M +Kellyann/M +Kelly/M +kelp/GZMDS +Kelsey/M +Kelsi/M +Kelsy/M +Kelt's +Kelvin/M +kelvin/MS +Kelwin/M +Kemerovo/M +Kempis/M +Kemp/M +Kendall/M +Kendal/M +Kendell/M +Kendra/M +Kendre/M +Kendrick/MS +Kenilworth/M +Ken/M +Kenmore/M +ken/MS +Kenna/M +Kennan/M +Kennecott/M +kenned +Kennedy/M +kennel/GSMD +Kenneth/M +Kennett/M +Kennie/M +kenning +Kennith/M +Kenn/M +Kenny/M +keno/M +Kenon/M +Kenosha/M +Kensington/M +Kent/M +Kenton/M +Kentuckian/S +Kentucky/M +Kenya/M +Kenyan/S +Kenyatta/M +Kenyon/M +Keogh/M +Keokuk/M +kepi/SM +Kepler/M +kept +keratin/MS +kerbside +Kerby/M +kerchief/MDSG +Kerensky/M +Kerianne/M +Keriann/M +Keri/M +Kerk/M +Ker/M +Kermie/M +Kermit/M +Kermy/M +kerned +kernel/GSMD +kerning +Kern/M +kerosene/MS +Kerouac/M +Kerrie/M +Kerrill/M +Kerri/M +Kerrin/M +Kerr/M +Kerry/M +Kerstin/M +Kerwin/M +Kerwinn/M +Kesley/M +Keslie/M +Kessiah/M +Kessia/M +Kessler/M +kestrel/SM +ketch/MS +ketchup/SM +ketone/M +ketosis/M +Kettering/M +Kettie/M +Ketti/M +kettledrum/SM +kettleful +kettle/SM +Ketty/M +Kevan/M +Keven/M +Kevina/M +Kevin/M +Kevlar +Kev/MN +Kevon/M +Kevorkian/M +Kevyn/M +Kewaskum/M +Kewaunee/M +Kewpie/M +keyboardist/S +keyboard/RDMZGS +keyclick/SM +keyhole/MS +Key/M +Keynesian/M +Keynes/M +keynoter/M +keynote/SRDZMG +keypad/MS +keypuncher/M +keypunch/ZGRSD +keyring +key/SGMD +keystone/SM +keystroke/SDMG +keyword/SM +k/FGEIS +kg +K/G +KGB +Khabarovsk/M +Khachaturian/M +khaki/SM +Khalid/M +Khalil/M +Khan/M +khan/MS +Kharkov/M +Khartoum/M +Khayyam/M +Khmer/M +Khoisan/M +Khomeini/M +Khorana/M +Khrushchev/SM +Khufu/M +Khulna/M +Khwarizmi/M +Khyber/M +kHz/M +KIA +Kiah/M +Kial/M +kibble/GMSD +kibbutzim +kibbutz/M +kibitzer/M +kibitz/GRSDZ +kibosh/GMSD +Kickapoo/M +kickback/SM +kickball/MS +kicker/M +kick/GZDRS +kickoff/SM +kickstand/MS +kicky/RT +kidded +kidder/SM +kiddie/SD +kidding/YM +kiddish +Kidd/M +kiddo/SM +kiddying +kiddy's +kidless +kid/MS +kidnaper's +kidnaping's +kidnap/MSJ +kidnapped +kidnapper/SM +kidnapping/S +kidney/MS +kidskin/SM +Kieffer/M +kielbasa/SM +kielbasi +Kiele/M +Kiel/M +Kienan/M +kier/I +Kierkegaard/M +Kiersten/M +Kieth/M +Kiev/M +Kigali/M +Kikelia/M +Kikuyu/M +Kilauea/M +Kile/M +Kiley/M +Kilian/M +Kilimanjaro/M +kill/BJGZSDR +killdeer/SM +Killebrew/M +killer/M +Killian/M +Killie/M +killing/Y +killjoy/S +Killy/M +kiln/GDSM +kilobaud/M +kilobit/S +kilobuck +kilobyte/S +kilocycle/MS +kilogauss/M +kilogram/MS +kilohertz/M +kilohm/M +kilojoule/MS +kiloliter/MS +kilometer/SM +kilo/SM +kiloton/SM +kilovolt/SM +kilowatt/SM +kiloword +kilter/M +kilt/MDRGZS +Ki/M +Kimball/M +Kimbell/M +Kimberlee/M +Kimberley/M +Kimberli/M +Kimberly/M +Kimberlyn/M +Kimble/M +Kimbra/M +Kim/M +Kimmie/M +Kimmi/M +Kimmy/M +kimono/MS +Kincaid/M +kinda +kindergarten/MS +kindergärtner/SM +kinder/U +kindheartedness/MS +kindhearted/YP +kindle/AGRSD +kindler/M +kindliness/SM +kindliness's/U +kindling/M +kindly/TUPR +kindness's +kindness/US +kind/PSYRT +kindred/S +kinematic/S +kinematics/M +kinesics/M +kine/SM +kinesthesis +kinesthetically +kinesthetic/S +kinetically +kinetic/S +kinetics/M +kinfolk/S +kingbird/M +kingdom/SM +kingfisher/MS +kinglet/M +kingliness/M +kingly/TPR +King/M +kingpin/MS +Kingsbury/M +king/SGYDM +kingship/SM +Kingsley/M +Kingsly/M +Kingston/M +Kingstown/M +Kingwood/M +kink/GSDM +kinkily +kinkiness/SM +kinky/PRT +Kin/M +kin/MS +Kinna/M +Kinney/M +Kinnickinnic/M +Kinnie/M +Kinny/M +Kinsey/M +kinsfolk/S +Kinshasa/M +Kinshasha/M +kinship/SM +Kinsley/M +kinsman/M +kinsmen/M +kinswoman/M +kinswomen +kiosk/SM +Kiowa/SM +Kipling/M +Kip/M +kip/MS +Kippar/M +kipped +kipper/DMSG +Kipper/M +Kippie/M +kipping +Kipp/MR +Kippy/M +Kira/M +Kirbee/M +Kirbie/M +Kirby/M +Kirchhoff/M +Kirchner/M +Kirchoff/M +Kirghistan/M +Kirghizia/M +Kirghiz/M +Kiribati +Kiri/M +Kirinyaga/M +kirk/GDMS +Kirkland/M +Kirk/M +Kirkpatrick/M +Kirkwood/M +Kirov/M +kirsch/S +Kirsteni/M +Kirsten/M +Kirsti/M +Kirstin/M +Kirstyn/M +Kisangani/M +Kishinev/M +kismet/SM +kiss/DSRBJGZ +Kissee/M +kisser/M +Kissiah/M +Kissie/M +Kissinger/M +Kitakyushu/M +kitbag's +kitchener/M +Kitchener/M +kitchenette/SM +kitchen/GDRMS +kitchenware/SM +kiter/M +kite/SM +kith/MDG +kiths +Kit/M +kit/MDRGS +kitsch/MS +kitschy +kitted +kittenishness/M +kittenish/YP +kitten/SGDM +Kittie/M +Kitti/M +kitting +kittiwakes +Kitty/M +kitty/SM +Kiwanis/M +kiwifruit/S +kiwi/SM +Kizzee/M +Kizzie/M +KKK +kl +Klan/M +Klansman/M +Klara/M +Klarika/M +Klarrisa/M +Klaus/M +klaxon/M +Klee/M +Kleenex/SM +Klein/M +Kleinrock/M +Klemens/M +Klement/M +Kleon/M +kleptomaniac/SM +kleptomania/MS +Kliment/M +Kline/M +Klingon/M +Klondike/SDMG +kludger/M +kludge/RSDGMZ +kludgey +klutziness/S +klutz/SM +klutzy/TRP +Klux/M +klystron/MS +km +kn +knacker/M +knack/SGZRDM +knackwurst/MS +Knapp/M +knapsack/MS +Knauer/M +knavery/MS +knave/SM +knavish/Y +kneader/M +knead/GZRDS +kneecap/MS +kneecapped +kneecapping +knee/DSM +kneeing +kneeler/M +kneel/GRS +kneepad/SM +knell/SMDG +knelt +Knesset/M +knew +Kngwarreye/M +Knickerbocker/MS +knickerbocker/S +knickknack/SM +knick/ZR +Knievel/M +knife/DSGM +knighthood/MS +knightliness/MS +knightly/P +Knight/M +knight/MDYSG +knish/MS +knit/AU +knits +knitted +knitter/MS +knitting/SM +knitwear/M +knives/M +knobbly +knobby/RT +Knobeloch/M +knob/MS +knockabout/M +knockdown/S +knocker/M +knock/GZSJRD +knockoff/S +knockout/MS +knockwurst's +knoll/MDSG +Knopf/M +Knossos/M +knothole/SM +knot/MS +knotted +knottiness/M +knotting/M +knotty/TPR +knowable/U +knower/M +know/GRBSJ +knowhow +knowingly/U +knowing/RYT +knowings/U +knowledgeableness/M +knowledgeable/P +knowledgeably +knowledge/SM +Knowles +known/SU +Knox/M +Knoxville/M +knuckleball/R +knuckle/DSMG +knuckleduster +knucklehead/MS +Knudsen/M +Knudson/M +knurl/DSG +Knuth/M +Knutsen/M +Knutson/M +KO +koala/SM +Kobayashi/M +Kobe/M +Kochab/M +Koch/M +Kodachrome/M +Kodak/SM +Kodaly/M +Kodiak/M +Koenig/M +Koenigsberg/M +Koenraad/M +Koestler/M +Kohinoor/M +Kohler/M +Kohl/MR +kohlrabies +kohlrabi/M +kola/SM +Kolyma/M +Kommunizma/M +Kong/M +Kongo/M +Konrad/M +Konstance/M +Konstantine/M +Konstantin/M +Konstanze/M +kookaburra/SM +kook/GDMS +kookiness/S +kooky/PRT +Koo/M +Koontz/M +kopeck/MS +Koppers/M +Koralle/M +Koral/M +Kora/M +Koranic +Koran/SM +Kordula/M +Korea/M +Korean/S +Korella/M +Kore/M +Koren/M +Koressa/M +Korey/M +Korie/M +Kori/M +Kornberg/M +Korney/M +Korrie/M +Korry/M +Kort/M +Kory/M +Korzybski/M +Kosciusko/M +kosher/DGS +Kossuth/M +Kosygin/M +Kovacs/M +Kowalewski/M +Kowalski/M +Kowloon/M +kowtow/SGD +KP +kph +kraal/SMDG +Kraemer/M +kraft/M +Kraft/M +Krakatau's +Krakatoa/M +Krakow/M +Kramer/M +Krasnodar/M +Krasnoyarsk/M +Krause/M +kraut/S! +Krebs/M +Kremlin/M +Kremlinologist/MS +Kremlinology/MS +Kresge/M +Krieger/M +kriegspiel/M +krill/MS +Kringle/M +Krisha/M +Krishnah/M +Krishna/M +Kris/M +Krispin/M +Krissie/M +Krissy/M +Kristal/M +Krista/M +Kristan/M +Kristel/M +Kriste/M +Kristen/M +Kristian/M +Kristie/M +Kristien/M +Kristi/MN +Kristina/M +Kristine/M +Kristin/M +Kristofer/M +Kristoffer/M +Kristofor/M +Kristoforo/M +Kristo/MS +Kristopher/M +Kristy/M +Kristyn/M +Kr/M +Kroc/M +Kroger/M +króna/M +Kronecker/M +krone/RM +kronor +krónur +Kropotkin/M +Krueger/M +Kruger/M +Krugerrand/S +Krupp/M +Kruse/M +krypton/SM +Krystalle/M +Krystal/M +Krysta/M +Krystle/M +Krystyna/M +ks +K's +KS +k's/IE +kt +Kublai/M +Kubrick/M +kuchen/MS +kudos/M +kudzu/SM +Kuenning/M +Kuhn/M +Kuibyshev/M +Ku/M +Kumar/M +kumquat/SM +Kunming/M +Kuomintang/M +Kurdish/M +Kurdistan/SM +Kurd/SM +Kurosawa/M +Kurtis/M +Kurt/M +kurtosis/M +Kusch/M +Kuwaiti/SM +Kuwait/M +Kuznetsk/M +Kuznets/M +kvetch/DSG +kw +kW +Kwakiutl/M +Kwangchow's +Kwangju/M +Kwanzaa/S +kWh +KY +Kyla/M +kyle/M +Kyle/M +Kylen/M +Kylie/M +Kylila/M +Kylynn/M +Ky/MH +Kym/M +Kynthia/M +Kyoto/M +Kyrgyzstan +Kyrstin/M +Kyushu/M +L +LA +Laban/M +labeled/U +labeler/M +label/GAZRDS +labellings/A +label's +labial/YS +labia/M +labile +labiodental +labium/M +laboratory/MS +laboredness/M +labored/PMY +labored's/U +laborer/M +laboring/MY +laborings/U +laboriousness/MS +laborious/PY +labor/RDMJSZG +laborsaving +Labradorean/S +Labrador/SM +lab/SM +Lab/SM +laburnum/SM +labyrinthine +labyrinth/M +labyrinths +laced/U +Lacee/M +lace/MS +lacerate/NGVXDS +laceration/M +lacer/M +laces/U +lacewing/MS +Lacey/M +Lachesis/M +lachrymal/S +lachrymose +Lacie/M +lacing/M +lackadaisic +lackadaisical/Y +Lackawanna/M +lacker/M +lackey/SMDG +lack/GRDMS +lackluster/S +Lac/M +laconic +laconically +lacquerer/M +lacquer/ZGDRMS +lacrosse/MS +lac/SGMDR +lactate/MNGSDX +lactational/Y +lactation/M +lacteal +lactic +lactose/MS +lacunae +lacuna/M +Lacy/M +lacy/RT +ladder/GDMS +laddie/MS +laded/U +ladened +ladening +laden/U +lade/S +lading/M +ladle/SDGM +Ladoga/M +Ladonna/M +lad/XGSJMND +ladybird/SM +ladybug/MS +ladyfinger/SM +ladylike/U +ladylove/MS +Ladyship/MS +ladyship/SM +lady/SM +Lady/SM +Laetitia/M +laetrile/S +Lafayette/M +Lafitte/M +lager/DMG +laggard/MYSP +laggardness/M +lagged +lagging/MS +lagniappe/SM +lagoon/MS +Lagos/M +Lagrange/M +Lagrangian/M +Laguerre/M +Laguna/M +lag/ZSR +Lahore/M +laid/AI +Laidlaw/M +lain +Laina/M +Lainey/M +Laird/M +laird/MS +lair/GDMS +laissez +laity/SM +Laius/M +lake/DSRMG +Lakehurst/M +Lakeisha/M +laker/M +lakeside +Lakewood/M +Lakisha/M +Lakshmi/M +lallygagged +lallygagging +lallygag/S +Lalo/M +La/M +Lamaism/SM +Lamarck/M +Lamar/M +lamasery/MS +lama/SM +Lamaze +lambada/S +lambaste/SDG +lambda/SM +lambency/MS +lambent/Y +Lambert/M +lambkin/MS +Lamb/M +Lamborghini/M +lambskin/MS +lamb/SRDMG +lambswool +lamebrain/SM +lamed/M +lameness/MS +lamentableness/M +lamentable/P +lamentably +lamentation/SM +lament/DGSB +lamented/U +lame/SPY +la/MHLG +laminae +lamina/M +laminar +laminate/XNGSD +lamination/M +lam/MDRSTG +lammed +lammer +lamming +Lammond/M +Lamond/M +Lamont/M +L'Amour +lampblack/SM +lamplighter/M +lamplight/ZRMS +lampooner/M +lampoon/RDMGS +Lamport/M +lamppost/SM +lamprey/MS +lamp/SGMRD +lampshade/MS +LAN +Lanae/M +Lanai/M +lanai/SM +Lana/M +Lancashire/M +Lancaster/M +Lancelot/M +Lance/M +lancer/M +lance/SRDGMZ +lancet/MS +landau/MS +lander/I +landfall/SM +landfill/DSG +landforms +landholder/M +landhold/JGZR +landing/M +Landis/M +landlady/MS +landless +landlines +landlocked +landlord/MS +landlubber/SM +Land/M +landmark/GSMD +landmass/MS +Landon/M +landowner/MS +landownership/M +landowning/SM +Landry/M +Landsat +landscape/GMZSRD +landscaper/M +lands/I +landslide/MS +landslid/G +landslip +landsman/M +landsmen +land/SMRDJGZ +Landsteiner/M +landward/S +Landwehr/M +Lane/M +lane/SM +Lanette/M +Laney/M +Langeland/M +Lange/M +Langerhans/M +Langford/M +Langland/M +Langley/M +Lang/M +Langmuir/M +Langsdon/M +Langston/M +language/MS +languidness/MS +languid/PY +languisher/M +languishing/Y +languish/SRDG +languorous/Y +languor/SM +Lanie/M +Lani/M +Lanita/M +lankiness/SM +lankness/MS +lank/PTYR +lanky/PRT +Lanna/M +Lannie/M +Lanni/M +Lanny/M +lanolin/MS +Lansing/M +lantern/GSDM +lanthanide/M +lanthanum/MS +lanyard/MS +Lanzhou +Laocoon/M +Lao/SM +Laotian/MS +lapboard/MS +lapdog/S +lapel/MS +lapidary/MS +lapin/MS +Laplace/M +Lapland/ZMR +lapped +lappet/MS +lapping +Lapp/SM +lapsed/A +lapse/KSDMG +lapser/MA +lapses/A +lapsing/A +lap/SM +laps/SRDG +laptop/SM +lapwing/MS +Laraine/M +Lara/M +Laramie/M +larboard/MS +larcenist/S +larcenous +larceny/MS +larch/MS +larder/M +lard/MRDSGZ +Lardner/M +lardy/RT +Laredo/M +largehearted +largemouth +largeness/SM +large/SRTYP +largess/SM +largish +largo/S +lariat/MDGS +Lari/M +Larina/M +Larine/M +Larisa/M +Larissa/M +larker/M +lark/GRDMS +Lark/M +larkspur/MS +Larousse/M +Larry/M +Larsen/M +Lars/NM +Larson/M +larvae +larval +larva/M +laryngeal/YS +larynges +laryngitides +laryngitis/M +larynx/M +Laryssa/M +lasagna/S +lasagne's +Lascaux/M +lasciviousness/MS +lascivious/YP +lase +laser/M +lashed/U +lasher/M +lashing/M +lash/JGMSRD +Lassa/M +Lassen/M +Lassie/M +lassie/SM +lassitude/MS +lassoer/M +lasso/GRDMS +las/SRZG +lass/SM +laster/M +lastingness/M +lasting/PY +last/JGSYRD +Laszlo/M +Latasha/M +Latashia/M +latching/M +latchkey/SM +latch's +latch/UGSD +latecomer/SM +lated/A +late/KA +lately +latency/MS +lateness/MS +latent/YS +later/A +lateral/GDYS +lateralization +Lateran/M +latest/S +LaTeX/M +latex/MS +lathe/M +latherer/M +lather/RDMG +lathery +lathing/M +lath/MSRDGZ +Lathrop/M +laths +Latia/M +latices/M +Latina/SM +Latinate +Latino/S +Latin/RMS +latish +Latisha/M +latitude/SM +latitudinal/Y +latitudinarian/S +latitudinary +Lat/M +Latonya/M +Latoya/M +Latrena/M +Latrina/M +latrine/MS +Latrobe/M +lat/SDRT +latter/YM +latte/SR +lattice/SDMG +latticework/MS +latticing/M +Lattimer/M +Latvia/M +Latvian/S +laudably +laudanum/MS +laudatory +Lauderdale/M +lauder/M +Lauder/M +Laud/MR +laud/RDSBG +lauds/M +Laue/M +laughableness/M +laughable/P +laughably +laugh/BRDZGJ +laugher/M +laughing/MY +laughingstock/SM +laughs +laughter/MS +Laughton/M +Launce/M +launch/AGSD +launcher/MS +launching/S +launchpad/S +laundered/U +launderer/M +launderette/MS +launder/SDRZJG +laundress/MS +laundrette/S +laundromat/S +Laundromat/SM +laundryman/M +laundrymen +laundry/MS +laundrywoman/M +laundrywomen +Lauraine/M +Lauralee/M +Laural/M +laura/M +Laura/M +Laurasia/M +laureate/DSNG +laureateship/SM +Lauree/M +Laureen/M +Laurella/M +Laurel/M +laurel/SGMD +Laure/M +Laurena/M +Laurence/M +Laurene/M +Lauren/SM +Laurentian +Laurent/M +Lauretta/M +Laurette/M +Laurianne/M +Laurice/M +Laurie/M +Lauri/M +Lauritz/M +Lauryn/M +Lausanne/M +lavage/MS +lavaliere/MS +Laval/M +lava/SM +lavatory/MS +lave/GDS +Lavena/M +lavender/MDSG +Laverna/M +Laverne/M +Lavern/M +Lavina/M +Lavinia/M +Lavinie/M +lavishness/MS +lavish/SRDYPTG +Lavoisier/M +Lavonne/M +Lawanda/M +lawbreaker/SM +lawbreaking/MS +Lawford/M +lawfulness/SMU +lawful/PUY +lawgiver/MS +lawgiving/M +lawlessness/MS +lawless/PY +Law/M +lawmaker/MS +lawmaking/SM +lawman/M +lawmen +lawnmower/S +lawn/SM +Lawrence/M +Lawrenceville/M +lawrencium/SM +Lawry/M +law/SMDG +Lawson/M +lawsuit/MS +Lawton/M +lawyer/DYMGS +laxativeness/M +laxative/PSYM +laxer/A +laxes/A +laxity/SM +laxness/SM +lax/PTSRY +layabout/MS +Layamon/M +layaway/S +lay/CZGSR +layered/C +layer/GJDM +layering/M +layer's/IC +layette/SM +Layla/M +Lay/M +layman/M +laymen +Layne/M +Layney/M +layoff/MS +layout/SM +layover/SM +laypeople +layperson/S +lays/AI +Layton/M +layup/MS +laywoman/M +laywomen +Lazare/M +Lazar/M +Lazaro/M +Lazarus/M +laze/DSG +lazily +laziness/MS +lazuli/M +lazybones/M +lazy/PTSRDG +lb +LBJ/M +lbs +LC +LCD +LCM +LDC +leachate +Leach/M +leach/SDG +Leadbelly/M +leaded/U +leadenness/M +leaden/PGDY +leaderless +leader/M +leadership/MS +lead/SGZXJRDN +leadsman/M +leadsmen +leafage/MS +leaf/GSDM +leafhopper/M +leafiness/M +leafless +leaflet/SDMG +leafstalk/SM +leafy/PTR +leaguer/M +league/RSDMZG +Leah/M +leakage/SM +leaker/M +Leakey/M +leak/GSRDM +leakiness/MS +leaky/PRT +Lea/M +lea/MS +Leander/M +Leandra/M +leaner/M +leaning/M +Lean/M +Leanna/M +Leanne/M +leanness/MS +Leann/M +Leanora/M +Leanor/M +lean/YRDGTJSP +leaper/M +leapfrogged +leapfrogging +leapfrog/SM +leap/RDGZS +Lear/M +learnedly +learnedness/M +learned/UA +learner/M +learning/M +learns/UA +learn/SZGJRD +Leary/M +lease/ARSDG +leaseback/MS +leaseholder/M +leasehold/SRMZ +leaser/MA +lease's +leash's +leash/UGSD +leasing/M +leas/SRDGZ +least/S +leastwise +leatherette/S +leather/MDSG +leathern +leatherneck/SM +leathery +leaven/DMJGS +leavened/U +leavening/M +Leavenworth/M +leaver/M +leaves/M +leave/SRDJGZ +leaving/M +Lebanese +Lebanon/M +Lebbie/M +lebensraum +Lebesgue/M +Leblanc/M +lecher/DMGS +lecherousness/MS +lecherous/YP +lechery/MS +lecithin/SM +lectern/SM +lecturer/M +lecture/RSDZMG +lectureship/SM +led +Leda/M +Lederberg/M +ledger/DMG +ledge/SRMZ +LED/SM +Leeanne/M +Leeann/M +leech/MSDG +Leeds/M +leek/SM +Leelah/M +Leela/M +Leeland/M +Lee/M +lee/MZRS +Leena/M +leer/DG +leeriness/MS +leering/Y +leery/PTR +Leesa/M +Leese/M +Leeuwenhoek/M +Leeward/M +leeward/S +leeway/MS +leftism/SM +leftist/SM +leftmost +leftover/MS +Left/S +left/TRS +leftward/S +Lefty/M +lefty/SM +legacy/MS +legalese/MS +legalism/SM +legalistic +legality/MS +legalization/MS +legalize/DSG +legalized/U +legal/SY +legate/AXCNGSD +legatee/MS +legate's/C +legation/AMC +legato/SM +legendarily +legendary/S +Legendre/M +legend/SM +legerdemain/SM +Leger/SM +legged +legginess/MS +legging/MS +leggy/PRT +leghorn/SM +Leghorn/SM +legibility/MS +legible +legibly +legionary/S +legionnaire/SM +legion/SM +legislate/SDXVNG +legislation/M +legislative/SY +legislator/SM +legislature/MS +legitimacy/MS +legitimate/SDNGY +legitimation/M +legitimatize/SDG +legitimization/MS +legitimize/RSDG +legit/S +legless +legman/M +legmen +leg/MS +Lego/M +Legra/M +Legree/M +legroom/MS +legstraps +legume/SM +leguminous +legwork/SM +Lehigh/M +Lehman/M +Leia/M +Leibniz/M +Leicester/SM +Leiden/M +Leif/M +Leigha/M +Leigh/M +Leighton/M +Leilah/M +Leila/M +lei/MS +Leipzig/M +Leisha/M +leisureliness/MS +leisurely/P +leisure/SDYM +leisurewear +leitmotif/SM +leitmotiv/MS +Lek/M +Lelah/M +Lela/M +Leland/M +Lelia/M +Lemaitre/M +Lemar/M +Lemke/M +Lem/M +lemma/MS +lemme/GJ +Lemmie/M +lemming/M +Lemmy/M +lemonade/SM +lemon/GSDM +lemony +Lemuel/M +Lemuria/M +lemur/MS +Lena/M +Lenard/M +Lenci/M +lender/M +lend/SRGZ +Lenee/M +Lenette/M +lengthener/M +lengthen/GRD +lengthily +lengthiness/MS +length/MNYX +lengths +lengthwise +lengthy/TRP +lenience/S +leniency/MS +lenient/SY +Leningrad/M +Leninism/M +Leninist +Lenin/M +lenitive/S +Lenka/M +Len/M +Le/NM +Lenna/M +Lennard/M +Lennie/M +Lennon/M +Lenny/M +Lenoir/M +Leno/M +Lenora/M +Lenore/M +lens/SRDMJGZ +lent/A +lenticular +lentil/SM +lento/S +Lent/SMN +Leodora/M +Leoine/M +Leola/M +Leoline/M +Leo/MS +Leona/M +Leonanie/M +Leonard/M +Leonardo/M +Leoncavallo/M +Leonelle/M +Leonel/M +Leone/M +Leonerd/M +Leonhard/M +Leonidas/M +Leonid/M +Leonie/M +leonine +Leon/M +Leonora/M +Leonore/M +Leonor/M +Leontine/M +Leontyne/M +leopardess/SM +leopard/MS +leopardskin +Leopold/M +Leopoldo/M +Leopoldville/M +Leora/M +leotard/MS +leper/SM +Lepidus/M +Lepke/M +leprechaun/SM +leprosy/MS +leprous +lepta +lepton/SM +Lepus/M +Lerner/M +Leroi/M +Leroy/M +Lesa/M +lesbianism/MS +lesbian/MS +Leshia/M +lesion/DMSG +Lesley/M +Leslie/M +Lesli/M +Lesly/M +Lesotho/M +lessee/MS +lessen/GDS +Lesseps/M +lesser +lesses +Lessie/M +lessing +lesson/DMSG +lessor/MS +less/U +Lester/M +lest/R +Les/Y +Lesya/M +Leta/M +letdown/SM +lethality/M +lethal/YS +Letha/M +lethargic +lethargically +lethargy/MS +Lethe/M +Lethia/M +Leticia/M +Letisha/M +let/ISM +Letitia/M +Letizia/M +Letta/M +letterbox/S +lettered/U +letterer/M +letterhead/SM +lettering/M +letter/JSZGRDM +letterman/M +Letterman/M +lettermen +letterpress/MS +Lettie/M +Letti/M +letting/S +lettuce/SM +Letty/M +letup/MS +leukemia/SM +leukemic/S +leukocyte/MS +Leupold/M +Levant/M +leveeing +levee/SDM +leveled/U +leveler/M +levelheadedness/S +levelheaded/P +leveling/U +levelness/SM +level/STZGRDYP +leverage/MGDS +lever/SDMG +Levesque/M +Levey/M +Leviathan +leviathan/MS +levier/M +Levi/MS +Levine/M +Levin/M +levitate/XNGDS +levitation/M +Leviticus/M +Levitt/M +levity/MS +Lev/M +Levon/M +Levy/M +levy/SRDZG +lewdness/MS +lewd/PYRT +Lewellyn/M +Lewes +Lewie/M +Lewinsky/M +lewis/M +Lewis/M +Lewiss +Lew/M +lex +lexeme/MS +lexical/Y +lexicographer/MS +lexicographic +lexicographical/Y +lexicography/SM +lexicon/SM +Lexie/M +Lexi/MS +Lexine/M +Lexington/M +Lexus/M +Lexy/M +Leyden/M +Leyla/M +Lezley/M +Lezlie/M +lg +Lhasa/SM +Lhotse/M +liability/SAM +liable/AP +liaise/GSD +liaison/SM +Lia/M +Liam/M +Liana/M +Liane/M +Lian/M +Lianna/M +Lianne/M +liar/MS +libation/SM +libbed +Libbey/M +Libbie/M +Libbi/M +libbing +Libby/M +libeler/M +libel/GMRDSZ +libelous/Y +Liberace/M +liberalism/MS +liberality/MS +liberalization/SM +liberalized/U +liberalize/GZSRD +liberalizer/M +liberalness/MS +liberal/YSP +liberate/NGDSCX +liberationists +liberation/MC +liberator/SCM +Liberia/M +Liberian/S +libertarianism/M +libertarian/MS +libertine/MS +liberty/MS +libidinal +libidinousness/M +libidinous/PY +libido/MS +Lib/M +lib/MS +librarian/MS +library/MS +Libra/SM +libretoes +libretos +librettist/MS +libretto/MS +Libreville/M +Librium/M +Libya/M +Libyan/S +lice/M +licensed/AU +licensee/SM +license/MGBRSD +licenser/M +licenses/A +licensing/A +licensor/M +licentiate/MS +licentiousness/MS +licentious/PY +Licha/M +lichee's +lichen/DMGS +Lichtenstein/M +Lichter/M +licit/Y +licked/U +lickerish +licker/M +lick/GRDSJ +licking/M +licorice/SM +Lida/M +lidded +lidding +Lidia/M +lidless +lid/MS +lido/MS +Lieberman/M +Liebfraumilch/M +Liechtenstein/RMZ +lied/MR +lie/DRS +Lief/M +liefs/A +lief/TSR +Liege/M +liege/SR +Lie/M +lien/SM +lier/IMA +lies/A +Liesa/M +lieu/SM +lieut +lieutenancy/MS +lieutenant/SM +Lieut/M +lifeblood/SM +lifeboat/SM +lifebuoy/S +lifeforms +lifeguard/MDSG +lifelessness/SM +lifeless/PY +lifelikeness/M +lifelike/P +lifeline/SM +lifelong +life/MZR +lifer/M +lifesaver/SM +lifesaving/S +lifespan/S +lifestyle/S +lifetaking +lifetime/MS +lifework/MS +LIFO +lifter/M +lift/GZMRDS +liftoff/MS +ligament/MS +ligand/MS +ligate/XSDNG +ligation/M +ligature/DSGM +light/ADSCG +lighted/U +lightener/M +lightening/M +lighten/ZGDRS +lighter/CM +lightered +lightering +lighters +lightest +lightface/SDM +lightheaded +lightheartedness/MS +lighthearted/PY +lighthouse/MS +lighting/MS +lightly +lightness/MS +lightning/SMD +lightproof +light's +lightship/SM +lightweight/S +ligneous +lignite/MS +lignum +likability/MS +likableness/MS +likable/P +likeability's +liked/E +likelihood/MSU +likely/UPRT +likeness/MSU +liken/GSD +liker/E +liker's +likes/E +likest +like/USPBY +likewise +liking/SM +lilac/MS +Lilah/M +Lila/SM +Lilia/MS +Liliana/M +Liliane/M +Lilian/M +Lilith/M +Liliuokalani/M +Lilla/M +Lille/M +Lillian/M +Lillie/M +Lilli/MS +lilliputian/S +Lilliputian/SM +Lilliput/M +Lilllie/M +Lilly/M +Lil/MY +Lilongwe/M +lilting/YP +lilt/MDSG +Lilyan/M +Lily/M +lily/MSD +Lima/M +Limbaugh/M +limbered/U +limberness/SM +limber/RDYTGP +limbers/U +limbic +limbless +Limbo +limbo/GDMS +limb/SGZRDM +Limburger/SM +limeade/SM +lime/DSMG +limekiln/M +limelight/DMGS +limerick/SM +limestone/SM +limitability +limitably +limitation/MCS +limit/CSZGRD +limitedly/U +limitedness/M +limited/PSY +limiter/M +limiting/S +limitlessness/SM +limitless/PY +limit's +limn/GSD +Limoges/M +limo/S +limousine/SM +limper/M +limpet/SM +limpidity/MS +limpidness/SM +limpid/YP +limpness/MS +Limpopo/M +limp/SGTPYRD +Li/MY +limy/TR +linage/MS +Lina/M +linchpin/MS +Linc/M +Lincoln/SM +Linda/M +Lindbergh/M +Lindberg/M +linden/MS +Lindholm/M +Lindie/M +Lindi/M +Lind/M +Lindon/M +Lindquist/M +Lindsay/M +Lindsey/M +Lindstrom/M +Lindsy/M +Lindy/M +line/AGDS +lineage/SM +lineal/Y +Linea/M +lineament/MS +linearity/MS +linearize/SDGNB +linear/Y +linebacker/SM +lined/U +linefeed +Linell/M +lineman/M +linemen +linen/SM +liner/SM +line's +linesman/M +linesmen +Linet/M +Linette/M +lineup/S +lingerer/M +lingerie/SM +lingering/Y +linger/ZGJRD +lingoes +lingo/M +lingual/SY +lingua/M +linguine +linguini's +linguistically +linguistic/S +linguistics/M +linguist/SM +ling/ZR +liniment/MS +lining/SM +linkable +linkage/SM +linked/A +linker/S +linking/S +Link/M +link's +linkup/S +link/USGD +Lin/M +Linnaeus/M +Linnea/M +Linnell/M +Linnet/M +linnet/SM +Linnie/M +Linn/M +Linoel/M +linoleum/SM +lino/M +Linotype/M +linseed/SM +lintel/SM +linter/M +Linton/M +lint/SMR +linty/RST +Linus/M +Linux/M +Linwood/M +Linzy/M +Lionello/M +Lionel/M +lioness/SM +lionhearted +lionization/SM +lionizer/M +lionize/ZRSDG +Lion/M +lion/MS +lipase/M +lipid/MS +lip/MS +liposuction/S +lipped +lipper +Lippi/M +lipping +Lippmann/M +lippy/TR +lipread/GSRJ +Lipschitz/M +Lipscomb/M +lipstick/MDSG +Lipton/M +liq +liquefaction/SM +liquefier/M +liquefy/DRSGZ +liqueur/DMSG +liquidate/GNXSD +liquidation/M +liquidator/SM +liquidity/SM +liquidizer/M +liquidize/ZGSRD +liquidness/M +liquid/SPMY +liquorice/SM +liquorish +liquor/SDMG +lira/M +Lira/M +lire +Lisabeth/M +Lisa/M +Lisbeth/M +Lisbon/M +Lise/M +Lisetta/M +Lisette/M +Lisha/M +Lishe/M +Lisle/M +lisle/SM +lisper/M +lisp/MRDGZS +Lissajous/M +Lissa/M +Lissie/M +Lissi/M +Liss/M +lissomeness/M +lissome/P +lissomness/M +Lissy/M +listed/U +listener/M +listen/ZGRD +Listerine/M +lister/M +Lister/M +listing/M +list/JMRDNGZXS +listlessness/SM +listless/PY +Liston/M +Liszt/M +Lita/M +litany/MS +litchi/SM +literacy/MS +literalism/M +literalistic +literalness/MS +literal/PYS +literariness/SM +literary/P +literate/YNSP +literati +literation/M +literature/SM +liter/M +lite/S +litheness/SM +lithe/PRTY +lithesome +lithium/SM +lithograph/DRMGZ +lithographer/M +lithographic +lithographically +lithographs +lithography/MS +lithology/M +lithosphere/MS +lithospheric +Lithuania/M +Lithuanian/S +litigant/MS +litigate/NGXDS +litigation/M +litigator/SM +litigiousness/MS +litigious/PY +litmus/SM +litotes/M +lit/RZS +littérateur/S +litterbug/SM +litter/SZGRDM +Little/M +littleneck/M +littleness/SM +little/RSPT +Littleton/M +Litton/M +littoral/S +liturgical/Y +liturgic/S +liturgics/M +liturgist/MS +liturgy/SM +Liuka/M +livability/MS +livableness/M +livable/U +livably +Liva/M +lived/A +livelihood/SM +liveliness/SM +livelong/S +lively/RTP +liveness/M +liven/SDG +liver/CSGD +liveried +liverish +Livermore/M +Liverpool/M +Liverpudlian/MS +liver's +liverwort/SM +liverwurst/SM +livery/CMS +liveryman/MC +liverymen/C +lives/A +lives's +livestock/SM +live/YHZTGJDSRPB +Livia/M +lividness/M +livid/YP +livingness/M +Livingstone/M +Livingston/M +living/YP +Liv/M +Livonia/M +Livvie/M +Livvy/M +Livvyy/M +Livy/M +Lizabeth/M +Liza/M +lizard/MS +Lizbeth/M +Lizette/M +Liz/M +Lizzie/M +Lizzy/M +l/JGVXT +Ljubljana/M +LL +llama/SM +llano/SM +LLB +ll/C +LLD +Llewellyn/M +Lloyd/M +Llywellyn/M +LNG +lo +loadable +loaded/A +loader/MU +loading/MS +load's/A +loads/A +loadstar's +loadstone's +load/SURDZG +loafer/M +Loafer/S +loaf/SRDMGZ +loam/SMDG +loamy/RT +loaner/M +loaning/M +loan/SGZRDMB +loansharking/S +loanword/S +loathe +loather/M +loathing/M +loath/JPSRDYZG +loathness/M +loathsomeness/MS +loathsome/PY +loaves/M +Lobachevsky/M +lobar +lobbed +lobber/MS +lobbing +lobby/GSDM +lobbyist/MS +lobe/SM +lob/MDSG +lobotomist +lobotomize/GDS +lobotomy/MS +lobster/MDGS +lobularity +lobular/Y +lobule/SM +locale/MS +localisms +locality/MS +localization/MS +localized/U +localizer/M +localizes/U +localize/ZGDRS +local/SGDY +locatable +locate/AXESDGN +locater/M +locational/Y +location/EMA +locative/S +locator's +Lochinvar/M +loch/M +lochs +loci/M +lockable +Lockean/M +locked/A +Locke/M +locker/SM +locket/SM +Lockhart/M +Lockheed/M +Lockian/M +locking/S +lockjaw/SM +Lock/M +locknut/M +lockout/MS +lock's +locksmithing/M +locksmith/MG +locksmiths +lockstep/S +lock/UGSD +lockup/MS +Lockwood/M +locomotion/SM +locomotive/YMS +locomotor +locomotory +loco/SDMG +locoweed/MS +locus/M +locust/SM +locution/MS +lode/SM +lodestar/MS +lodestone/MS +lodged/E +lodge/GMZSRDJ +Lodge/M +lodgepole +lodger/M +lodges/E +lodging/M +lodgment/M +Lodovico/M +Lodowick/M +Lodz +Loeb/M +Loella/M +Loewe/M +Loewi/M +lofter/M +loftily +loftiness/SM +loft/SGMRD +lofty/PTR +loganberry/SM +Logan/M +logarithmic +logarithmically +logarithm/MS +logbook/MS +loge/SMNX +logged/U +loggerhead/SM +logger/SM +loggia/SM +logging/MS +logicality/MS +logicalness/M +logical/SPY +logician/SM +logic/SM +login/S +logion/M +logistical/Y +logistic/MS +logjam/SM +LOGO +logo/SM +logotype/MS +logout +logrolling/SM +log's/K +log/SM +logy/RT +Lohengrin/M +loincloth/M +loincloths +loin/SM +Loire/M +Loise/M +Lois/M +loiterer/M +loiter/RDJSZG +Loki/M +Lola/M +Loleta/M +Lolita/M +loller/M +lollipop/MS +loll/RDGS +Lolly/M +lolly/SM +Lombardi/M +Lombard/M +Lombardy/M +Lomb/M +Lome +Lona/M +Londonderry/M +Londoner/M +London/RMZ +Lonee/M +loneliness/SM +lonely/TRP +loneness/M +lone/PYZR +loner/M +lonesomeness/MS +lonesome/PSY +longboat/MS +longbow/SM +longed/K +longeing +longer/K +longevity/MS +Longfellow/M +longhair/SM +longhand/SM +longhorn/SM +longing/MY +longish +longitude/MS +longitudinal/Y +long/JGTYRDPS +Long/M +longness/M +longshoreman/M +longshoremen +longsighted +longs/K +longstanding +Longstreet/M +longsword +longterm +longtime +Longueuil/M +longueur/SM +longways +longword/SM +Loni/M +Lon/M +Lonna/M +Lonnard/M +Lonnie/M +Lonni/M +Lonny/M +loofah/M +loofahs +lookahead +lookalike/S +looker/M +look/GZRDS +lookout/MS +lookup/SM +looming/M +Loomis/M +loom/MDGS +loon/MS +loony/SRT +looper/M +loophole/MGSD +loop/MRDGS +loopy/TR +loosed/U +looseleaf +loosener/M +looseness/MS +loosen/UDGS +loose/SRDPGTY +looses/U +loosing/M +looter/M +loot/MRDGZS +loper/M +lope/S +Lopez/M +lopped +lopper/MS +lopping +lop/SDRG +lopsidedness/SM +lopsided/YP +loquaciousness/MS +loquacious/YP +loquacity/SM +Loraine/M +Lorain/M +Loralee/M +Loralie/M +Loralyn/M +Lora/M +Lorant/M +lording/M +lordliness/SM +lordly/PTR +Lord/MS +lord/MYDGS +lordship/SM +Lordship/SM +Loree/M +Loreen/M +Lorelei/M +Lorelle/M +lore/MS +Lorena/M +Lorene/M +Loren/SM +Lorentzian/M +Lorentz/M +Lorenza/M +Lorenz/M +Lorenzo/M +Loretta/M +Lorette/M +lorgnette/SM +Loria/M +Lorianna/M +Lorianne/M +Lorie/M +Lorilee/M +Lorilyn/M +Lori/M +Lorinda/M +Lorine/M +Lorin/M +loris/SM +Lorita/M +lorn +Lorna/M +Lorne/M +Lorraine/M +Lorrayne/M +Lorre/M +Lorrie/M +Lorri/M +Lorrin/M +lorryload/S +Lorry/M +lorry/SM +Lory/M +Los +loser/M +lose/ZGJBSR +lossage +lossless +loss/SM +lossy/RT +lost/P +Lothaire/M +Lothario/MS +lotion/MS +Lot/M +lot/MS +Lotta/M +lotted +Lotte/M +lotter +lottery/MS +Lottie/M +Lotti/M +lotting +Lott/M +lotto/MS +Lotty/M +lotus/SM +louden/DG +loudhailer/S +loudly/RT +loudmouth/DM +loudmouths +loudness/MS +loudspeaker/SM +loudspeaking +loud/YRNPT +Louella/M +Louie/M +Louisa/M +Louise/M +Louisette/M +Louisiana/M +Louisianan/S +Louisianian/S +Louis/M +Louisville/M +Lou/M +lounger/M +lounge/SRDZG +Lourdes/M +lour/GSD +louse/CSDG +louse's +lousewort/M +lousily +lousiness/MS +lousy/PRT +loutishness/M +loutish/YP +Loutitia/M +lout/SGMD +louver/DMS +L'Ouverture +Louvre/M +lovableness/MS +lovable/U +lovably +lovebird/SM +lovechild +Lovecraft/M +love/DSRMYZGJB +loved/U +Lovejoy/M +Lovelace/M +Loveland/M +lovelessness/M +loveless/YP +lovelies +lovelinesses +loveliness/UM +Lovell/M +lovelornness/M +lovelorn/P +lovely/URPT +Love/M +lovemaking/SM +lover/YMG +lovesick +lovestruck +lovingly +lovingness/M +loving/U +lowborn +lowboy/SM +lowbrow/MS +lowdown/S +Lowell/M +Lowe/M +lowercase/GSD +lower/DG +lowermost +Lowery/M +lowish +lowland/RMZS +Lowlands/M +lowlife/SM +lowlight/MS +lowliness/MS +lowly/PTR +lowness/MS +low/PDRYSZTG +Lowrance/M +lox/MDSG +loyaler +loyalest +loyal/EY +loyalism/SM +loyalist/SM +loyalty/EMS +Loyang/M +Loydie/M +Loyd/M +Loy/M +Loyola/M +lozenge/SDM +LP +LPG +LPN/S +Lr +ls +l's +L's +LSD +ltd +Ltd/M +Lt/M +Luanda/M +Luann/M +luau/MS +lubber/YMS +Lubbock/M +lube/DSMG +lubricant/SM +lubricate/VNGSDX +lubrication/M +lubricator/MS +lubricious/Y +lubricity/SM +Lubumbashi/M +Lucais/M +Luca/MS +Luce/M +lucent/Y +Lucerne/M +Lucho/M +Lucia/MS +Luciana/M +Lucian/M +Luciano/M +lucidity/MS +lucidness/MS +lucid/YP +Lucie/M +Lucien/M +Lucienne/M +Lucifer/M +Lucila/M +Lucile/M +Lucilia/M +Lucille/M +Luci/MN +Lucina/M +Lucinda/M +Lucine/M +Lucio/M +Lucita/M +Lucite/MS +Lucius/M +luck/GSDM +luckier/U +luckily/U +luckiness/UMS +luckless +Lucknow/M +Lucky/M +lucky/RSPT +lucrativeness/SM +lucrative/YP +lucre/MS +Lucretia/M +Lucretius/M +lucubrate/GNSDX +lucubration/M +Lucy/M +Luddite/SM +Ludhiana/M +ludicrousness/SM +ludicrous/PY +Ludlow/M +Ludmilla/M +ludo/M +Ludovico/M +Ludovika/M +Ludvig/M +Ludwig/M +Luella/M +Luelle/M +luff/GSDM +Lufthansa/M +Luftwaffe/M +luge/MC +Luger/M +luggage/SM +lugged +lugger/SM +lugging +Lugosi/M +lug/RS +lugsail/SM +lugubriousness/MS +lugubrious/YP +Luigi/M +Luisa/M +Luise/M +Luis/M +Lukas/M +Luke/M +lukewarmness/SM +lukewarm/PY +Lula/M +Lulita/M +lullaby/GMSD +lull/SDG +lulu/M +Lulu/M +Lu/M +lumbago/SM +lumbar/S +lumberer/M +lumbering/M +lumberjack/MS +lumberman/M +lumbermen +lumber/RDMGZSJ +lumberyard/MS +lumen/M +Lumičre/M +luminance/M +luminary/MS +luminescence/SM +luminescent +luminosity/MS +luminousness/M +luminous/YP +lummox/MS +lumper/M +lumpiness/MS +lumpishness/M +lumpish/YP +lump/SGMRDN +lumpy/TPR +lunacy/MS +Luna/M +lunar/S +lunary +lunate/YND +lunatic/S +lunation/M +luncheonette/SM +luncheon/SMDG +luncher/M +lunch/GMRSD +lunchpack +lunchroom/MS +lunchtime/MS +Lundberg/M +Lund/M +Lundquist/M +lune/M +lunge/MS +lunger/M +lungfish/SM +lungful +lung/SGRDM +lunkhead/SM +Lupe/M +lupine/SM +Lupus/M +lupus/SM +Lura/M +lurcher/M +lurch/RSDG +lure/DSRG +lurer/M +Lurette/M +lurex +Luria/M +luridness/SM +lurid/YP +lurker/M +lurk/GZSRD +Lurleen/M +Lurlene/M +Lurline/M +Lusaka/M +Lusa/M +lusciousness/MS +luscious/PY +lushness/MS +lush/YSRDGTP +Lusitania/M +luster/GDM +lustering/M +lusterless +lustfulness/M +lustful/PY +lustily +lustiness/MS +lust/MRDGZS +lustrousness/M +lustrous/PY +lusty/PRT +lutanist/MS +lute/DSMG +lutenist/MS +Lutero/M +lutetium/MS +Lutheranism/MS +Lutheran/SM +Luther/M +luting/M +Lutz +Luxembourgian +Luxembourg/RMZ +Luxemburg's +luxe/MS +luxuriance/MS +luxuriant/Y +luxuriate/GNSDX +luxuriation/M +luxuriousness/SM +luxurious/PY +luxury/MS +Luz/M +Luzon/M +L'vov +Lyallpur/M +lyceum/MS +lychee's +lycopodium/M +Lycra/S +Lycurgus/M +Lyda/M +Lydia/M +Lydian/S +Lydie/M +Lydon/M +lye/JSMG +Lyell/M +lying/Y +Lyle/M +Lyly/M +Lyman/M +Lyme/M +lymphatic/S +lymph/M +lymphocyte/SM +lymphoid +lymphoma/MS +lymphs +Ly/MY +Lynchburg/M +lyncher/M +lynching/M +Lynch/M +lynch/ZGRSDJ +Lynda/M +Lyndell/M +Lyndel/M +Lynde/M +Lyndon/M +Lyndsay/M +Lyndsey/M +Lyndsie/M +Lyndy/M +Lynea/M +Lynelle/M +Lynette/M +Lynett/M +Lyn/M +Lynna/M +Lynnea/M +Lynnelle/M +Lynnell/M +Lynne/M +Lynnet/M +Lynnette/M +Lynnett/M +Lynn/M +Lynsey/M +lynx/MS +Lyon/SM +Lyra/M +lyrebird/MS +lyre/SM +lyricalness/M +lyrical/YP +lyricism/SM +lyricist/SM +lyric/S +Lysenko/M +lysine/M +Lysistrata/M +Lysol/M +Lyssa/M +LyX/M +MA +Maalox/M +ma'am +Mabelle/M +Mabel/M +Mable/M +Mab/M +macabre/Y +macadamize/SDG +macadam/SM +Macao/M +macaque/SM +macaroni/SM +macaroon/MS +Macarthur/M +MacArthur/M +Macaulay/M +macaw/SM +Macbeth/M +Maccabees/M +Maccabeus/M +Macdonald/M +MacDonald/M +MacDraw/M +Macedonia/M +Macedonian/S +Macedon/M +mace/MS +Mace/MS +macerate/DSXNG +maceration/M +macer/M +Macgregor/M +MacGregor/M +machete/SM +Machiavellian/S +Machiavelli/M +machinate/SDXNG +machination/M +machinelike +machine/MGSDB +machinery/SM +machinist/MS +machismo/SM +Mach/M +macho/S +Machs +Macias/M +Macintosh/M +MacIntosh/M +macintosh's +Mackenzie/M +MacKenzie/M +mackerel/SM +Mackinac/M +Mackinaw +mackinaw/SM +mackintosh/SM +mack/M +Mack/M +MacLeish/M +Macmillan/M +MacMillan/M +Macon/SM +MacPaint/M +macramé/S +macrobiotic/S +macrobiotics/M +macrocosm/MS +macrodynamic +macroeconomic/S +macroeconomics/M +macromolecular +macromolecule/SM +macron/MS +macrophage/SM +macroscopic +macroscopically +macrosimulation +macro/SM +macrosocioeconomic +Mac/SGMD +mac/SGMDR +Macy/M +Madagascan/SM +Madagascar/M +Madalena/M +Madalyn/M +Mada/M +madame/M +Madame/MS +madam/SM +madcap/S +Maddalena/M +madded +madden/GSD +maddening/Y +Madden/M +madder/MS +maddest +Maddie/M +Maddi/M +madding +Maddox/M +Maddy/M +made/AU +Madeira/SM +Madelaine/M +Madeleine/M +Madelena/M +Madelene/M +Madelina/M +Madeline/M +Madelin/M +Madella/M +Madelle/M +Madel/M +Madelon/M +Madelyn/M +mademoiselle/MS +Madge/M +madhouse/SM +Madhya/M +Madison/M +Madlen/M +Madlin/M +madman/M +madmen +madness/SM +Madonna/MS +mad/PSY +Madras +madras/SM +Madrid/M +madrigal/MSG +Madsen/M +Madurai/M +madwoman/M +madwomen +Mady/M +Maegan/M +Maelstrom/M +maelstrom/SM +Mae/M +maestro/MS +Maeterlinck/M +Mafia/MS +mafia/S +mafiosi +mafioso/M +Mafioso/S +MAG +magazine/DSMG +Magdaia/M +Magdalena/M +Magdalene/M +Magdalen/M +Magda/M +Magellanic +Magellan/M +magenta/MS +magged +Maggee/M +Maggie/M +Maggi/M +magging +maggot/MS +maggoty/RT +Maggy/M +magi +magical/Y +magician/MS +magicked +magicking +magic/SM +Magill/M +Magi/M +Maginot/M +magisterial/Y +magistracy/MS +magistrate/MS +Mag/M +magma/SM +magnanimity/SM +magnanimosity +magnanimous/PY +magnate/SM +magnesia/MS +magnesite/M +magnesium/SM +magnetically +magnetic/S +magnetics/M +magnetism/SM +magnetite/SM +magnetizable +magnetization/ASCM +magnetize/CGDS +magnetized/U +magnetodynamics +magnetohydrodynamical +magnetohydrodynamics/M +magnetometer/MS +magneto/MS +magnetosphere/M +magnetron/M +magnet/SM +magnification/M +magnificence/SM +magnificent/Y +magnified/U +magnify/DRSGNXZ +magniloquence/MS +magniloquent +Magnitogorsk/M +magnitude/SM +magnolia/SM +Magnum +magnum/SM +Magnuson/M +Magog/M +Magoo/M +magpie/SM +Magritte/M +Magruder/M +mag/S +Magsaysay/M +Maguire/SM +Magus/M +Magyar/MS +Mahabharata +Mahala/M +Mahalia/M +maharajah/M +maharajahs +maharanee's +maharani/MS +Maharashtra/M +maharishi/SM +mahatma/SM +Mahavira/M +Mahayana/M +Mahayanist +Mahdi/M +Mahfouz/M +Mahican/SM +mahjong's +Mahler/M +Mahmoud/M +Mahmud/M +mahogany/MS +Mahomet's +mahout/SM +Maia/M +Maible/M +maidenhair/MS +maidenhead/SM +maidenhood/SM +maidenly/P +maiden/YM +maidservant/MS +maid/SMNX +maier +Maier/M +Maiga/M +Maighdiln/M +Maigret/M +mailbag/MS +mailbox/MS +mail/BSJGZMRD +mailer/M +Mailer/M +Maillol/M +maillot/SM +mailman/M +mailmen +Maiman/M +maimedness/M +maimed/P +maimer/M +Maimonides/M +Mai/MR +maim/SGZRD +mainbrace/M +Maine/MZR +Mainer/M +mainframe/MS +mainlander/M +mainland/SRMZ +mainliner/M +mainline/RSDZG +mainly +mainmast/SM +main/SA +mainsail/SM +mains/M +mainspring/SM +mainstay/MS +mainstream/DRMSG +maintainability +maintainable/U +maintain/BRDZGS +maintained/U +maintainer/M +maintenance/SM +maintop/SM +maiolica's +Maire/M +Mair/M +Maisey/M +Maisie/M +maisonette/MS +Maison/M +Maitilde/M +maize/MS +Maj +Maje/M +majestic +majestically +majesty/MS +Majesty/MS +majolica/SM +Majorca/M +major/DMGS +majordomo/S +majorette/SM +majority/SM +Major/M +Majuro/M +makable +Makarios/M +makefile/S +makeover/S +Maker/M +maker/SM +makeshift/S +make/UGSA +makeup/MS +making/SM +Malabar/M +Malabo/M +Malacca/M +Malachi/M +malachite/SM +maladapt/DV +maladjust/DLV +maladjustment/MS +maladministration +maladroitness/MS +maladroit/YP +malady/MS +Malagasy/M +malaise/SM +Mala/M +Malamud/M +malamute/SM +Malanie/M +malaprop +malapropism/SM +Malaprop/M +malarial +malaria/MS +malarious +malarkey/SM +malathion/S +Malawian/S +Malawi/M +Malayalam/M +Malaya/M +Malayan/MS +Malaysia/M +Malaysian/S +Malay/SM +Malchy/M +Malcolm/M +malcontentedness/M +malcontented/PY +malcontent/SMD +Maldive/SM +Maldivian/S +Maldonado/M +maledict +malediction/MS +malefaction/MS +malefactor/MS +malefic +maleficence/MS +maleficent +Male/M +Malena/M +maleness/MS +male/PSM +malevolence/S +malevolencies +malevolent/Y +malfeasance/SM +malfeasant +malformation/MS +malformed +malfunction/SDG +Malia/M +Malian/S +Malibu/M +malice/MGSD +maliciousness/MS +malicious/YU +malignancy/SM +malignant/YS +malign/GSRDYZ +malignity/MS +Mali/M +Malina/M +Malinda/M +Malinde/M +malingerer/M +malinger/GZRDS +Malinowski/M +Malissa/M +Malissia/M +mallard/SM +Mallarmé/M +malleability/SM +malleableness/M +malleable/P +mallet/MS +Mallissa/M +Mallorie/M +Mallory/M +mallow/MS +mall/SGMD +Mal/M +malnourished +malnutrition/SM +malocclusion/MS +malodorous +Malone/M +Malorie/M +Malory/M +malposed +malpractice/SM +Malraux/M +Malta/M +malted/S +Maltese +Malthusian/S +Malthus/M +malting/M +maltose/SM +maltreat/GDSL +maltreatment/S +malt/SGMD +malty/RT +Malva/M +Malvina/M +Malvin/M +Malynda/M +mama/SM +mamba/SM +mambo/GSDM +Mame/M +Mamet/M +ma/MH +Mamie/M +mammalian/SM +mammal/SM +mammary +mamma's +mammogram/S +mammography/S +Mammon's +mammon/SM +mammoth/M +mammoths +mammy/SM +Mamore/M +manacle/SDMG +manageability/S +manageableness +manageable/U +managed/U +management/SM +manageress/M +managerial/Y +manager/M +managership/M +manage/ZLGRSD +Managua/M +Manama/M +mańana/M +mananas +Manasseh/M +manatee/SM +Manaus's +Manchester/M +Manchu/MS +Manchuria/M +Manchurian/S +Mancini/M +manciple/M +Mancunian/MS +mandala/SM +Mandalay/M +Manda/M +mandamus/GMSD +Mandarin +mandarin/MS +mandate/SDMG +mandatory/S +Mandela +Mandelbrot/M +Mandel/M +mandible/MS +mandibular +Mandie/M +Mandi/M +Mandingo/M +mandolin/MS +mandrake/MS +mandrel/SM +mandrill/SM +Mandy/M +mančge/GSD +mane/MDS +Manet/M +maneuverability/MS +maneuverer/M +maneuver/MRDSGB +Manfred/M +manful/Y +manganese/MS +mange/GMSRDZ +manger/M +manginess/S +mangler/M +mangle/RSDG +mangoes +mango/M +mangrove/MS +mangy/PRT +manhandle/GSD +Manhattan/SM +manhole/MS +manhood/MS +manhunt/SM +maniacal/Y +maniac/SM +mania/SM +manically +Manichean/M +manic/S +manicure/MGSD +manicurist/SM +manifestation/SM +manifesto/GSDM +manifest/YDPGS +manifolder/M +manifold/GPYRDMS +manifoldness/M +manikin/MS +Manila/MS +manila/S +manilla's +Mani/M +manioc/SM +manipulability +manipulable +manipulate/SDXBVGN +manipulative/PM +manipulator/MS +manipulatory +Manitoba/M +Manitoulin/M +Manitowoc/M +mankind/M +Mankowski/M +Manley/M +manlike +manliness/SM +manliness's/U +manly/URPT +manna/MS +manned/U +mannequin/MS +mannered/U +mannerism/SM +mannerist/M +mannerliness/MU +mannerly/UP +manner/SDYM +Mann/GM +Mannheim/M +Mannie/M +mannikin's +Manning/M +manning/U +mannishness/SM +mannish/YP +Manny/M +Manolo/M +Mano/M +manometer/SM +Manon/M +manorial +manor/MS +manpower/SM +manqué/M +man's +mansard/SM +manservant/M +manse/XNM +Mansfield/M +mansion/M +manslaughter/SM +Man/SM +Manson/M +mans/S +manta/MS +Mantegna/M +mantelpiece/MS +mantel/SM +mantes +mantilla/MS +mantissa/SM +mantis/SM +mantle/ESDG +Mantle/M +mantle's +mantling/M +mantra/MS +mantrap/SM +manual/SMY +Manuela/M +Manuel/M +manufacture/JZGDSR +manufacturer/M +manumission/MS +manumit/S +manumitted +manumitting +manure/RSDMZG +manuscript/MS +man/USY +Manville/M +Manx +many +Manya/M +Maoism/MS +Maoist/S +Mao/M +Maori/SM +Maplecrest/M +maple/MS +mapmaker/S +mappable +mapped/UA +mapper/S +mapping/MS +Mapplethorpe/M +maps/AU +map/SM +Maputo/M +Marabel/M +marabou/MS +marabout's +Maracaibo/M +maraca/MS +Mara/M +maraschino/SM +Marathi +marathoner/M +Marathon/M +marathon/MRSZ +Marat/M +marauder/M +maraud/ZGRDS +marbleize/GSD +marble/JRSDMG +marbler/M +marbling/M +Marceau/M +Marcela/M +Marcelia/M +Marcelino/M +Marcella/M +Marcelle/M +Marcellina/M +Marcelline/M +Marcello/M +Marcellus/M +Marcel/M +Marcelo/M +Marchall/M +Marchelle/M +marcher/M +marchioness/SM +March/MS +march/RSDZG +Marcia/M +Marciano/M +Marcie/M +Marcile/M +Marcille/M +Marci/M +Marc/M +Marconi/M +Marco/SM +Marcotte/M +Marcus/M +Marcy/M +Mardi/SM +Marduk/M +Mareah/M +mare/MS +Marena/M +Maren/M +Maressa/M +Margalit/M +Margalo/M +Marga/M +Margareta/M +Margarete/M +Margaretha/M +Margarethe/M +Margaret/M +Margaretta/M +Margarette/M +margarine/MS +Margarita/M +margarita/SM +Margarito/M +Margaux/M +Margeaux/M +Marge/M +Margery/M +Marget/M +Margette/M +Margie/M +Margi/M +marginalia +marginality +marginalization +marginalize/SDG +marginal/YS +margin/GSDM +Margit/M +Margo/M +Margot/M +Margrethe/M +Margret/M +Marguerite/M +Margy/M +mariachi/SM +maria/M +Maria/M +Mariam/M +Mariana/SM +Marian/MS +Marianna/M +Marianne/M +Mariann/M +Mariano/M +Maribelle/M +Maribel/M +Maribeth/M +Maricela/M +Marice/M +Maridel/M +Marieann/M +Mariejeanne/M +Mariele/M +Marielle/M +Mariellen/M +Mariel/M +Marie/M +Marietta/M +Mariette/M +Marigold/M +marigold/MS +Marijn/M +Marijo/M +marijuana/SM +Marika/M +Marilee/M +Marilin/M +Marillin/M +Marilyn/M +marimba/SM +Mari/MS +marinade/MGDS +Marina/M +marina/MS +marinara/SM +marinate/NGXDS +marination/M +mariner/M +Marine/S +marine/ZRS +Marin/M +Marinna/M +Marino/M +Mario/M +marionette/MS +Marion/M +Mariquilla/M +Marisa/M +Mariska/M +Marisol/M +Marissa/M +Maritain/M +marital/Y +Marita/M +maritime/R +Maritsa/M +Maritza/M +Mariupol/M +Marius/M +Mariya/M +Marja/M +Marje/M +Marjie/M +Marji/M +Marj/M +marjoram/SM +Marjorie/M +Marjory/M +Marjy/M +Markab/M +markdown/SM +marked/AU +markedly +marker/M +marketability/SM +marketable/U +Marketa/M +marketeer/S +marketer/M +market/GSMRDJBZ +marketing/M +marketplace/MS +mark/GZRDMBSJ +Markham/M +marking/M +Markism/M +markkaa +markka/M +Mark/MS +Markos +Markov +Markovian +Markovitz/M +marks/A +marksman/M +marksmanship/S +marksmen +markup/SM +Markus/M +Marla/M +Marlane/M +Marlboro/M +Marlborough/M +Marleah/M +Marlee/M +Marleen/M +Marlena/M +Marlene/M +Marley/M +Marlie/M +Marline/M +marlinespike/SM +Marlin/M +marlin/SM +marl/MDSG +Marlo/M +Marlon/M +Marlowe/M +Marlow/M +Marlyn/M +Marmaduke/M +marmalade/MS +Marmara/M +marmoreal +marmoset/MS +marmot/SM +Marna/M +Marne/M +Marney/M +Marnia/M +Marnie/M +Marni/M +maroon/GRDS +marquee/MS +Marquesas/M +marque/SM +marquess/MS +marquetry/SM +Marquette/M +Marquez/M +marquise/M +marquisette/MS +Marquis/M +marquis/SM +Marquita/M +Marrakesh/M +marred/U +marriageability/SM +marriageable +marriage/ASM +married/US +Marrilee/M +marring +Marriott/M +Marris/M +Marrissa/M +marrowbone/MS +marrow/GDMS +marry/SDGA +mar/S +Marseillaise/SM +Marseilles +Marseille's +marshal/GMDRSZ +Marshalled/M +marshaller +Marshall/GDM +Marshalling/M +marshallings +Marshal/M +Marsha/M +marshiness/M +marshland/MS +Marsh/M +marshmallow/SM +marsh/MS +marshy/PRT +Marsiella/M +Mar/SMN +marsupial/MS +Martainn/M +Marta/M +Martelle/M +Martel/M +marten/M +Marten/M +Martguerita/M +Martha/M +Marthe/M +Marthena/M +Martial +martial/Y +Martian/S +Martica/M +Martie/M +Marti/M +Martina/M +martinet/SM +Martinez/M +martingale/MS +martini/MS +Martinique/M +Martin/M +Martino/M +martin/SM +Martinson/M +Martita/M +mart/MDNGXS +Mart/MN +Marty/M +Martyn/M +Martynne/M +martyrdom/SM +martyr/GDMS +Marva/M +marvel/DGS +Marvell/M +marvelous/PY +Marve/M +Marven/M +Marvin/M +Marv/NM +Marwin/M +Marxian/S +Marxism/SM +Marxist/SM +Marx/M +Marya/M +Maryanna/M +Maryanne/M +Maryann/M +Marybelle/M +Marybeth/M +Maryellen/M +Maryjane/M +Maryjo/M +Maryland/MZR +Marylee/M +Marylinda/M +Marylin/M +Maryl/M +Marylou/M +Marylynne/M +Mary/M +Maryrose/M +Marys +Marysa/M +marzipan/SM +Masada/M +Masai/M +Masaryk/M +masc +Mascagni/M +mascara/SGMD +mascot/SM +masculineness/M +masculine/PYS +masculinity/SM +Masefield/M +maser/M +Maseru/M +MASH +Masha/M +Mashhad/M +mash/JGZMSRD +m/ASK +masked/U +masker/M +mask/GZSRDMJ +masks/U +masochism/MS +masochistic +masochistically +masochist/MS +masonic +Masonic +Masonite/M +masonry/MS +mason/SDMG +Mason/SM +masquerader/M +masquerade/RSDGMZ +masquer/M +masque/RSMZ +Massachusetts/M +massacre/DRSMG +massager/M +massage/SRDMG +Massasoit/M +Massenet/M +masseur/MS +masseuse/SM +Massey/M +massif/SM +Massimiliano/M +Massimo/M +massing/R +massiveness/SM +massive/YP +massless +mas/SRZ +Mass/S +mass/VGSD +mastectomy/MS +masterclass +mastered/A +masterfulness/M +masterful/YP +master/JGDYM +masterliness/M +masterly/P +mastermind/GDS +masterpiece/MS +mastership/M +Master/SM +masterstroke/MS +masterwork/S +mastery/MS +mast/GZSMRD +masthead/SDMG +masticate/SDXGN +mastication/M +mastic/SM +mastiff/MS +mastodon/MS +mastoid/S +masturbate/SDNGX +masturbation/M +masturbatory +matador/SM +Mata/M +matchable/U +match/BMRSDZGJ +matchbook/SM +matchbox/SM +matched/UA +matcher/M +matches/A +matchless/Y +matchlock/MS +matchmake/GZJR +matchmaker/M +matchmaking/M +matchplay +match's/A +matchstick/MS +matchwood/SM +mated/U +mate/IMS +Matelda/M +Mateo/M +materialism/SM +materialistic +materialistically +materialist/SM +materiality/M +materialization/SM +materialize/CDS +materialized/A +materializer/SM +materializes/A +materializing +materialness/M +material/SPYM +matériel/MS +mater/M +maternal/Y +maternity/MS +mates/U +mathematical/Y +Mathematica/M +mathematician/SM +mathematic/S +mathematics/M +Mathematik/M +Mather/M +Mathe/RM +Mathew/MS +Mathewson/M +Mathian/M +Mathias +Mathieu/M +Mathilda/M +Mathilde/M +Mathis +math/M +maths +Matias/M +Matilda/M +Matilde/M +matinée/S +mating/M +matins/M +Matisse/SM +matriarchal +matriarch/M +matriarchs +matriarchy/MS +matrices +matricidal +matricide/MS +matriculate/XSDGN +matriculation/M +matrimonial/Y +matrimony/SM +matrix/M +matron/YMS +mat/SJGMDR +Matsumoto/M +matte/JGMZSRD +Mattel/M +Matteo/M +matter/GDM +Matterhorn/M +Matthaeus/M +Mattheus/M +Matthew/MS +Matthias +Matthieu/M +Matthiew/M +Matthus/M +Mattias/M +Mattie/M +Matti/M +matting/M +mattins's +Matt/M +mattock/MS +mattress/MS +matt's +Matty/M +maturate/DSNGVX +maturational +maturation/M +matureness/M +maturer/M +mature/RSDTPYG +maturity/MS +matzo/SHM +matzot +Maude/M +Maudie/M +maudlin/Y +Maud/M +Maugham/M +Maui/M +mauler/M +maul/RDGZS +maunder/GDS +Maupassant/M +Maura/M +Maureene/M +Maureen/M +Maure/M +Maurene/M +Mauriac/M +Maurice/M +Mauricio/M +Maurie/M +Maurine/M +Maurise/M +Maurita/M +Mauritania/M +Mauritanian/S +Mauritian/S +Mauritius/M +Maurits/M +Maurizia/M +Maurizio/M +Maurois/M +Mauro/M +Maury/M +Mauser/M +mausoleum/SM +mauve/SM +maven/S +maverick/SMDG +mavin's +Mavis/M +Mavra/M +mawkishness/SM +mawkish/PY +Mawr/M +maw/SGMD +max/GDS +Maxie/M +maxillae +maxilla/M +maxillary/S +Maxi/M +maximality +maximal/SY +maxima's +Maximilian/M +Maximilianus/M +Maximilien/M +maximization/SM +maximizer/M +maximize/RSDZG +Maxim/M +Maximo/M +maxim/SM +maximum/MYS +Maxine/M +maxi/S +Max/M +Maxtor/M +Maxwellian +maxwell/M +Maxwell/M +Maxy/M +Maya/MS +Mayan/S +Maybelle/M +maybe/S +mayday/S +may/EGS +Maye/M +mayer +Mayer/M +mayest +Mayfair/M +Mayflower/M +mayflower/SM +mayfly/MS +mayhap +mayhem/MS +Maynard/M +Mayne/M +Maynord/M +mayn't +Mayo/M +mayonnaise/MS +mayoral +mayoralty/MS +mayoress/MS +Mayor/M +mayor/MS +mayorship/M +mayo/S +maypole/MS +Maypole/SM +Mayra/M +May/SMR +mayst +Mazama/M +Mazarin/M +Mazatlan/M +Mazda/M +mazedness/SM +mazed/YP +maze/MGDSR +mazurka/SM +Mazzini/M +Mb +MB +MBA +Mbabane/M +Mbini/M +MC +McAdam/MS +McAllister/M +McBride/M +McCabe/M +McCain/M +McCall/M +McCarthyism/M +McCarthy/M +McCartney/M +McCarty/M +McCauley/M +McClain/M +McClellan/M +McClure/M +McCluskey/M +McConnell/M +McCormick/M +McCoy/SM +McCracken/M +McCray/M +McCullough/M +McDaniel/M +McDermott/M +McDonald/M +McDonnell/M +McDougall/M +McDowell/M +McElhaney/M +McEnroe/M +McFadden/M +McFarland/M +McGee/M +McGill/M +McGovern/M +McGowan/M +McGrath/M +McGraw/M +McGregor/M +McGuffey/M +McGuire/M +MCI/M +McIntosh/M +McIntyre/M +McKay/M +McKee/M +McKenzie/M +McKesson/M +McKinley/M +McKinney/M +McKnight/M +McLanahan/M +McLaughlin/M +McLean/M +McLeod/M +McLuhan/M +McMahon/M +McMartin/M +McMillan/M +McNamara/M +McNaughton/M +McNeil/M +McPherson/M +MD +Md/M +mdse +MDT +ME +Meade/M +Mead/M +meadowland +meadowlark/SM +meadow/MS +Meadows +meadowsweet/M +mead/SM +Meagan/M +meagerness/SM +meager/PY +Meaghan/M +meagres +mealiness/MS +meal/MDGS +mealtime/MS +mealybug/S +mealymouthed +mealy/PRST +meander/JDSG +meaneing +meanie/MS +meaningfulness/SM +meaningful/YP +meaninglessness/SM +meaningless/PY +meaning/M +meanness/S +means/M +meantime/SM +meant/U +meanwhile/S +Meany/M +mean/YRGJTPS +meany's +Meara/M +measle/SD +measles/M +measly/TR +measurable/U +measurably +measure/BLMGRSD +measured/Y +measureless +measurement/SM +measurer/M +measures/A +measuring/A +meas/Y +meataxe +meatball/MS +meatiness/MS +meatless +meatloaf +meatloaves +meat/MS +meatpacking/S +meaty/RPT +Mecca/MS +mecca/S +mechanical/YS +mechanic/MS +mechanism/SM +mechanistic +mechanistically +mechanist/M +mechanization/SM +mechanized/U +mechanizer/M +mechanize/RSDZGB +mechanizes/U +mechanochemically +Mechelle/M +med +medalist/MS +medallion/MS +medal/SGMD +Medan/M +meddle/GRSDZ +meddlesome +Medea/M +Medellin +Medfield/M +mediaeval's +medial/AY +medials +median/YMS +media/SM +mediateness/M +mediate/PSDYVNGX +mediation/ASM +mediator/SM +Medicaid/SM +medical/YS +medicament/MS +Medicare/MS +medicate/DSXNGV +medication/M +Medici/MS +medicinal/SY +medicine/DSMG +medico/SM +medic/SM +medievalist/MS +medieval/YMS +Medina/M +mediocre +mediocrity/MS +meditate/NGVXDS +meditation/M +meditativeness/M +meditative/PY +Mediterranean/MS +mediumistic +medium/SM +medley/SM +medulla/SM +Medusa/M +meed/MS +meekness/MS +meek/TPYR +meerschaum/MS +meeter/M +meetinghouse/S +meeting/M +meet/JGSYR +me/G +mega +megabit/MS +megabuck/S +megabyte/S +megacycle/MS +megadeath/M +megadeaths +megahertz/M +megalithic +megalith/M +megaliths +megalomaniac/SM +megalomania/SM +megalopolis/SM +Megan/M +megaphone/SDGM +megaton/MS +megavolt/M +megawatt/SM +megaword/S +Megen/M +Meggie/M +Meggi/M +Meggy/M +Meghan/M +Meghann/M +Meg/MN +megohm/MS +Mehetabel/M +Meier/M +Meighen/M +Meiji/M +Mei/MR +meioses +meiosis/M +meiotic +Meir/M +Meister/M +Meistersinger/M +Mejia/M +Mekong/M +Mela/M +Melamie/M +melamine/SM +melancholia/SM +melancholic/S +melancholy/MS +Melanesia/M +Melanesian/S +melange/S +Melania/M +Melanie/M +melanin/MS +melanoma/SM +Melantha/M +Melany/M +Melba/M +Melbourne/M +Melcher/M +Melchior/M +meld/SGD +męlée/MS +Melendez/M +Melesa/M +Melessa/M +Melicent/M +Melina/M +Melinda/M +Melinde/M +meliorate/XSDVNG +melioration/M +Melisa/M +Melisande/M +Melisandra/M +Melisenda/M +Melisent/M +Melissa/M +Melisse/M +Melita/M +Melitta/M +Mella/M +Mellicent/M +Mellie/M +mellifluousness/SM +mellifluous/YP +Melli/M +Mellisa/M +Mellisent/M +Melloney/M +Mellon/M +mellowness/MS +mellow/TGRDYPS +Melly/M +Mel/MY +Melodee/M +melodically +melodic/S +Melodie/M +melodiousness/S +melodious/YP +melodrama/SM +melodramatically +melodramatic/S +Melody/M +melody/MS +Melonie/M +melon/MS +Melony/M +Melosa/M +Melpomene/M +meltdown/S +melter/M +melting/Y +Melton/M +melt/SAGD +Melva/M +Melville/M +Melvin/M +Melvyn/M +Me/M +member/DMS +membered/AE +members/EA +membership/SM +membrane/MSD +membranous +memento/SM +Memling/M +memoir/MS +memorabilia +memorability/SM +memorableness/M +memorable/P +memorably +memorandum/SM +memorialize/DSG +memorialized/U +memorial/SY +memoriam +memorization/MS +memorized/U +memorizer/M +memorize/RSDZG +memorizes/A +memoryless +memory/MS +memo/SM +Memphis/M +menace/GSD +menacing/Y +menagerie/SM +menage/S +Menander/M +menarche/MS +Menard/M +Mencius/M +Mencken/M +mendaciousness/M +mendacious/PY +mendacity/MS +Mendeleev/M +mendelevium/SM +Mendelian +Mendel/M +Mendelssohn/M +mender/M +Mendez/M +mendicancy/MS +mendicant/S +Mendie/M +mending/M +Mendocino/M +Mendoza/M +mend/RDSJGZ +Mendy/M +Menelaus/M +Menes/M +menfolk/S +menhaden/M +menial/YS +meningeal +meninges +meningitides +meningitis/M +meninx +menisci +meniscus/M +Menkalinan/M +Menkar/M +Menkent/M +Menlo/M +men/MS +Mennonite/SM +Menominee +menopausal +menopause/SM +menorah/M +menorahs +Menotti/M +Mensa/M +Mensch/M +mensch/S +menservants/M +mens/SDG +menstrual +menstruate/NGDSX +menstruation/M +mensurable/P +mensuration/MS +menswear/M +mentalist/MS +mentality/MS +mental/Y +mentholated +menthol/SM +mentionable/U +mentioned/U +mentioner/M +mention/ZGBRDS +mentor/DMSG +Menuhin/M +menu/SM +Menzies/M +meow/DSG +Mephistopheles/M +Merak/M +Mercado/M +mercantile +Mercator/M +Mercedes +mercenariness/M +mercenary/SMP +mercerize/SDG +Mercer/M +mercer/SM +merchandiser/M +merchandise/SRDJMZG +merchantability +merchantman/M +merchantmen +merchant/SBDMG +Mercie/M +mercifully/U +mercifulness/M +merciful/YP +mercilessness/SM +merciless/YP +Merci/M +Merck/M +mercurial/SPY +mercuric +Mercurochrome/M +mercury/MS +Mercury/MS +Mercy/M +mercy/SM +Meredeth/M +Meredithe/M +Meredith/M +Merell/M +meretriciousness/SM +meretricious/YP +mere/YS +merganser/MS +merger/M +merge/SRDGZ +Meridel/M +meridian/MS +meridional +Meridith/M +Meriel/M +Merilee/M +Merill/M +Merilyn/M +meringue/MS +merino/MS +Meris +Merissa/M +merited/U +meritocracy/MS +meritocratic +meritocrats +meritoriousness/MS +meritorious/PY +merit/SCGMD +Meriwether/M +Merla/M +Merle/M +Merlina/M +Merline/M +merlin/M +Merlin/M +Merl/M +mermaid/MS +merman/M +mermen +Merna/M +Merola/M +meromorphic +Merralee/M +Merrel/M +Merriam/M +Merrick/M +Merridie/M +Merrielle/M +Merrie/M +Merrilee/M +Merrile/M +Merrili/M +Merrill/M +merrily +Merrily/M +Merrimack/M +Merrimac/M +merriment/MS +merriness/S +Merritt/M +Merry/M +merrymaker/MS +merrymaking/SM +merry/RPT +Mersey/M +mer/TGDR +Merton/M +Mervin/M +Merv/M +Merwin/M +Merwyn/M +Meryl/M +Mesa +Mesabi/M +mesa/SM +mescaline/SM +mescal/SM +mesdames/M +mesdemoiselles/M +Meshed's +meshed/U +mesh/GMSD +mesmeric +mesmerism/SM +mesmerized/U +mesmerizer/M +mesmerize/SRDZG +Mesolithic/M +mesomorph/M +mesomorphs +meson/MS +Mesopotamia/M +Mesopotamian/S +mesosphere/MS +mesozoic +Mesozoic +mesquite/MS +mes/S +message/SDMG +messeigneurs +messenger/GSMD +Messerschmidt/M +mess/GSDM +Messiaen/M +messiah +Messiah/M +messiahs +Messiahs +messianic +Messianic +messieurs/M +messily +messiness/MS +messmate/MS +Messrs/M +messy/PRT +mestizo/MS +meta +metabolic +metabolically +metabolism/MS +metabolite/SM +metabolize/GSD +metacarpal/S +metacarpi +metacarpus/M +metacircular +metacircularity +metalanguage/MS +metalization/SM +metalized +metallic/S +metalliferous +metallings +metallography/M +metalloid/M +metallurgic +metallurgical/Y +metallurgist/S +metallurgy/MS +metal/SGMD +metalsmith/MS +metalworking/M +metalwork/RMJGSZ +Meta/M +metamathematical +metamorphic +metamorphism/SM +metamorphose/GDS +metamorphosis/M +metaphoric +metaphorical/Y +metaphor/MS +metaphosphate/M +metaphysical/Y +metaphysic/SM +metastability/M +metastable +metastases +metastasis/M +metastasize/DSG +metastatic +metatarsal/S +metatarsi +metatarsus/M +metatheses +metathesis/M +metathesized +metathesizes +metathesizing +metavariable +metempsychoses +metempsychosis/M +meteoric +meteorically +meteorite/SM +meteoritic/S +meteoritics/M +meteoroid/SM +meteorologic +meteorological +meteorologist/S +meteorology/MS +meteor/SM +meter/GDM +mete/ZDGSR +methadone/SM +methane/MS +methanol/SM +methinks +methionine/M +methodicalness/SM +methodical/YP +methodism +Methodism/SM +methodist/MS +Methodist/MS +method/MS +methodological/Y +methodologists +methodology/MS +methought +Methuen/M +Methuselah/M +Methuselahs +methylated +methylene/M +methyl/SM +meticulousness/MS +meticulous/YP +métier/S +metonymy/M +Metrecal/M +metrical/Y +metricate/SDNGX +metricize/GSD +metrics/M +metric/SM +metronome/MS +metropolis/SM +metropolitanization +metropolitan/S +metro/SM +mets +Metternich/M +mettle/SDM +mettlesome +met/U +Metzler/M +Meuse/M +mewl/GSD +mew/SGD +mews/SM +Mex +Mexicali/M +Mexican/S +Mexico/M +Meyerbeer/M +Meyer/SM +mezzanine/MS +mezzo/S +MFA +mfg +mfr/S +mg +M/GB +Mg/M +MGM/M +mgr +Mgr +MHz +MI +MIA +Mia/M +Miami/SM +Miaplacidus/M +miasmal +miasma/SM +Micaela/M +Micah/M +mica/MS +micelles +mice/M +Michaela/M +Michaelangelo/M +Michaelina/M +Michaeline/M +Michaella/M +Michaelmas/MS +Michael/SM +Michaelson/M +Michail/M +Michale/M +Michal/M +Micheal/M +Micheil/M +Michelangelo/M +Michele/M +Michelina/M +Micheline/M +Michelin/M +Michelle/M +Michell/M +Michel/M +Michelson/M +Michigander/S +Michiganite/S +Michigan/M +Mich/M +Mickelson/M +Mickey/M +mickey/SM +Mickie/M +Micki/M +Mick/M +Micky/M +Mic/M +Micmac/M +micra's +microamp +microanalysis/M +microanalytic +microbe/MS +microbial +microbicidal +microbicide/M +microbiological +microbiologist/MS +microbiology/SM +microbrewery/S +microchemistry/M +microchip/S +microcircuit/MS +microcode/GSD +microcomputer/MS +microcosmic +microcosm/MS +microdensitometer +microdot/MS +microeconomic/S +microeconomics/M +microelectronic/S +microelectronics/M +microfiber/S +microfiche/M +microfilm/DRMSG +microfossils +micrography/M +microgroove/MS +microhydrodynamics +microinstruction/SM +microjoule +microlevel +microlight/S +micromanage/GDSL +micromanagement/S +micrometeorite/MS +micrometeoritic +micrometer/SM +Micronesia/M +Micronesian/S +micron/MS +microorganism/SM +microphone/SGM +Microport/M +microprocessing +microprocessor/SM +microprogrammed +microprogramming +microprogram/SM +micro/S +microscope/SM +microscopic +microscopical/Y +microscopy/MS +microsecond/MS +microsimulation/S +Microsystems +micros/M +Microsoft/M +microsomal +microstore +microsurgery/SM +MicroVAXes +MicroVAX/M +microvolt/SM +microwaveable +microwave/BMGSD +microword/S +midair/MS +midas +Midas/M +midband/M +midday/MS +midden/SM +middest +middlebrow/SM +Middlebury/M +middle/GJRSD +middleman/M +middlemen +middlemost +Middlesex/M +Middleton/M +Middletown/M +middleweight/SM +middling/Y +middy/SM +Mideastern +Mideast/M +midfield/RM +Midge/M +midge/SM +midget/MS +midi/S +midland/MRS +Midland/MS +midlife +midlives +midmorn/G +midmost/S +midnight/SYM +midpoint/MS +midrange +midrib/MS +midriff/MS +mid/S +midscale +midsection/M +midshipman/M +midshipmen +midship/S +midspan +midstream/MS +midst/SM +midsummer/MS +midterm/MS +midtown/MS +Midway/M +midway/S +midweek/SYM +Midwesterner/M +Midwestern/ZR +Midwest/M +midwicket +midwifery/SM +midwife/SDMG +midwinter/YMS +midwives +midyear/MS +mien/M +miff/GDS +mightily +mightiness/MS +mightn't +might/S +mighty/TPR +mignon +mignonette/SM +Mignon/M +Mignonne/M +migraine/SM +migrant/MS +migrate/ASDG +migration/MS +migrative +migratory/S +MIG/S +Miguela/M +Miguelita/M +Miguel/M +mikado/MS +Mikaela/M +Mikael/M +mike/DSMG +Mikel/M +Mike/M +Mikey/M +Mikhail/M +Mikkel/M +Mikol/M +Mikoyan/M +milady/MS +Milagros/M +Milanese +Milan/M +milch/M +mildew/DMGS +mildness/MS +Mildred/M +Mildrid/M +mild/STYRNP +mileage/SM +Milena/M +milepost/SM +miler/M +mile/SM +Mile/SM +milestone/MS +Milford/M +Milicent/M +milieu/SM +Milissent/M +militancy/MS +militantness/M +militant/YPS +militarily +militarism/SM +militaristic +militarist/MS +militarization/SCM +militarize/SDCG +military +militate/SDG +militiaman/M +militiamen +militia/SM +Milka/M +Milken/M +milker/M +milk/GZSRDM +milkiness/MS +milkmaid/SM +milkman/M +milkmen +milkshake/S +milksop/SM +milkweed/MS +milky/RPT +millage/S +Millard/M +Millay/M +millenarian +millenarianism/M +millennial +millennialism +millennium/MS +millepede's +miller/M +Miller/M +Millet/M +millet/MS +milliamp +milliampere/S +milliard/MS +millibar/MS +Millicent/M +millidegree/S +Millie/M +milligram/MS +millijoule/S +Millikan/M +milliliter/MS +Milli/M +millimeter/SM +milliner/SM +millinery/MS +milling/M +millionaire/MS +million/HDMS +millionth/M +millionths +millipede/SM +millisecond/MS +Millisent/M +millivoltmeter/SM +millivolt/SM +milliwatt/S +millpond/MS +millrace/SM +mill/SGZMRD +Mill/SMR +millstone/SM +millstream/SM +millwright/MS +Milly/M +mil/MRSZ +Mil/MY +Milne/M +Milo/M +Milquetoast/S +milquetoast/SM +Miltiades/M +Miltie/M +Milt/M +milt/MDSG +Miltonic +Milton/M +Miltown/M +Milty/M +Milwaukee/M +Milzie/M +MIMD +mime/DSRMG +mimeograph/GMDS +mimeographs +mimer/M +mimesis/M +mimetic +mimetically +mimicked +mimicker/SM +mimicking +mimicry/MS +mimic/S +Mimi/M +mi/MNX +Mimosa/M +mimosa/SM +Mina/M +minaret/MS +minatory +mincemeat/MS +mincer/M +mince/SRDGZJ +mincing/Y +Minda/M +Mindanao/M +mind/ARDSZG +mindbogglingly +minded/P +minder/M +mindfully +mindfulness/MS +mindful/U +mindlessness/SM +mindless/YP +Mindoro/M +min/DRZGJ +mind's +mindset/S +Mindy/M +minefield/MS +mineralization/C +mineralized/U +mineralogical +mineralogist/SM +mineralogy/MS +mineral/SM +miner/M +Miner/M +Minerva/M +mineshaft +mine/SNX +minestrone/MS +minesweeper/MS +Minetta/M +Minette/M +mineworkers +mingle/SDG +Ming/M +Mingus/M +miniature/GMSD +miniaturist/SM +miniaturization/MS +miniaturize/SDG +minibike/S +minibus/SM +minicab/M +minicam/MS +minicomputer/SM +minidress/SM +minify/GSD +minimalism/S +minimalistic +minimalist/MS +minimality +minimal/SY +minima's +minimax/M +minimization/MS +minimized/U +minimizer/M +minimize/RSDZG +minim/SM +minimum/MS +mining/M +minion/M +mini/S +miniseries +miniskirt/MS +ministerial/Y +minister/MDGS +ministrant/S +ministration/SM +ministry/MS +minivan/S +miniver/M +minke +mink/SM +Min/MR +Minna/M +Minnaminnie/M +Minneapolis/M +Minne/M +minnesinger/MS +Minnesota/M +Minnesotan/S +Minnie/M +Minni/M +Minn/M +Minnnie/M +minnow/SM +Minny/M +Minoan/S +Minolta/M +minor/DMSG +minority/MS +Minor/M +Minos +Minotaur/M +minotaur/S +Minot/M +minoxidil/S +Minsk/M +Minsky/M +minster/SM +minstrel/SM +minstrelsy/MS +mintage/SM +Mintaka/M +Minta/M +minter/M +mint/GZSMRD +minty/RT +minuend/SM +minuet/SM +Minuit/M +minuscule/SM +minus/S +minuteman +Minuteman/M +minutemen +minuteness/SM +minute/RSDPMTYG +minutiae +minutia/M +minx/MS +Miocene +MIPS +Miquela/M +Mirabeau/M +Mirabella/M +Mirabelle/M +Mirabel/M +Mirach/M +miracle/MS +miraculousness/M +miraculous/PY +mirage/GSDM +Mira/M +Miranda/M +Miran/M +Mireielle/M +Mireille/M +Mirella/M +Mirelle/M +mire/MGDS +Mirfak/M +Miriam/M +Mirilla/M +Mir/M +Mirna/M +Miro +mirror/DMGS +mirthfulness/SM +mirthful/PY +mirthlessness/M +mirthless/YP +mirth/M +mirths +MIRV/DSG +miry/RT +Mirzam/M +misaddress/SDG +misadventure/SM +misalign/DSGL +misalignment/MS +misalliance/MS +misanalysed +misanthrope/MS +misanthropic +misanthropically +misanthropist/S +misanthropy/SM +misapplier/M +misapply/GNXRSD +misapprehend/GDS +misapprehension/MS +misappropriate/GNXSD +misbegotten +misbehaver/M +misbehave/RSDG +misbehavior/SM +misbrand/DSG +misc +miscalculate/XGNSD +miscalculation/M +miscall/SDG +miscarriage/MS +miscarry/SDG +miscast/GS +miscegenation/SM +miscellanea +miscellaneous/PY +miscellany/MS +Mischa/M +mischance/MGSD +mischief/MDGS +mischievousness/MS +mischievous/PY +miscibility/S +miscible/C +misclassification/M +misclassified +misclassifying +miscode/SDG +miscommunicate/NDS +miscomprehended +misconceive/GDS +misconception/MS +misconduct/GSMD +misconfiguration +misconstruction/MS +misconstrue/DSG +miscopying +miscount/DGS +miscreant/MS +miscue/MGSD +misdeal/SG +misdealt +misdeed/MS +misdemeanant/SM +misdemeanor/SM +misdiagnose/GSD +misdid +misdirect/GSD +misdirection/MS +misdirector/S +misdoes +misdo/JG +misdone +miserableness/SM +miserable/SP +miserably +miser/KM +miserliness/MS +miserly/P +misery/MS +mises/KC +misfeasance/MS +misfeature/M +misfield +misfile/SDG +misfire/SDG +misfit/MS +misfitted +misfitting +misfortune/SM +misgauge/GDS +misgiving/MYS +misgovern/LDGS +misgovernment/S +misguidance/SM +misguidedness/M +misguided/PY +misguide/DRSG +misguider/M +Misha/M +mishandle/SDG +mishap/MS +mishapped +mishapping +misheard +mishear/GS +mishitting +mishmash/SM +misidentification/M +misidentify/GNSD +misinformation/SM +misinform/GDS +misinterpretation/MS +misinterpreter/M +misinterpret/RDSZG +misjudge/DSG +misjudging/Y +misjudgment/MS +Miskito +mislabel/DSG +mislaid +mislay/GS +misleader/M +mislead/GRJS +misleading/Y +misled +mismanage/LGSD +mismanagement/MS +mismatch/GSD +misname/GSD +misnomer/GSMD +misogamist/MS +misogamy/MS +misogynistic +misogynist/MS +misogynous +misogyny/MS +misperceive/SD +misplace/GLDS +misplacement/MS +misplay/GSD +mispositioned +misprint/SGDM +misprision/SM +mispronounce/DSG +mispronunciation/MS +misquotation/MS +misquote/GDS +misreader/M +misread/RSGJ +misrelated +misremember/DG +misreport/DGS +misrepresentation/MS +misrepresenter/M +misrepresent/SDRG +misroute/DS +misrule/SDG +missal/ESM +misshape/DSG +misshapenness/SM +misshapen/PY +Missie/M +missile/MS +missilery/SM +mission/AMS +missionary/MS +missioned +missioner/SM +missioning +missis's +Mississauga/M +Mississippian/S +Mississippi/M +missive/MS +Missoula/M +Missourian/S +Missouri/M +misspeak/SG +misspecification +misspecified +misspelling/M +misspell/SGJD +misspend/GS +misspent +misspoke +misspoken +mis/SRZ +miss/SDEGV +Miss/SM +misstate/GLDRS +misstatement/MS +misstater/M +misstep/MS +misstepped +misstepping +missus/SM +Missy/M +mistakable/U +mistake/BMGSR +mistaken/Y +mistaker/M +mistaking/Y +Mistassini/M +mister/GDM +Mister/SM +mistily +Misti/M +mistime/GSD +mistiness/S +mistletoe/MS +mist/MRDGZS +mistook +mistral/MS +mistranslated +mistranslates +mistranslating +mistranslation/SM +mistreat/DGSL +mistreatment/SM +Mistress/MS +mistress/MSY +mistrial/SM +mistruster/M +mistrustful/Y +mistrust/SRDG +Misty/M +mistype/SDGJ +misty/PRT +misunderstander/M +misunderstanding/M +misunderstand/JSRZG +misunderstood +misuser/M +misuse/RSDMG +miswritten +Mitchael/M +Mitchell/M +Mitchel/M +Mitch/M +miterer/M +miter/GRDM +mite/SRMZ +Mitford/M +Mithra/M +Mithridates/M +mitigated/U +mitigate/XNGVDS +mitigation/M +MIT/M +mitoses +mitosis/M +mitotic +MITRE/SM +Mitsubishi/M +mitten/M +Mitterrand/M +mitt/XSMN +Mitty/M +Mitzi/M +mitzvahs +mixable +mix/AGSD +mixed/U +mixer/SM +mixture/SM +Mizar/M +mizzenmast/SM +mizzen/MS +Mk +mks +ml +Mlle/M +mm +MM +MMe +Mme/SM +MN +mnemonically +mnemonics/M +mnemonic/SM +Mnemosyne/M +Mn/M +MO +moan/GSZRDM +moat/SMDG +mobbed +mobber +mobbing +mobcap/SM +Mobile/M +mobile/S +mobility/MS +mobilizable +mobilization/AMCS +mobilize/CGDS +mobilized/U +mobilizer/MS +mobilizes/A +Mobil/M +mob/MS +mobster/MS +Mobutu/M +moccasin/SM +mocha/SM +mockers/M +mockery/MS +mock/GZSRD +mockingbird/MS +mocking/Y +mo/CSK +modality/MS +modal/Y +modeled/A +modeler/M +modeling/M +models/A +model/ZGSJMRD +mode/MS +modem/SM +moderated/U +moderateness/SM +moderate/PNGDSXY +moderation/M +moderator/MS +modernism/MS +modernistic +modernist/S +modernity/SM +modernization/MS +modernized/U +modernizer/M +modernize/SRDGZ +modernizes/U +modernness/SM +modern/PTRYS +Modesta/M +Modestia/M +Modestine/M +Modesto/M +modest/TRY +Modesty/M +modesty/MS +modicum/SM +modifiability/M +modifiableness/M +modifiable/U +modification/M +modified/U +modifier/M +modify/NGZXRSD +Modigliani/M +modishness/MS +modish/YP +mod/TSR +Modula/M +modularity/SM +modularization +modularize/SDG +modular/SY +modulate/ADSNCG +modulation/CMS +modulator/ACSM +module/SM +moduli +modulo +modulus/M +modus +Moe/M +Moen/M +Mogadiscio's +Mogadishu +mogul/MS +Mogul/MS +mohair/SM +Mohamed/M +Mohammad/M +Mohammedanism/MS +Mohammedan/SM +Mohammed's +Mohandas/M +Mohandis/M +Mohawk/MS +Mohegan/S +Mohican's +Moho/M +Mohorovicic/M +Mohr/M +moiety/MS +moil/SGD +Moina/M +Moines/M +Moira/M +moire/MS +Moise/MS +Moiseyev/M +Moishe/M +moistener/M +moisten/ZGRD +moistness/MS +moist/TXPRNY +moisture/MS +moisturize/GZDRS +Mojave/M +molal +molarity/SM +molar/MS +molasses/MS +Moldavia/M +Moldavian/S +moldboard/SM +molder/DG +moldiness/SM +molding/M +mold/MRDJSGZ +Moldova +moldy/PTR +molecularity/SM +molecular/Y +molecule/MS +molehill/SM +mole/MTS +moleskin/MS +molestation/SM +molested/U +molester/M +molest/RDZGS +Moliere +Molina/M +Moline/M +Mollee/M +Mollie/M +mollification/M +mollify/XSDGN +Molli/M +Moll/M +moll/MS +mollusc's +mollusk/S +mollycoddler/M +mollycoddle/SRDG +Molly/M +molly/SM +Molnar/M +Moloch/M +Molokai/M +Molotov/M +molter/M +molt/RDNGZS +Moluccas +molybdenite/M +molybdenum/MS +Mombasa/M +momenta +momentarily +momentariness/SM +momentary/P +moment/MYS +momentousness/MS +momentous/YP +momentum/SM +momma/S +Mommy/M +mommy/SM +Mo/MN +mom/SM +Monaco/M +monadic +monad/SM +Monah/M +Mona/M +monarchic +monarchical +monarchism/MS +monarchistic +monarchist/MS +monarch/M +monarchs +monarchy/MS +Monash/M +monastery/MS +monastical/Y +monasticism/MS +monastic/S +monaural/Y +Mondale/M +Monday/MS +Mondrian/M +Monegasque/SM +Monera/M +monetarily +monetarism/S +monetarist/MS +monetary +monetization/CMA +monetize/CGADS +Monet/M +moneybag/SM +moneychangers +moneyer/M +moneylender/SM +moneymaker/MS +moneymaking/MS +money/SMRD +Monfort/M +monger/SGDM +Mongolia/M +Mongolian/S +Mongolic/M +mongolism/SM +mongoloid/S +Mongoloid/S +Mongol/SM +mongoose/SM +mongrel/SM +Monica/M +monies/M +Monika/M +moniker/MS +Monique/M +monism/MS +monist/SM +monition/SM +monitored/U +monitor/GSMD +monitory/S +monkeyshine/S +monkey/SMDG +monkish +Monk/M +monk/MS +monkshood/SM +Monmouth/M +monochromatic +monochromator +monochrome/MS +monocle/SDM +monoclinic +monoclonal/S +monocotyledonous +monocotyledon/SM +monocular/SY +monodic +monodist/S +monody/MS +monogamist/MS +monogamous/PY +monogamy/MS +monogrammed +monogramming +monogram/MS +monograph/GMDS +monographs +monolingualism +monolingual/S +monolithic +monolithically +monolith/M +monoliths +monologist/S +monologue/GMSD +monomaniacal +monomaniac/MS +monomania/MS +monomeric +monomer/SM +monomial/SM +mono/MS +Monongahela/M +mononuclear +mononucleoses +mononucleosis/M +monophonic +monoplane/MS +monopole/S +monopolistic +monopolist/MS +monopolization/MS +monopolized/U +monopolize/GZDSR +monopolizes/U +monopoly/MS +monorail/SM +monostable +monosyllabic +monosyllable/MS +monotheism/SM +monotheistic +monotheist/S +monotone/SDMG +monotonic +monotonically +monotonicity +monotonousness/MS +monotonous/YP +monotony/MS +monovalent +monoxide/SM +Monroe/M +Monro/M +Monrovia/M +Monsanto/M +monseigneur +monsieur/M +Monsignori +Monsignor/MS +monsignor/S +Mon/SM +monsoonal +monsoon/MS +monster/SM +monstrance/ASM +monstrosity/SM +monstrousness/M +monstrous/YP +montage/SDMG +Montague/M +Montaigne/M +Montana/M +Montanan/MS +Montcalm/M +Montclair/M +Monte/M +Montenegrin +Montenegro/M +Monterey/M +Monterrey/M +Montesquieu/M +Montessori/M +Monteverdi/M +Montevideo/M +Montezuma +Montgomery/M +monthly/S +month/MY +months +Monticello/M +Monti/M +Mont/M +Montmartre/M +Montoya/M +Montpelier/M +Montrachet/M +Montreal/M +Montserrat/M +Monty/M +monumentality/M +monumental/Y +monument/DMSG +mooch/ZSRDG +moodily +moodiness/MS +mood/MS +Moody/M +moody/PTR +Moog +moo/GSD +moonbeam/SM +Mooney/M +moon/GDMS +moonless +moonlight/GZDRMS +moonlighting/M +moonlit +Moon/M +moonscape/MS +moonshiner/M +moonshine/SRZM +moonshot/MS +moonstone/SM +moonstruck +moonwalk/SDG +Moore/M +moor/GDMJS +mooring/M +Moorish +moorland/MS +Moor/MS +moose/M +moot/RDGS +moped/MS +moper/M +mope/S +mopey +mopier +mopiest +mopish +mopped +moppet/MS +mopping +mop/SZGMDR +moraine/MS +morale/MS +Morales/M +moralistic +moralistically +moralist/MS +morality/UMS +moralization/CS +moralize/CGDRSZ +moralled +moraller +moralling +moral/SMY +Mora/M +Moran/M +morass/SM +moratorium/SM +Moravia/M +Moravian +moray/SM +morbidity/SM +morbidness/S +morbid/YP +mordancy/MS +mordant/GDYS +Mordecai/M +Mord/M +Mordred/M +Mordy/M +more/DSN +Moreen/M +Morehouse/M +Moreland/M +morel/SM +More/M +Morena/M +Moreno/M +moreover +Morey/M +Morgana/M +Morganica/M +Morgan/MS +Morganne/M +morgen/M +Morgen/M +morgue/SM +Morgun/M +Moria/M +Moriarty/M +moribundity/M +moribund/Y +Morie/M +Morin/M +morion/M +Morison/M +Morissa/M +Morita/M +Moritz/M +Morlee/M +Morley/M +Morly/M +Mormonism/MS +Mormon/SM +Morna/M +morning/MY +morn/SGJDM +Moroccan/S +Morocco/M +morocco/SM +Moro/M +moronic +moronically +Moroni/M +moron/SM +moroseness/MS +morose/YP +morpheme/DSMG +morphemic/S +Morpheus/M +morph/GDJ +morphia/S +morphine/MS +morphism/MS +morphologic +morphological/Y +morphology/MS +morphophonemic/S +morphophonemics/M +morphs +Morrie/M +morris +Morris/M +Morrison/M +Morristown/M +Morrow/M +morrow/MS +Morry/M +morsel/GMDS +Morse/M +mortality/SM +mortal/SY +mortarboard/SM +mortar/GSDM +Morten/M +mortgageable +mortgagee/SM +mortgage/MGDS +mortgagor/SM +mortice's +mortician/SM +Mortie/M +mortification/M +mortified/Y +mortifier/M +mortify/DRSXGN +Mortimer/M +mortise/MGSD +Mort/MN +Morton/M +mortuary/MS +Morty/M +Mosaic +mosaicked +mosaicking +mosaic/MS +Moscone/M +Moscow/M +Moseley/M +Moselle/M +Mose/MSR +Moser/M +mosey/SGD +Moshe/M +Moslem's +Mosley/M +mosque/SM +mosquitoes +mosquito/M +mos/S +mossback/MS +Mossberg/M +Moss/M +moss/SDMG +mossy/SRT +most/SY +Mosul/M +mote/ASCNK +motel/MS +mote's +motet/SM +mothball/DMGS +motherboard/MS +motherfucker/MS! +motherfucking/! +motherhood/SM +mothering/M +motherland/SM +motherless +motherliness/MS +motherly/P +mother/RDYMZG +moths +moth/ZMR +motif/MS +motile/S +motility/MS +motional/K +motioner/M +motion/GRDMS +motionlessness/S +motionless/YP +motion's/ACK +motions/K +motivated/U +motivate/XDSNGV +motivational/Y +motivation/M +motivator/S +motiveless +motive/MGSD +motley/S +motlier +motliest +mot/MSV +motocross/SM +motorbike/SDGM +motorboat/MS +motorcade/MSDG +motorcar/MS +motorcycle/GMDS +motorcyclist/SM +motor/DMSG +motoring/M +motorist/SM +motorization/SM +motorize/DSG +motorized/U +motorman/M +motormen +motormouth +motormouths +Motorola/M +motorway/SM +Motown/M +mottle/GSRD +mottler/M +Mott/M +mottoes +motto/M +moue/DSMG +moulder/DSG +moult/GSD +mound/GMDS +mountable +mountaineering/M +mountaineer/JMDSG +mountainousness/M +mountainous/PY +mountainside/MS +mountain/SM +mountaintop/SM +Mountbatten/M +mountebank/SGMD +mounted/U +mount/EGACD +mounter/SM +mounties +Mountie/SM +mounting/MS +Mount/M +mounts/AE +mourner/M +mournfuller +mournfullest +mournfulness/S +mournful/YP +mourning/M +mourn/ZGSJRD +mouser/M +mouse/SRDGMZ +mousetrapped +mousetrapping +mousetrap/SM +mousiness/MS +mousing/M +mousse/MGSD +Moussorgsky/M +mousy/PRT +Mouthe/M +mouthful/MS +mouthiness/SM +mouth/MSRDG +mouthorgan +mouthpiece/SM +mouths +mouthwash/SM +mouthwatering +mouthy/PTR +Mouton/M +mouton/SM +movable/ASP +movableness/AM +move/ARSDGZB +moved/U +movement/SM +mover/AM +moviegoer/S +movie/SM +moving/YS +mower/M +Mowgli/M +mowing/M +mow/SDRZG +moxie/MS +Moyer/M +Moyna/M +Moyra/M +Mozambican/S +Mozambique/M +Mozart/M +Mozelle/M +Mozes/M +Mozilla/M +mozzarella/MS +mp +MP +mpg +mph +MPH +MRI +Mr/M +Mrs +ms +M's +MS +MSG +Msgr/M +m's/K +Ms/S +MST +MSW +mt +MT +mtg +mtge +Mt/M +MTS +MTV +Muawiya/M +Mubarak/M +muchness/M +much/SP +mucilage/MS +mucilaginous +mucker/M +muck/GRDMS +muckraker/M +muckrake/ZMDRSG +mucky/RT +mucosa/M +mucous +mucus/SM +mudded +muddily +muddiness/SM +mudding +muddle/GRSDZ +muddleheaded/P +muddlehead/SMD +muddler/M +muddy/TPGRSD +mudflat/S +mudguard/SM +mudlarks +mud/MS +mudroom/S +mudslide/S +mudslinger/M +mudslinging/M +mudsling/JRGZ +Mueller/M +Muenster +muenster/MS +muesli/M +muezzin/MS +muff/GDMS +Muffin/M +muffin/SM +muffler/M +muffle/ZRSDG +Mufi/M +Mufinella/M +mufti/MS +Mugabe/M +mugged +mugger/SM +mugginess/S +mugging/S +muggy/RPT +mugshot/S +mug/SM +mugwump/MS +Muhammadanism/S +Muhammadan/SM +Muhammad/M +Muire/M +Muir/M +Mukden/M +mukluk/SM +mulattoes +mulatto/M +mulberry/MS +mulch/GMSD +mulct/SDG +Mulder/M +mule/MGDS +muleskinner/S +muleteer/MS +mulishness/MS +mulish/YP +mullah/M +mullahs +mullein/MS +Mullen/M +muller/M +Muller/M +mullet/MS +Mulligan/M +mulligan/SM +mulligatawny/SM +Mullikan/M +Mullins +mullion/MDSG +mull/RDSG +Multan/M +multi +Multibus/M +multicellular +multichannel/M +multicollinearity/M +multicolor/SDM +multicolumn +multicomponent +multicomputer/MS +Multics/M +MULTICS/M +multicultural +multiculturalism/S +multidimensional +multidimensionality +multidisciplinary +multifaceted +multifamily +multifariousness/SM +multifarious/YP +multifigure +multiform +multifunction/D +multilateral/Y +multilayer +multilevel/D +multilingual +multilingualism/S +multimedia/S +multimegaton/M +multimeter/M +multimillionaire/SM +multinational/S +multinomial/M +multiphase +multiple/SM +multiplet/SM +multiplex/GZMSRD +multiplexor's +multipliable +multiplicand/SM +multiplication/M +multiplicative/YS +multiplicity/MS +multiplier/M +multiply/ZNSRDXG +multiprocess/G +multiprocessor/MS +multiprogram +multiprogrammed +multiprogramming/MS +multipurpose +multiracial +multistage +multistory/S +multisyllabic +multitasking/S +multitude/MS +multitudinousness/M +multitudinous/YP +multiuser +multivalent +multivalued +multivariate +multiversity/M +multivitamin/S +mu/M +mumbler/M +mumbletypeg/S +mumble/ZJGRSD +Mumford/M +mummed +mummer/SM +mummery/MS +mummification/M +mummify/XSDGN +mumming +mum/MS +mummy/GSDM +mumps/M +muncher/M +Münchhausen/M +munchies +Munch/M +munch/ZRSDG +Muncie/M +mundane/YSP +Mundt/M +munge/JGZSRD +Munich/M +municipality/SM +municipal/YS +munificence/MS +munificent/Y +munition/SDG +Munmro/M +Munoz/M +Munroe/M +Munro/M +mun/S +Munsey/M +Munson/M +Munster/MS +Muong/M +muon/M +Muppet/M +muralist/SM +mural/SM +Murasaki/M +Murat/M +Murchison/M +Murcia/M +murderer/M +murderess/S +murder/GZRDMS +murderousness/M +murderous/YP +Murdoch/M +Murdock/M +Mureil/M +Murial/M +muriatic +Murielle/M +Muriel/M +Murillo/M +murkily +murkiness/S +murk/TRMS +murky/RPT +Murmansk/M +murmurer/M +murmuring/U +murmurous +murmur/RDMGZSJ +Murphy/M +murrain/SM +Murray/M +Murrow/M +Murrumbidgee/M +Murry/M +Murvyn/M +muscatel/MS +Muscat/M +muscat/SM +musclebound +muscle/SDMG +Muscovite/M +muscovite/MS +Muscovy/M +muscularity/SM +muscular/Y +musculature/SM +muse +Muse/M +muser/M +musette/SM +museum/MS +mus/GJDSR +musher/M +mushiness/MS +mush/MSRDG +mushroom/DMSG +mushy/PTR +Musial/M +musicale/SM +musicality/SM +musicals +musical/YU +musician/MYS +musicianship/MS +musicked +musicking +musicological +musicologist/MS +musicology/MS +music/SM +musing/Y +Muskegon/M +muskeg/SM +muskellunge/SM +musketeer/MS +musketry/MS +musket/SM +musk/GDMS +muskie/M +muskiness/MS +muskmelon/MS +muskox/N +muskrat/MS +musky/RSPT +Muslim/MS +muslin/MS +mussel/MS +Mussolini/MS +Mussorgsky/M +muss/SDG +mussy/RT +mustache/DSM +mustachio/MDS +mustang/MS +mustard/MS +muster/GD +mustily +mustiness/MS +mustn't +must/RDGZS +must've +musty/RPT +mutability/SM +mutableness/M +mutable/P +mutably +mutagen/SM +mutant/MS +mutate/XVNGSD +mutational/Y +mutation/M +mutator/S +muted/Y +muteness/S +mute/PDSRBYTG +mutilate/XDSNG +mutilation/M +mutilator/MS +mutineer/SMDG +mutinous/Y +mutiny/MGSD +Mutsuhito/M +mutterer/M +mutter/GZRDJ +muttonchops +mutton/SM +mutt/ZSMR +mutuality/S +mutual/SY +muumuu/MS +muzak +Muzak/SM +Muzo/M +muzzled/U +muzzle/MGRSD +muzzler/M +MVP +MW +Myanmar +Mycah/M +Myca/M +Mycenaean +Mycenae/M +Mychal/M +mycologist/MS +mycology/MS +myelitides +myelitis/M +Myer/MS +myers +mylar +Mylar/S +Myles/M +Mylo/M +My/M +myna/SM +Mynheer/M +myocardial +myocardium/M +myopia/MS +myopically +myopic/S +Myrah/M +Myra/M +Myranda/M +Myrdal/M +myriad/S +Myriam/M +Myrilla/M +Myrle/M +Myrlene/M +myrmidon/S +Myrna/M +Myron/M +myrrh/M +myrrhs +Myrta/M +Myrtia/M +Myrtice/M +Myrtie/M +Myrtle/M +myrtle/SM +Myrvyn/M +Myrwyn/M +mys +my/S +myself +Mysore/M +mysteriousness/MS +mysterious/YP +mystery/MDSG +mystical/Y +mysticism/MS +mystic/SM +mystification/M +mystifier/M +mystify/CSDGNX +mystifying/Y +mystique/MS +Myst/M +mythic +mythical/Y +myth/MS +mythographer/SM +mythography/M +mythological/Y +mythologist/MS +mythologize/CSDG +mythology/SM +myths +N +NAACP +nabbed +nabbing +Nabisco/M +nabob/SM +Nabokov/M +nab/S +nacelle/SM +nacho/S +NaCl/M +nacre/MS +nacreous +Nada/M +Nadean/M +Nadeen/M +Nader/M +Nadia/M +Nadine/M +nadir/SM +Nadiya/M +Nadya/M +Nady/M +nae/VM +Nagasaki/M +nagged +nagger/S +nagging/Y +nag/MS +Nagoya/M +Nagpur/M +Nagy/M +Nahuatl/SM +Nahum/M +naiad/SM +naifs +nailbrush/SM +nailer/M +nail/SGMRD +Naipaul/M +Nair/M +Nairobi/M +Naismith/M +naive/SRTYP +naiveté/SM +naivety/MS +Nakamura/M +Nakayama/M +nakedness/MS +naked/TYRP +Nakoma/M +Nalani/M +Na/M +Namath/M +nameable/U +name/ADSG +namedrop +namedropping +named's +named/U +nameless/PY +namely +nameplate/MS +namer/SM +name's +namesake/SM +Namibia/M +Namibian/S +naming/M +Nam/M +Nanak/M +Nana/M +Nananne/M +Nancee/M +Nance/M +Nancey/M +Nanchang/M +Nancie/M +Nanci/M +Nancy/M +Nanete/M +Nanette/M +Nanice/M +Nani/M +Nanine/M +Nanjing +Nanking's +Nan/M +Nannette/M +Nannie/M +Nanni/M +Nanny/M +nanny/SDMG +nanometer/MS +Nanon/M +Nanook/M +nanosecond/SM +Nansen/M +Nantes/M +Nantucket/M +Naoma/M +Naomi/M +napalm/MDGS +nape/SM +Naphtali/M +naphthalene/MS +naphtha/SM +Napier/M +napkin/SM +Naples/M +napless +Nap/M +Napoleonic +napoleon/MS +Napoleon/MS +napped +napper/MS +Nappie/M +napping +Nappy/M +nappy/TRSM +nap/SM +Nara/M +Narbonne/M +narc/DGS +narcissism/MS +narcissistic +narcissist/MS +narcissus/M +Narcissus/M +narcoleptic +narcoses +narcosis/M +narcotic/SM +narcotization/S +narcotize/GSD +Nariko/M +Nari/M +nark's +Narmada/M +Narragansett/M +narrate/VGNSDX +narration/M +narrative/MYS +narratology +narrator/SM +narrowing/P +narrowness/SM +narrow/RDYTGPS +narwhal/MS +nary +nasality/MS +nasalization/MS +nasalize/GDS +nasal/YS +NASA/MS +nascence/ASM +nascent/A +NASDAQ +Nash/M +Nashua/M +Nashville/M +Nassau/M +Nasser/M +nastily +nastiness/MS +nasturtium/SM +nasty/TRSP +natal +Natala/M +Natalee/M +Natale/M +Natalia/M +Natalie/M +Natalina/M +Nataline/M +natalist +natality/M +Natal/M +Natalya/M +Nata/M +Nataniel/M +Natasha/M +Natassia/M +Natchez +natch/S +Nate/XMN +Nathalia/M +Nathalie/M +Nathanael/M +Nathanial/M +Nathaniel/M +Nathanil/M +Nathan/MS +nationalism/SM +nationalistic +nationalistically +nationalist/MS +nationality/MS +nationalization/MS +nationalize/CSDG +nationalized/AU +nationalizer/SM +national/YS +nationhood/SM +nation/MS +nationwide +nativeness/M +native/PYS +Natividad/M +Nativity/M +nativity/MS +Natka/M +natl +Nat/M +NATO/SM +natter/SGD +nattily +nattiness/SM +Natty/M +natty/TRP +naturalism/MS +naturalistic +naturalist/MS +naturalization/SM +naturalized/U +naturalize/GSD +naturalness/US +natural/PUY +naturals +nature/ASDCG +nature's +naturist +Naugahyde/S +naughtily +naughtiness/SM +naught/MS +naughty/TPRS +Naur/M +Nauru/M +nausea/SM +nauseate/DSG +nauseating/Y +nauseousness/SM +nauseous/P +nautical/Y +nautilus/MS +Navaho's +Navajoes +Navajo/S +naval/Y +Navarro/M +navel/MS +nave/SM +navigability/SM +navigableness/M +navigable/P +navigate/DSXNG +navigational +navigation/M +navigator/MS +Navona/M +Navratilova/M +navvy/M +Navy/S +navy/SM +nay/MS +naysayer/S +Nazarene/MS +Nazareth/M +Nazi/SM +Nazism/S +NB +NBA +NBC +Nb/M +NBS +NC +NCAA +NCC +NCO +NCR +ND +N'Djamena +Ndjamena/M +Nd/M +Ne +NE +Neala/M +Neale/M +Neall/M +Neal/M +Nealon/M +Nealson/M +Nealy/M +Neanderthal/S +neap/DGS +Neapolitan/SM +nearby +nearly/RT +nearness/MS +nearside/M +nearsightedness/S +nearsighted/YP +near/TYRDPSG +neaten/DG +neath +neatness/MS +neat/YRNTXPS +Neb/M +Nebraska/M +Nebraskan/MS +Nebr/M +Nebuchadnezzar/MS +nebulae +nebula/M +nebular +nebulousness/SM +nebulous/PY +necessaries +necessarily/U +necessary/U +necessitate/DSNGX +necessitation/M +necessitous +necessity/SM +neckband/M +neckerchief/MS +neck/GRDMJS +necking/M +necklace/DSMG +neckline/MS +necktie/MS +necrology/SM +necromancer/MS +necromancy/MS +necromantic +necrophiliac/S +necrophilia/M +necropolis/SM +necropsy/M +necroses +necrosis/M +necrotic +nectarine/SM +nectarous +nectar/SM +nectary/MS +Neda/M +Nedda/M +Neddie/M +Neddy/M +Nedi/M +Ned/M +née +needed/U +needer/M +needful/YSP +Needham/M +neediness/MS +needlecraft/M +needle/GMZRSD +needlepoint/SM +needlessness/S +needless/YP +needlewoman/M +needlewomen +needlework/RMS +needn't +need/YRDGS +needy/TPR +Neel/M +Neely/M +ne'er +nefariousness/MS +nefarious/YP +Nefen/M +Nefertiti/M +negated/U +negater/M +negate/XRSDVNG +negation/M +negativeness/SM +negative/PDSYG +negativism/MS +negativity/MS +negator/MS +Negev/M +neglecter/M +neglectfulness/SM +neglectful/YP +neglect/SDRG +negligee/SM +negligence/MS +negligent/Y +negligibility/M +negligible +negligibly +negotiability/MS +negotiable/A +negotiant/M +negotiate/ASDXGN +negotiation/MA +negotiator/MS +Negress/MS +negritude/MS +Negritude/S +Negroes +negroid +Negroid/S +Negro/M +neg/S +Nehemiah/M +Nehru/M +neighbored/U +neighborer/M +neighborhood/SM +neighborlinesses +neighborliness/UM +neighborly/UP +neighbor/SMRDYZGJ +neigh/MDG +neighs +Neila/M +Neile/M +Neilla/M +Neille/M +Neill/M +Neil/SM +neither +Nelda/M +Nelia/M +Nelie/M +Nelle/M +Nellie/M +Nelli/M +Nell/M +Nelly/M +Nelsen/M +Nels/N +Nelson/M +nelson/MS +nematic +nematode/SM +Nembutal/M +nemeses +nemesis +Nemesis/M +neoclassical +neoclassicism/MS +neoclassic/M +neocolonialism/MS +neocortex/M +neodymium/MS +Neogene +neolithic +Neolithic/M +neologism/SM +neomycin/M +neonatal/Y +neonate/MS +neon/DMS +neophyte/MS +neoplasm/SM +neoplastic +neoprene/SM +Nepalese +Nepali/MS +Nepal/M +nepenthe/MS +nephew/MS +nephrite/SM +nephritic +nephritides +nephritis/M +nepotism/MS +nepotist/S +Neptune/M +neptunium/MS +nerd/S +nerdy/RT +Nereid/M +Nerf/M +Nerissa/M +Nerita/M +Nero/M +Neron/M +Nerta/M +Nerte/M +Nertie/M +Nerti/M +Nert/M +Nerty/M +Neruda/M +nervelessness/SM +nerveless/YP +nerve's +nerve/UGSD +nerviness/SM +nerving/M +nervousness/SM +nervous/PY +nervy/TPR +Nessa/M +Nessie/M +Nessi/M +Nessy/M +Nesta/M +nester/M +Nester/M +Nestle/M +nestler/M +nestle/RSDG +nestling/M +Nestorius/M +Nestor/M +nest/RDGSBM +netball/M +nether +Netherlander/SM +Netherlands/M +nethermost +netherworld/S +Netscape/M +net/SM +Netta/M +Nettie/M +Netti/M +netting/M +nett/JGRDS +Nettle/M +nettle/MSDG +nettlesome +Netty/M +network/SJMDG +Netzahualcoyotl/M +Neumann/M +neuralgia/MS +neuralgic +neural/Y +neurasthenia/MS +neurasthenic/S +neuritic/S +neuritides +neuritis/M +neuroanatomy +neurobiology/M +neurological/Y +neurologist/MS +neurology/SM +neuromuscular +neuronal +neurone/S +neuron/MS +neuropathology/M +neurophysiology/M +neuropsychiatric +neuroses +neurosis/M +neurosurgeon/MS +neurosurgery/SM +neurotically +neurotic/S +neurotransmitter/S +neuter/JZGRD +neutralise's +neutralism/MS +neutralist/S +neutrality/MS +neutralization/MS +neutralized/U +neutralize/GZSRD +neutral/PYS +neutrino/MS +neutron/MS +neut/ZR +Nevada/M +Nevadan/S +Nevadian/S +Neva/M +never +nevermore +nevertheless +nevi +Nevile/M +Neville/M +Nevil/M +Nevin/SM +Nevis/M +Nev/M +Nevsa/M +Nevsky/M +nevus/M +Newark/M +newbie/S +newborn/S +Newbury/M +Newburyport/M +Newcastle/M +newcomer/MS +newed/A +Newell/M +newel/MS +newer/A +newfangled +newfound +newfoundland +Newfoundlander/M +Newfoundland/SRMZ +newish +newline/SM +newlywed/MS +Newman/M +newness/MS +Newport/M +news/A +newsagent/MS +newsboy/SM +newscaster/M +newscasting/M +newscast/SRMGZ +newsdealer/MS +newsed +newses +newsflash/S +newsgirl/S +newsgroup/SM +newsing +newsletter/SM +NeWS/M +newsman/M +newsmen +newspaperman/M +newspapermen +newspaper/SMGD +newspaperwoman/M +newspaperwomen +newsprint/MS +new/SPTGDRY +newsreader/MS +newsreel/SM +newsroom/S +news's +newsstand/MS +Newsweekly/M +newsweekly/S +Newsweek/MY +newswire +newswoman/M +newswomen +newsworthiness/SM +newsworthy/RPT +newsy/TRS +newt/MS +Newtonian +Newton/M +newton/SM +Nexis/M +next +nexus/SM +Neysa/M +NF +NFC +NFL +NFS +Ngaliema/M +Nguyen/M +NH +NHL +niacin/SM +Niagara/M +Niall/M +Nial/M +Niamey/M +nibbed +nibbing +nibbler/M +nibble/RSDGZ +Nibelung/M +nib/SM +Nicaean +Nicaragua/M +Nicaraguan/S +Niccolo/M +Nice/M +Nicene +niceness/MS +nicety/MS +nice/YTPR +niche/SDGM +Nicholas +Nichole/M +Nicholle/M +Nichol/MS +Nicholson/M +nichrome +nickelodeon/SM +nickel/SGMD +nicker/GD +Nickey/M +nick/GZRDMS +Nickie/M +Nicki/M +Nicklaus/M +Nick/M +nicknack's +nickname/MGDRS +nicknamer/M +Nickolai/M +Nickola/MS +Nickolaus/M +Nicko/M +Nicky/M +Nicobar/M +Nicodemus/M +Nicolai/MS +Nicola/MS +Nicolea/M +Nicole/M +Nicolette/M +Nicoli/MS +Nicolina/M +Nicoline/M +Nicolle/M +Nicol/M +Nico/M +Nicosia/M +nicotine/MS +Niebuhr/M +niece/MS +Niel/MS +Nielsen/M +Niels/N +Nielson/M +Nietzsche/M +Nieves/M +nifty/TRS +Nigel/M +Nigeria/M +Nigerian/S +Nigerien +Niger/M +niggardliness/SM +niggardly/P +niggard/SGMDY +nigger/SGDM! +niggler/M +niggle/RSDGZJ +niggling/Y +nigh/RDGT +nighs +nightcap/SM +nightclothes +nightclubbed +nightclubbing +nightclub/MS +nightdress/MS +nightfall/SM +nightgown/MS +nighthawk/MS +nightie/MS +Nightingale/M +nightingale/SM +nightlife/MS +nightlong +nightmare/MS +nightmarish/Y +nightshade/SM +nightshirt/MS +night/SMYDZ +nightspot/MS +nightstand/SM +nightstick/S +nighttime/S +nightwear/M +nighty's +NIH +nihilism/MS +nihilistic +nihilist/MS +Nijinsky/M +Nikaniki/M +Nike/M +Niki/M +Nikita/M +Nikkie/M +Nikki/M +Nikko/M +Nikolai/M +Nikola/MS +Nikolaos/M +Nikolaus/M +Nikolayev's +Nikoletta/M +Nikolia/M +Nikolos/M +Niko/MS +Nikon/M +Nile/SM +nilled +nilling +Nil/MS +nil/MYS +nilpotent +Nilsen/M +Nils/N +Nilson/M +Nilsson/M +Ni/M +nimbi +nimbleness/SM +nimble/TRP +nimbly +nimbus/DM +NIMBY +Nimitz/M +Nimrod/MS +Nina/M +nincompoop/MS +ninefold +nine/MS +ninepence/M +ninepin/S +ninepins/M +nineteen/SMH +nineteenths +ninetieths +Ninetta/M +Ninette/M +ninety/MHS +Nineveh/M +ninja/S +Ninnetta/M +Ninnette/M +ninny/SM +Ninon/M +Nintendo/M +ninth +ninths +Niobe/M +niobium/MS +nipped +nipper/DMGS +nippiness/S +nipping/Y +nipple/GMSD +Nipponese +Nippon/M +nippy/TPR +nip/S +Nirenberg/M +nirvana/MS +Nirvana/S +nisei +Nisei/MS +Nissa/M +Nissan/M +Nisse/M +Nissie/M +Nissy/M +Nita/M +niter/M +nitpick/DRSJZG +nitrate/MGNXSD +nitration/M +nitric +nitride/MGS +nitriding/M +nitrification/SM +nitrite/MS +nitrocellulose/MS +nitrogenous +nitrogen/SM +nitroglycerin/MS +nitrous +nitwit/MS +nit/ZSMR +Niven/M +nixer/M +nix/GDSR +Nixie/M +Nixon/M +NJ +Nkrumah/M +NLRB +nm +NM +no/A +NOAA +Noach/M +Noah/M +Noak/M +Noami/M +Noam/M +Nobelist/SM +nobelium/MS +Nobel/M +Nobe/M +Nobie/M +nobility/MS +Noble/M +nobleman/M +noblemen +nobleness/SM +noblesse/M +noble/TPSR +noblewoman +noblewomen +nob/MY +nobody/MS +Noby/M +nocturnal/SY +nocturne/SM +nodal/Y +nodded +nodding +noddle/MSDG +noddy/M +node/MS +NoDoz/M +nod/SM +nodular +nodule/SM +Noelani/M +Noella/M +Noelle/M +Noell/M +Noellyn/M +Noel/MS +noel/S +Noelyn/M +Noe/M +Noemi/M +noes/S +noggin/SM +nohow +noise/GMSD +noiselessness/SM +noiseless/YP +noisemaker/M +noisemake/ZGR +noisily +noisiness/MS +noisome +noisy/TPR +Nola/M +Nolana/M +Noland/M +Nolan/M +Nolie/M +Nollie/M +Noll/M +Nolly/M +No/M +nomadic +nomad/SM +Nome/M +nomenclature/MS +Nomi/M +nominalized +nominal/K +nominally +nominals +nominate/CDSAXNG +nomination/MAC +nominative/SY +nominator/CSM +nominee/MS +non +nonabrasive +nonabsorbent/S +nonacademic/S +nonacceptance/MS +nonacid/MS +nonactive +nonadaptive +nonaddictive +nonadhesive +nonadjacent +nonadjustable +nonadministrative +nonage/MS +nonagenarian/MS +nonaggression/SM +nonagricultural +Nonah/M +nonalcoholic/S +nonaligned +nonalignment/SM +nonallergic +Nona/M +nonappearance/MS +nonassignable +nonathletic +nonattendance/SM +nonautomotive +nonavailability/SM +nonbasic +nonbeliever/SM +nonbelligerent/S +nonblocking +nonbreakable +nonburnable +nonbusiness +noncaloric +noncancerous +noncarbohydrate/M +nonce/MS +nonchalance/SM +nonchalant/YP +nonchargeable +nonclerical/S +nonclinical +noncollectable +noncombatant/MS +noncombustible/S +noncommercial/S +noncommissioned +noncommittal/Y +noncom/MS +noncommunicable +noncompeting +noncompetitive +noncompliance/MS +noncomplying/S +noncomprehending +nonconducting +nonconductor/MS +nonconforming +nonconformist/SM +nonconformity/SM +nonconsecutive +nonconservative +nonconstructive +noncontagious +noncontiguous +noncontinuous +noncontributing +noncontributory +noncontroversial +nonconvertible +noncooperation/SM +noncorroding/S +noncorrosive +noncredit +noncriminal/S +noncritical +noncrystalline +noncumulative +noncustodial +noncyclic +nondairy +nondecreasing +nondeductible +nondelivery/MS +nondemocratic +nondenominational +nondepartmental +nondepreciating +nondescript/YS +nondestructive/Y +nondetachable +nondeterminacy +nondeterminate/Y +nondeterminism +nondeterministic +nondeterministically +nondisciplinary +nondisclosure/SM +nondiscrimination/SM +nondiscriminatory +nondramatic +nondrinker/SM +nondrying +nondurable +noneconomic +noneducational +noneffective/S +nonelastic +nonelectrical +nonelectric/S +nonemergency +nonempty +nonenforceable +nonentity/MS +nonequivalence/M +nonequivalent/S +none/S +nones/M +nonessential/S +nonesuch/SM +nonetheless +nonevent/MS +nonexchangeable +nonexclusive +nonexempt +nonexistence/MS +nonexistent +nonexplosive/S +nonextensible +nonfactual +nonfading +nonfat +nonfatal +nonfattening +nonferrous +nonfictional +nonfiction/SM +nonflammable +nonflowering +nonfluctuating +nonflying +nonfood/M +nonfreezing +nonfunctional +nongovernmental +nongranular +nonhazardous +nonhereditary +nonhuman +nonidentical +Nonie/M +Noni/M +noninclusive +nonindependent +nonindustrial +noninfectious +noninflammatory +noninflationary +noninflected +nonintellectual/S +noninteracting +noninterchangeable +noninterference/MS +nonintervention/SM +nonintoxicating +nonintuitive +noninvasive +nonionic +nonirritating +nonjudgmental +nonjudicial +nonlegal +nonlethal +nonlinearity/MS +nonlinear/Y +nonlinguistic +nonliterary +nonliving +nonlocal +nonmagical +nonmagnetic +nonmalignant +nonmember/SM +nonmetallic +nonmetal/MS +nonmigratory +nonmilitant/S +nonmilitary +Nonnah/M +Nonna/M +nonnarcotic/S +nonnative/S +nonnegative +nonnegotiable +nonnuclear +nonnumerical/S +nonobjective +nonobligatory +nonobservance/MS +nonobservant +nonoccupational +nonoccurence +nonofficial +nonogenarian +nonoperational +nonoperative +nonorthogonal +nonorthogonality +nonparallel/S +nonparametric +nonpareil/SM +nonparticipant/SM +nonparticipating +nonpartisan/S +nonpaying +nonpayment/SM +nonperformance/SM +nonperforming +nonperishable/S +nonperson/S +nonperturbing +nonphysical/Y +nonplus/S +nonplussed +nonplussing +nonpoisonous +nonpolitical +nonpolluting +nonporous +nonpracticing +nonprejudicial +nonprescription +nonprocedural/Y +nonproductive +nonprofessional/S +nonprofit/SB +nonprogrammable +nonprogrammer +nonproliferation/SM +nonpublic +nonpunishable +nonracial +nonradioactive +nonrandom +nonreactive +nonreciprocal/S +nonreciprocating +nonrecognition/SM +nonrecoverable +nonrecurring +nonredeemable +nonreducing +nonrefillable +nonrefundable +nonreligious +nonrenewable +nonrepresentational +nonresidential +nonresident/SM +nonresidual +nonresistance/SM +nonresistant/S +nonrespondent/S +nonresponse +nonrestrictive +nonreturnable/S +nonrhythmic +nonrigid +nonsalaried +nonscheduled +nonscientific +nonscoring +nonseasonal +nonsectarian +nonsecular +nonsegregated +nonsense/MS +nonsensicalness/M +nonsensical/PY +nonsensitive +nonsexist +nonsexual +nonsingular +nonskid +nonslip +nonsmoker/SM +nonsmoking +nonsocial +nonspeaking +nonspecialist/MS +nonspecializing +nonspecific +nonspiritual/S +nonstaining +nonstandard +nonstarter/SM +nonstick +nonstop +nonstrategic +nonstriking +nonstructural +nonsuccessive +nonsupervisory +nonsupport/GS +nonsurgical +nonsustaining +nonsympathizer/M +nontarnishable +nontaxable/S +nontechnical/Y +nontenured +nonterminal/MS +nonterminating +nontermination/M +nontheatrical +nonthinking/S +nonthreatening +nontoxic +nontraditional +nontransferable +nontransparent +nontrivial +nontropical +nonuniform +nonunion/S +nonuser/SM +nonvenomous +nonverbal/Y +nonveteran/MS +nonviable +nonviolence/SM +nonviolent/Y +nonvirulent +nonvocal +nonvocational +nonvolatile +nonvolunteer/S +nonvoter/MS +nonvoting +nonwhite/SM +nonworking +nonyielding +nonzero +noodle/GMSD +nook/MS +noonday/MS +noon/GDMS +nooning/M +noontide/MS +noontime/MS +noose/SDGM +nope/S +NORAD/M +noradrenalin +noradrenaline/M +Norah/M +Nora/M +Norbert/M +Norberto/M +Norbie/M +Norby/M +Nordhoff/M +Nordic/S +Nordstrom/M +Norean/M +Noreen/M +Norene/M +Norfolk/M +nor/H +Norina/M +Norine/M +normalcy/MS +normality/SM +normalization/A +normalizations +normalization's +normalized/AU +normalizes/AU +normalize/SRDZGB +normal/SY +Norma/M +Normand/M +Normandy/M +Norman/SM +normativeness/M +normative/YP +Normie/M +norm/SMGD +Normy/M +Norplant +Norrie/M +Norri/SM +Norristown/M +Norry/M +Norse +Norseman/M +Norsemen +Northampton/M +northbound +northeastern +northeaster/YM +Northeast/SM +northeastward/S +northeast/ZSMR +northerly/S +norther/MY +Northerner/M +northernmost +northern/RYZS +Northfield/M +northing/M +northland +North/M +northmen +north/MRGZ +Northrop/M +Northrup/M +norths +Norths +Northumberland/M +northward/S +northwestern +northwester/YM +northwest/MRZS +Northwest/MS +northwestward/S +Norton/M +Norwalk/M +Norway/M +Norwegian/S +Norwich/M +Norw/M +nosebag/M +nosebleed/SM +nosecone/S +nosedive/DSG +nosed/V +nosegay/MS +nose/M +Nosferatu/M +nos/GDS +nosh/MSDG +nosily +nosiness/MS +nosing/M +nostalgia/SM +nostalgically +nostalgic/S +Nostradamus/M +Nostrand/M +nostril/SM +nostrum/SM +nosy/SRPMT +notability/SM +notableness/M +notable/PS +notably +notarial +notarization/S +notarize/DSG +notary/MS +notate/VGNXSD +notational/CY +notation/CMSF +notative/CF +notch/MSDG +not/DRGB +notebook/MS +note/CSDFG +notedness/M +noted/YP +notepad/S +notepaper/MS +note's +noteworthiness/SM +noteworthy/P +nothingness/SM +nothing/PS +noticeable/U +noticeably +noticeboard/S +noticed/U +notice/MSDG +notifiable +notification/M +notifier/M +notify/NGXSRDZ +notional/Y +notion/MS +notoriety/S +notoriousness/M +notorious/YP +Notre/M +Nottingham/M +notwithstanding +Nouakchott/M +nougat/MS +Noumea/M +noun/SMK +nourish/DRSGL +nourished/U +nourisher/M +nourishment/SM +nous/M +nouveau +nouvelle +novae +Novak/M +Nova/M +nova/MS +novelette/SM +Novelia/M +novelist/SM +novelization/S +novelize/GDS +Novell/SM +novella/SM +novel/SM +novelty/MS +November/SM +novena/SM +novene +Novgorod/M +novice/MS +novitiate/MS +Nov/M +Novocaine/M +Novocain/S +Novokuznetsk/M +Novosibirsk/M +NOW +nowadays +noway/S +Nowell/M +nowhere/S +nowise +now/S +noxiousness/M +noxious/PY +Noyce/M +Noyes/M +nozzle/MS +Np +NP +NRA +nroff/M +N's +NS +n's/CI +NSF +n/T +NT +nth +nuance/SDM +nubbin/SM +nubby/RT +Nubia/M +Nubian/M +nubile +nub/MS +nuclear/K +nuclease/M +nucleated/A +nucleate/DSXNG +nucleation/M +nucleic +nuclei/M +nucleoli +nucleolus/M +nucleon/MS +nucleotide/MS +nucleus/M +nuclide/M +nude/CRS +nudely +nudeness/M +nudest +nudge/GSRD +nudger/M +nudism/MS +nudist/MS +nudity/MS +nugatory +Nugent/M +nugget/SM +nuisance/MS +nuke/DSMG +Nukualofa +null/DSG +nullification/M +nullifier/M +nullify/RSDXGNZ +nullity/SM +nu/M +numbered/UA +numberer/M +numberless +numberplate/M +number/RDMGJ +numbers/A +Numbers/M +numbing/Y +numbness/MS +numb/SGZTYRDP +numbskull's +numerable/IC +numeracy/SI +numeral/YMS +numerate/SDNGX +numerates/I +numeration/M +numerator/MS +numerical/Y +numeric/S +numerological +numerologist/S +numerology/MS +numerousness/M +numerous/YP +numinous/S +numismatic/S +numismatics/M +numismatist/MS +numskull/SM +Nunavut/M +nuncio/SM +Nunez/M +Nunki/M +nun/MS +nunnery/MS +nuptial/S +Nuremberg/M +Nureyev/M +nursemaid/MS +nurser/M +nurseryman/M +nurserymen +nursery/MS +nurse/SRDJGMZ +nursling/M +nurturer/M +nurture/SRDGZM +nus +nutate/NGSD +nutation/M +nutcracker/M +nutcrack/RZ +nuthatch/SM +nutmeat/SM +nutmegged +nutmegging +nutmeg/MS +nut/MS +nutpick/MS +Nutrasweet/M +nutria/SM +nutrient/MS +nutriment/MS +nutritional/Y +nutritionist/MS +nutrition/SM +nutritiousness/MS +nutritious/PY +nutritive/Y +nutshell/MS +nutted +nuttiness/SM +nutting +nutty/TRP +nuzzle/GZRSD +NV +NW +NWT +NY +Nyasa/M +NYC +Nydia/M +Nye/M +Nyerere/M +nylon/SM +nymphet/MS +nymph/M +nympholepsy/M +nymphomaniac/S +nymphomania/MS +nymphs +Nyquist/M +NYSE +Nyssa/M +NZ +o +O +oafishness/S +oafish/PY +oaf/MS +Oahu/M +Oakland/M +Oakley/M +Oakmont/M +oak/SMN +oakum/MS +oakwood +oar/GSMD +oarlock/MS +oarsman/M +oarsmen +oarswoman +oarswomen +OAS +oases +oasis/M +oatcake/MS +oater/M +Oates/M +oath/M +oaths +oatmeal/SM +oat/SMNR +Oaxaca/M +ob +OB +Obadiah/M +Obadias/M +obbligato/S +obduracy/S +obdurateness/S +obdurate/PDSYG +Obediah/M +obedience/EMS +obedient/EY +Obed/M +obeisance/MS +obeisant/Y +obelisk/SM +Oberlin/M +Oberon/M +obese +obesity/MS +obey/EDRGS +obeyer/EM +obfuscate/SRDXGN +obfuscation/M +obfuscatory +Obidiah/M +Obie/M +obi/MDGS +obit/SMR +obituary/SM +obj +objectify/GSDXN +objectionableness/M +objectionable/U +objectionably +objection/SMB +objectiveness/MS +objective/PYS +objectivity/MS +objector/SM +object/SGVMD +objurgate/GNSDX +objurgation/M +oblate/NYPSX +oblation/M +obligate/NGSDXY +obligational +obligation/M +obligatorily +obligatory +obliged/E +obliger/M +obliges/E +oblige/SRDG +obligingness/M +obliging/PY +oblique/DSYGP +obliqueness/S +obliquity/MS +obliterate/VNGSDX +obliteration/M +obliterative/Y +oblivion/MS +obliviousness/MS +oblivious/YP +oblongness/M +oblong/SYP +obloquies +obloquy/M +Ob/MD +obnoxiousness/MS +obnoxious/YP +oboe/SM +oboist/S +obos +O'Brien/M +obs +obscene/RYT +obscenity/MS +obscurantism/MS +obscurantist/MS +obscuration +obscureness/M +obscure/YTPDSRGL +obscurity/MS +obsequies +obsequiousness/S +obsequious/YP +obsequy +observability/M +observable/SU +observably +observance/MS +observantly +observants +observant/U +observational/Y +observation/MS +observatory/MS +observed/U +observer/M +observe/ZGDSRB +observing/Y +obsess/GVDS +obsessional +obsession/MS +obsessiveness/S +obsessive/PYS +obsidian/SM +obsolesce/GSD +obsolescence/S +obsolescent/Y +obsolete/GPDSY +obsoleteness/M +obstacle/SM +obstetrical +obstetrician/SM +obstetric/S +obstetrics/M +obstinacy/SM +obstinateness/M +obstinate/PY +obstreperousness/SM +obstreperous/PY +obstructed/U +obstructer/M +obstructionism/SM +obstructionist/MS +obstruction/SM +obstructiveness/MS +obstructive/PSY +obstruct/RDVGS +obtainable/U +obtainably +obtain/LSGDRB +obtainment/S +obtrude/DSRG +obtruder/M +obtrusion/S +obtrusiveness/MSU +obtrusive/UPY +obtuseness/S +obtuse/PRTY +obverse/YS +obviate/XGNDS +obviousness/SM +obvious/YP +Oby/M +ocarina/MS +O'Casey +Occam/M +occasional/Y +occasion/MDSJG +Occidental/S +occidental/SY +occident/M +Occident/SM +occipital/Y +occlude/GSD +occlusion/MS +occlusive/S +occulter/M +occultism/SM +occult/SRDYG +occupancy/SM +occupant/MS +occupational/Y +occupation/SAM +occupied/AU +occupier/M +occupies/A +occupy/RSDZG +occur/AS +occurred/A +occurrence/SM +occurring/A +oceanfront/MS +oceangoing +Oceania/M +oceanic +ocean/MS +oceanographer/SM +oceanographic +oceanography/SM +oceanology/MS +oceanside +Oceanside/M +Oceanus/M +ocelot/SM +ocher/DMGS +Ochoa/M +o'clock +O'Clock +O'Connell/M +O'Connor/M +Oconomowoc/M +OCR +octagonal/Y +octagon/SM +octahedral +octahedron/M +octal/S +octane/MS +octant/M +octave/MS +Octavia/M +Octavian/M +Octavio/M +Octavius/M +octavo/MS +octennial +octet/SM +octile +octillion/M +Oct/M +October/MS +octogenarian/MS +octopus/SM +octoroon/M +ocular/S +oculist/SM +OD +odalisque/SM +oddball/SM +oddity/MS +oddment/MS +oddness/MS +odd/TRYSPL +Odele/M +Odelia/M +Odelinda/M +Odella/M +Odelle/M +Odell/M +O'Dell/M +ode/MDRS +Ode/MR +Oderberg/MS +Oder/M +Odessa/M +Odets/M +Odetta/M +Odette/M +Odey/M +Odie/M +Odilia/M +Odille/M +Odin/M +odiousness/MS +odious/PY +Odis/M +odium/MS +Odo/M +odometer/SM +Odom/M +O'Donnell/M +odor/DMS +odoriferous +odorless +odorous/YP +ODs +O'Dwyer/M +Ody/M +Odysseus/M +Odyssey/M +odyssey/S +OE +OED +oedipal +Oedipal/Y +Oedipus/M +OEM/M +OEMS +oenology/MS +oenophile/S +o'er +O'Er +Oersted/M +oesophagi +oeuvre/SM +Ofelia/M +Ofella/M +offal/MS +offbeat/MS +offcuts +Offenbach/M +offender/M +offend/SZGDR +offense/MSV +offensively/I +offensiveness/MSI +offensive/YSP +offerer/M +offering/M +offer/RDJGZ +offertory/SM +offhand/D +offhandedness/S +offhanded/YP +officeholder/SM +officemate/S +officer/GMD +officership/S +office/SRMZ +officialdom/SM +officialism/SM +officially/U +official/PSYM +officiant/SM +officiate/XSDNG +officiation/M +officiator/MS +officio +officiousness/MS +officious/YP +offing/M +offish +offload/GDS +offprint/GSDM +offramp +offset/SM +offsetting +offshoot/MS +offshore +offside/RS +offspring/M +offstage/S +off/SZGDRJ +offtrack +Ofilia/M +of/K +often/RT +oftentimes +oft/NRT +ofttimes +Ogbomosho/M +Ogdan/M +Ogden/M +Ogdon/M +Ogilvy/M +ogive/M +Oglethorpe/M +ogle/ZGDSR +ogreish +ogre/MS +ogress/S +oh +OH +O'Hara +O'Hare/M +O'Higgins +Ohioan/S +Ohio/M +ohmic +ohmmeter/MS +ohm/SM +oho/S +ohs +OHSA/M +oilcloth/M +oilcloths +oiler/M +oilfield/MS +oiliness/SM +oilman/M +oil/MDRSZG +oilmen +oilseed/SM +oilskin/MS +oily/TPR +oink/GDS +ointment/SM +Oise/M +OJ +Ojibwa/SM +Okamoto/M +okapi/SM +Okayama/M +okay/M +Okeechobee/M +O'Keeffe +Okefenokee +Okhotsk/M +Okinawa/M +Okinawan/S +Oklahoma/M +Oklahoman/SM +Okla/M +OK/MDG +okra/MS +OKs +Oktoberfest +Olaf/M +Olag/M +Ola/M +Olav/M +Oldenburg/M +olden/DG +Oldfield/M +oldie/MS +oldish +oldness/S +Oldsmobile/M +oldster/SM +Olduvai/M +old/XTNRPS +olé +oleaginous +oleander/SM +O'Leary/M +olefin/M +Oleg/M +Ole/MV +Olenek/M +Olenka/M +Olen/M +Olenolin/M +oleomargarine/SM +oleo/S +oles +olfactory +Olga/M +Olia/M +oligarchic +oligarchical +oligarch/M +oligarchs +oligarchy/SM +Oligocene +oligopolistic +oligopoly/MS +Olimpia/M +Olin/M +olive/MSR +Olive/MZR +Oliver/M +Olivero/M +Olivette/M +Olivetti/M +Olivia/M +Olivier/M +Olivie/RM +Oliviero/M +Oliy/M +Ollie/M +Olly/M +Olmec +Olmsted/M +Olsen/M +Olson/M +Olva/M +Olvan/M +Olwen/M +Olympe/M +Olympiad/MS +Olympian/S +Olympia/SM +Olympic/S +Olympie/M +Olympus/M +Omaha/SM +Oman/M +Omar/M +ombudsman/M +ombudsmen +Omdurman/M +omega/MS +omelet/SM +omelette's +omen/DMG +Omero/M +omicron/MS +ominousness/SM +ominous/YP +omission/MS +omit/S +omitted +omitting +omnibus/MS +omni/M +omnipotence/SM +Omnipotent +omnipotent/SY +omnipresence/MS +omnipresent/Y +omniscience/SM +omniscient/YS +omnivore/MS +omnivorousness/MS +omnivorous/PY +oms +Omsk/M +om/XN +ON +onanism/M +Onassis/M +oncer/M +once/SR +oncogene/S +oncologist/S +oncology/SM +oncoming/S +Ondrea/M +Oneal/M +Onega/M +Onegin/M +Oneida/SM +O'Neil +O'Neill +oneness/MS +one/NPMSX +oner/M +onerousness/SM +onerous/YP +oneself +onetime +oneupmanship +Onfre/M +Onfroi/M +ongoing/S +Onida/M +onion/GDM +onionskin/MS +onlooker/MS +onlooking +only/TP +Onofredo/M +Ono/M +onomatopoeia/SM +onomatopoeic +onomatopoetic +Onondaga/MS +onrush/GMS +on/RY +ons +Onsager/M +onset/SM +onsetting +onshore +onside +onslaught/MS +Ontarian/S +Ontario/M +Ont/M +onto +ontogeny/SM +ontological/Y +ontology/SM +onus/SM +onward/S +onyx/MS +oodles +ooh/GD +oohs +oolitic +Oona/M +OOo/M +oops/S +Oort/M +ooze/GDS +oozy/RT +opacity/SM +opalescence/S +opalescent/Y +Opalina/M +Opaline/M +Opal/M +opal/SM +opaque/GTPYRSD +opaqueness/SM +opcode/MS +OPEC +Opel/M +opencast +opened/AU +opener/M +openhandedness/SM +openhanded/P +openhearted +opening/M +openness/S +OpenOffice.org/M +opens/A +openwork/MS +open/YRDJGZTP +operable/I +operandi +operand/SM +operant/YS +opera/SM +operate/XNGVDS +operatically +operatic/S +operationalization/S +operationalize/D +operational/Y +operation/M +operative/IP +operatively +operativeness/MI +operatives +operator/SM +operetta/MS +ope/S +Ophelia/M +Ophelie/M +Ophiuchus/M +ophthalmic/S +ophthalmologist/SM +ophthalmology/MS +opiate/GMSD +opine/XGNSD +opinionatedness/M +opinionated/PY +opinion/M +opioid +opium/MS +opossum/SM +opp +Oppenheimer/M +opponent/MS +opportune/IY +opportunism/SM +opportunistic +opportunistically +opportunist/SM +opportunity/MS +oppose/BRSDG +opposed/U +opposer/M +oppositeness/M +opposite/SXYNP +oppositional +opposition/M +oppress/DSGV +oppression/MS +oppressiveness/MS +oppressive/YP +oppressor/MS +opprobrious/Y +opprobrium/SM +Oprah/M +ops +opt/DSG +opthalmic +opthalmologic +opthalmology +optical/Y +optician/SM +optic/S +optics/M +optima +optimality +optimal/Y +optimise's +optimism/SM +optimistic +optimistically +optimist/SM +optimization/SM +optimize/DRSZG +optimized/U +optimizer/M +optimizes/U +optimum/SM +optionality/M +optional/YS +option/GDMS +optoelectronic +optometric +optometrist/MS +optometry/SM +opulence/SM +opulent/Y +opus/SM +op/XGDN +OR +oracle/GMSD +oracular +Oralee/M +Oralia/M +Oralie/M +Oralla/M +Oralle/M +oral/YS +Ora/M +orangeade/MS +Orange/M +orange/MS +orangery/SM +orangutan/MS +Oranjestad/M +Oran/M +orate/SDGNX +oration/M +oratorical/Y +oratorio/MS +orator/MS +oratory/MS +Orazio/M +Orbadiah/M +orbicular +orbiculares +orbital/MYS +orbit/MRDGZS +orb/SMDG +orchard/SM +orchestral/Y +orchestra/MS +orchestrate/GNSDX +orchestrater's +orchestration/M +orchestrator/M +orchid/SM +ordainer/M +ordainment/MS +ordain/SGLDR +ordeal/SM +order/AESGD +ordered/U +orderer +ordering/S +orderless +orderliness/SE +orderly/PS +order's/E +ordinal/S +ordinance/MS +ordinarily +ordinariness/S +ordinary/RSPT +ordinated +ordinate/I +ordinates +ordinate's +ordinating +ordination/SM +ordnance/SM +Ordovician +ordure/MS +oregano/SM +Oreg/M +Oregonian/S +Oregon/M +Orelee/M +Orelia/M +Orelie/M +Orella/M +Orelle/M +Orel/M +Oren/M +Ore/NM +ore/NSM +Oreo +Orestes +organdie's +organdy/MS +organelle/MS +organically/I +organic/S +organismic +organism/MS +organist/MS +organizable/UMS +organizational/MYS +organization/MEAS +organize/AGZDRS +organized/UE +organizer/MA +organizes/E +organizing/E +organ/MS +organometallic +organza/SM +orgasm/GSMD +orgasmic +orgiastic +orgy/SM +Oriana/M +oriel/MS +orientable +Oriental/S +oriental/SY +orientated/A +orientate/ESDXGN +orientates/A +orientation/AMES +orienteering/M +orienter +orient/GADES +orient's +Orient/SM +orifice/MS +orig +origami/MS +originality/SM +originally +original/US +originate/VGNXSD +origination/M +originative/Y +originator/SM +origin/MS +Orin/M +Orinoco/M +oriole/SM +Orion/M +orison/SM +Oriya/M +Orizaba/M +Orkney/M +Orland/M +Orlando/M +Orlan/M +Orleans +Orlick/M +Orlon/SM +Orly/M +ormolu/SM +or/MY +ornamental/SY +ornamentation/SM +ornament/GSDM +ornateness/SM +ornate/YP +orneriness/SM +ornery/PRT +ornithological +ornithologist/SM +ornithology/MS +orographic/M +orography/M +Orono/M +orotund +orotundity/MS +orphanage/MS +orphanhood/M +orphan/SGDM +Orpheus/M +Orphic +Orran/M +Orren/M +Orrin/M +orris/SM +Orr/MN +ors +Orsa/M +Orsola/M +Orson/M +Ortega/M +Ortensia/M +orthodontia/S +orthodontic/S +orthodontics/M +orthodontist/MS +orthodoxies +orthodoxly/U +Orthodox/S +orthodoxy's +orthodox/YS +orthodoxy/U +orthogonality/M +orthogonalization/M +orthogonalized +orthogonal/Y +orthographic +orthographically +orthography/MS +orthonormal +orthopedic/S +orthopedics/M +orthopedist/SM +orthophosphate/MS +orthorhombic +Ortiz/M +Orton/M +Orval/M +Orville/M +Orv/M +Orwellian +Orwell/M +o's +Osage/SM +Osaka/M +Osbert/M +Osborne/M +Osborn/M +Osbourne/M +Osbourn/M +Oscar/SM +Osceola/M +oscillate/SDXNG +oscillation/M +oscillator/SM +oscillatory +oscilloscope/SM +osculate/XDSNG +osculation/M +Osgood/M +OSHA +Oshawa/M +O'Shea/M +Oshkosh/M +osier/MS +Osiris/M +Oslo/M +Os/M +OS/M +Osman/M +osmium/MS +Osmond/M +osmoses +osmosis/M +osmotic +Osmund/M +osprey/SM +osseous/Y +Ossie/M +ossification/M +ossify/NGSDX +ostensible +ostensibly +ostentation/MS +ostentatiousness/M +ostentatious/PY +osteoarthritides +osteoarthritis/M +osteology/M +osteopathic +osteopath/M +osteopaths +osteopathy/MS +osteoporoses +osteoporosis/M +ostracise's +ostracism/MS +ostracize/GSD +Ostrander/M +ostrich/MS +Ostrogoth/M +Ostwald/M +O'Sullivan/M +Osvaldo/M +Oswald/M +Oswell/M +OT +OTB +OTC +Otes +Otha/M +Othelia/M +Othella/M +Othello/M +otherness/M +other/SMP +otherwise +otherworldly/P +otherworld/Y +Othilia/M +Othilie/M +Otho/M +otiose +Otis/M +OTOH +Ottawa/MS +otter/DMGS +Ottilie/M +Otto/M +Ottoman +ottoman/MS +Ouagadougou/M +oubliette/SM +ouch/SDG +oughtn't +ought/SGD +Ouija/MS +ounce/MS +our/S +ourself +ourselves +ouster/M +oust/RDGZS +outage/MS +outargue/GDS +outback/MRS +outbalance/GDS +outbidding +outbid/S +outboard/S +outboast/GSD +outbound/S +outbreak/SMG +outbroke +outbroken +outbuilding/SM +outburst/MGS +outcast/GSM +outclass/SDG +outcome/SM +outcropped +outcropping/S +outcrop/SM +outcry/MSDG +outdated/P +outdid +outdistance/GSD +outdoes +outdo/G +outdone +outdoor/S +outdoorsy +outdraw/GS +outdrawn +outdrew +outermost +outerwear/M +outface/SDG +outfall/MS +outfielder/M +outfield/RMSZ +outfight/SG +outfit/MS +outfitted +outfitter/MS +outfitting +outflank/SGD +outflow/SMDG +outfought +outfox/GSD +outgeneraled +outgoes +outgo/GJ +outgoing/P +outgrew +outgrip +outgrow/GSH +outgrown +outgrowth/M +outgrowths +outguess/SDG +outhit/S +outhitting +outhouse/SM +outing/M +outlaid +outlander/M +outlandishness/MS +outlandish/PY +outland/ZR +outlast/GSD +outlawry/M +outlaw/SDMG +outlay/GSM +outlet/SM +outliers +outline/SDGM +outlive/GSD +outlook/MDGS +outlying +outmaneuver/GSD +outmatch/SDG +outmigration +outmoded +outness/M +outnumber/GDS +outpaced +outpatient/SM +outperform/DGS +out/PJZGSDR +outplacement/S +outplay/GDS +outpoint/GDS +outpost/SM +outpouring/M +outpour/MJG +outproduce/GSD +output/SM +outputted +outputting +outrace/GSD +outrage/GSDM +outrageousness/M +outrageous/YP +outran +outrank/GSD +outré +outreach/SDG +outrider/MS +outrigger/SM +outright/Y +outrunning +outrun/S +outscore/GDS +outsell/GS +outset/MS +outsetting +outshine/SG +outshone +outshout/GDS +outsider/PM +outside/ZSR +outsize/S +outskirt/SM +outsmart/SDG +outsold +outsource/SDJG +outspend/SG +outspent +outspoke +outspokenness/SM +outspoken/YP +outspread/SG +outstanding/Y +outstate/NX +outstation/M +outstay/SDG +outstretch/GSD +outstripped +outstripping +outstrip/S +outtake/S +outvote/GSD +outwardness/M +outward/SYP +outwear/SG +outweigh/GD +outweighs +outwit/S +outwitted +outwitting +outwore +outwork/SMDG +outworn +ouzo/SM +oval/MYPS +ovalness/M +ova/M +ovarian +ovary/SM +ovate/SDGNX +ovation/GMD +ovenbird/SM +oven/MS +overabundance/MS +overabundant +overachieve/SRDGZ +overact/DGVS +overage/S +overaggressive +overallocation +overall/SM +overambitious +overanxious +overarching +overarm/GSD +overate +overattentive +overawe/GDS +overbalance/DSG +overbear/GS +overbearingness/M +overbearing/YP +overbidding +overbid/S +overbite/MS +overblown +overboard +overbold +overbook/SDG +overbore +overborne +overbought +overbuild/GS +overbuilt +overburdening/Y +overburden/SDG +overbuy/GS +overcame +overcapacity/M +overcapitalize/DSG +overcareful +overcast/GS +overcasting/M +overcautious +overcerebral +overcharge/DSG +overcloud/DSG +overcoating/M +overcoat/SMG +overcomer/M +overcome/RSG +overcommitment/S +overcompensate/XGNDS +overcompensation/M +overcomplexity/M +overcomplicated +overconfidence/MS +overconfident/Y +overconscientious +overconsumption/M +overcook/SDG +overcooled +overcorrection +overcritical +overcrowd/DGS +overcurious +overdecorate/SDG +overdependent +overdetermined +overdevelop/SDG +overdid +overdoes +overdo/G +overdone +overdose/DSMG +overdraft/SM +overdraw/GS +overdrawn +overdress/GDS +overdrew +overdrive/GSM +overdriven +overdrove +overdubbed +overdubbing +overdub/S +overdue +overeagerness/M +overeager/PY +overeater/M +overeat/GNRS +overeducated +overemotional +overemphases +overemphasis/M +overemphasize/GZDSR +overenthusiastic +overestimate/DSXGN +overestimation/M +overexcite/DSG +overexercise/SDG +overexert/GDS +overexertion/SM +overexploitation +overexploited +overexpose/GDS +overexposure/SM +overextend/DSG +overextension +overfall/M +overfed +overfeed/GS +overfill/GDS +overfishing +overflew +overflight/SM +overflow/DGS +overflown +overfly/GS +overfond +overfull +overgeneralize/GDS +overgenerous +overgraze/SDG +overgrew +overground +overgrow/GSH +overgrown +overgrowth/M +overgrowths +overhand/DGS +overhang/GS +overhasty +overhaul/GRDJS +overhead/S +overheard +overhearer/M +overhear/SRG +overheat/SGD +overhung +overincredulous +overindulgence/SM +overindulgent +overindulge/SDG +overinflated +overjoy/SGD +overkill/SDMG +overladed +overladen +overlaid +overlain +overland/S +overlap/MS +overlapped +overlapping +overlarge +overlay/GS +overleaf +overlie +overload/SDG +overlong +overlook/DSG +overlord/DMSG +overloud +overly/GRS +overmanning +overmaster/GSD +overmatching +overmodest +overmuch/S +overnice +overnight/SDRGZ +overoptimism/SM +overoptimistic +overpaid +overparticular +overpass/GMSD +overpay/LSG +overpayment/M +overplay/SGD +overpopulate/DSNGX +overpopulation/M +overpopulous +overpower/GSD +overpowering/Y +overpraise/DSG +overprecise +overpressure +overprice/SDG +overprint/DGS +overproduce/SDG +overproduction/S +overprotect/GVDS +overprotection/M +overqualified +overran +overrate/DSG +overreach/DSRG +overreaction/SM +overreact/SGD +overred +overrefined +overrepresented +overridden +overrider/M +override/RSG +overripe +overrode +overrule/GDS +overrunning +overrun/S +oversample/DG +oversaturate +oversaw +oversea/S +overseeing +overseen +overseer/M +oversee/ZRS +oversell/SG +oversensitiveness/S +oversensitive/P +oversensitivity +oversexed +overshadow/GSD +overshoe/SM +overshoot/SG +overshot/S +oversight/SM +oversimple +oversimplification/M +oversimplify/GXNDS +oversize/GS +oversleep/GS +overslept +oversoftness/M +oversoft/P +oversold +overspecialization/MS +overspecialize/GSD +overspend/SG +overspent +overspill/DMSG +overspread/SG +overstaffed +overstatement/SM +overstate/SDLG +overstay/GSD +overstepped +overstepping +overstep/S +overstimulate/DSG +overstock/SGD +overstraining +overstressed +overstretch/D +overstrict +overstrike/GS +overstrung +overstuffed +oversubscribe/SDG +oversubtle +oversupply/MDSG +oversuspicious +overtaken +overtake/RSZG +overtax/DSG +overthrew +overthrow/GS +overthrown +overtightened +overtime/MGDS +overtire/DSG +overtone/MS +overtook +overt/PY +overture/DSMG +overturn/SDG +overuse/DSG +overvalue/GSD +overview/MS +overweening +overweight/GSD +overwhelm/GDS +overwhelming/Y +overwinter/SDG +overwork/GSD +overwrap +overwrite/SG +overwritten +overwrote +overwrought +over/YGS +overzealousness/M +overzealous/P +Ovid/M +oviduct/SM +oviform +oviparous +ovoid/S +ovular +ovulate/GNXDS +ovulatory +ovule/MS +ovum/MS +ow/DYG +Owen/MS +owe/S +owlet/SM +owl/GSMDR +owlishness/M +owlish/PY +owned/U +own/EGDS +ownership/MS +owner/SM +oxalate/M +oxalic +oxaloacetic +oxblood/S +oxbow/SM +oxcart/MS +oxen/M +oxford/MS +Oxford/MS +oxidant/SM +oxidate/NVX +oxidation/M +oxidative/Y +oxide/SM +oxidization/MS +oxidized/U +oxidize/JDRSGZ +oxidizer/M +oxidizes/A +ox/MNS +Oxnard +Oxonian +oxtail/M +Oxus/M +oxyacetylene/MS +oxygenate/XSDMGN +oxygenation/M +oxygen/MS +oxyhydroxides +oxymora +oxymoron/M +oyster/GSDM +oystering/M +oz +Ozark/SM +Oz/M +ozone/SM +Ozymandias/M +Ozzie/M +Ozzy/M +P +PA +Pablo/M +Pablum/M +pablum/S +Pabst/M +pabulum/SM +PAC +pace/DRSMZG +Pace/M +pacemaker/SM +pacer/M +pacesetter/MS +pacesetting +Pacheco/M +pachyderm/MS +pachysandra/MS +pacific +pacifically +pacification/M +Pacific/M +pacifier/M +pacifism/MS +pacifistic +pacifist/MS +pacify/NRSDGXZ +package/ARSDG +packaged/U +packager/S +package's +packages/U +packaging/SM +Packard/SM +packed/AU +packer/MUS +packet/MSDG +pack/GZSJDRMB +packhorse/M +packinghouse/S +packing/M +packsaddle/SM +Packston/M +packs/UA +Packwood/M +Paco/M +Pacorro/M +pact/SM +Padang/M +padded/U +Paddie/M +padding/SM +paddle/MZGRSD +paddler/M +paddock/SDMG +Paddy/M +paddy/SM +Padget/M +Padgett/M +Padilla/M +padlock/SGDM +pad/MS +Padraic/M +Padraig/M +padre/MS +Padrewski/M +Padriac/M +paean/MS +paediatrician/MS +paediatrics/M +paedophilia's +paella/SM +paeony/M +Paganini/M +paganism/MS +pagan/SM +pageantry/SM +pageant/SM +pageboy/SM +paged/U +pageful +Page/M +page/MZGDRS +pager/M +paginate/DSNGX +Paglia/M +pagoda/MS +Pahlavi/M +paid/AU +Paige/M +pailful/SM +Pail/M +pail/SM +Paine/M +painfuller +painfullest +painfulness/MS +painful/YP +pain/GSDM +painkiller/MS +painkilling +painlessness/S +painless/YP +painstaking/SY +paint/ADRZGS +paintbox/M +paintbrush/SM +painted/U +painterly/P +painter/YM +painting/SM +paint's +paintwork +paired/UA +pair/JSDMG +pairs/A +pairwise +paisley/MS +pajama/MDS +Pakistani/S +Pakistan/M +palace/MS +paladin/MS +palaeolithic +palaeontologists +palaeontology/M +palanquin/MS +palatability/M +palatableness/M +palatable/P +palatalization/MS +palatalize/SDG +palatal/YS +palate/BMS +palatial/Y +palatinate/SM +Palatine +palatine/S +palaver/GSDM +paleface/SM +Palembang/M +paleness/S +Paleocene +Paleogene +paleographer/SM +paleography/SM +paleolithic +Paleolithic +paleontologist/S +paleontology/MS +Paleozoic +Palermo/M +pale/SPY +Palestine/M +Palestinian/S +Palestrina/M +palette/MS +Paley/M +palfrey/MS +palimony/S +palimpsest/MS +palindrome/MS +palindromic +paling/M +palisade/MGSD +Palisades/M +palish +Palladio/M +palladium/SM +pallbearer/SM +palletized +pallet/SMGD +pall/GSMD +palliate/SDVNGX +palliation/M +palliative/SY +pallidness/MS +pallid/PY +Pall/M +pallor/MS +palmate +palmer/M +Palmer/M +Palmerston/M +palmetto/MS +palm/GSMDR +palmist/MS +palmistry/MS +Palm/MR +Palmolive/M +palmtop/S +Palmyra/M +palmy/RT +Palo/M +Paloma/M +Palomar/M +palomino/MS +palpable +palpably +palpate/SDNGX +palpation/M +palpitate/NGXSD +palpitation/M +pal/SJMDRYTG +palsy/GSDM +paltriness/SM +paltry/TRP +paludal +Pa/M +Pamela/M +Pamelina/M +Pamella/M +pa/MH +Pamirs +Pam/M +Pammie/M +Pammi/M +Pammy/M +pampas/M +pamperer/M +pamper/RDSG +Pampers +pamphleteer/DMSG +pamphlet/SM +panacea/MS +panache/MS +Panama/MS +Panamanian/S +panama/S +pancake/MGSD +Panchito/M +Pancho/M +panchromatic +pancreas/MS +pancreatic +panda/SM +pandemic/S +pandemonium/SM +pander/ZGRDS +Pandora/M +panegyric/SM +pane/KMS +paneling/M +panelist/MS +panelization +panelized +panel/JSGDM +Pangaea/M +pang/GDMS +pangolin/M +panhandle/RSDGMZ +panicked +panicking +panicky/RT +panic/SM +panier's +panjandrum/M +Pankhurst/M +Pan/M +Panmunjom/M +panned +pannier/SM +panning +panoply/MSD +panorama/MS +panoramic +panpipes +Pansie/M +pan/SMD +Pansy/M +pansy/SM +Pantagruel/M +Pantaloon/M +pantaloons +pant/GDS +pantheism/MS +pantheistic +pantheist/S +pantheon/MS +panther/SM +pantie/SM +pantiled +pantograph/M +pantomime/SDGM +pantomimic +pantomimist/SM +pantry/SM +pantsuit/SM +pantyhose +pantyliner +pantywaist/SM +Panza/M +Paola/M +Paoli/M +Paolina/M +Paolo/M +papacy/SM +Papagena/M +Papageno/M +papal/Y +papa/MS +paparazzi +papaw/SM +papaya/MS +paperback/GDMS +paperboard/MS +paperboy/SM +paperer/M +papergirl/SM +paper/GJMRDZ +paperhanger/SM +paperhanging/SM +paperiness/M +paperless +paperweight/MS +paperwork/SM +papery/P +papillae +papilla/M +papillary +papist/MS +papoose/SM +Pappas/M +papped +papping +pappy/RST +paprika/MS +pap/SZMNR +papyri +papyrus/M +Paquito/M +parable/MGSD +parabola/MS +parabolic +paraboloidal/M +paraboloid/MS +Paracelsus/M +paracetamol/M +parachuter/M +parachute/RSDMG +parachutist/MS +Paraclete/M +parader/M +parade/RSDMZG +paradigmatic +paradigm/SM +paradisaic +paradisaical +Paradise/M +paradise/MS +paradoxic +paradoxicalness/M +paradoxical/YP +paradox/MS +paraffin/GSMD +paragon/SGDM +paragrapher/M +paragraph/MRDG +paragraphs +Paraguayan/S +Paraguay/M +parakeet/MS +paralegal/S +paralinguistic +parallax/SM +parallel/DSG +paralleled/U +parallelepiped/MS +parallelism/SM +parallelization/MS +parallelize/ZGDSR +parallelogram/MS +paralysis/M +paralytically +paralytic/S +paralyzedly/S +paralyzed/Y +paralyzer/M +paralyze/ZGDRS +paralyzingly/S +paralyzing/Y +paramagnetic +paramagnet/M +Paramaribo/M +paramecia +paramecium/M +paramedical/S +paramedic/MS +parameterization/SM +parameterize/BSDG +parameterized/U +parameterless +parameter/SM +parametric +parametrically +parametrization +parametrize/DS +paramilitary/S +paramount/S +paramour/MS +para/MS +Paramus/M +Paraná +paranoiac/S +paranoia/SM +paranoid/S +paranormal/SY +parapet/SMD +paraphernalia +paraphrase/GMSRD +paraphraser/M +paraplegia/MS +paraplegic/S +paraprofessional/SM +parapsychologist/S +parapsychology/MS +paraquat/S +parasite/SM +parasitically +parasitic/S +parasitism/SM +parasitologist/M +parasitology/M +parasol/SM +parasympathetic/S +parathion/SM +parathyroid/S +paratrooper/M +paratroop/RSZ +paratyphoid/S +parboil/DSG +parceled/U +parceling/M +parcel/SGMD +Parcheesi/M +parch/GSDL +parchment/SM +PARC/M +pardonableness/M +pardonable/U +pardonably/U +pardoner/M +pardon/ZBGRDS +paregoric/SM +parentage/MS +parental/Y +parenteral +parentheses +parenthesis/M +parenthesize/GSD +parenthetic +parenthetical/Y +parenthood/MS +parent/MDGJS +pare/S +paresis/M +pares/S +Pareto/M +parfait/SM +pariah/M +pariahs +parietal/S +parimutuel/S +paring/M +parishioner/SM +parish/MS +Parisian/SM +Paris/M +parity/ESM +parka/MS +Parke/M +Parker/M +Parkersburg/M +park/GJZDRMS +Parkhouse/M +parking/M +Parkinson/M +parkish +parkland/M +parklike +Parkman +Park/RMS +parkway/MS +parlance/SM +parlay/DGS +parley/MDSG +parliamentarian/SM +parliamentary/U +parliament/MS +Parliament/MS +parlor/SM +parlous +Parmesan/S +parmigiana +Parnassus/SM +Parnell/M +parochialism/SM +parochiality +parochial/Y +parodied/U +parodist/SM +parody/SDGM +parolee/MS +parole/MSDG +paroxysmal +paroxysm/MS +parquetry/SM +parquet/SMDG +parrakeet's +parred +parricidal +parricide/MS +parring +Parrish/M +Parr/M +Parrnell/M +parrot/GMDS +parrotlike +parry/GSD +Parry/M +parse +parsec/SM +parsed/U +Parsee's +parser/M +Parsifal/M +parsimonious/Y +parsimony/SM +pars/JDSRGZ +parsley/MS +parsnip/MS +parsonage/MS +parson/MS +Parsons/M +partaken +partaker/M +partake/ZGSR +part/CDGS +parterre/MS +parter/S +parthenogeneses +parthenogenesis/M +Parthenon/M +Parthia/M +partiality/MS +partial/SY +participant/MS +participate/NGVDSX +participation/M +participator/S +participatory +participial/Y +participle/MS +particleboard/S +particle/MS +particolored +particularistic +particularity/SM +particularization/MS +particularize/GSD +particular/SY +particulate/S +parting/MS +partisanship/SM +partisan/SM +partition/AMRDGS +partitioned/U +partitioner/M +partitive/S +partizan's +partly +partner/DMGS +partnership/SM +partook +partridge/MS +part's +parturition/SM +partway +party/RSDMG +parvenu/SM +par/ZGSJBMDR +Pasadena/M +PASCAL +Pascale/M +Pascal/M +pascal/SM +paschal/S +pasha/MS +Paso/M +Pasquale/M +pas/S +passably +passage/MGSD +passageway/MS +Passaic/M +passband +passbook/MS +passel/MS +passé/M +passenger/MYS +passerby +passer/M +passersby +passim +passing/Y +passionated +passionate/EYP +passionateness/EM +passionates +passionating +passioned +passionflower/MS +passioning +passionless +passion/SEM +Passion/SM +passivated +passiveness/S +passive/SYP +passivity/S +pass/JGVBZDSR +passkey/SM +passmark +passover +Passover/MS +passport/SM +password/SDM +pasta/MS +pasteboard/SM +pasted/UA +pastel/MS +paste/MS +Pasternak/M +pastern/SM +pasteup +pasteurization/MS +pasteurized/U +pasteurizer/M +pasteurize/RSDGZ +Pasteur/M +pastiche/MS +pastille/SM +pastime/SM +pastiness/SM +pastoralization/M +pastoral/SPY +pastorate/MS +pastor/GSDM +past/PGMDRS +pastrami/MS +pastry/SM +past's/A +pasts/A +pasturage/SM +pasture/MGSRD +pasturer/M +pasty/PTRS +Patagonia/M +Patagonian/S +patch/EGRSD +patcher/EM +patchily +patchiness/S +patch's +patchwork/RMSZ +patchy/PRT +patellae +patella/MS +Patel/M +Pate/M +paten/M +Paten/M +patentee/SM +patent/ZGMRDYSB +paterfamilias/SM +pater/M +paternalism/MS +paternalist +paternalistic +paternal/Y +paternity/SM +paternoster/SM +Paterson/M +pate/SM +pathetic +pathetically +pathfinder/MS +pathless/P +path/M +pathname/SM +pathogenesis/M +pathogenic +pathogen/SM +pathologic +pathological/Y +pathologist/MS +pathology/SM +pathos/SM +paths +pathway/MS +Patience/M +patience/SM +patient/MRYTS +patient's/I +patients/I +patina/SM +patine +Patin/M +patio/MS +Pat/MN +pat/MNDRS +Patna/M +patois/M +Paton/M +patresfamilias +patriarchal +patriarchate/MS +patriarch/M +patriarchs +patriarchy/MS +Patrica/M +Patrice/M +Patricia/M +patrician/MS +patricide/MS +Patricio/M +Patrick/M +Patric/M +patrimonial +patrimony/SM +patriotically +patriotic/U +patriotism/SM +patriot/SM +patristic/S +Patrizia/M +Patrizio/M +Patrizius/M +patrolled +patrolling +patrolman/M +patrolmen +patrol/MS +patrolwoman +patrolwomen +patronage/MS +patroness/S +patronization +patronized/U +patronize/GZRSDJ +patronizer/M +patronizes/A +patronizing's/U +patronizing/YM +patronymically +patronymic/S +patron/YMS +patroon/MS +patsy/SM +Patsy/SM +patted +Patten/M +patten/MS +patterer/M +pattern/GSDM +patternless +patter/RDSGJ +Patterson/M +Pattie/M +Patti/M +patting +Pattin/M +Patton/M +Patty/M +patty/SM +paucity/SM +Paula/M +Paule/M +Pauletta/M +Paulette/M +Paulie/M +Pauli/M +Paulina/M +Pauline +Pauling/M +Paulita/M +Paul/MG +Paulo/M +Paulsen/M +Paulson/M +Paulus/M +Pauly/M +paunch/GMSD +paunchiness/M +paunchy/RTP +pauperism/SM +pauperize/SDG +pauper/SGDM +pause/DSG +Pavarotti +paved/UA +pave/GDRSJL +Pavel/M +pavement/SGDM +paver/M +paves/A +Pavia/M +pavilion/SMDG +paving/A +paving's +Pavla/M +Pavlova/MS +Pavlovian +Pavlov/M +pawl/SM +paw/MDSG +pawnbroker/SM +pawnbroking/S +Pawnee/SM +pawner/M +pawn/GSDRM +pawnshop/MS +pawpaw's +Pawtucket/M +paxes +Paxon/M +Paxton/M +payable/S +pay/AGSLB +payback/S +paycheck/SM +payday/MS +payed +payee/SM +payer/SM +payload/SM +paymaster/SM +payment/ASM +Payne/SM +payoff/MS +payola/MS +payout/S +payroll/MS +payslip/S +Payson/M +Payton/M +Paz/M +Pb/M +PBS +PBX +PCB +PC/M +PCP +PCs +pct +pd +PD +Pd/M +PDP +PDQ +PDT +PE +Peabody/M +peaceableness/M +peaceable/P +peaceably +peacefuller +peacefullest +peacefulness/S +peaceful/PY +peace/GMDS +peacekeeping/S +Peace/M +peacemaker/MS +peacemaking/MS +peacetime/MS +peach/GSDM +Peachtree/M +peachy/RT +peacock/SGMD +Peadar/M +peafowl/SM +peahen/MS +peaked/P +peakiness/M +peak/SGDM +peaky/P +pealed/A +Peale/M +peal/MDSG +peals/A +pea/MS +peanut/SM +Pearce/M +Pearla/M +Pearle/M +pearler/M +Pearlie/M +Pearline/M +Pearl/M +pearl/SGRDM +pearly/TRS +Pearson/M +pear/SYM +peartrees +Peary/M +peasanthood +peasantry/SM +peasant/SM +peashooter/MS +peats/A +peat/SM +peaty/TR +pebble/MGSD +pebbling/M +pebbly/TR +Pebrook/M +pecan/SM +peccadilloes +peccadillo/M +peccary/MS +Pechora/M +pecker/M +peck/GZSDRM +Peckinpah/M +Peck/M +Pecos/M +pectic +pectin/SM +pectoral/S +peculate/NGDSX +peculator/S +peculiarity/MS +peculiar/SY +pecuniary +pedagogical/Y +pedagogic/S +pedagogics/M +pedagogue/SDGM +pedagogy/MS +pedal/SGRDM +pedantic +pedantically +pedantry/MS +pedant/SM +peddler/M +peddle/ZGRSD +pederast/SM +pederasty/SM +Peder/M +pedestal/GDMS +pedestrianization +pedestrianize/GSD +pedestrian/MS +pediatrician/SM +pediatric/S +pedicab/SM +pedicure/DSMG +pedicurist/SM +pedigree/DSM +pediment/DMS +pedlar's +pedometer/MS +pedophile/S +pedophilia +Pedro/M +peduncle/MS +peeing +peekaboo/SM +peek/GSD +peeler/M +peeling/M +Peel/M +peel/SJGZDR +peen/GSDM +peeper/M +peephole/SM +peep/SGZDR +peepshow/MS +peepy +peerage/MS +peer/DMG +peeress/MS +peerlessness/M +peerless/PY +peeve/GZMDS +peevers/M +peevishness/SM +peevish/YP +peewee/S +pee/ZDRS +Pegasus/MS +pegboard/SM +Pegeen/M +pegged +Peggie/M +Peggi/M +pegging +Peggy/M +Peg/M +peg/MS +peignoir/SM +Pei/M +Peiping/M +Peirce/M +pejoration/SM +pejorative/SY +peke/MS +Pekinese's +pekingese +Pekingese/SM +Peking/SM +pekoe/SM +pelagic +Pelee/M +Pele/M +pelf/SM +Pelham/M +pelican/SM +pellagra/SM +pellet/SGMD +pellucid +Peloponnese/M +pelter/M +pelt/GSDR +pelvic/S +pelvis/SM +Pembroke/M +pemmican/SM +penalization/SM +penalized/U +penalize/SDG +penalty/MS +penal/Y +Pena/M +penance/SDMG +pence/M +penchant/MS +pencil/SGJMD +pendant/SM +pend/DCGS +pendent/CS +Penderecki/M +Pendleton/M +pendulous +pendulum/MS +Penelopa/M +Penelope/M +penetrability/SM +penetrable +penetrate/SDVGNX +penetrating/Y +penetration/M +penetrativeness/M +penetrative/PY +penetrator/MS +penguin/MS +penicillin/SM +penile +peninsular +peninsula/SM +penis/MS +penitence/MS +penitential/YS +penitentiary/MS +penitent/SY +penknife/M +penknives +penlight/MS +pen/M +Pen/M +penman/M +penmanship/MS +penmen +Penna +pennant/SM +penned +Penney/M +Pennie/M +penniless +Penni/M +penning +Pennington/M +pennis +Penn/M +pennon/SM +Pennsylvania/M +Pennsylvanian/S +Penny/M +penny/SM +pennyweight/SM +pennyworth/M +penologist/MS +penology/MS +Penrod/M +Pensacola/M +pensioner/M +pension/ZGMRDBS +pensiveness/S +pensive/PY +pens/V +pentacle/MS +pentagonal/SY +Pentagon/M +pentagon/SM +pentagram/MS +pentameter/SM +pent/AS +Pentateuch/M +pentathlete/S +pentathlon/MS +pentatonic +pentecostal +Pentecostalism/S +Pentecostal/S +Pentecost/SM +penthouse/SDGM +Pentium/M +penuche/SM +penultimate/SY +penumbrae +penumbra/MS +penuriousness/MS +penurious/YP +penury/SM +peonage/MS +peon/MS +peony/SM +people/SDMG +Peoria/M +Pepe/M +Pepillo/M +Pepi/M +Pepin/M +Pepita/M +Pepito/M +pepped +peppercorn/MS +pepperer/M +peppergrass/M +peppermint/MS +pepperoni/S +pepper/SGRDM +peppery +peppiness/SM +pepping +peppy/PRT +Pepsico/M +PepsiCo/M +Pepsi/M +pepsin/SM +pep/SM +peptic/S +peptidase/SM +peptide/SM +peptizing +Pepys/M +Pequot/M +peradventure/S +perambulate/DSNGX +perambulation/M +perambulator/MS +percale/MS +perceivably +perceive/DRSZGB +perceived/U +perceiver/M +percentage/MS +percentile/SM +percent/MS +perceptible +perceptibly +perceptional +perception/MS +perceptiveness/MS +perceptive/YP +perceptual/Y +percept/VMS +Perceval/M +perchance +perch/GSDM +perchlorate/M +perchlorination +percipience/MS +percipient/S +Percival/M +percolate/NGSDX +percolation/M +percolator/MS +percuss/DSGV +percussionist/MS +percussion/SAM +percussiveness/M +percussive/PY +percutaneous/Y +Percy/M +perdition/MS +perdurable +peregrinate/XSDNG +peregrination/M +peregrine/S +Perelman/M +peremptorily +peremptory/P +perennial/SY +pčres +perestroika/S +Perez/M +perfecta/S +perfect/DRYSTGVP +perfecter/M +perfectibility/MS +perfectible +perfectionism/MS +perfectionist/MS +perfection/MS +perfectiveness/M +perfective/PY +perfectness/MS +perfidiousness/M +perfidious/YP +perfidy/MS +perforated/U +perforate/XSDGN +perforation/M +perforce +performance/MS +performed/U +performer/M +perform/SDRZGB +perfumer/M +perfumery/SM +perfume/ZMGSRD +perfunctorily +perfunctoriness/M +perfunctory/P +perfused +perfusion/M +Pergamon/M +pergola/SM +perhaps/S +Peria/M +pericardia +pericardium/M +Perice/M +Periclean +Pericles/M +perigee/SM +perihelia +perihelion/M +peril/GSDM +Perilla/M +perilousness/M +perilous/PY +Peri/M +perimeter/MS +perinatal +perinea +perineum/M +periodic +periodical/YMS +periodicity/MS +period/MS +periodontal/Y +periodontics/M +periodontist/S +peripatetic/S +peripheral/SY +periphery/SM +periphrases +periphrasis/M +periphrastic +periscope/SDMG +perishable/SM +perish/BZGSRD +perishing/Y +peristalses +peristalsis/M +peristaltic +peristyle/MS +peritoneal +peritoneum/SM +peritonitis/MS +periwigged +periwigging +periwig/MS +periwinkle/SM +perjurer/M +perjure/SRDZG +perjury/MS +per/K +perk/GDS +perkily +perkiness/S +Perkin/SM +perky/TRP +Perla/M +Perle/M +Perl/M +permafrost/MS +permalloy/M +Permalloy/M +permanence/SM +permanency/MS +permanentness/M +permanent/YSP +permeability/SM +permeableness/M +permeable/P +permeate/NGVDSX +Permian +permissibility/M +permissibleness/M +permissible/P +permissibly +permission/SM +permissiveness/MS +permissive/YP +permit/SM +permitted +permitting +Perm/M +perm/MDGS +permutation/MS +permute/SDG +Pernell/M +perniciousness/MS +pernicious/PY +Pernod/M +Peron/M +peroration/SM +Perot/M +peroxidase/M +peroxide/MGDS +perpend/DG +perpendicularity/SM +perpendicular/SY +perpetrate/NGXSD +perpetration/M +perpetrator/SM +perpetual/SY +perpetuate/NGSDX +perpetuation/M +perpetuity/MS +perplex/DSG +perplexed/Y +perplexity/MS +perquisite/SM +Perren/M +Perri/M +Perrine/M +Perry/MR +persecute/XVNGSD +persecution/M +persecutor/MS +persecutory +Perseid/M +Persephone/M +Perseus/M +perseverance/MS +persevere/GSD +persevering/Y +Pershing/M +Persia/M +Persian/S +persiflage/MS +persimmon/SM +Persis/M +persist/DRSG +persistence/SM +persistent/Y +persnickety +personableness/M +personable/P +personae +personage/SM +personality/SM +personalization/CMS +personalize/CSDG +personalized/U +personalty/MS +personal/YS +persona/M +person/BMS +personification/M +personifier/M +personify/XNGDRS +personnel/SM +person's/U +persons/U +perspective/YMS +perspex +perspicaciousness/M +perspicacious/PY +perspicacity/S +perspicuity/SM +perspicuousness/M +perspicuous/YP +perspiration/MS +perspire/DSG +persuaded/U +persuader/M +persuade/ZGDRSB +persuasion/SM +persuasively +persuasiveness/MS +persuasive/U +pertain/GSD +Perth/M +pertinaciousness/M +pertinacious/YP +pertinacity/MS +pertinence/S +pertinent/YS +pertness/MS +perturbation/MS +perturbed/U +perturb/GDS +pertussis/SM +pert/YRTSP +peruke/SM +Peru/M +perusal/SM +peruser/M +peruse/RSDZG +Peruvian/S +pervade/SDG +pervasion/M +pervasiveness/MS +pervasive/PY +perverseness/SM +perverse/PXYNV +perversion/M +perversity/MS +pervert/DRSG +perverted/YP +perverter/M +perviousness +peseta/SM +Peshawar/M +peskily +peskiness/S +pesky/RTP +peso/MS +pessimal/Y +pessimism/SM +pessimistic +pessimistically +pessimist/SM +pester/DG +pesticide/MS +pestiferous +pestilence/SM +pestilential/Y +pestilent/Y +pestle/SDMG +pesto/S +pest/RZSM +PET +Pétain/M +petal/SDM +Peta/M +petard/MS +petcock/SM +Pete/M +peter/GD +Peter/M +Petersburg/M +Petersen/M +Peters/N +Peterson/M +Peterus/M +Petey/M +pethidine/M +petiole/SM +petiteness/M +petite/XNPS +petitioner/M +petition/GZMRD +petition's/A +petitions/A +petits +Petkiewicz/M +Pet/MRZ +Petra/M +Petrarch/M +petrel/SM +petri +petrifaction/SM +petrify/NDSG +Petrina/M +Petr/M +petrochemical/SM +petrodollar/MS +petroglyph/M +petrolatum/MS +petroleum/MS +petrolled +petrolling +petrol/MS +petrologist/MS +petrology/MS +Petronella/M +Petronia/M +Petronilla/M +Petronille/M +pet/SMRZ +petted +petter/MS +Pettibone/M +petticoat/SMD +pettifogged +pettifogger/SM +pettifogging +pettifog/S +pettily +pettiness/S +petting +pettis +pettishness/M +pettish/YP +Petty/M +petty/PRST +petulance/MS +petulant/Y +Petunia/M +petunia/SM +Peugeot/M +Pewaukee/M +pewee/MS +pewit/MS +pew/SM +pewter/SRM +peyote/SM +Peyter/M +Peyton/M +pf +Pfc +PFC +pfennig/SM +Pfizer/M +pg +PG +Phaedra/M +Phaethon/M +phaeton/MS +phage/M +phagocyte/SM +Phaidra/M +phalanger/MS +phalanges +phalanx/SM +phalli +phallic +phallus/M +Phanerozoic +phantasmagoria/SM +phantasmal +phantasm/SM +phantasy's +phantom/MS +pharaoh +Pharaoh/M +pharaohs +Pharaohs +pharisaic +Pharisaic +Pharisaical +pharisee/S +Pharisee/SM +pharmaceutical/SY +pharmaceutic/S +pharmaceutics/M +pharmacist/SM +pharmacological/Y +pharmacologist/SM +pharmacology/SM +pharmacopoeia/SM +pharmacy/SM +pharyngeal/S +pharynges +pharyngitides +pharyngitis/M +pharynx/M +phase/DSRGZM +phaseout/S +PhD +pheasant/SM +Phebe/M +Phedra/M +Phekda/M +Phelia/M +Phelps/M +phenacetin/MS +phenobarbital/SM +phenolic +phenol/MS +phenolphthalein/M +phenomenal/Y +phenomena/SM +phenomenological/Y +phenomenology/MS +phenomenon/SM +phenotype/MS +phenylalanine/M +phenyl/M +pheromone/MS +phew/S +phialled +phialling +phial/MS +Phidias/M +Philadelphia/M +philanderer/M +philander/SRDGZ +philanthropic +philanthropically +philanthropist/MS +philanthropy/SM +philatelic +philatelist/MS +philately/SM +Philbert/M +Philco/M +philharmonic/S +Philipa/M +Philip/M +Philippa/M +Philippe/M +Philippians/M +philippic/SM +Philippine/SM +Philis/M +philistine/S +Philistine/SM +philistinism/S +Phillida/M +Phillie/M +Phillipa/M +Phillipe/M +Phillip/MS +Phillipp/M +Phillis/M +Philly/SM +Phil/MY +philodendron/MS +philological/Y +philologist/MS +philology/MS +Philomena/M +philosopher/MS +philosophic +philosophical/Y +philosophized/U +philosophizer/M +philosophizes/U +philosophize/ZDRSG +philosophy/MS +philter/SGDM +philtre/DSMG +Phineas/M +Phip/M +Phipps/M +phi/SM +phlebitides +phlebitis/M +phlegmatic +phlegmatically +phlegm/SM +phloem/MS +phlox/M +pH/M +Ph/M +phobia/SM +phobic/S +Phobos/M +Phoebe/M +phoebe/SM +Phoenicia/M +Phoenician/SM +Phoenix/M +phoenix/MS +phone/DSGM +phoneme/SM +phonemically +phonemic/S +phonemics/M +phonetically +phonetician/SM +phonetic/S +phonetics/M +phonically +phonic/S +phonics/M +phoniness/MS +phonographer/M +phonographic +phonograph/RM +phonographs +phonologic +phonological/Y +phonologist/MS +phonology/MS +phonon/M +phony/PTRSDG +phooey/S +phosphatase/M +phosphate/MS +phosphide/M +phosphine/MS +phosphoresce +phosphorescence/SM +phosphorescent/Y +phosphoric +phosphor/MS +phosphorous +phosphorus/SM +photocell/MS +photochemical/Y +photochemistry/M +photocopier/M +photocopy/MRSDZG +photoelectric +photoelectrically +photoelectronic +photoelectrons +photoengraver/M +photoengrave/RSDJZG +photoengraving/M +photofinishing/MS +photogenic +photogenically +photograph/AGD +photographer/SM +photographic +photographically +photograph's +photographs/A +photography/MS +photojournalism/SM +photojournalist/SM +photoluminescence/M +photolysis/M +photolytic +photometer/SM +photometric +photometrically +photometry/M +photomicrograph/M +photomicrography/M +photomultiplier/M +photon/MS +photorealism +photosensitive +photo/SGMD +photosphere/M +photostatic +Photostat/MS +Photostatted +Photostatting +photosyntheses +photosynthesis/M +photosynthesize/DSG +photosynthetic +phototypesetter +phototypesetting/M +phrasal +phrase/AGDS +phrasebook +phrasemaking +phraseology/MS +phrase's +phrasing/SM +phrenological/Y +phrenologist/MS +phrenology/MS +phylactery/MS +phylae +phyla/M +Phylis/M +Phyllida/M +Phyllis/M +Phyllys/M +phylogeny/MS +phylum/M +Phylys/M +phys +physicality/M +physical/PYS +physician/SM +physicist/MS +physicked +physicking +physic/SM +physiochemical +physiognomy/SM +physiography/MS +physiologic +physiological/Y +physiologist/SM +physiology/MS +physiotherapist/MS +physiotherapy/SM +physique/MSD +phytoplankton/M +Piaf/M +Piaget/M +Pia/M +pianism/M +pianissimo/S +pianistic +pianist/SM +pianoforte/MS +pianola +Pianola/M +piano/SM +piaster/MS +piazza/SM +pibroch/M +pibrochs +picador/MS +picaresque/S +pica/SM +Picasso/M +picayune/S +Piccadilly/M +piccalilli/MS +piccolo/MS +pickaback's +pickaxe's +pickax/GMSD +pickerel/MS +Pickering/M +picker/MG +picketer/M +picket/MSRDZG +Pickett/M +Pickford/M +pick/GZSJDR +pickle/SDMG +Pickman/M +pickoff/S +pickpocket/GSM +pickup/SM +Pickwick/M +picky/RT +picnicked +picnicker/MS +picnicking +picnic/SM +picofarad/MS +picojoule +picoseconds +picot/DMGS +Pict/M +pictograph/M +pictographs +pictorialness/M +pictorial/PYS +picture/MGSD +picturesqueness/SM +picturesque/PY +piddle/GSD +piddly +pidgin/SM +piebald/S +piece/GMDSR +piecemeal +piecer/M +piecewise +pieceworker/M +piecework/ZSMR +piedmont +Piedmont/M +pieing +pie/MS +Pierce/M +piercer/M +pierce/RSDZGJ +piercing/Y +Pierette/M +pier/M +Pier/M +Pierre/M +Pierrette/M +Pierrot/M +Pierson/M +Pieter/M +Pietra/M +Pietrek/M +Pietro/M +piety/SM +piezoelectric +piezoelectricity/M +piffle/MGSD +pigeon/DMGS +pigeonhole/SDGM +pigged +piggery/M +pigging +piggishness/SM +piggish/YP +piggyback/MSDG +Piggy/M +piggy/RSMT +pigheadedness/S +pigheaded/YP +piglet/MS +pigmentation/MS +pigment/MDSG +pig/MLS +Pigmy's +pigpen/SM +pigroot +pigskin/MS +pigsty/SM +pigswill/M +pigtail/SMD +Pike/M +pike/MZGDRS +piker/M +pikestaff/MS +pilaf/MS +pilaster/SM +Pilate/M +pilau's +pilchard/SM +Pilcomayo/M +pile/JDSMZG +pileup/MS +pilferage/SM +pilferer/M +pilfer/ZGSRD +Pilgrim +pilgrimage/DSGM +pilgrim/MS +piling/M +pillage/RSDZG +pillar/DMSG +pillbox/MS +pill/GSMD +pillion/DMGS +pillory/MSDG +pillowcase/SM +pillow/GDMS +pillowslip/S +Pillsbury/M +pilot/DMGS +pilothouse/SM +piloting/M +pimento/MS +pimiento/SM +pimpernel/SM +pimp/GSMYD +pimple/SDM +pimplike +pimply/TRM +PIN +pinafore/MS +pińata/S +Pinatubo/M +pinball/MS +Pincas/M +pincer/GSD +Pinchas/M +pincher/M +pinch/GRSD +pincushion/SM +Pincus/M +Pindar/M +pineapple/MS +pined/A +Pinehurst/M +pine/MNGXDS +pines/A +pinfeather/SM +ping/GDRM +pinheaded/P +pinhead/SMD +pinhole/SM +pining/A +pinion/DMG +Pinkerton/M +pinkeye/MS +pink/GTYDRMPS +pinkie/SM +pinkish/P +pinkness/S +pinko/MS +pinky's +pinnacle/MGSD +pinnate +pinned/U +pinning/S +Pinocchio/M +Pinochet/M +pinochle/SM +pińon/S +pinpoint/SDG +pinprick/MDSG +pin's +pinsetter/SM +Pinsky/M +pinstripe/SDM +pintail/SM +Pinter/M +pint/MRS +pinto/S +pinup/MS +pin/US +pinwheel/DMGS +pinyin +Pinyin +piny/RT +pioneer/SDMG +pion/M +Piotr/M +piousness/MS +pious/YP +pipeline/DSMG +pipe/MS +piper/M +Piper/M +Pipestone/M +pipet's +pipette/MGSD +pipework +piping/YM +pipit/MS +pip/JSZMGDR +Pip/MR +Pippa/M +pipped +pipping +pippin/SM +Pippo/M +Pippy/M +pipsqueak/SM +piquancy/MS +piquantness/M +piquant/PY +pique/GMDS +piracy/MS +Piraeus/M +Pirandello/M +piranha/SM +pirate/MGSD +piratical/Y +pirogi +pirogies +pirouette/MGSD +pis +Pisa/M +piscatorial +Pisces/M +Pisistratus/M +pismire/SM +Pissaro/M +piss/DSRG! +pistachio/MS +piste/SM +pistillate +pistil/MS +pistoleers +pistole/M +pistol/SMGD +piston/SM +pitapat/S +pitapatted +pitapatting +pita/SM +Pitcairn/M +pitchblende/SM +pitcher/M +pitchfork/GDMS +pitching/M +pitchman/M +pitchmen +pitch/RSDZG +pitchstone/M +piteousness/SM +piteous/YP +pitfall/SM +pithily +pithiness/SM +pith/MGDS +piths +pithy/RTP +pitiableness/M +pitiable/P +pitiably +pitier/M +pitifuller +pitifullest +pitifulness/M +pitiful/PY +pitilessness/SM +pitiless/PY +pitman/M +pit/MS +Pitney/M +piton/SM +pittance/SM +pitted +pitting +Pittman/M +Pittsburgh/ZM +Pittsfield/M +Pitt/SM +Pittston/M +pituitary/SM +pitying/Y +pity/ZDSRMG +Pius/M +pivotal/Y +pivot/DMSG +pivoting/M +pix/DSG +pixel/SM +pixie/MS +pixiness +pixmap/SM +Pizarro/M +pizazz/S +pi/ZGDRH +pizza/SM +pizzeria/SM +pizzicati +pizzicato +pj's +PJ's +pk +pkg +pkt +pkwy +Pkwy +pl +placard/DSMG +placate/NGVXDRS +placatory +placeable/A +placebo/SM +placed/EAU +place/DSRJLGZM +placeholder/S +placekick/DGS +placeless/Y +placement/AMES +placental/S +placenta/SM +placer/EM +places/EA +placidity/SM +placidness/M +placid/PY +placing/AE +placket/SM +plagiarism/MS +plagiarist/MS +plagiarize/GZDSR +plagiary/SM +plagued/U +plague/MGRSD +plaguer/M +plaice/M +plaid/DMSG +plainclothes +plainclothesman +plainclothesmen +Plainfield/M +plainness/MS +plainsman/M +plainsmen +plainsong/SM +plainspoken +plain/SPTGRDY +plaintiff/MS +plaintiveness/M +plaintive/YP +plaint/VMS +Plainview/M +plaiting/M +plait/SRDMG +planar +planarity +Planck/M +plan/DRMSGZ +planeload +planer/M +plane's +plane/SCGD +planetarium/MS +planetary +planetesimal/M +planet/MS +planetoid/SM +plangency/S +plangent +planking/M +plank/SJMDG +plankton/MS +planned/U +planner/SM +planning +Plano +planoconcave +planoconvex +Plantagenet/M +plantain/MS +plantar +plantation/MS +planter/MS +planting/S +plantlike +plant's +plant/SADG +plaque/MS +plash/GSDM +plasma/MS +plasmid/S +plasm/M +plasterboard/MS +plasterer/M +plastering/M +plaster/MDRSZG +plasterwork/M +plastically +plasticine +Plasticine/M +plasticity/SM +plasticize/GDS +plastic/MYS +plateau/GDMS +plateful/S +platelet/SM +platen/M +plater/M +plate/SM +platform/SGDM +Plath/M +plating/M +platinize/GSD +platinum/MS +platitude/SM +platitudinous/Y +plat/JDNRSGXZ +Plato/M +platonic +Platonic +Platonism/M +Platonist +platoon/MDSG +platted +Platte/M +platter/MS +Platteville/M +platting +platypus/MS +platys +platy/TR +plaudit/MS +plausibility/S +plausible/P +plausibly +Plautus/M +playability/U +playable/U +playacting/M +playact/SJDG +playback/MS +playbill/SM +Playboy/M +playboy/SM +play/DRSEBG +played/A +player's/E +player/SM +playfellow/S +playfulness/MS +playful/PY +playgirl/SM +playgoer/MS +playground/MS +playgroup/S +playhouse/SM +playing/S +playmate/MS +playoff/S +playpen/SM +playroom/SM +plays/A +Playtex/M +plaything/MS +playtime/SM +playwright/SM +playwriting/M +plaza/SM +pleader/MA +pleading/MY +plead/ZGJRDS +pleasanter +pleasantest +pleasantness/SMU +pleasantry/MS +pleasant/UYP +pleased/EU +pleaser/M +pleases/E +please/Y +pleasingness/M +pleasing/YP +plea/SM +pleas/RSDJG +pleasurableness/M +pleasurable/P +pleasurably +pleasureful +pleasure/MGBDS +pleasure's/E +pleasures/E +pleater/M +pleat/RDMGS +plebeian/SY +plebe/MS +plebiscite/SM +plectra +plectrum/SM +pledger/M +pledge/RSDMG +Pleiads +Pleistocene +plenary/S +plenipotentiary/S +plenitude/MS +plenteousness/M +plenteous/PY +plentifulness/M +plentiful/YP +plenty/SM +plenum/M +pleonasm/MS +plethora/SM +pleurae +pleural +pleura/M +pleurisy/SM +Plexiglas/MS +plexus/SM +pliability/MS +pliableness/M +pliable/P +pliancy/MS +pliantness/M +pliant/YP +plication/MA +plier/MA +plight/GMDRS +plimsolls +plinker/M +plink/GRDS +plinth/M +plinths +Pliny/M +Pliocene/S +PLO +plodded +plodder/SM +plodding/SY +plod/S +plopped +plopping +plop/SM +plosive +plot/SM +plotted/A +plotter/MDSG +plotting +plover/MS +plowed/U +plower/M +plowman/M +plowmen +plow/SGZDRM +plowshare/MS +ploy's +ploy/SCDG +plucker/M +pluckily +pluckiness/SM +pluck/SGRD +plucky/TPR +pluggable +plugged/UA +plugging/AU +plughole +plug's +plug/US +plumage/DSM +plumbago/M +plumbed/U +plumber/M +plumbing/M +plumb/JSZGMRD +plume/SM +plummer +plummest +plummet/DSG +plummy +plumper/M +plumpness/S +plump/RDNYSTGP +plum/SMDG +plumy/TR +plunder/GDRSZ +plunger/M +plunge/RSDZG +plunker/M +plunk/ZGSRD +pluperfect/S +pluralism/MS +pluralistic +pluralist/S +plurality/SM +pluralization/MS +pluralize/GZRSD +pluralizer/M +plural/SY +plushness/MS +plush/RSYMTP +plushy/RPT +plus/S +plussed +plussing +Plutarch/M +plutocracy/MS +plutocratic +plutocrat/SM +Pluto/M +plutonium/SM +pluvial/S +ply/AZNGRSD +Plymouth/M +plywood/MS +pm +PM +Pm/M +PMS +pneumatically +pneumatic/S +pneumatics/M +pneumonia/MS +PO +poacher/M +poach/ZGSRD +Pocahontas/M +pocketbook/SM +pocketful/SM +pocketing/M +pocketknife/M +pocketknives +pocket/MSRDG +pock/GDMS +pockmark/MDSG +Pocono/MS +podded +podding +podge/ZR +Podgorica/M +podiatrist/MS +podiatry/MS +podium/MS +pod/SM +Podunk/M +Poe/M +poem/MS +poesy/GSDM +poetaster/MS +poetess/MS +poetically +poeticalness +poetical/U +poetic/S +poetics/M +poet/MS +poetry/SM +pogo +Pogo/M +pogrom/GMDS +poignancy/MS +poignant/Y +Poincaré/M +poinciana/SM +Poindexter/M +poinsettia/SM +pointblank +pointedness/M +pointed/PY +pointer/M +pointillism/SM +pointillist/SM +pointing/M +pointlessness/SM +pointless/YP +point/RDMZGS +pointy/TR +poise/M +pois/GDS +poi/SM +poisoner/M +poisoning/M +poisonous/PY +poison/RDMZGSJ +Poisson/M +poke/DRSZG +Pokemon/M +pokerface/D +poker/M +poky/SRT +Poland/M +Polanski/M +polarimeter/SM +polarimetry +polariscope/M +Polaris/M +polarity/MS +polarization/CMS +polarized/UC +polarize/RSDZG +polarizes/C +polarizing/C +polarogram/SM +polarograph +polarography/M +Polaroid/SM +polar/S +polecat/SM +polemical/Y +polemicist/S +polemic/S +polemics/M +pole/MS +Pole/MS +poler/M +polestar/S +poleward/S +pol/GMDRS +policeman/M +policemen/M +police/MSDG +policewoman/M +policewomen +policyholder/MS +policymaker/S +policymaking +policy/SM +poliomyelitides +poliomyelitis/M +polio/SM +Polish +polished/U +polisher/M +polish/RSDZGJ +polis/M +Politburo/M +politburo/S +politeness/MS +polite/PRTY +politesse/SM +politically +political/U +politician/MS +politicization/S +politicize/CSDG +politicked +politicking/SM +politico/SM +politic/S +politics/M +polity/MS +polka/SDMG +Polk/M +pollack/SM +Pollard/M +polled/U +pollen/GDM +pollinate/XSDGN +pollination/M +pollinator/MS +polliwog/SM +poll/MDNRSGX +pollock's +Pollock/SM +pollster/MS +pollutant/MS +polluted/U +polluter/M +pollute/RSDXZVNG +pollution/M +Pollux/M +Pollyanna/M +Polly/M +pollywog's +Pol/MY +Polo/M +polo/MS +polonaise/MS +polonium/MS +poltergeist/SM +poltroon/MS +polyandrous +polyandry/MS +polyatomic +polybutene/MS +polycarbonate +polychemicals +polychrome +polyclinic/MS +polycrystalline +polyelectrolytes +polyester/SM +polyether/S +polyethylene/SM +polygamist/MS +polygamous/Y +polygamy/MS +polyglot/S +polygonal/Y +polygon/MS +polygraph/MDG +polygraphs +polygynous +polyhedral +polyhedron/MS +Polyhymnia/M +polyisobutylene +polyisocyanates +polymath/M +polymaths +polymerase/S +polymeric +polymerization/SM +polymerize/SDG +polymer/MS +polymorphic +polymorphism/MS +polymorph/M +polymyositis +Polynesia/M +Polynesian/S +polynomial/YMS +Polyphemus/M +polyphonic +polyphony/MS +polyphosphate/S +polyp/MS +polypropylene/MS +polystyrene/SM +polysyllabic +polysyllable/SM +polytechnic/MS +polytheism/SM +polytheistic +polytheist/SM +polythene/M +polytonal/Y +polytopes +polyunsaturated +polyurethane/SM +polyvinyl/MS +Po/M +pomade/MGSD +pomander/MS +pomegranate/SM +Pomerania/M +Pomeranian +pommel/GSMD +Pomona/M +Pompadour/M +pompadour/MDS +pompano/SM +Pompeian/S +Pompeii/M +Pompey/M +pompom/SM +pompon's +pomposity/MS +pompousness/S +pompous/YP +pomp/SM +ponce/M +Ponce/M +Ponchartrain/M +poncho/MS +ponderer/M +ponderousness/MS +ponderous/PY +ponder/ZGRD +pond/SMDRGZ +pone/SM +pongee/MS +poniard/GSDM +pons/M +Pontchartrain/M +Pontiac/M +Pontianak/M +pontiff/MS +pontifical/YS +pontificate/XGNDS +pontoon/SMDG +pony/DSMG +ponytail/SM +pooch/GSDM +poodle/MS +poof/MS +pooh/DG +Pooh/M +poohs +Poole/M +pool/MDSG +poolroom/MS +poolside +Poona/M +poop/MDSG +poorboy +poorhouse/MS +poorness/MS +poor/TYRP +popcorn/MS +Popek/MS +pope/SM +Pope/SM +Popeye/M +popgun/SM +popinjay/MS +poplar/SM +poplin/MS +Popocatepetl/M +popover/SM +poppa/MS +popped +Popper/M +popper/SM +poppet/M +popping +Poppins/M +poppycock/MS +Poppy/M +poppy/SDM +poppyseed +Popsicle/MS +pop/SM +populace/MS +popularism +popularity/UMS +popularization/SM +popularize/A +popularized +popularizer/MS +popularizes/U +popularizing +popular/YS +populate/CXNGDS +populated/UA +populates/A +populating/A +population/MC +populism/S +populist/SM +populousness/MS +populous/YP +porcelain/SM +porch/SM +porcine +porcupine/MS +pore/ZGDRS +Porfirio/M +porgy/SM +poring/Y +porker/M +porky/TSR +pork/ZRMS +pornographer/SM +pornographic +pornographically +pornography/SM +porno/S +porn/S +porosity/SM +porousness/MS +porous/PY +porphyritic +porphyry/MS +porpoise/DSGM +porridge/MS +Porrima/M +porringer/MS +Porsche/M +portability/S +portables +portable/U +portably +port/ABSGZMRD +portage/ASM +portaged +portaging +portal/SM +portamento/M +portcullis/MS +ported/CE +Porte/M +portend/SDG +portentousness/M +portentous/PY +portent/SM +porterage/M +porter/DMG +porterhouse/SM +Porter/M +porter's/A +portfolio/MS +porthole/SM +Portia/M +porticoes +portico/M +Portie/M +portičre/SM +porting/E +portion/KGSMD +Portland/M +portliness/SM +portly/PTR +portmanteau/SM +Port/MR +Pôrto/M +portraitist/SM +portrait/MS +portraiture/MS +portrayal/SM +portrayer/M +portray/GDRS +ports/CE +Portsmouth/M +Portugal/M +Portuguese/M +portulaca/MS +Porty/M +posed/CA +Poseidon/M +poser/KME +poses/CA +poseur/MS +pose/ZGKDRSE +posh/DSRGT +posing/CA +positifs +positionable +positional/KY +position/KGASMD +position's/EC +positions/EC +positiveness/S +positive/RSPYT +positivism/M +positivist/S +positivity +positron/SM +posit/SCGD +Posner/M +posse/M +possess/AGEDS +possessed/PY +possession/AEMS +possessional +possessiveness/MS +possessive/PSMY +possessor/MS +possibility/SM +possible/TRS +possibly +poss/S +possum/MS +postage/MS +postal/S +post/ASDRJG +postbag/M +postbox/SM +postcard/SM +postcode/SM +postcondition/S +postconsonantal +postdate/DSG +postdoctoral +posteriori +posterior/SY +posterity/SM +poster/MS +postfix/GDS +postgraduate/SM +posthaste/S +posthumousness/M +posthumous/YP +posthypnotic +postilion/MS +postindustrial +posting/M +postlude/MS +Post/M +postman/M +postmarital +postmark/GSMD +postmaster/SM +postmen +postmeridian +postmistress/MS +postmodern +postmodernist +postmortem/S +postnasal +postnatal +postoperative/Y +postorder +postpaid +postpartum +postpone/GLDRS +postponement/S +postpositions +postprandial +post's +postscript/SM +postsecondary +postulate/XGNSD +postulation/M +postural +posture/MGSRD +posturer/M +postvocalic +postwar +posy/SM +potability/SM +potableness/M +potable/SP +potage/M +potash/MS +potassium/MS +potatoes +potato/M +potbelly/MSD +potboiler/M +potboil/ZR +pot/CMS +Potemkin/M +potency/MS +potentate/SM +potentiality/MS +potential/SY +potentiating +potentiometer/SM +potent/YS +potful/SM +pothead/MS +potherb/MS +pother/GDMS +potholder/MS +pothole/SDMG +potholing/M +pothook/SM +potion/SM +potlatch/SM +potluck/MS +Potomac/M +potpie/SM +potpourri/SM +Potsdam/M +potsherd/MS +potshot/S +pottage/SM +Pottawatomie/M +potted +Potter/M +potter/RDMSG +pottery/MS +potting +Potts/M +potty/SRT +pouch/SDMG +Poughkeepsie/M +Poul/M +poulterer/MS +poultice/DSMG +poultry/MS +pounce/SDG +poundage/MS +pounder/MS +pound/KRDGS +Pound/M +pour/DSG +pourer's +Poussin/MS +pouter/M +pout/GZDRS +poverty/MS +POW +powderpuff +powder/RDGMS +powdery +Powell/M +powerboat/MS +powerfulness/M +powerful/YP +power/GMD +powerhouse/MS +powerlessness/SM +powerless/YP +Powers +Powhatan/M +pow/RZ +powwow/GDMS +pox/GMDS +Poznan/M +pp +PP +ppm +ppr +PPS +pr +PR +practicability/S +practicable/P +practicably +practicality/SM +practicalness/M +practical/YPS +practice/BDRSMG +practiced/U +practicer/M +practicum/SM +practitioner/SM +Pradesh/M +Prado/M +Praetorian +praetorian/S +praetor/MS +pragmatical/Y +pragmatic/S +pragmatics/M +pragmatism/MS +pragmatist/MS +Prague/M +Praia +prairie/MS +praise/ESDG +praiser/S +praise's +praiseworthiness/MS +praiseworthy/P +praising/Y +Prakrit/M +praline/MS +pram/MS +prancer/M +prance/ZGSRD +prancing/Y +prank/SMDG +prankster/SM +praseodymium/SM +Pratchett/M +prate/DSRGZ +prater/M +pratfall/MS +prating/Y +prattle/DRSGZ +prattler/M +prattling/Y +Pratt/M +Prattville/M +Pravda/M +prawn/MDSG +praxes +praxis/M +Praxiteles/M +pray/DRGZS +prayerbook +prayerfulness/M +prayerful/YP +prayer/M +PRC +preach/DRSGLZJ +preacher/M +preaching/Y +preachment/MS +preachy/RT +preadolescence/S +Preakness/M +preallocate/XGNDS +preallocation/M +preallocator/S +preamble/MGDS +preamp +preamplifier/M +prearrange/LSDG +prearrangement/SM +preassign/SDG +preauthorize +prebendary/M +Precambrian +precancel/DGS +precancerous +precariousness/MS +precarious/PY +precautionary +precaution/SGDM +precede/DSG +precedence/SM +precedented/U +precedent/SDM +preceptive/Y +preceptor/MS +precept/SMV +precess/DSG +precession/M +precinct/MS +preciosity/MS +preciousness/S +precious/PYS +precipice/MS +precipitable +precipitant/S +precipitateness/M +precipitate/YNGVPDSX +precipitation/M +precipitousness/M +precipitous/YP +preciseness/SM +precise/XYTRSPN +precision/M +précis/MDG +preclude/GDS +preclusion/S +precociousness/MS +precocious/YP +precocity/SM +precode/D +precognition/SM +precognitive +precollege/M +precolonial +precomputed +preconceive/GSD +preconception/SM +precondition/GMDS +preconscious +precook/GDS +precursor/SM +precursory +precut +predate/NGDSX +predation/CMS +predator/SM +predatory +predecease/SDG +predecessor/MS +predeclared +predecline +predefine/GSD +predefinition/SM +predesignate/GDS +predestination/SM +predestine/SDG +predetermination/MS +predeterminer/M +predetermine/ZGSRD +predicable/S +predicament/SM +predicate/VGNXSD +predication/M +predicator +predictability/UMS +predictable/U +predictably/U +predict/BSDGV +predicted/U +prediction/MS +predictive/Y +predictor/MS +predigest/GDS +predilect +predilection/SM +predispose/SDG +predisposition/MS +predoctoral +predominance/SM +predominant/Y +predominate/YSDGN +predomination/M +preemie/MS +preeminence/SM +preeminent/Y +preemployment/M +preempt/GVSD +preemption/SM +preemptive/Y +preemptor/M +preener/M +preen/SRDG +preexist/DSG +preexistence/SM +preexistent +prefabbed +prefabbing +prefab/MS +prefabricate/XNGDS +prefabrication/M +preface/DRSGM +prefacer/M +prefatory +prefect/MS +prefecture/MS +preferableness/M +preferable/P +preferably +prefer/BL +preference/MS +preferential/Y +preferment/SM +preferred +preferring +prefiguration/M +prefigure/SDG +prefix/MDSG +preflight/SGDM +preform/DSG +pref/RZ +pregnancy/SM +pregnant/Y +preheat/GDS +prehensile +prehistoric +prehistorical/Y +prehistory/SM +preindustrial +preinitialize/SDG +preinterview/M +preisolated +prejudge/DRSG +prejudger/M +prejudgment/SM +prejudiced/U +prejudice/MSDG +prejudicial/PY +prekindergarten/MS +prelacy/MS +prelate/SM +preliminarily +preliminary/S +preliterate/S +preloaded +prelude/GMDRS +preluder/M +premarital/Y +premarket +prematureness/M +premature/SPY +prematurity/M +premedical +premeditated/Y +premeditate/XDSGNV +premeditation/M +premed/S +premenstrual +premiere/MS +premier/GSDM +premiership/SM +Preminger/M +premise/GMDS +premiss's +premium/MS +premix/GDS +premolar/S +premonition/SM +premonitory +prenatal/Y +Pren/M +Prenticed/M +Prentice/MGD +Prenticing/M +Prentiss/M +Prent/M +prenuptial +preoccupation/MS +preoccupy/DSG +preoperative +preordain/DSLG +prepackage/GSD +prepaid +preparation/SM +preparative/SYM +preparatory +preparedly +preparedness/USM +prepared/UP +prepare/ZDRSG +prepay/GLS +prepayment/SM +prepender/S +prepends +preplanned +preponderance/SM +preponderant/Y +preponderate/DSYGN +prepositional/Y +preposition/SDMG +prepossess/GSD +prepossessing/U +prepossession/MS +preposterousness/M +preposterous/PY +prepped +prepping +preppy/RST +preprepared +preprint/SGDM +preprocessed +preprocessing +preprocessor/S +preproduction +preprogrammed +prep/SM +prepubescence/S +prepubescent/S +prepublication/M +prepuce/SM +prequel/S +preradiation +prerecord/DGS +preregister/DSG +preregistration/MS +prerequisite/SM +prerogative/SDM +Pres +presage/GMDRS +presager/M +presbyopia/MS +presbyterian +Presbyterianism/S +Presbyterian/S +presbyter/MS +presbytery/MS +preschool/RSZ +prescience/SM +prescient/Y +Prescott/M +prescribed/U +prescriber/M +prescribe/RSDG +prescription/SM +prescriptive/Y +prescript/SVM +preselect/SGD +presence/SM +presentableness/M +presentable/P +presentably/A +presentational/A +presentation/AMS +presented/A +presenter/A +presentiment/MS +presentment/SM +presents/A +present/SLBDRYZGP +preservationist/S +preservation/SM +preservative/SM +preserve/DRSBZG +preserved/U +preserver/M +preset/S +presetting +preshrank +preshrink/SG +preshrunk +preside/DRSG +presidency/MS +presidential/Y +president/SM +presider/M +presidia +presidium/M +Presley/M +presoaks +presort/GDS +pres/S +press/ACDSG +pressed/U +presser/MS +pressingly/C +pressing/YS +pressman/M +pressmen +pressure/DSMG +pressurization/MS +pressurize/DSRGZ +pressurized/U +prestidigitate/NX +prestidigitation/M +prestidigitatorial +prestidigitator/M +prestige/MS +prestigious/PY +Preston/M +presto/S +presumably +presume/BGDRS +presumer/M +presuming/Y +presumption/MS +presumptive/Y +presumptuousness/SM +presumptuous/YP +presuppose/GDS +presupposition/S +pretax +preteen/S +pretended/Y +pretender/M +pretending/U +pretend/SDRZG +pretense/MNVSX +pretension/GDM +pretentiousness/S +pretentious/UYP +preterite's +preterit/SM +preternatural/Y +pretest/SDG +pretext/SMDG +Pretoria/M +pretreated +pretreatment/S +pretrial +prettify/SDG +prettily +prettiness/SM +pretty/TGPDRS +pretzel/SM +prevailing/Y +prevail/SGD +prevalence/MS +prevalent/SY +prevaricate/DSXNG +prevaricator/MS +preventable/U +preventably +preventative/S +prevent/BSDRGV +preventer/M +prevention/MS +preventiveness/M +preventive/SPY +preview/ZGSDRM +previous/Y +prevision/SGMD +prewar +prexes +preyer's +prey/SMDG +Priam/M +priapic +Pribilof/M +price/AGSD +priced/U +priceless +Price/M +pricer/MS +price's +pricey +pricier +priciest +pricker/M +pricking/M +prickle/GMDS +prickliness/S +prickly/RTP +prick/RDSYZG +prideful/Y +pride/GMDS +prier/M +priestess/MS +priesthood/SM +Priestley/M +priestliness/SM +priestly/PTR +priest/SMYDG +prigged +prigging +priggishness/S +priggish/PYM +prig/SM +primacy/MS +primal +primarily +primary/MS +primate/MS +primed/U +primely/M +primeness/M +prime/PYS +primer/M +Prime's +primeval/Y +priming/M +primitiveness/SM +primitive/YPS +primitivism/M +primmed +primmer +primmest +primming +primness/MS +primogenitor/MS +primogeniture/MS +primordial/YS +primp/DGS +primrose/MGSD +prim/SPJGZYDR +princedom/MS +princeliness/SM +princely/PRT +Prince/M +prince/SMY +princess/MS +Princeton/M +principality/MS +principal/SY +Principe/M +Principia/M +principled/U +principle/SDMG +printable/U +printably +print/AGDRS +printed/U +printer/AM +printers +printing/SM +printmaker/M +printmake/ZGR +printmaking/M +printout/S +Prinz/M +prioress/MS +priori +prioritize/DSRGZJ +priority/MS +prior/YS +priory/SM +Pris +Prisca/M +Priscella/M +Priscilla/M +prised +prise/GMAS +prismatic +prism/MS +prison/DRMSGZ +prisoner/M +Prissie/M +prissily +prissiness/SM +prissy/RSPT +pristine/Y +prithee/S +privacy/MS +privateer/SMDG +privateness/M +private/NVYTRSXP +privation/MCS +privative/Y +privatization/S +privatize/GSD +privet/SM +privileged/U +privilege/SDMG +privily +privy/SRMT +prized/A +prize/DSRGZM +prizefighter/M +prizefighting/M +prizefight/SRMGJZ +prizewinner/S +prizewinning +Pr/MN +PRO +proactive +probabilist +probabilistic +probabilistically +probability/SM +probable/S +probably +probated/A +probate/NVMX +probates/A +probating/A +probational +probationary/S +probationer/M +probation/MRZ +probation's/A +probative/A +prober/M +probity/SM +problematical/UY +problematic/S +problem/SM +proboscis/MS +prob/RBJ +procaine/MS +procedural/SY +procedure/MS +proceeder/M +proceeding/M +proceed/JRDSG +process/BSDMG +processed/UA +processes/A +processional/YS +procession/GD +processor/MS +proclamation/MS +proclivity/MS +proconsular +procrastinate/XNGDS +procrastination/M +procrastinator/MS +procreational +procreatory +procrustean +Procrustean +Procrustes/M +proctor/GSDM +proctorial +procurable/U +procure/L +procurement/MS +Procyon/M +prodded +prodding +prodigality/S +prodigal/SY +prodigiousness/M +prodigious/PY +prodigy/MS +prod/S +produce/AZGDRS +producer/AM +producible/A +production/ASM +productively/UA +productiveness/MS +productive/PY +productivities +productivity/A +productivity's +productize/GZRSD +product/V +Prof +profanation/S +profaneness/MS +profane/YPDRSG +profanity/MS +professed/Y +professionalism/SM +professionalize/GSD +professional/USY +profession/SM +professorial/Y +professorship/SM +professor/SM +proffer/GSD +proficiency/SM +proficient/YS +profitability/MS +profitableness/MU +profitable/UP +profitably/U +profiteer/GSMD +profiterole/MS +profit/GZDRB +profitless +profligacy/S +profligate/YS +proforma/S +profoundity +profoundness/SM +profound/PTYR +prof/S +profundity/MS +profuseness/MS +profuse/YP +progenitor/SM +progeny/M +progesterone/SM +prognathous +prognoses +prognosis/M +prognosticate/NGVXDS +prognostication/M +prognosticator/S +prognostic/S +program/CSA +programed +programing +programmability +programmable/S +programmed/CA +programmer/ASM +programming/CA +programmings +progression/SM +progressiveness/SM +progressive/SPY +progressivism +progress/MSDVG +prohibiter/M +prohibitionist/MS +prohibition/MS +Prohibition/MS +prohibitiveness/M +prohibitive/PY +prohibitory +prohibit/VGSRD +projected/AU +projectile/MS +projectionist/MS +projection/MS +projective/Y +project/MDVGS +projector/SM +Prokofieff/M +Prokofiev/M +prolegomena +proletarianization/M +proletarianized +proletarian/S +proletariat/SM +proliferate/GNVDSX +proliferation/M +prolifically +prolific/P +prolixity/MS +prolix/Y +prologize +prologue/MGSD +prologuize +prolongate/NGSDX +prolongation/M +prolonger/M +prolong/G +promenade/GZMSRD +promenader/M +Promethean +Prometheus/M +promethium/SM +prominence/MS +prominent/Y +promiscuity/MS +promiscuousness/M +promiscuous/PY +promise/GD +promising/UY +promissory +promontory/MS +promote/GVZBDR +promoter/M +promotiveness/M +promotive/P +prompted/U +prompter/M +promptitude/SM +promptness/MS +prompt/SGJTZPYDR +pro/MS +promulgate/NGSDX +promulgation/M +promulgator/MS +pron +proneness/MS +prone/PY +pronghorn/SM +prong/SGMD +pronominalization +pronominalize +pronounceable/U +pronouncedly +pronounced/U +pronounce/GLSRD +pronouncement/SM +pronouncer/M +pronto +pronunciation/SM +proofed/A +proofer +proofing/M +proofreader/M +proofread/GZSR +proof/SEAM +propaganda/SM +propagandistic +propagandist/SM +propagandize/DSG +propagated/U +propagate/SDVNGX +propagation/M +propagator/MS +propellant/MS +propelled +propeller/MS +propelling +propel/S +propensity/MS +properness/M +proper/PYRT +propertied/U +property/SDM +prophecy/SM +prophesier/M +prophesy/GRSDZ +prophetess/S +prophetic +prophetical/Y +prophet/SM +prophylactic/S +prophylaxes +prophylaxis/M +propinquity/MS +propionate/M +propitiate/GNXSD +propitiatory +propitiousness/M +propitious/YP +proponent/MS +proportionality/M +proportional/SY +proportionate/YGESD +proportioner/M +proportion/ESGDM +proportionment/M +proposal/SM +propped +propping +proprietary/S +proprietorial +proprietorship/SM +proprietor/SM +proprietress/MS +propriety/MS +proprioception +proprioceptive +prop/SZ +propulsion/MS +propulsive +propylene/M +prorogation/SM +prorogue +prosaic +prosaically +proscenium/MS +prosciutti +prosciutto/SM +proscription/SM +proscriptive +pros/DSRG +prosecute/SDBXNG +prosecution/M +prosecutor/MS +proselyte/SDGM +proselytism/MS +proselytize/ZGDSR +prose/M +proser/M +Proserpine/M +prosodic/S +prosody/MS +prospect/DMSVG +prospection/SM +prospectiveness/M +prospective/SYP +prospector/MS +prospectus/SM +prosper/GSD +prosperity/MS +prosperousness/M +prosperous/PY +prostate +prostheses +prosthesis/M +prosthetic/S +prosthetics/M +prostitute/DSXNGM +prostitution/M +prostrate/SDXNG +prostration/M +prosy/RT +protactinium/MS +protagonist/SM +Protagoras/M +protean/S +protease/M +protect/DVGS +protected/UY +protectionism/MS +protectionist/MS +protection/MS +protectiveness/S +protective/YPS +protectorate/SM +protector/MS +protégées +protégé/SM +protein/MS +proteolysis/M +proteolytic +Proterozoic/M +protestantism +Protestantism/MS +protestant/S +Protestant/SM +protestation/MS +protest/G +protesting/Y +Proteus/M +protocol/DMGS +protoplasmic +protoplasm/MS +prototype/SDGM +prototypic +prototypical/Y +protozoa +protozoan/MS +protozoic +protozoon's +protract/DG +protrude/SDG +protrusile +protrusion/MS +protrusive/PY +protuberance/S +protuberant +Proudhon/M +proud/TRY +Proust/M +provabilities +provability's +provability/U +provableness/M +provable/P +provably +prov/DRGZB +proved/U +proven/U +prove/ESDAG +provenance/SM +Provençal +Provencals +Provence/M +provender/SDG +provenience/SM +provenly +proverb/DG +proverbial/Y +Proverbs/M +prover/M +provide/DRSBGZ +provided/U +providence/SM +Providence/SM +providential/Y +provident/Y +provider/M +province/SM +provincialism/SM +provincial/SY +provisional/YS +provisioner/M +provision/R +proviso/MS +provocateur/S +provocativeness/SM +provocative/P +provoked/U +provoke/GZDRS +provoking/Y +provolone/SM +Provo/M +provost/MS +prowess/SM +prowler/M +prowl/RDSZG +prow/TRMS +proximal/Y +proximateness/M +proximate/PY +proximity/MS +Proxmire/M +proxy/SM +Prozac +prude/MS +Prudence/M +prudence/SM +Prudential/M +prudential/SY +prudent/Y +prudery/MS +Prudi/M +prudishness/SM +prudish/YP +Prudy/M +Prue/M +Pruitt/M +Pru/M +prune/DSRGZM +pruner/M +prurience/MS +prurient/Y +Prussia/M +Prussian/S +prussic +Prut/M +Pryce/M +pry/DRSGTZ +pryer's +prying/Y +P's +PS +p's/A +psalmist/SM +psalm/SGDM +Psalms/M +psalter +Psalter/SM +psaltery/MS +psephologist/M +pseudonymous +pseudonym/SM +pseudopod +pseudo/S +pseudoscience/S +pshaw/SDG +psi/S +psittacoses +psittacosis/M +psoriases +psoriasis/M +psst/S +PST +psychedelically +psychedelic/S +psyche/M +Psyche/M +psychiatric +psychiatrist/SM +psychiatry/MS +psychical/Y +psychic/MS +psychoacoustic/S +psychoacoustics/M +psychoactive +psychoanalysis/M +psychoanalyst/S +psychoanalytic +psychoanalytical +psychoanalyze/SDG +psychobabble/S +psychobiology/M +psychocultural +psychodrama/MS +psychogenic +psychokinesis/M +psycholinguistic/S +psycholinguistics/M +psycholinguists +psychological/Y +psychologist/MS +psychology/MS +psychometric/S +psychometrics/M +psychometry/M +psychoneuroses +psychoneurosis/M +psychopathic/S +psychopath/M +psychopathology/M +psychopaths +psychopathy/SM +psychophysical/Y +psychophysic/S +psychophysics/M +psychophysiology/M +psychosis/M +psycho/SM +psychosocial/Y +psychosomatic/S +psychosomatics/M +psychos/S +psychotherapeutic/S +psychotherapist/MS +psychotherapy/SM +psychotically +psychotic/S +psychotropic/S +psychs +psych/SDG +PT +PTA +Ptah/M +ptarmigan/MS +pt/C +pterodactyl/SM +Pt/M +PTO +Ptolemaic +Ptolemaists +Ptolemy/MS +ptomaine/MS +Pu +pubbed +pubbing +pubertal +puberty/MS +pubes +pubescence/S +pubescent +pubic +pubis/M +publican/AMS +publication/AMS +publicist/SM +publicity/SM +publicized/U +publicize/SDG +publicness/M +publics/A +public/YSP +publishable/U +published/UA +publisher/ASM +publishes/A +publishing/M +publish/JDRSBZG +pub/MS +Puccini/M +puce/SM +pucker/DG +Puckett/M +puck/GZSDRM +puckishness/S +puckish/YP +Puck/M +pudding/MS +puddle/JMGRSD +puddler/M +puddling/M +puddly +pudenda +pudendum/M +pudginess/SM +pudgy/PRT +Puebla/M +Pueblo/MS +pueblo/SM +puerile/Y +puerility/SM +puerperal +puers +Puerto/M +puffball/SM +puffer/M +puffery/M +puffiness/S +puffin/SM +Puff/M +puff/SGZDRM +puffy/PRT +Puget/M +pugged +pugging +Pugh/M +pugilism/SM +pugilistic +pugilist/S +pug/MS +pugnaciousness/MS +pugnacious/YP +pugnacity/SM +puissant/Y +puke/GDS +pukka +Pulaski/SM +pulchritude/SM +pulchritudinous/M +pule/GDS +Pulitzer/SM +pullback/S +pull/DRGZSJ +pullet/SM +pulley/SM +Pullman/MS +pullout/S +pullover/SM +pulmonary +pulpiness/S +pulpit/MS +pulp/MDRGS +pulpwood/MS +pulpy/PTR +pulsar/MS +pulsate/NGSDX +pulsation/M +pulse/ADSG +pulser +pulse's +pulverable +pulverization/MS +pulverized/U +pulverize/GZSRD +pulverizer/M +pulverizes/UA +puma/SM +pumice/SDMG +pummel/SDG +pumpernickel/SM +pump/GZSMDR +pumping/M +pumpkin/MS +punchbowl/M +punched/U +puncheon/MS +puncher/M +punch/GRSDJBZ +punchline/S +Punch/M +punchy/RT +punctilio/SM +punctiliousness/SM +punctilious/PY +punctualities +punctuality/UM +punctualness/M +punctual/PY +punctuate/SDXNG +punctuational +punctuation/M +puncture/SDMG +punditry/S +pundit/SM +pungency/MS +pungent/Y +Punic +puniness/MS +punished/U +punisher/M +punishment/MS +punish/RSDGBL +punitiveness/M +punitive/YP +Punjabi/M +Punjab/M +punk/TRMS +punky/PRS +pun/MS +punned +punning +punster/SM +punter/M +punt/GZMDRS +puny/PTR +pupae +pupal +pupa/M +pupate/NGSD +pupillage/M +pupil/SM +pup/MS +pupped +puppeteer/SM +puppetry/MS +puppet/SM +pupping +puppy/GSDM +puppyish +purblind +Purcell/M +purchasable +purchase/GASD +purchaser/MS +purdah/M +purdahs +Purdue/M +purebred/S +puree/DSM +pureeing +pureness/MS +pure/PYTGDR +purgation/M +purgative/MS +purgatorial +purgatory/SM +purge/GZDSR +purger/M +purify/GSRDNXZ +Purim/SM +Purina/M +purine/SM +purism/MS +puristic +purist/MS +puritanic +puritanical/Y +Puritanism/MS +puritanism/S +puritan/SM +Puritan/SM +purity/SM +purlieu/SM +purl/MDGS +purloin/DRGS +purloiner/M +purple/MTGRSD +purplish +purport/DRSZG +purported/Y +purposefulness/S +purposeful/YP +purposelessness/M +purposeless/PY +purpose/SDVGYM +purposiveness/M +purposive/YP +purr/DSG +purring/Y +purse/DSRGZM +purser/M +pursuance/MS +pursuant +pursuer/M +pursue/ZGRSD +pursuit/MS +purulence/MS +purulent +Purus +purveyance/MS +purvey/DGS +purveyor/MS +purview/SM +Pusan/M +Pusey/M +pushbutton/S +pushcart/SM +pushchair/SM +pushdown +push/DSRBGZ +pusher/M +pushily +pushiness/MS +Pushkin/M +pushover/SM +Pushtu/M +pushy/PRT +pusillanimity/MS +pusillanimous/Y +pus/SM +puss/S +pussycat/S +pussyfoot/DSG +pussy/TRSM +pustular +pustule/MS +putative/Y +Putin/M +put/IS +Putnam/M +Putnem/M +putout/S +putrefaction/SM +putrefactive +putrefy/DSG +putrescence/MS +putrescent +putridity/M +putridness/M +putrid/YP +putsch/S +putted/I +puttee/MS +putter/RDMGZ +putting/I +putt/SGZMDR +puttying/M +putty/SDMG +puzzle/JRSDZLG +puzzlement/MS +puzzler/M +PVC +pvt +Pvt/M +PW +PX +p/XTGJ +Pygmalion/M +pygmy/SM +Pygmy/SM +Pyhrric/M +pyknotic +Pyle/M +pylon/SM +pylori +pyloric +pylorus/M +Pym/M +Pynchon/M +Pyongyang/M +pyorrhea/SM +Pyotr/M +pyramidal/Y +pyramid/GMDS +pyre/MS +Pyrenees +Pyrex/SM +pyridine/M +pyrimidine/SM +pyrite/MS +pyroelectric +pyroelectricity/SM +pyrolysis/M +pyrolyze/RSM +pyromaniac/SM +pyromania/MS +pyrometer/MS +pyrometry/M +pyrophosphate/M +pyrotechnical +pyrotechnic/S +pyrotechnics/M +pyroxene/M +pyroxenite/M +Pyrrhic +Pythagoras/M +Pythagorean/S +Pythias +Python/M +python/MS +pyx/MDSG +q +Q +QA +Qaddafi/M +Qantas/M +Qatar/M +QB +QC +QED +Qingdao +Qiqihar/M +QM +Qom/M +qr +q's +Q's +qt +qty +qua +Quaalude/M +quackery/MS +quackish +quack/SDG +quadded +quadding +quadrangle/MS +quadrangular/M +quadrant/MS +quadraphonic/S +quadrapole +quadratical/Y +quadratic/SM +quadrature/MS +quadrennial/SY +quadrennium/MS +quadric +quadriceps/SM +quadrilateral/S +quadrille/XMGNSD +quadrillion/MH +quadripartite/NY +quadriplegia/SM +quadriplegic/SM +quadrivia +quadrivium/M +quadrupedal +quadruped/MS +quadruple/GSD +quadruplet/SM +quadruplicate/GDS +quadruply/NX +quadrupole +quad/SM +quadword/MS +quaffer/M +quaff/SRDG +quagmire/DSMG +quahog/MS +quail/GSDM +quaintness/MS +quaint/PTYR +quake/GZDSR +Quakeress/M +Quakerism/S +Quaker/SM +quaky/RT +qualification/ME +qualified/UY +qualifier/SM +qualify/EGXSDN +qualitative/Y +quality/MS +qualmish +qualm/SM +quandary/MS +quangos +quanta/M +Quantico/M +quantifiable/U +quantified/U +quantifier/M +quantify/GNSRDZX +quantile/S +quantitativeness/M +quantitative/PY +quantity/MS +quantization/MS +quantizer/M +quantize/ZGDRS +quantum/M +quarantine/DSGM +quark/SM +quarreler/M +quarrellings +quarrelsomeness/MS +quarrelsome/PY +quarrel/SZDRMG +quarrier/M +quarryman/M +quarrymen +quarry/RSDGM +quarterback/SGMD +quarterdeck/MS +quarterer/M +quarterfinal/MS +quartering/M +quarterly/S +quartermaster/MS +quarter/MDRYG +quarterstaff/M +quarterstaves +quartet/SM +quartic/S +quartile/SM +quarto/SM +quart/RMSZ +quartzite/M +quartz/SM +quasar/SM +quash/GSD +quasi +quasilinear +Quasimodo/M +Quaternary +quaternary/S +quaternion/SM +quatrain/SM +quaver/GDS +quavering/Y +quavery +Quayle/M +quayside/M +quay/SM +queasily +queasiness/SM +queasy/TRP +Quebec/M +Quechua/M +Queenie/M +queenly/RT +queen/SGMDY +Queensland/M +Queen/SM +queerness/S +queer/STGRDYP +queller/M +quell/SRDG +Que/M +quenchable/U +quenched/U +quencher/M +quench/GZRSDB +quenchless +Quentin/M +Quent/M +Querida/M +quern/M +querulousness/S +querulous/YP +query/MGRSD +quested/A +quester/AS +quester's +quest/FSIM +questing +questionableness/M +questionable/P +questionably/U +questioned/UA +questioner/M +questioning/UY +questionnaire/MS +question/SMRDGBZJ +quests/A +Quetzalcoatl/M +queued/C +queue/GZMDSR +queuer/M +queues/C +queuing/C +Quezon/M +quibble/GZRSD +quibbler/M +quiche/SM +quicken/RDG +quickie/MS +quicklime/SM +quickness/MS +quick/RNYTXPS +quicksand/MS +quicksilver/GDMS +quickstep/SM +quid/SM +quiesce/D +quiescence/MS +quiescent/YP +quieted/E +quieten/SGD +quieter/E +quieter's +quieting/E +quietly/E +quietness/MS +quiets/E +quietude/IEMS +quietus/MS +quiet/UTGPSDRY +Quillan/M +quill/GSDM +Quill/M +quilter/M +quilting/M +quilt/SZJGRDM +quincentenary/M +quince/SM +Quincey/M +quincy/M +Quincy/M +quinine/MS +Quinlan/M +Quinn/M +quinquennial/Y +quinsy/SM +Quinta/M +Quintana/M +quintessence/SM +quintessential/Y +quintet/SM +quintic +quintile/SM +Quintilian/M +Quintilla/M +quintillion/MH +quintillionth/M +Quintina/M +Quintin/M +Quint/M +quint/MS +Quinton/M +quintuple/SDG +quintuplet/MS +Quintus/M +quip/MS +quipped +quipper +quipping +quipster/SM +quired/AI +quire/MDSG +quires/AI +Quirinal/M +quiring/IA +quirkiness/SM +quirk/SGMD +quirky/PTR +quirt/SDMG +Quisling/M +quisling/SM +quitclaim/GDMS +quit/DGS +quite/SADG +Quito/M +quittance/SM +quitter/SM +quitting +quiver/GDS +quivering/Y +quivery +Quixote/M +quixotic +quixotically +Quixotism/M +quiz/M +quizzed +quizzer/SM +quizzes +quizzical/Y +quizzing +quo/H +quoin/SGMD +quoit/GSDM +quondam +quonset +Quonset +quorate/I +quorum/MS +quotability/S +quota/MS +quotation/SM +quoter/M +quote/UGSD +quot/GDRB +quotidian/S +quotient/SM +qwerty +qwertys +Rabat/M +rabbet/GSMD +Rabbi/M +rabbi/MS +rabbinate/MS +rabbinic +rabbinical/Y +rabbiter/M +rabbit/MRDSG +rabble/GMRSD +rabbler/M +Rabelaisian +Rabelais/M +rabidness/SM +rabid/YP +rabies +Rabi/M +Rabin/M +rabis +Rab/M +raccoon/SM +racecourse/MS +racegoers +racehorse/SM +raceme/MS +race/MZGDRSJ +racer/M +racetrack/SMR +raceway/SM +Rachael/M +Rachele/M +Rachelle/M +Rachel/M +Rachmaninoff/M +racialism/MS +racialist/MS +racial/Y +racily +Racine/M +raciness/MS +racism/S +racist/MS +racketeer/MDSJG +racket/SMDG +rackety +rack/GDRMS +raconteur/SM +racoon's +racquetball/S +racquet's +racy/RTP +radarscope/MS +radar/SM +Radcliffe/M +radded +radder +raddest +Raddie/M +radding +Raddy/M +radial/SY +radiance/SM +radian/SM +radiant/YS +radiate/XSDYVNG +radiation/M +radiative/Y +radiator/MS +radicalism/MS +radicalization/S +radicalize/GSD +radicalness/M +radical/SPY +radices's +radii/M +radioactive/Y +radioactivity/MS +radioastronomical +radioastronomy +radiocarbon/MS +radiochemical/Y +radiochemistry/M +radiogalaxy/S +radiogram/SM +radiographer/MS +radiographic +radiography/MS +radioisotope/SM +radiologic +radiological/Y +radiologist/MS +radiology/MS +radioman/M +radiomen +radiometer/SM +radiometric +radiometry/MS +radionics +radionuclide/M +radiopasteurization +radiophone/MS +radiophysics +radioscopy/SM +radio/SMDG +radiosonde/SM +radiosterilization +radiosterilized +radiotelegraph +radiotelegraphs +radiotelegraphy/MS +radiotelephone/SM +radiotherapist/SM +radiotherapy/SM +radish/MS +radium/MS +radius/M +radix/SM +Rad/M +radon/SM +rad/S +Raeann/M +Rae/M +RAF +Rafaela/M +Rafaelia/M +Rafaelita/M +Rafaellle/M +Rafaello/M +Rafael/M +Rafa/M +Rafe/M +Raffaello/M +Raffarty/M +Rafferty/M +raffia/SM +raffishness/SM +raffish/PY +raffle/MSDG +Raff/M +Rafi/M +Raf/M +rafter/DM +raft/GZSMDR +raga/MS +ragamuffin/MS +ragbag/SM +rage/MS +raggedness/SM +ragged/PRYT +raggedy/TR +ragging +rag/GSMD +raging/Y +raglan/MS +Ragnar/M +Ragnarök +ragout/SMDG +ragtag/MS +ragtime/MS +ragweed/MS +ragwort/M +Rahal/M +rah/DG +Rahel/M +rahs +raider/M +raid/MDRSGZ +railbird/S +rail/CDGS +railer/SM +railhead/SM +railing/MS +raillery/MS +railroader/M +railroading/M +railroad/SZRDMGJ +rail's +railwaymen +railway/MS +raiment/SM +Raimondo/M +Raimund/M +Raimundo/M +Raina/M +rainbow/MS +raincloud/S +raincoat/SM +raindrop/SM +Raine/MR +Rainer/M +rainfall/SM +rainforest's +rain/GSDM +Rainier/M +rainless +rainmaker/SM +rainmaking/MS +rainproof/GSD +rainstorm/SM +rainwater/MS +rainy/RT +raise/DSRGZ +raiser/M +raising/M +raisin/MS +rajah/M +rajahs +Rajive/M +raj/M +Rakel/M +rake/MGDRS +raker/M +rakishness/MS +rakish/PY +Raleigh/M +Ralf/M +Ralina/M +rally/GSD +Ralph/M +Ralston/M +Ra/M +Ramada/M +Ramadan/SM +Ramakrishna/M +Rama/M +Raman/M +Ramayana/M +ramble/JRSDGZ +rambler/M +rambling/Y +Rambo/M +rambunctiousness/S +rambunctious/PY +ramekin/SM +ramie/MS +ramification/M +ramify/XNGSD +Ramirez/M +Ramiro/M +ramjet/SM +Ram/M +rammed +ramming +Ramo/MS +Ramona/M +Ramonda/M +Ramon/M +rampage/SDG +rampancy/S +rampant/Y +rampart/SGMD +ramp/GMDS +ramrodded +ramrodding +ramrod/MS +RAM/S +Ramsay/M +Ramses/M +Ramsey/M +ramshackle +ram/SM +rams/S +ran/A +Rana/M +Rancell/M +Rance/M +rancher/M +rancho/SM +ranch/ZRSDMJG +rancidity/MS +rancidness/SM +rancid/P +rancorous/Y +rancor/SM +Randall/M +Randal/M +Randa/M +Randee/M +Randell/M +Randene/M +Randie/M +Randi/M +randiness/S +Rand/M +rand/MDGS +Randolf/M +Randolph/M +randomization/SM +randomize/SRDG +randomness/SM +random/PYS +Randy/M +randy/PRST +Ranee/M +ranee/SM +ranged/C +rangeland/S +ranger/M +ranges/C +range/SM +rang/GZDR +ranginess/S +ranging/C +Rangoon/M +rangy/RPT +Rania/M +Ranice/M +Ranier/M +Rani/MR +Ranique/M +rani's +ranked/U +ranker/M +rank/GZTYDRMPJS +Rankine/M +ranking/M +Rankin/M +rankle/SDG +rankness/MS +Ranna/M +ransacker/M +ransack/GRDS +Ransell/M +ransomer/M +Ransom/M +ransom/ZGMRDS +ranter/M +rant/GZDRJS +ranting/Y +Raoul/M +rapaciousness/MS +rapacious/YP +rapacity/MS +rapeseed/M +rape/SM +Raphaela/M +Raphael/M +rapidity/MS +rapidness/S +rapid/YRPST +rapier/SM +rapine/SM +rapist/MS +rap/MDRSZG +rapped +rappelled +rappelling +rappel/S +rapper/SM +rapping/M +rapporteur/SM +rapport/SM +rapprochement/SM +rapscallion/MS +raptness/S +rapture/MGSD +rapturousness/M +rapturous/YP +rapt/YP +Rapunzel/M +Raquela/M +Raquel/M +rarebit/MS +rarefaction/MS +rarefy/GSD +rareness/MS +rare/YTPGDRS +rarity/SM +Rasalgethi/M +Rasalhague/M +rascal/SMY +rasher/M +rashness/S +rash/PZTYSR +Rasia/M +Rasla/M +Rasmussen/M +raspberry/SM +rasper/M +rasping/Y +rasp/SGJMDR +Rasputin/M +raspy/RT +Rastaban/M +Rastafarian/M +raster/MS +Rastus/M +ratchet/MDSG +rateable +rated/U +rate/KNGSD +ratepayer/SM +rater/M +rate's +Ratfor/M +rather +Rather/M +rathskeller/SM +ratifier/M +ratify/ZSRDGXN +rating/M +ratiocinate/VNGSDX +ratiocination/M +ratio/MS +rationale/SM +rationalism/SM +rationalistic +rationalist/S +rationality/MS +rationalization/SM +rationalizer/M +rationalize/ZGSRD +rationalness/M +rational/YPS +ration/DSMG +Ratliff/M +ratlike +ratline/SM +rat/MDRSJZGB +rattail +rattan/MS +ratted +ratter/MS +ratting +rattlebrain/DMS +rattle/RSDJGZ +rattlesnake/MS +rattletrap/MS +rattling/Y +rattly/TR +rattrap/SM +ratty/RT +raucousness/SM +raucous/YP +Raul/M +raunchily +raunchiness/S +raunchy/RTP +ravage/GZRSD +ravager/M +raveling/S +Ravel/M +ravel/UGDS +raven/JGMRDS +Raven/M +ravenous/YP +raver/M +rave/ZGDRSJ +Ravid/M +Ravi/M +ravine/SDGM +ravioli/SM +ravisher/M +ravishing/Y +ravish/LSRDZG +ravishment/SM +Raviv/M +Rawalpindi/M +rawboned +rawhide/SDMG +Rawley/M +Rawlings/M +Rawlins/M +Rawlinson/M +rawness/SM +raw/PSRYT +Rawson/M +Rayburn/M +Raychel/M +Raye/M +ray/GSMD +Rayleigh/M +Ray/M +Raymond/M +Raymondville/M +Raymund/M +Raymundo/M +Rayna/M +Raynard/M +Raynell/M +Rayner/M +Raynor/M +rayon/SM +Rayshell/M +Raytheon/M +raze/DRSG +razer/M +razorback/SM +razorblades +razor/MDGS +razz/GDS +razzmatazz/S +Rb +RBI/S +RC +RCA +rcpt +RCS +rd +RD +RDA +Rd/M +reabbreviate +reachability +reachable/U +reachably +reached/U +reacher/M +reach/GRB +reacquisition +reactant/SM +reacted/U +reaction +reactionary/SM +reactivity +readability/MS +readable/P +readably +readdress/G +Reade/M +reader/M +readership/MS +Read/GM +readied +readies +readily +readinesses +readiness/UM +reading/M +Reading/M +read/JGZBR +readopt/G +readout/MS +reads/A +readying +ready/TUPR +Reagan/M +Reagen/M +realisms +realism's +realism/U +realistically/U +realistic/U +realist/SM +reality/USM +realizability/MS +realizableness/M +realizable/SMP +realizably/S +realization/MS +realized/U +realize/JRSDBZG +realizer/M +realizes/U +realizing/MY +realm/M +realness/S +realpolitik/SM +real/RSTP +realtor's +Realtor/S +realty/SM +Rea/M +reamer/M +ream/MDRGZ +Reamonn/M +reanimate +reaper/M +reappraise/G +reap/SGZ +rear/DRMSG +rearguard/MS +rearmost +rearrange/L +rearward/S +reasonableness/SMU +reasonable/UP +reasonably/U +Reasoner/M +reasoner/SM +reasoning/MS +reasonless +reasons +reason/UBDMG +reassess/GL +reassuringly/U +reattach/GSL +reawakening/M +Reba/M +rebate/M +Rebbecca/M +Rebeca/M +Rebecca's +Rebecka/M +Rebekah/M +Rebeka/M +Rebekkah/M +rebeller +rebellion/SM +rebelliousness/MS +rebellious/YP +rebel/MS +Rebe/M +rebid +rebidding +rebind/G +rebirth +reboil/G +rebook +reboot/ZR +rebound/G +rebroadcast/MG +rebuke/RSDG +rebuking/Y +rebus +rebuttal/SM +rebutting +rec +recalcitrance/SM +recalcitrant/S +recalibrate/N +recantation/S +recant/G +recap +recappable +recapping +recast/G +recd +rec'd +recede +receipt/SGDM +receivable/S +received/U +receiver/M +receivership/SM +receive/ZGRSDB +recency/M +recension/M +recentness/SM +recent/YPT +receptacle/SM +receptionist/MS +reception/MS +receptiveness/S +receptive/YP +receptivity/S +receptor/MS +recessional/S +recessionary +recessiveness/M +recessive/YPS +recess/SDMVG +rechargeable +recheck/G +recherché +recherches +recidivism/MS +recidivist/MS +Recife/M +recipe/MS +recipiency +recipient/MS +reciprocal/SY +reciprocate/NGXVDS +reciprocation/M +reciprocity/MS +recitalist/S +recital/MS +recitative/MS +reciter/M +recite/ZR +recked +recking +recklessness/S +reckless/PY +reckoner/M +reckoning/M +reckon/SGRDJ +reclaim/B +reclamation/SM +recliner/M +recline/RSDZG +recluse/MVNS +reclusion/M +recode/G +recognizability +recognizable/U +recognizably +recognize/BZGSRD +recognizedly/S +recognized/U +recognizer/M +recognizingly/S +recognizing/UY +recoilless +recoinage +recolor/GD +recombinant +recombine +recommended/U +recompense/GDS +recompute/B +reconciled/U +reconciler/M +reconcile/SRDGB +reconditeness/M +recondite/YP +reconfigurability +reconfigure/R +reconnaissance/MS +reconnect/R +reconnoiter/GSD +reconquer/G +reconsecrate +reconstitute +reconstructed/U +Reconstruction/M +reconsult/G +recontact/G +recontaminate/N +recontribute +recook/G +recopy/G +recorded/AU +records/A +record/ZGJ +recourse +recoverability +recoverable/U +recover/B +recovery/MS +recreant/S +recreational +recriminate/GNVXDS +recrimination/M +recriminatory +recross/G +recrudesce/GDS +recrudescence/MS +recrudescent +recruiter/M +recruitment/MS +recruit/ZSGDRML +recrystallize +rectal/Y +rectangle/SM +rectangular/Y +recta's +rectifiable +rectification/M +rectifier/M +rectify/DRSGXZN +rectilinear/Y +rectitude/MS +recto/MS +rector/SM +rectory/MS +rectum/SM +recumbent/Y +recuperate/VGNSDX +recuperation/M +recur +recurrence/MS +recurrent +recurse/NX +recursion/M +recusant/M +recuse +recyclable/S +recycle/BZ +redact/DGS +redaction/SM +redactor/MS +redbird/SM +redbreast/SM +redbrick/M +redbud/M +redcap/MS +redcoat/SM +redcurrant/M +redden/DGS +redder +reddest +redding +reddish/P +Redd/M +redeclaration +redecorate +redeemable/U +redeem/BRZ +redeemed/U +redeemer/M +Redeemer/M +redemptioner/M +redemption/RMS +redemptive +redeposit/M +redetermination +Redford/M +Redgrave/M +redhead/DRMS +Redhook/M +redial/G +redirect/G +redirection +redlining/S +Redmond/M +redneck/SMD +redness/MS +redo/G +redolence/MS +redolent +Redondo/M +redouble/S +redoubtably +redound/GDS +red/PYS +redshift/S +redskin/SM +Redstone/M +reduced/U +reducer/M +reduce/RSDGZ +reducibility/M +reducible +reducibly +reductionism/M +reductionist/S +reduction/SM +reduct/V +redundancy/SM +redundant/Y +redwood/SM +redye +redyeing +Reeba/M +Reebok/M +Reece/M +reecho/G +reed/GMDR +reediness/SM +reeding/M +Reed/M +Reedville/M +reedy/PTR +reefer/M +reef/GZSDRM +reeker/M +reek/GSR +reeler/M +reel's +reel/USDG +Ree/MDS +Reena/M +reenforcement +reentrant +Reese/M +reestimate/M +Reeta/M +Reeva/M +reeve/G +Reeves +reexamine +refection/SM +refectory/SM +refer/B +refereed/U +refereeing +referee/MSD +reference/CGSRD +referenced/U +reference's +referencing/U +referendum/MS +referentiality +referential/YM +referent/SM +referral/SM +referred +referrer/S +referring +reffed +reffing +refile +refinance +refined/U +refine/LZ +refinement/MS +refinish/G +refit +reflectance/M +reflected/U +reflectional +reflection/SM +reflectiveness/M +reflective/YP +reflectivity/M +reflector/MS +reflect/SDGV +reflexion/MS +reflexiveness/M +reflexive/PSY +reflexivity/M +reflex/YV +reflooring +refluent +reflux/G +refocus/G +refold/G +reforestation +reforge/G +reformatory/SM +reform/B +reformed/U +reformer/M +reformism/M +reformist/S +refract/DGVS +refractiveness/M +refractive/PY +refractometer/MS +refractoriness/M +refractory/PS +refrain/DGS +refreshed/U +refreshing/Y +refresh/LB +refreshment/MS +refrigerant/MS +refrigerated/U +refrigerate/XDSGN +refrigeration/M +refrigerator/MS +refrozen +refry/GS +refugee/MS +refuge/SDGM +Refugio/M +refulgence/SM +refulgent +refund/B +refunder/M +refurbish/L +refurbishment/S +refusal/SM +refuse/R +refuser/M +refutation/MS +refute/GZRSDB +refuter/M +ref/ZS +reg +regale/L +regalement/S +regal/GYRD +regalia/M +Regan/M +regard/EGDS +regardless/PY +regather/G +regatta/MS +regency/MS +regeneracy/MS +regenerately +regenerateness/M +regenerate/U +Regen/M +reggae/SM +Reggie/M +Reggi/MS +Reggy/M +regicide/SM +regime/MS +regimen/MS +regimental/S +regimentation/MS +regiment/SDMG +Reginae +Reginald/M +Regina/M +Reginauld/M +Regine/M +regionalism/MS +regional/SY +region/SM +Regis/M +register's +register/UDSG +registrable +registrant/SM +registrar/SM +registration/AM +registrations +registry/MS +Reg/MN +regnant +Regor/M +regress/DSGV +regression/MS +regressiveness/M +regressive/PY +regressors +regretfulness/M +regretful/PY +regret/S +regrettable +regrettably +regretted +regretting +reground +regroup/G +regrow/G +regularity/MS +regularization/MS +regularize/SDG +regular/YS +regulate/CSDXNG +regulated/U +regulation/M +regulative +regulator/SM +regulatory +Regulus/M +regurgitate/XGNSD +regurgitation/M +rehabbed +rehabbing +rehabilitate/SDXVGN +rehabilitation/M +rehab/S +rehang/G +rehear/GJ +rehearsal/SM +rehearse +rehearsed/U +rehearser/M +rehears/R +reheat/G +reheating/M +Rehnquist +rehydrate +Reichenberg/M +Reich/M +Reichstags +Reichstag's +Reidar/M +Reider/M +Reid/MR +reign/MDSG +Reiko/M +Reilly/M +reimburse/GSDBL +reimbursement/MS +Reinald/M +Reinaldo/MS +Reina/M +reindeer/M +Reine/M +reinforced/U +reinforce/GSRDL +reinforcement/MS +reinforcer/M +rein/GDM +Reinhard/M +Reinhardt/M +Reinhold/M +Reinold/M +reinstate/L +reinstatement/MS +reinsurance +Reinwald/M +reissue +REIT +reiterative/SP +rejecter/M +rejecting/Y +rejection/SM +rejector/MS +reject/RDVGS +rejigger +rejoice/RSDJG +rejoicing/Y +rejoinder/SM +rejuvenate/NGSDX +rejuvenatory +relapse +relatedly +relatedness/MS +related/U +relater/M +relate/XVNGSZ +relational/Y +relation/M +relationship/MS +relativeness/M +relative/SPY +relativism/M +relativistic +relativistically +relativist/MS +relativity/MS +relator's +relaxant/SM +relaxation/MS +relaxedness/M +relaxed/YP +relax/GZD +relaxing/Y +relay/GDM +relearn/G +releasable/U +release/B +released/U +relenting/U +relentlessness/SM +relentless/PY +relent/SDG +relevance/SM +relevancy/MS +relevant/Y +reliability/UMS +reliables +reliable/U +reliably/U +reliance/MS +reliant/Y +relicense/R +relic/MS +relict/C +relict's +relief/M +relievedly +relieved/U +reliever/M +relieve/RSDZG +religionists +religion/SM +religiosity/M +religiousness/MS +religious/PY +relink/G +relinquish/GSDL +relinquishment/SM +reliquary/MS +relish/GSD +relive/GB +reload/GR +relocate/B +reluctance/MS +reluctant/Y +rel/V +rely/DG +rem +Re/M +remade/S +remainder/SGMD +remain/GD +remake/M +remand/DGS +remap +remapping +remarkableness/S +remarkable/U +remarkably +remark/BG +remarked/U +Remarque/M +rematch/G +Rembrandt/M +remeasure/D +remediableness/M +remediable/P +remedy/SDMG +remembered/U +rememberer/M +remember/GR +remembrance/MRS +remembrancer/M +Remington/M +reminisce/GSD +reminiscence/SM +reminiscent/Y +remissness/MS +remiss/YP +remit/S +remittance/MS +remitted +remitting/U +Rem/M +remnant/MS +remodel/G +remolding +remonstrant/MS +remonstrate/SDXVNG +remonstration/M +remonstrative/Y +remorsefulness/M +remorseful/PY +remorselessness/MS +remorseless/YP +remorse/SM +remoteness/MS +remote/RPTY +remoulds +removal/MS +REM/S +remunerated/U +remunerate/VNGXSD +remuneration/M +remunerativeness/M +remunerative/YP +Remus/M +Remy/M +Renado/M +Renae/M +renaissance/S +Renaissance/SM +renal +Renaldo/M +Rena/M +Renard/M +Renascence/SM +Renata/M +Renate/M +Renato/M +renaturation +Renaud/M +Renault/MS +rend +renderer/M +render/GJRD +rendering/M +rendezvous/DSMG +rendition/GSDM +rend/RGZS +Renee/M +renegade/SDMG +renege/GZRSD +reneger/M +Renelle/M +Renell/M +Rene/M +renewal/MS +renew/BG +renewer/M +Renie/M +rennet/MS +Rennie/M +rennin/SM +Renoir/M +Reno/M +renounce/LGRSD +renouncement/MS +renouncer/M +renovate/NGXSD +renovation/M +renovator/SM +renown/SGDM +Rensselaer/M +rentaller +rental/SM +renter/M +rent/GZMDRS +renumber/G +renumeration +renunciate/VNX +renunciation/M +Renville/M +reoccupy/G +reopen/G +reorganized/U +repack/G +repairable/U +repair/BZGR +repairer/M +repairman/M +repairmen +repairs/E +repaper +reparable +reparation/SM +reparteeing +repartee/MDS +repartition/Z +repast/G +repatriate/SDXNG +repave +repealer/M +repeal/GR +repeatability/M +repeatable/U +repeatably +repeated/Y +repeater/M +repeat/RDJBZG +repelled +repellent/SY +repelling/Y +repel/S +repentance/SM +repentant/SY +repent/RDG +repertoire/SM +repertory/SM +repetition +repetitiousness/S +repetitious/YP +repetitiveness/MS +repetitive/PY +repine/R +repiner/M +replace/RL +replay/GM +replenish/LRSDG +replenishment/S +repleteness/MS +replete/SDPXGN +repletion/M +replica/SM +replicate/SDVG +replicator/S +replug +reply/X +Rep/M +repopulate +reported/Y +reportorial/Y +reposeful +repose/M +repository/MS +reprehend/GDS +reprehensibility/MS +reprehensibleness/M +reprehensible/P +reprehensibly +reprehension/MS +representable/U +representational/Y +representativeness/M +Representative/S +representative/SYMP +representativity +represented/U +represent/GB +repression/SM +repressiveness/M +repressive/YP +repress/V +reprieve/GDS +reprimand/SGMD +reprint/M +reprisal/MS +reproacher/M +reproachfulness/M +reproachful/YP +reproach/GRSDB +reproaching/Y +reprobate/N +reprocess/G +reproducibility/MS +reproducible/S +reproducibly +reproductive/S +reproof/G +reprove/R +reproving/Y +rep/S +reptile/SM +reptilian/S +Republicanism/S +republicanism/SM +Republican/S +republic/M +republish/G +repudiate/XGNSD +repudiation/M +repudiator/S +repugnance/MS +repugnant/Y +repulse/VNX +repulsion/M +repulsiveness/MS +repulsive/PY +reputability/SM +reputably/E +reputation/SM +reputed/Y +repute/ESB +reputing +requested/U +request/G +Requiem/MS +requiem/SM +require/LR +requirement/MS +requisiteness/M +requisite/PNXS +requisitioner/M +requisition/GDRM +requital/MS +requited/U +requiter/M +requite/RZ +reread/G +rerecord/G +rerouteing +rerunning +res/C +rescale +rescind/SDRG +rescission/SM +rescue/GZRSD +reseal/BG +research/MB +reselect/G +resemblant +resemble/DSG +resend/G +resent/DSLG +resentfulness/SM +resentful/PY +resentment/MS +reserpine/MS +reservation/MS +reservednesses +reservedness/UM +reserved/UYP +reservist/SM +reservoir/MS +reset/RDG +resettle/L +reshipping +reshow/G +reshuffle/M +reside/G +residence/MS +residency/SM +residential/Y +resident/SM +resider/M +residua +residual/YS +residuary +residue/SM +residuum/M +resignation/MS +resigned/YP +resilience/MS +resiliency/S +resilient/Y +resin/D +resinlike +resinous +resiny +resistance/SM +Resistance/SM +resistantly +resistants +resistant/U +resisted/U +resistible +resistibly +resisting/U +resistiveness/M +resistive/PY +resistivity/M +resistless +resistor/MS +resist/RDZVGS +resize/G +resold +resole/G +resoluble +resoluteness/MS +resolute/PYTRV +resolvability/M +resolvable/U +resolved/U +resolvent +resonance/SM +resonant/YS +resonate/DSG +resonator/MS +resorption/MS +resort/R +resound/G +resourcefulness/SM +resourceful/PY +resp +respectability/SM +respectable/SP +respectably +respect/BSDRMZGV +respected/E +respectful/EY +respectfulness/SM +respecting/E +respectiveness/M +respective/PY +respect's/E +respects/E +respell/G +respiration/MS +respirator/SM +respiratory/M +resplendence/MS +resplendent/Y +respondent/MS +respond/SDRZG +responser/M +response/RSXMV +responsibility/MS +responsibleness/M +responsible/P +responsibly +responsiveness/MSU +responsive/YPU +respray/G +restart/B +restate/L +restaurant/SM +restaurateur/SM +rest/DRSGVM +rested/U +rester/M +restfuller +restfullest +restfulness/MS +restful/YP +restitution/SM +restiveness/SM +restive/PY +restlessness/MS +restless/YP +restorability +Restoration/M +restoration/MS +restorative/PYS +restorer/M +restore/Z +restrained/UY +restraint/MS +restrict/DVGS +restricted/YU +restriction/SM +restrictively +restrictiveness/MS +restrictives +restrictive/U +restroom/SM +restructurability +restructure +rest's/U +rests/U +restudy/M +restyle +resubstitute +resultant/YS +result/SGMD +resume/SDBG +resumption/MS +resurface +resurgence/MS +resurgent +resurrect/GSD +resurrection/SM +resurvey/G +resuscitate/XSDVNG +resuscitation/M +resuscitator/MS +retail/Z +retainer/M +retain/LZGSRD +retake +retaliate/VNGXSD +retaliation/M +retaliatory +Reta/M +retardant/SM +retardation/SM +retarder/M +retard/ZGRDS +retch/SDG +retention/SM +retentiveness/S +retentive/YP +retentivity/M +retest/G +Retha/M +rethought +reticence/S +reticent/Y +reticle/SM +reticular +reticulate/GNYXSD +reticulation/M +reticule/MS +reticulum/M +retinal/S +retina/SM +retinue/MS +retiredness/M +retiree/MS +retire/L +retirement/SM +retiring/YP +retort/GD +retract/DG +retractile +retrench/L +retrenchment/MS +retributed +retribution/MS +retributive +retrieval/SM +retriever/M +retrieve/ZGDRSB +retroactive/Y +retrofire/GMSD +retrofit/S +retrofitted +retrofitting +retroflection +retroflex/D +retroflexion/M +retrogradations +retrograde/GYDS +retrogression/MS +retrogressive/Y +retrogress/SDVG +retrorocket/MS +retro/SM +retrospection/MS +retrospective/SY +retrospect/SVGMD +retrovirus/S +retrovision +retry/G +retsina/SM +returnable/S +returned/U +returnee/SM +retype +Reube/M +Reuben/M +Reub/NM +Reunion/M +reuse/B +Reuters +Reuther/M +reutilization +Reuven/M +Reva/M +revanchist +revealed/U +revealingly +revealing/U +reveal/JBG +reveille/MS +revelation/MS +Revelation/MS +revelatory +revelry/MS +revel/SJRDGZ +revenge/MGSRD +revenger/M +revenuer/M +revenue/ZR +reverberant +reverberate/XVNGSD +reverberation/M +revere/GSD +Revere/M +reverencer/M +reverence/SRDGM +Reverend +reverend/SM +reverential/Y +reverent/Y +reverie/SM +reversal/MS +reverser/M +reverse/Y +reversibility/M +reversible/S +reversibly +reversioner/M +reversion/R +revers/M +reverter/M +revertible +revert/RDVGS +revet/L +revetment/SM +review/G +revile/GZSDL +revilement/MS +reviler/M +revise/BRZ +revised/U +revisionary +revisionism/SM +revisionist/SM +revitalize/ZR +revivalism/MS +revivalist/MS +revival/SM +reviver/M +revive/RSDG +revivification/M +revivify/X +Revkah/M +Revlon/M +Rev/M +revocable +revoke/GZRSD +revolter/M +revolt/GRD +revolting/Y +revolutionariness/M +revolutionary/MSP +revolutionist/MS +revolutionize/GDSRZ +revolutionizer/M +revolution/SM +revolve/BSRDZJG +revolver/M +revue/MS +revulsion/MS +revved +revving +rev/ZM +rewarded/U +rewarding/Y +rewarm/G +reweave +rewedding +reweigh/G +rewind/BGR +rewire/G +rework/G +rexes +Rex/M +Reyes +Reykjavik/M +re/YM +Rey/M +Reynaldo/M +Reyna/M +Reynard/M +Reynold/SM +rezone +Rf +RF +RFC +RFD +R/G +rhapsodic +rhapsodical +rhapsodize/GSD +rhapsody/SM +Rhea/M +rhea/SM +Rheba/M +Rhee/M +Rheims/M +Rheinholdt/M +Rhenish +rhenium/MS +rheology/M +rheostat/MS +rhesus/S +Rheta/M +rhetorical/YP +rhetorician/MS +rhetoric/MS +Rhetta/M +Rhett/M +rheumatically +rheumatic/S +rheumatics/M +rheumatism/SM +rheumatoid +rheum/MS +rheumy/RT +Rhiamon/M +Rhianna/M +Rhiannon/M +Rhianon/M +Rhinelander/M +Rhineland/RM +Rhine/M +rhinestone/SM +rhinitides +rhinitis/M +rhinoceros/MS +rhino/MS +rhinotracheitis +rhizome/MS +Rh/M +Rhoda/M +Rhodes +Rhodesia/M +Rhodesian/S +Rhodia/M +Rhodie/M +rhodium/MS +rhododendron/SM +rhodolite/M +rhodonite/M +Rhody/M +rhombic +rhomboidal +rhomboid/SM +rhombus/SM +rho/MS +Rhona/M +Rhonda/M +Rhone +rhubarb/MS +rhyme/DSRGZM +rhymester/MS +Rhys/M +rhythmical/Y +rhythmic/S +rhythmics/M +rhythm/MS +RI +rial/MS +Riane/M +Riannon/M +Rianon/M +ribaldry/MS +ribald/S +ribbed +Ribbentrop/M +ribber/S +ribbing/M +ribbon/DMSG +ribcage +rib/MS +riboflavin/MS +ribonucleic +ribosomal +ribosome/MS +Rica/M +Rican/SM +Ricard/M +Ricardo/M +Ricca/M +Riccardo/M +rice/DRSMZG +Rice/M +ricer/M +Richard/MS +Richardo/M +Richardson/M +Richart/M +Richelieu/M +richen/DG +Richey/M +Richfield/M +Richie/M +Richland/M +Rich/M +Richmond/M +Richmound/M +richness/MS +Richter/M +Richthofen/M +Richy/M +rich/YNSRPT +Rici/M +Rickard/M +Rickenbacker/M +Rickenbaugh/M +Rickert/M +rickets/M +rickety/RT +Rickey/M +rick/GSDM +Rickie/M +Ricki/M +Rick/M +Rickover/M +rickrack/MS +rickshaw/SM +Ricky/M +Ric/M +ricochet/GSD +Rico/M +Ricoriki/M +ricotta/MS +riddance/SM +ridden +ridding +riddle/GMRSD +Riddle/M +ride/CZSGR +Ride/M +rider/CM +riderless +ridership/S +ridge/DSGM +Ridgefield/M +ridgepole/SM +Ridgway/M +ridgy/RT +ridicule/MGDRS +ridiculer/M +ridiculousness/MS +ridiculous/PY +riding/M +rid/ZGRJSB +Riemann/M +Riesling/SM +rife/RT +riff/GSDM +riffle/SDG +riffraff/SM +rifled/U +rifle/GZMDSR +rifleman/M +riflemen +rifler/M +rifling/M +rift/GSMD +Riga/M +rigamarole's +rigatoni/M +Rigel/M +rigged +rigger/SM +rigging/MS +Riggs/M +righteousnesses/U +righteousness/MS +righteous/PYU +rightfulness/MS +rightful/PY +rightism/SM +rightist/S +rightmost +rightness/MS +Right/S +right/SGTPYRDN +rightsize/SDG +rights/M +rightward/S +rigidify/S +rigidity/S +rigidness/S +rigid/YP +rigmarole/MS +rig/MS +Rigoberto/M +Rigoletto/M +rigor/MS +rigorousness/S +rigorous/YP +Riki/M +Rikki/M +Rik/M +rile/DSG +Riley/M +Rilke/M +rill/GSMD +Rimbaud/M +rime/MS +rimer/M +rim/GSMDR +rimless +rimmed +rimming +Rinaldo/M +Rina/M +rind/MDGS +Rinehart/M +ringer/M +ring/GZJDRM +ringing/Y +ringleader/MS +ringlet/SM +ringlike +Ringling/M +Ring/M +ringmaster/MS +Ringo/M +ringside/ZMRS +ringworm/SM +rink/GDRMS +rinse/DSRG +Riobard/M +Rio/MS +Riordan/M +rioter/M +riotousness/M +riotous/PY +riot/SMDRGZJ +RIP +riparian/S +ripcord/SM +ripened/U +ripenesses +ripeness/UM +ripen/RDG +ripe/PSY +riper/U +ripest/U +Ripley/M +Rip/M +rip/NDRSXTG +ripoff/S +riposte/SDMG +ripped +ripper/SM +ripping +rippler/M +ripple/RSDGM +ripply/TR +ripsaw/GDMS +riptide/SM +Risa/M +RISC +risen +riser/M +rise/RSJZG +risibility/SM +risible/S +rising/M +risker/M +risk/GSDRM +riskily +riskiness/MS +risky/RTP +risotto/SM +risqué +rissole/M +Ritalin +Rita/M +Ritchie/M +rite/DSM +Ritter/M +ritualism/SM +ritualistic +ritualistically +ritualized +ritual/MSY +Ritz/M +ritzy/TR +rivaled/U +Rivalee/M +rivalry/MS +rival/SGDM +Riva/MS +rive/CSGRD +Rivera/M +riverbank/SM +riverbed/S +riverboat/S +river/CM +riverfront +riverine +Rivers +Riverside/M +riverside/S +Riverview/M +riveter/M +rivet/GZSRDM +riveting/Y +Riviera/MS +Rivi/M +Rivkah/M +rivulet/SM +Rivy/M +riv/ZGNDR +Riyadh/M +riyal/SM +rm +RMS +RN +RNA +Rn/M +roach/GSDM +Roach/M +roadbed/MS +roadblock/SMDG +roadhouse/SM +roadie/S +roadkill/S +road/MIS +roadrunner/MS +roadshow/S +roadside/S +roadsigns +roadster/SM +roadsweepers +roadway/SM +roadwork/SM +roadworthy +roam/DRGZS +Roana/M +Roanna/M +Roanne/M +Roanoke/M +roan/S +roar/DRSJGZ +roarer/M +roaring/T +Roarke/M +roaster/M +roast/SGJZRD +robbed +robber/SM +Robbert/M +robbery/SM +Robbie/M +Robbi/M +robbing +Robbin/MS +Robb/M +Robby/M +Robbyn/M +robe/ESDG +Robena/M +Robenia/M +Robers/M +Roberson/M +Roberta/M +Robert/MS +Roberto/M +Robertson/SM +robe's +Robeson/M +Robespierre/M +Robina/M +Robinet/M +Robinetta/M +Robinette/M +Robinett/M +Robinia/M +Robin/M +robin/MS +Robinson/M +Robinsonville/M +Robles/M +Rob/MZ +robotic/S +robotism +robotize/GDS +robot/MS +rob/SDG +Robson/M +Robt/M +robustness/SM +robust/RYPT +Roby/M +Robyn/M +Rocco/M +Rocha/M +Rochambeau/M +Rochella/M +Rochelle/M +Rochell/M +Roche/M +Rochester/M +Rochette/M +Roch/M +rockabilly/MS +rockabye +Rockaway/MS +rockbound +Rockefeller/M +rocker/M +rocketry/MS +rocket/SMDG +Rockey/M +rockfall/S +Rockford/M +rock/GZDRMS +Rockie/M +rockiness/MS +Rockland/M +Rock/M +Rockne/M +Rockville/M +Rockwell/M +Rocky/SM +rocky/SRTP +rococo/MS +Roda/M +rodded +Roddenberry/M +rodder +Roddie/M +rodding +Rodd/M +Roddy/M +rodent/MS +rodeo/SMDG +Roderich/M +Roderick/M +Roderic/M +Roderigo/M +rode/S +Rodger/M +Rodge/ZMR +Rodie/M +Rodi/M +Rodina/M +Rodin/M +Rod/M +Rodney/M +Rodolfo/M +Rodolphe/M +Rodolph/M +Rodrick/M +Rodrigo/M +Rodriguez/M +Rodrique/M +Rodriquez/M +rod/SGMD +roebuck/SM +Roentgen's +roentgen/SM +roe/SM +ROFL +Rogelio/M +roger/GSD +Rogerio/M +Roger/M +Roget/M +Rog/MRZ +rogued/K +rogue/GMDS +roguery/MS +rogues/K +roguing/K +roguishness/SM +roguish/PY +roil/SGD +Roi/SM +roisterer/M +roister/SZGRD +Rojas/M +Roland/M +Rolando/M +Roldan/M +role/MS +Roley/M +Rolfe/M +Rolf/M +Rolland/M +rollback/SM +rolled/A +Rollerblade/S +rollerskating +roller/SM +rollick/DGS +rollicking/Y +Rollie/M +rolling/S +Rollin/SM +Rollo/M +rollover/S +roll/UDSG +Rolodex +Rolph/M +Rolvaag/M +ROM +romaine/MS +Romain/M +Roma/M +romancer/M +romance/RSDZMG +Romanesque/S +Romania/M +Romanian/SM +Romano/MS +Romanov/M +roman/S +Romansh/M +Romans/M +Roman/SM +romantically/U +romanticism/MS +Romanticism/S +romanticist/S +romanticize/SDG +romantic/MS +Romany/SM +Romeo/MS +romeo/S +Romero/M +Rome/SM +Rommel/M +Romney/M +Romola/M +Romona/M +Romonda/M +romper/M +romp/GSZDR +Rom/SM +Romulus/M +Romy/M +Ronalda/M +Ronald/M +Rona/M +Ronda/M +rondo/SM +Ronica/M +Ron/M +Ronna/M +Ronnica/M +Ronnie/M +Ronni/M +Ronny/M +Ronstadt/M +Rontgen +Roobbie/M +rood/MS +roof/DRMJGZS +roofer/M +roofgarden +roofing/M +roofless +rooftop/S +rookery/MS +rook/GDMS +rookie/SRMT +roomer/M +roomette/SM +roomful/MS +roominess/MS +roommate/SM +room/MDRGZS +roomy/TPSR +Rooney/M +Rooseveltian +Roosevelt/M +rooster/M +roost/SGZRDM +rooted/P +rooter/M +rootlessness/M +rootless/P +rootlet/SM +Root/M +root/MGDRZS +rootstock/M +rope/DRSMZG +roper/M +roping/M +Roquefort/MS +Roquemore/M +Rora/M +Rorie/M +Rori/M +Rorke/M +Rorschach +Rory/M +Rosabella/M +Rosabelle/M +Rosabel/M +Rosaleen/M +Rosales/M +Rosalia/M +Rosalie/M +Rosalinda/M +Rosalinde/M +Rosalind/M +Rosaline/M +Rosalynd/M +Rosalyn/M +Rosa/M +Rosamond/M +Rosamund/M +Rosana/M +Rosanna/M +Rosanne/M +Rosario/M +rosary/SM +Roscoe/M +Rosco/M +Roseanna/M +Roseanne/M +Roseann/M +roseate/Y +Roseau +rosebud/MS +rosebush/SM +Rosecrans/M +Roseland/M +Roselia/M +Roseline/M +Roselin/M +Rosella/M +Roselle/M +Rose/M +Rosemaria/M +Rosemarie/M +Rosemary/M +rosemary/MS +rose/MGDS +Rosemonde/M +Rosenberg/M +Rosenblum/M +Rosendo/M +Rosene/M +Rosen/M +Rosenthal/M +Rosenzweig/M +Rosetta/M +Rosette/M +rosette/SDMG +rosewater +rosewood/SM +Roshelle/M +Rosicrucian/M +Rosie/M +rosily +Rosina/M +rosiness/MS +rosin/SMDG +Rosita/M +Roslyn/M +Rosmunda/M +Ros/N +Ross +Rossetti/M +Rossie/M +Rossi/M +Rossini/M +Rossy/M +Rostand/M +roster/DMGS +Rostov/M +rostra's +rostrum/SM +Roswell/M +Rosy/M +rosy/RTP +rota/MS +Rotarian/SM +rotary/S +rotated/U +rotate/VGNXSD +rotational/Y +rotation/M +rotative/Y +rotator/SM +rotatory +ROTC +rote/MS +rotgut/MS +Roth/M +Rothschild/M +rotisserie/MS +rotogravure/SM +rotor/MS +rototill/RZ +rot/SDG +rotted +rottenness/S +rotten/RYSTP +Rotterdam/M +rotter/M +rotting +rotunda/SM +rotundity/S +rotundness/S +rotund/SDYPG +Rouault/M +roué/MS +rouge/GMDS +roughage/SM +roughen/DG +rougher/M +roughhouse/GDSM +roughish +roughneck/MDSG +roughness/MS +roughs +roughshod +rough/XPYRDNGT +roulette/MGDS +roundabout/PSM +roundedness/M +rounded/P +roundelay/SM +roundels +rounder/M +roundhead/D +roundheadedness/M +roundheaded/P +roundhouse/SM +roundish +roundness/MS +roundoff +roundup/MS +roundworm/MS +round/YRDSGPZT +Rourke/M +rouse/DSRG +rouser/M +Rousseau/M +roustabout/SM +roust/SGD +route/ASRDZGJ +router/M +route's +rout/GZJMDRS +routine/SYM +routing/M +routinize/GSD +Rouvin/M +rover/M +Rover/M +rove/ZGJDRS +roving/M +Rowan/M +rowboat/SM +rowdily +rowdiness/MS +rowdyism/MS +rowdy/PTSR +rowel/DMSG +Rowe/M +Rowena/M +rowen/M +Rowen/M +rower/M +Rowland/M +Rowley/M +Row/MN +Rowney/M +row/SJZMGNDR +Roxana/M +Roxane/M +Roxanna/M +Roxanne/M +Roxie/M +Roxi/M +Roxine/M +Roxy/M +royalist/SM +Royall/M +Royal/M +royal/SY +royalty/MS +Royce/M +Roy/M +Rozalie/M +Rozalin/M +Rozamond/M +Rozanna/M +Rozanne/M +Rozele/M +Rozella/M +Rozelle/M +Roze/M +Rozina/M +Roz/M +RP +rpm +RPM +rps +RR +Rriocard/M +rs +r's +R's +RSFSR +RSI +RSV +RSVP +RSX +rt +rte +Rte +RTFM +r/TGVJ +Rubaiyat/M +rubato/MS +rubbed +rubberize/GSD +rubberneck/DRMGSZ +rubber/SDMG +rubbery/TR +rubbing/M +rubbish/DSMG +rubbishy +rubble/GMSD +rubdown/MS +rubella/MS +Rube/M +Ruben/MS +rube/SM +Rubetta/M +Rubia/M +Rubicon/SM +rubicund +rubidium/SM +Rubie/M +Rubik/M +Rubi/M +Rubina/M +Rubin/M +Rubinstein/M +ruble/MS +rubout +rubric/MS +rub/S +Ruby/M +ruby/MTGDSR +Ruchbah/M +ruck/M +rucksack/SM +ruckus/SM +ruction/SM +rudderless +rudder/MS +Ruddie/M +ruddiness/MS +Rudd/M +Ruddy/M +ruddy/PTGRSD +rudeness/MS +rude/PYTR +Rudie/M +Rudiger/M +rudimentariness/M +rudimentary/P +rudiment/SM +Rudolf/M +Rudolfo/M +Rudolph/M +Rudyard/M +Rudy/M +ruefulness/S +rueful/PY +rue/GDS +Rufe/M +ruff/GSYDM +ruffian/GSMDY +ruffled/U +ruffler/M +ruffle/RSDG +ruffly/TR +Rufus/M +Rugby's +rugby/SM +ruggedness/S +rugged/PYRT +Ruggiero/M +rugging +rug/MS +Ruhr/M +ruination/MS +ruiner/M +ruin/MGSDR +ruinousness/M +ruinous/YP +Ruiz/M +rulebook/S +ruled/U +rule/MZGJDRS +ruler/GMD +ruling/M +Rumanian's +Rumania's +rumba/GDMS +rumble/JRSDG +rumbler/M +rumbustious +rumen/M +Rumford/M +Ru/MH +ruminant/YMS +ruminate/VNGXSD +ruminative/Y +rummage/GRSD +rummager/M +Rummel/M +rummer +rummest +rummy/TRSM +rumored/U +rumorer/M +rumormonger/SGMD +rumor/ZMRDSG +Rumpelstiltskin/M +rump/GMYDS +rumple/SDG +rumply/TR +rumpus/SM +rum/XSMN +runabout/SM +runaround/S +run/AS +runaway/S +rundown/SM +rune/MS +Runge/M +rung/MS +runic +runlet/SM +runnable +runnel/SM +runner/MS +running/S +Runnymede/M +runny/RT +runoff/MS +runtime +runtiness/M +runt/MS +runty/RPT +runway/MS +Runyon/M +rupee/MS +Ruperta/M +Rupert/M +Ruperto/M +rupiah/M +rupiahs +Ruppert/M +Ruprecht/M +rupture/GMSD +rurality/M +rural/Y +Rurik/M +ruse/MS +Rushdie/M +rush/DSRGZ +rusher/M +rushes/I +rushing/M +Rush/M +Rushmore/M +rushy/RT +Ruskin/M +rusk/MS +Russell/M +Russel/M +russet/MDS +russetting +Russia/M +Russian/SM +Russo/M +Russ/S +Rustbelt/M +rustically +rusticate/GSD +rustication/M +rusticity/S +rustic/S +Rustie/M +rustiness/MS +Rustin/M +rustler/M +rustle/RSDGZ +rust/MSDG +rustproof/DGS +Rusty/M +rusty/XNRTP +rutabaga/SM +Rutger/SM +Ruthanne/M +Ruthann/M +Ruthe/M +ruthenium/MS +rutherfordium/SM +Rutherford/M +Ruthie/M +Ruthi/M +ruthlessness/MS +ruthless/YP +Ruth/M +Ruthy/M +Rutland/M +Rutledge/M +rut/MS +rutted +Rutter/M +Ruttger/M +rutting +rutty/RT +Ruy/M +RV +RVs +Rwandan/S +Rwanda/SM +Rwy/M +Rx/M +Ryan/M +Ryann/M +Rycca/M +Rydberg/M +Ryder/M +rye/MS +Ryley/M +Ry/M +Ryon/M +Ryukyu/M +Ryun/M +S +SA +Saab/M +Saar/M +Saba/M +sabbath +Sabbath/M +Sabbaths +sabbatical/S +sabered/U +saber/GSMD +Sabik/M +Sabina/M +Sabine/M +Sabin/M +sable/GMDS +sabotage/DSMG +saboteur/SM +sabot/MS +Sabra/M +sabra/MS +Sabrina/M +SAC +Sacajawea/M +saccharides +saccharine +saccharin/MS +Sacco/M +sacerdotal +Sacha/M +sachem/MS +sachet/SM +Sachs/M +sackcloth/M +sackcloths +sacker/M +sackful/MS +sack/GJDRMS +sacking/M +sacral +sacra/L +sacramental/S +sacrament/DMGS +Sacramento/M +sacredness/S +sacred/PY +sacrificer/M +sacrifice/RSDZMG +sacrificial/Y +sacrilege/MS +sacrilegious/Y +sacristan/SM +sacristy/MS +sacroiliac/S +sacrosanctness/MS +sacrosanct/P +sacrum/M +sac/SM +Sada/M +Sadat/M +Saddam/M +sadden/DSG +sadder +saddest +saddlebag/SM +saddler/M +saddle's +saddle/UGDS +Sadducee/M +Sadella/M +Sade/M +sades +Sadie/M +sadism/MS +sadistic +sadistically +sadist/MS +sadness/SM +sadomasochism/MS +sadomasochistic +sadomasochist/S +sad/PY +Sadr/M +Sadye/M +safari/GMDS +safeguard/MDSG +safekeeping/MS +safeness/MS +safeness's/U +safes +safety/SDMG +safe/URPTY +safflower/SM +saffron/MS +sagaciousness/M +sagacious/YP +sagacity/MS +saga/MS +Sagan/M +sagebrush/SM +sage/MYPS +sagged +sagger +sagging +saggy/RT +Saginaw/M +Sagittarius/MS +sago/MS +sag/TSR +saguaro/SM +Sahara/M +Saharan/M +Sahel +sahib/MS +Saidee/M +saids +said/U +Saigon/M +sailboard/DGS +sailboat/SRMZG +sailcloth/M +sailcloths +sailer/M +sailfish/SM +sail/GJMDRS +sailing/M +sailor/YMS +sailplane/SDMG +sainthood/MS +saintlike +saintliness/MS +saintly/RTP +saint/YDMGS +Saiph/M +saith +saiths +Sakai/M +sake/MRS +saker/M +Sakhalin/M +Sakharov/M +Saki/M +saki's +salaam/GMDS +salable/U +salaciousness/MS +salacious/YP +salacity/MS +Saladin/M +Salado/M +salad/SM +Salaidh/M +salamander/MS +salami/MS +salary/SDMG +Salas/M +Salazar/M +saleability/M +sale/ABMS +Saleem/M +Salem/M +Salerno/M +salesclerk/SM +salesgirl/SM +saleslady/S +salesman/M +salesmanship/SM +salesmen +salespeople/M +salesperson/MS +salesroom/M +saleswoman +saleswomen +salience/MS +saliency +salient/SY +Salim/M +Salina/MS +saline/S +salinger +Salinger/M +salinity/MS +Salisbury/M +Salish/M +saliva/MS +salivary +salivate/XNGSD +salivation/M +Salk/M +Sallee/M +Salle/M +Sallie/M +Salli/M +sallowness/MS +sallow/TGRDSP +Sallust/M +Sallyanne/M +Sallyann/M +sally/GSDM +Sally/M +salmonellae +salmonella/M +Salmon/M +salmon/SM +Sal/MY +Saloma/M +Salome/M +Salomi/M +Salomo/M +Salomone/M +Salomon/M +Salonika/M +salon/SM +saloonkeeper +saloon/MS +salsa/MS +salsify/M +SALT +saltcellar/SM +salted/UC +salter/M +salt/GZTPMDRS +saltine/MS +saltiness/SM +saltness/M +Salton/M +saltpeter/SM +salts/C +saltshaker/S +saltwater +salty/RSPT +salubriousness/M +salubrious/YP +salubrity/M +salutariness/M +salutary/P +salutation/SM +salutatory/S +saluter/M +salute/RSDG +Salvadoran/S +Salvadorian/S +Salvador/M +salvageable +salvage/MGRSD +salvager/M +salvation/MS +Salvatore/M +salve/GZMDSR +salver/M +Salvidor/M +salvo/GMDS +Salween/M +Salyut/M +Salz/M +SAM +Samantha/M +Samara/M +Samaria/M +Samaritan/MS +samarium/MS +Samarkand/M +samba/GSDM +sameness/MS +same/SP +Sam/M +Sammie/M +Sammy/M +Samoa +Samoan/S +Samoset/M +samovar/SM +Samoyed/M +sampan/MS +sampler/M +sample/RSDJGMZ +sampling/M +Sampson/M +Samsonite/M +Samson/M +Samuele/M +Samuel/SM +Samuelson/M +samurai/M +San'a +Sana/M +sanatorium/MS +Sanborn/M +Sanchez/M +Sancho/M +sanctification/M +sanctifier/M +sanctify/RSDGNX +sanctimoniousness/MS +sanctimonious/PY +sanctimony/MS +sanctioned/U +sanction/SMDG +sanctity/SM +sanctuary/MS +sanctum/SM +sandal/MDGS +sandalwood/SM +sandbagged +sandbagging +sandbag/MS +sandbank/SM +sandbar/S +sandblaster/M +sandblast/GZSMRD +sandbox/MS +Sandburg/M +sandcastle/S +Sande/M +Sanderling/M +sander/M +Sander/M +Sanderson/M +sandhill +sandhog/SM +Sandia/M +Sandie/M +Sandi/M +sandiness/S +Sandinista +sandlot/SM +sandlotter/S +sandman/M +sandmen +Sand/MRZ +Sandor/M +Sandoval/M +sandpaper/DMGS +sandpile +sandpiper/MS +sandpit/M +Sandra/M +Sandro/M +sand/SMDRGZ +sandstone/MS +sandstorm/SM +Sandusky/M +sandwich/SDMG +Sandye/M +Sandy/M +sandy/PRT +saned +sane/IRYTP +saneness/MS +saneness's/I +sanes +Sanford/M +Sanforized +Sanger/M +sangfroid/S +sangria/SM +Sang/RM +sang/S +sanguinary +sanguined +sanguine/F +sanguinely +sanguineness/M +sanguineous/F +sanguines +sanguining +Sanhedrin/M +saning +sanitarian/S +sanitarium/SM +sanitary/S +sanitate/NX +sanitation/M +sanitizer/M +sanitize/RSDZG +sanity/SIM +sank +Sankara/M +San/M +sans +sanserif +Sanskritic +Sanskritize/M +Sanskrit/M +Sansone/M +Sanson/M +Santa/M +Santana/M +Santayana/M +Santeria +Santiago/M +Santo/MS +sapience/MS +sapient +sapless +sapling/SM +sap/MS +sapped +sapper/SM +Sapphira/M +Sapphire/M +sapphire/MS +Sappho/M +sappiness/SM +sapping +Sapporo/M +sappy/RPT +saprophyte/MS +saprophytic +sapsucker/SM +sapwood/SM +Saraann/M +Saracen/MS +Saragossa/M +Sarah/M +Sarajane/M +Sarajevo/M +Sara/M +Saran/M +saran/SM +sarape's +Sarasota/M +Saratoga/M +Saratov/M +Sarawak/M +sarcasm/MS +sarcastic +sarcastically +sarcoma/MS +sarcophagi +sarcophagus/M +sardine/SDMG +Sardinia/M +sardonic +sardonically +Saree/M +Sarena/M +Sarene/M +Sarette/M +Sargasso/M +Sarge/M +Sargent/M +sarge/SM +Sargon/M +Sari/M +sari/MS +Sarina/M +Sarine/M +Sarita/M +Sarnoff/M +sarong/MS +Saroyan/M +sarsaparilla/MS +Sarto/M +sartorial/Y +sartorius/M +Sartre/M +Sascha/M +SASE +Sasha/M +sashay/GDS +Sashenka/M +sash/GMDS +Saskatchewan/M +Saskatoon/M +Sask/M +sassafras/MS +sass/GDSM +Sassoon/M +sassy/TRS +SAT +satanic +satanical/Y +Satanism/M +satanism/S +Satanist/M +satanist/S +Satan/M +satchel/SM +sat/DG +sateen/MS +satellite/GMSD +sate/S +satiable/I +satiate/GNXSD +satiation/M +satiety/MS +satin/MDSG +satinwood/MS +satiny +satire/SM +satiric +satirical/Y +satirist/SM +satirize/DSG +satirizes/U +satisfaction/ESM +satisfactorily/U +satisfactoriness/MU +satisfactory/UP +satisfiability/U +satisfiable/U +satisfied/UE +satisfier/M +satisfies/E +satisfy/GZDRS +satisfying/EU +satisfyingly +Sat/M +satori/SM +satrap/SM +saturated/CUA +saturater/M +saturates/A +saturate/XDRSNG +saturation/M +Saturday/MS +saturnalia +Saturnalia/M +saturnine/Y +Saturn/M +Satyanarayanan/M +satyriases +satyriasis/M +satyric +satyr/MS +sauce/DSRGZM +saucepan/SM +saucer/M +saucily +sauciness/S +saucy/TRP +Saudi/S +Saud/M +Saudra/M +sauerkraut/SM +Saukville/M +Saul/M +Sault/M +sauna/DMSG +Sauncho/M +Saunder/SM +Saunderson/M +Saundra/M +saunter/DRSG +saurian/S +sauropod/SM +sausage/MS +Saussure/M +sauté/DGS +Sauternes/M +Sauveur/M +savage/GTZYPRSD +Savage/M +savageness/SM +savagery/MS +Savannah/M +savanna/MS +savant/SM +saved/U +saveloy/M +saver/M +save/ZGJDRSB +Savina/M +Savior/M +savior/SM +Saviour/M +Savonarola/M +savored/U +savorer/M +savorier +savoriest +savoriness/S +savoringly/S +savoring/Y +savor/SMRDGZ +savory/UMPS +Savoyard/M +Savoy/M +savoy/SM +savvy/GTRSD +sawbones/M +sawbuck/SM +sawdust/MDSG +sawer/M +sawfly/SM +sawhorse/MS +Saw/M +sawmill/SM +saw/SMDRG +sawtooth +Sawyere/M +Sawyer/M +sawyer/MS +Saxe/M +saxifrage/SM +Sax/M +sax/MS +Saxon/SM +Saxony/M +saxophone/MS +saxophonist/SM +Saxton/M +Sayer/M +sayer/SM +sayest +saying/MS +Sayre/MS +says/M +say/USG +Say/ZMR +SBA +Sb/M +SC +scabbard/SGDM +scabbed +scabbiness/SM +scabbing +scabby/RTP +scabies/M +scabrousness/M +scabrous/YP +scab/SM +scad/SM +scaffolding/M +scaffold/JGDMS +scalability +Scala/M +scalar/SM +scalawag/SM +scald/GJRDS +scaled/AU +scale/JGZMBDSR +scaleless +scalene +scaler/M +scales/A +scaliness/MS +scaling/A +scallion/MS +scalloper/M +scallop/GSMDR +scalloping/M +scalpel/SM +scalper/M +scalp/GZRDMS +scalping/M +scaly/TPR +scammed +scamming +scamper/GD +scampi/M +scamp/RDMGZS +scam/SM +Scan +scan/AS +scandal/GMDS +scandalized/U +scandalize/GDS +scandalmonger/SM +scandalousness/M +scandalous/YP +Scandinavia/M +Scandinavian/S +scandium/MS +scanned/A +scanner/SM +scanning/A +scansion/SM +scant/CDRSG +scantest +scantily +scantiness/MS +scantly +scantness/MS +scanty/TPRS +scapegoat/SGDM +scapegrace/MS +scape/M +scapulae +scapula/M +scapular/S +scarab/SM +Scaramouch/M +Scarborough/M +scarceness/SM +scarce/RTYP +scarcity/MS +scar/DRMSG +scarecrow/MS +scaremongering/M +scaremonger/SGM +scarer/M +scare/S +scarface +Scarface/M +scarf/SDGM +scarification/M +scarify/DRSNGX +scarily +scariness/S +scarlatina/MS +Scarlatti/M +Scarlet/M +scarlet/MDSG +Scarlett/M +scarp/SDMG +scarred +scarring +scarves/M +scary/PTR +scathe/DG +scathed/U +scathing/Y +scatological +scatology/SM +scat/S +scatted +scatterbrain/MDS +scatter/DRJZSG +scatterer/M +scattergun +scattering/YM +scatting +scavenge/GDRSZ +scavenger/M +SCCS +scenario/SM +scenarist/MS +scene/GMDS +scenery/SM +scenically +scenic/S +scented/U +scent/GDMS +scentless +scent's/C +scents/C +scepter/DMSG +scepters/U +sceptically +sch +Schaefer/M +Schaeffer/M +Schafer/M +Schaffner/M +Schantz/M +Schapiro/M +Scheat/M +Schedar/M +schedule/ADSRG +scheduled/U +scheduler/MS +schedule's +Scheherazade/M +Scheherezade/M +Schelling/M +schema/M +schemata +schematically +schematic/S +scheme/JSRDGMZ +schemer/M +schemta +Schenectady/M +scherzo/MS +Schick/M +Schiller/M +schilling/SM +schismatic/S +schism/SM +schist/SM +schizoid/S +schizomycetes +schizophrenia/SM +schizophrenically +schizophrenic/S +schizo/S +schlemiel/MS +schlepped +schlepping +schlep/S +Schlesinger/M +Schliemann/M +Schlitz/M +schlock/SM +schlocky/TR +Schloss/M +schmaltz/MS +schmaltzy/TR +Schmidt/M +Schmitt/M +schmoes +schmo/M +schmooze/GSD +schmuck/MS +Schnabel/M +schnapps/M +schnauzer/MS +Schneider/M +schnitzel/MS +schnook/SM +schnoz/S +schnozzle/MS +Schoenberg/M +Schofield/M +scholarship/MS +scholar/SYM +scholastically +scholastic/S +schoolbag/SM +schoolbook/SM +schoolboy/MS +schoolchild/M +schoolchildren +schooldays +schooled/U +schoolfellow/S +schoolfriend +schoolgirlish +schoolgirl/MS +schoolhouse/MS +schooling/M +schoolmarmish +schoolmarm/MS +schoolmaster/SGDM +schoolmate/MS +schoolmistress/MS +schoolroom/SM +schoolteacher/MS +schoolwork/SM +schoolyard/SM +school/ZGMRDJS +schooner/SM +Schopenhauer/M +Schottky/M +Schrieffer/M +Schrödinger/M +Schroeder/M +Schroedinger/M +Schubert/M +Schultz/M +Schulz/M +Schumacher/M +Schuman/M +Schumann/M +schussboomer/S +schuss/SDMG +Schuster/M +Schuyler/M +Schuylkill/M +Schwab/M +Schwartzkopf/M +Schwartz/M +Schwarzenegger/M +schwa/SM +Schweitzer/M +Schweppes/M +Schwinger/M +Schwinn/M +sci +sciatica/SM +sciatic/S +science/FMS +scientifically/U +scientific/U +scientist/SM +Scientology/M +scimitar/SM +scintilla/MS +scintillate/GNDSX +scintillation/M +scintillator/SM +scion/SM +Scipio/M +scissor/SGD +scleroses +sclerosis/M +sclerotic/S +Sc/M +scoffer/M +scofflaw/MS +scoff/RDGZS +scolder/M +scold/GSJRD +scolioses +scoliosis/M +scollop's +sconce/SDGM +scone/SM +scooper/M +scoop/SRDMG +scooter/M +scoot/SRDGZ +scope/DSGM +Scopes/M +scops +scorbutic +scorcher/M +scorching/Y +scorch/ZGRSD +scoreboard/MS +scorecard/MS +scored/M +scorekeeper/SM +scoreless +scoreline +score/ZMDSRJG +scorner/M +scornfulness/M +scornful/PY +scorn/SGZMRD +scorpion/SM +Scorpio/SM +Scorpius/M +Scorsese/M +Scotchgard/M +Scotchman/M +Scotchmen +scotch/MSDG +scotchs +Scotch/S +Scotchwoman +Scotchwomen +Scotia/M +Scotian/M +Scotland/M +Scot/MS +Scotsman/M +Scotsmen +Scotswoman +Scotswomen +Scottie/SM +Scotti/M +Scottish +Scott/M +Scottsdale/M +Scotty's +scoundrel/YMS +scourer/M +scourge/MGRSD +scourger/M +scouring/M +scour/SRDGZ +scouter/M +scouting/M +scoutmaster/SM +Scout's +scout/SRDMJG +scow/DMGS +scowler/M +scowl/SRDG +scrabble/DRSZG +scrabbler/M +Scrabble/SM +scragged +scragging +scraggly/TR +scraggy/TR +scrag/SM +scrambler/MS +scrambler's/U +scramble/UDSRG +scrammed +scramming +scram/S +Scranton/M +scrapbook/SM +scraper/M +scrape/S +scrapheap/SM +scrapped +scrapper/SM +scrapping +scrappy/RT +scrap/SGZJRDM +scrapyard/S +scratched/U +scratcher/M +scratches/M +scratchily +scratchiness/S +scratch/JDRSZG +scratchy/TRP +scrawler/M +scrawl/GRDS +scrawly/RT +scrawniness/MS +scrawny/TRP +screamer/M +screaming/Y +scream/ZGSRD +screecher/M +screech/GMDRS +screechy/TR +screed/MS +scree/DSM +screened/U +screening/M +screenplay/MS +screen/RDMJSG +screenwriter/MS +screwball/SM +screwdriver/SM +screwer/M +screw/GUSD +screwiness/S +screw's +screwup +screwworm/MS +screwy/RTP +Scriabin/M +scribal +scribble/JZDRSG +scribbler/M +scribe/CDRSGIK +scriber/MKIC +scribe's +Scribner/MS +scrimmager/M +scrimmage/RSDMG +scrimp/DGS +scrimshaw/GSDM +scrim/SM +Scripps/M +scrip/SM +scripted/U +script/FGMDS +scriptural/Y +scripture/MS +Scripture/MS +scriptwriter/SM +scriptwriting/M +scrivener/M +scriven/ZR +scrod/M +scrofula/MS +scrofulous +scrollbar/SM +scroll/GMDSB +Scrooge/MS +scrooge/SDMG +scrota +scrotal +scrotum/M +scrounge/ZGDRS +scroungy/TR +scrubbed +scrubber/MS +scrubbing +scrubby/TR +scrub/S +scruffily +scruffiness/S +scruff/SM +scruffy/PRT +Scruggs/M +scrummage/MG +scrum/MS +scrumptious/Y +scrunch/DSG +scrunchy/S +scruple/SDMG +scrupulosity/SM +scrupulousness's +scrupulousness/US +scrupulous/UPY +scrutable/I +scrutinized/U +scrutinizer/M +scrutinize/RSDGZ +scrutinizingly/S +scrutinizing/UY +scrutiny/MS +SCSI +scuba/SDMG +scudded +scudding +Scud/M +scud/S +scuff/GSD +scuffle/SDG +sculler/M +scullery/MS +Sculley/M +scullion/MS +scull/SRDMGZ +sculptor/MS +sculptress/MS +sculpt/SDG +sculptural/Y +sculpture/SDGM +scumbag/S +scummed +scumming +scum/MS +scummy/TR +scupper/SDMG +scurf/MS +scurfy/TR +scurrility/MS +scurrilousness/MS +scurrilous/PY +scurry/GJSD +scurvily +scurviness/M +scurvy/SRTP +scutcheon/SM +scuttlebutt/MS +scuttle/MGSD +scuzzy/RT +Scylla/M +scythe/SDGM +Scythia/M +SD +SDI +SE +seabed/S +seabird/S +seaboard/MS +Seaborg/M +seaborne +Seabrook/M +seacoast/MS +seafare/JRZG +seafarer/M +seafood/MS +seafront/MS +Seagate/M +seagoing +Seagram/M +seagull/S +seahorse/S +sealant/MS +sealed/AU +sealer/M +seal/MDRSGZ +sealskin/SM +seals/UA +seamail +seamanship/SM +seaman/YM +seamer/M +seaminess/M +seamlessness/M +seamless/PY +seam/MNDRGS +seams/I +seamstress/MS +Seamus/M +sea/MYS +seamy/TRP +Seana/M +séance/SM +Sean/M +seaplane/SM +seaport/SM +seaquake/M +Seaquarium/M +searcher/AM +searching/YS +searchlight/SM +search/RSDAGZ +sear/DRSJGT +searing/Y +Sears/M +seascape/SM +seashell/MS +seashore/SM +seasickness/SM +seasick/P +seaside/SM +seasonableness/M +seasonable/UP +seasonably/U +seasonality +seasonal/Y +seasoned/U +seasoner/M +seasoning/M +season/JRDYMBZSG +seatbelt +seated/A +seater/M +seating/SM +SEATO +seat's +Seattle/M +seat/UDSG +seawall/S +seaward/S +seawater/S +seaway/MS +seaweed/SM +seaworthinesses +seaworthiness/MU +seaworthy/TRP +sebaceous +Sebastian/M +Sebastiano/M +Sebastien/M +seborrhea/SM +SEC +secant/SM +secede/GRSD +secessionist/MS +secession/MS +secludedness/M +secluded/YP +seclude/GSD +seclusion/SM +seclusive +Seconal +secondarily +secondary/PS +seconder/M +secondhand +second/RDYZGSL +secrecy/MS +secretarial +secretariat/MS +secretaryship/MS +secretary/SM +secrete/XNS +secretion/M +secretiveness/S +secretive/PY +secretory +secret/TVGRDYS +sec/S +sectarianism/MS +sectarian/S +sectary/MS +sectionalism/MS +sectionalized +sectional/SY +section/ASEM +sectioned +sectioning +sect/ISM +sectoral +sectored +sector/EMS +sectoring +sects/E +secularism/MS +secularist/MS +secularity/M +secularization/MS +secularized/U +secularize/GSD +secular/SY +secured/U +securely/I +secure/PGTYRSDJ +security/MSI +secy +sec'y +sedan/SM +sedateness/SM +sedate/PXVNGTYRSD +sedation/M +sedative/S +sedentary +Seder/SM +sedge/SM +Sedgwick/M +sedgy/RT +sedimentary +sedimentation/SM +sediment/SGDM +sedition/SM +seditiousness/M +seditious/PY +seducer/M +seduce/RSDGZ +seduction/MS +seductiveness/MS +seductive/YP +seductress/SM +sedulous/Y +Seebeck/M +seed/ADSG +seedbed/MS +seedcase/SM +seeded/U +seeder/MS +seediness/MS +seeding/S +seedless +seedling/SM +seedpod/S +seed's +seedy/TPR +seeings +seeing's +seeing/U +seeker/M +seek/GZSR +seeking/Y +Seeley/M +See/M +seem/GJSYD +seeming/Y +seemliness's +seemliness/US +seemly/UTPR +seen/U +seepage/MS +seep/GSD +seer/SM +seersucker/MS +sees +seesaw/DMSG +seethe/SDGJ +see/U +segmental/Y +segmentation/SM +segmented/U +segment/SGDM +Segovia/M +segregant +segregated/U +segregate/XCNGSD +segregation/CM +segregationist/SM +segregative +Segre/M +segue/DS +segueing +Segundo/M +Se/H +Seidel/M +seigneur/MS +seignior/SM +Seiko/M +seine/GZMDSR +Seine/M +seiner/M +Seinfeld/M +seismic +seismically +seismographer/M +seismographic +seismographs +seismography/SM +seismograph/ZMR +seismologic +seismological +seismologist/MS +seismology/SM +seismometer/S +seize/BJGZDSR +seizer/M +seizing/M +seizin/MS +seizor/MS +seizure/MS +Seka/M +Sela/M +Selassie/M +Selby/M +seldom +selected/UAC +selectional +selection/MS +selectiveness/M +selective/YP +selectivity/MS +selectman/M +selectmen +selectness/SM +selector/SM +select/PDSVGB +Selectric/M +selects/A +Selena/M +selenate/M +Selene/M +selenite/M +selenium/MS +selenographer/SM +selenography/MS +Selestina/M +Seleucid/M +Seleucus/M +self/GPDMS +selfishness/SU +selfish/PUY +selflessness/MS +selfless/YP +selfness/M +Selfridge/M +selfsameness/M +selfsame/P +Selia/M +Selie/M +Selig/M +Selim/M +Selina/M +Selinda/M +Seline/M +Seljuk/M +Selkirk/M +Sella/M +sell/AZGSR +seller/AM +Sellers/M +Selle/ZM +sellout/MS +Selma/M +seltzer/S +selvage/MGSD +selves/M +Selznick/M +semantical/Y +semanticist/SM +semantic/S +semantics/M +semaphore/GMSD +Semarang/M +semblance/ASME +semen/SM +semester/SM +semiannual/Y +semiarid +semiautomated +semiautomatic/S +semicircle/SM +semicircular +semicolon/MS +semiconductor/SM +semiconscious +semidefinite +semidetached +semidrying/M +semifinalist/MS +semifinal/MS +semilogarithmic +semimonthly/S +seminal/Y +seminarian/MS +seminar/SM +seminary/MS +Seminole/SM +semiofficial +semioticians +semiotic/S +semiotics/M +semipermanent/Y +semipermeable +semiprecious +semiprivate +semiprofessional/YS +semipublic +semiquantitative/Y +Semiramis/M +semiretired +semisecret +semiskilled +semi/SM +semisolid/S +semistructured +semisweet +Semite/SM +Semitic/MS +semitic/S +semitone/SM +semitrailer/SM +semitrance +semitransparent +semitropical +semivowel/MS +semiweekly/S +semiyearly +semolina/SM +sempiternal +sempstress/SM +Semtex +sen +Sen +Sena/M +senate/MS +Senate/MS +senatorial +senator/MS +Sendai/M +sender/M +sends/A +send/SRGZ +Seneca/MS +Senegalese +Senegal/M +senescence/SM +senescent +senile/SY +senility/MS +seniority/SM +senior/MS +Senior/S +Sennacherib/M +senna/MS +Sennett/M +Seńora/M +senora/S +senorita/S +senor/MS +sensately/I +sensate/YNX +sensationalism/MS +sensationalist/S +sensationalize/GSD +sensational/Y +sensation/M +sens/DSG +senselessness/SM +senseless/PY +sense/M +sensibility/ISM +sensibleness/MS +sensible/PRST +sensibly/I +sensitiveness/MS +sensitiveness's/I +sensitives +sensitive/YIP +sensitivity/ISM +sensitization/CSM +sensitized/U +sensitizers +sensitize/SDCG +sensor/MS +sensory +sensualist/MS +sensuality/MS +sensual/YF +sensuousness/S +sensuous/PY +Sensurround/M +sentence/SDMG +sentential/Y +sententious/Y +sentience/ISM +sentient/YS +sentimentalism/SM +sentimentalist/SM +sentimentality/SM +sentimentalization/SM +sentimentalize/RSDZG +sentimentalizes/U +sentimental/Y +sentiment/MS +sentinel/GDMS +sentry/SM +sent/UFEA +Seoul/M +sepal/SM +separability/MSI +separableness/MI +separable/PI +separably/I +separateness/MS +separates/M +separate/YNGVDSXP +separation/M +separatism/SM +separatist/SM +separator/SM +Sephardi/M +Sephira/M +sepia/MS +Sepoy/M +sepses +sepsis/M +septa/M +septate/N +September/MS +septennial/Y +septet/MS +septicemia/SM +septicemic +septic/S +septillion/M +sept/M +Sept/M +septuagenarian/MS +Septuagint/MS +septum/M +sepulcher/MGSD +sepulchers/UA +sepulchral/Y +seq +sequel/MS +sequenced/A +sequence/DRSJZMG +sequencer/M +sequence's/F +sequences/F +sequent/F +sequentiality/FM +sequentialize/DSG +sequential/YF +sequester/SDG +sequestrate/XGNDS +sequestration/M +sequin/SDMG +sequitur +Sequoia/M +sequoia/MS +Sequoya/M +Serafin/M +seraglio/SM +serape/S +seraphic +seraphically +seraphim's +seraph/M +seraphs +sera's +Serbia/M +Serbian/S +Serb/MS +Serbo/M +serenade/MGDRS +serenader/M +Serena/M +serendipitous/Y +serendipity/MS +serene/GTYRSDP +Serene/M +sereneness/SM +Serengeti/M +serenity/MS +sere/TGDRS +serfdom/MS +serf/MS +Sergeant/M +sergeant/SM +serge/DSGM +Sergei/M +Serge/M +Sergent/M +Sergio/M +serialization/MS +serialize/GSD +serial/MYS +series/M +serif/SMD +serigraph/M +serigraphs +seriousness/SM +serious/PY +sermonize/GSD +sermon/SGDM +serological/Y +serology/MS +serons +serous +Serpens/M +serpent/GSDM +serpentine/GYS +Serra/M +Serrano/M +serrate/GNXSD +serration/M +serried +serum/MS +servant/SDMG +serve/AGCFDSR +served/U +server/MCF +servers +serviceability/SM +serviceableness/M +serviceable/P +serviced/U +serviceman/M +servicemen +service/MGSRD +service's/E +services/E +servicewoman +servicewomen +serviette/MS +servilely +servileness/M +serviles +servile/U +servility/SM +serving/SM +servitor/SM +servitude/MS +servomechanism/MS +servomotor/MS +servo/S +sesame/MS +sesquicentennial/S +sessile +session/SM +setback/S +Seth/M +Set/M +Seton/M +set's +setscrew/SM +set/SIA +settable/A +sett/BJGZSMR +settee/MS +setter/M +setting/AS +setting's +settle/AUDSG +settlement/ASM +settler/MS +settling/S +setup/MS +Seumas/M +Seurat/M +Seuss/M +Sevastopol/M +sevenfold +sevenpence +seven/SMH +seventeen/HMS +seventeenths +sevenths +seventieths +seventy/MSH +severalfold +severalty/M +several/YS +severance/SM +severed/E +severeness/SM +severe/PY +severing/E +severity/MS +Severn/M +severs/E +sever/SGTRD +Severus/M +Seville/M +sewage/MS +Seward/M +sewerage/SM +sewer/GSMD +sewing/SM +sewn +sew/SAGD +sexagenarian/MS +sex/GMDS +sexily +sexiness/MS +sexism/SM +sexist/SM +sexless +sexologist/SM +sexology/MS +sexpot/SM +Sextans/M +sextant/SM +sextet/SM +sextillion/M +Sexton/M +sexton/MS +sextuple/MDG +sextuplet/MS +sexuality/MS +sexualized +sexual/Y +sexy/RTP +Seychelles +Seyfert +Seymour/M +sf +SF +Sgt +shabbily +shabbiness/SM +shabby/RTP +shack/GMDS +shackler/M +shackle's +Shackleton/M +shackle/UGDS +shad/DRJGSM +shaded/U +shadeless +shade/SM +shadily +shadiness/MS +shading/M +shadowbox/SDG +shadower/M +shadow/GSDRM +shadowiness/M +Shadow/M +shadowy/TRP +shady/TRP +Shae/M +Shafer/M +Shaffer/M +shafting/M +shaft/SDMG +shagged +shagginess/SM +shagging +shaggy/TPR +shag/MS +shah/M +shahs +Shaina/M +Shaine/M +shakable/U +shakably/U +shakeable +shakedown/S +shaken/U +shakeout/SM +shaker/M +Shaker/S +Shakespearean/S +Shakespeare/M +Shakespearian +shake/SRGZB +shakeup/S +shakily +shakiness/S +shaking/M +shaky/TPR +shale/SM +shall +shallot/SM +shallowness/SM +shallow/STPGDRY +Shalna/M +Shalne/M +shalom +Shalom/M +shalt +shamanic +shaman/SM +shamble/DSG +shambles/M +shamefaced/Y +shamefulness/S +shameful/YP +shamelessness/SM +shameless/PY +shame/SM +sham/MDSG +shammed +shammer +shamming +shammy's +shampoo/DRSMZG +shampooer/M +shamrock/SM +Shamus/M +Shana/M +Shanan/M +Shanda/M +Shandee/M +Shandeigh/M +Shandie/M +Shandra/M +shandy/M +Shandy/M +Shane/M +Shanghai/GM +Shanghaiing/M +shanghai/SDG +Shanie/M +Shani/M +shank/SMDG +Shannah/M +Shanna/M +Shannan/M +Shannen/M +Shannon/M +Shanon/M +shan't +Shanta/M +Shantee/M +shantis +Shantung/M +shantung/MS +shanty/SM +shantytown/SM +shape/AGDSR +shaped/U +shapelessness/SM +shapeless/PY +shapeliness/S +shapely/RPT +shaper/S +shape's +Shapiro/M +sharable/U +Sharai/M +Shara/M +shard/SM +shareable +sharecropped +sharecropper/MS +sharecropping +sharecrop/S +share/DSRGZMB +shared/U +shareholder/MS +shareholding/S +sharer/M +shareware/S +Shari'a +Sharia/M +sharia/SM +Shari/M +Sharity/M +shark/SGMD +sharkskin/SM +Sharla/M +Sharleen/M +Sharlene/M +Sharline/M +Sharl/M +Sharona/M +Sharon/M +Sharpe/M +sharpen/ASGD +sharpened/U +sharpener/S +sharper/M +sharpie/SM +Sharp/M +sharpness/MS +sharp/SGTZXPYRDN +sharpshooter/M +sharpshooting/M +sharpshoot/JRGZ +sharpy's +Sharron/M +Sharyl/M +Shasta/M +shat +shatter/DSG +shattering/Y +shatterproof +Shaughn/M +Shaula/M +Shauna/M +Shaun/M +shave/DSRJGZ +shaved/U +shaver/M +Shavian +shaving/M +Shavuot/M +Shawano/M +shawl/SDMG +shaw/M +Shaw/M +Shawna/M +Shawnee/SM +Shawn/M +Shaylah/M +Shayla/M +Shaylyn/M +Shaylynn/M +Shay/M +shay/MS +Shayna/M +Shayne/M +Shcharansky/M +sh/DRS +sheaf/MDGS +Shea/M +shearer/M +shear/RDGZS +sheather/M +sheathe/UGSD +sheath/GJMDRS +sheathing/M +sheaths +sheave/SDG +sheaves/M +Sheba/M +shebang/MS +Shebeli/M +Sheboygan/M +she'd +shedding +Shedir/M +sheds +shed's +shed/U +Sheelagh/M +Sheelah/M +Sheela/M +Sheena/M +sheen/MDGS +sheeny/TRSM +sheepdog/SM +sheepfold/MS +sheepherder/MS +sheepishness/SM +sheepish/YP +sheep/M +sheepskin/SM +Sheeree/M +sheerness/S +sheer/PGTYRDS +sheeting/M +sheetlike +sheet/RDMJSG +Sheetrock +Sheffielder/M +Sheffield/RMZ +Sheffie/M +Sheff/M +Sheffy/M +sheikdom/SM +sheikh's +sheik/SM +Sheilah/M +Sheila/M +shekel/MS +Shelagh/M +Shela/M +Shelba/M +Shelbi/M +Shelby/M +Shelden/M +Sheldon/M +shelf/MDGS +Shelia/M +she'll +shellacked +shellacking/MS +shellac/S +shelled/U +Shelley/M +shellfire/SM +shellfish/SM +Shellie/M +Shelli/M +Shell/M +shell/RDMGS +Shelly/M +Shel/MY +shelter/DRMGS +sheltered/U +shelterer/M +Shelton/M +shelve/JRSDG +shelver/M +shelves/M +shelving/M +she/M +Shem/M +Shena/M +Shenandoah/M +shenanigan/SM +Shenyang/M +Sheol/M +Shepard/M +shepherd/DMSG +shepherdess/S +Shepherd/M +Shep/M +Sheppard/M +Shepperd/M +Sheratan/M +Sheraton/M +sherbet/MS +sherd's +Sheree/M +Sheridan/M +Sherie/M +sheriff/SM +Sherill/M +Sherilyn/M +Sheri/M +Sherline/M +Sherlocke/M +sherlock/M +Sherlock/M +Sher/M +Sherman/M +Shermie/M +Sherm/M +Shermy/M +Sherpa/SM +Sherrie/M +Sherri/M +Sherry/M +sherry/MS +Sherwin/M +Sherwood/M +Sherwynd/M +Sherye/M +Sheryl/M +Shetland/S +Shevardnadze/M +shew/GSD +shewn +shh +shiatsu/S +shibboleth/M +shibboleths +shielded/U +shielder/M +shield/MDRSG +Shields/M +shiftily +shiftiness/SM +shiftlessness/S +shiftless/PY +shift/RDGZS +shifty/TRP +Shi'ite +Shiite/SM +Shijiazhuang +Shikoku/M +shill/DJSG +shillelagh/M +shillelaghs +shilling/M +Shillong/M +Shiloh/M +shimmed +shimmer/DGS +shimmery +shimming +shimmy/DSMG +shim/SM +Shina/M +shinbone/SM +shindig/MS +shiner/M +shine/S +shingle/MDRSG +shingler/M +shinguard +shininess/MS +shining/Y +shinned +shinning +shinny/GDSM +shin/SGZDRM +shinsplints +Shintoism/S +Shintoist/MS +Shinto/MS +shiny/PRT +shipboard/MS +shipborne +shipbuilder/M +shipbuild/RGZJ +shipload/SM +shipman/M +shipmate/SM +shipmen +shipment/AMS +shipowner/MS +shippable +shipped/A +shipper/SM +shipping/MS +ship's +shipshape +ship/SLA +shipwreck/GSMD +shipwright/MS +shipyard/MS +Shiraz/M +shire/MS +shirker/M +shirk/RDGZS +Shirlee/M +Shirleen/M +Shirlene/M +Shirley/M +Shirline/M +Shirl/M +Shir/M +shirr/GJDS +shirtfront/S +shirting/M +shirt/JDMSG +shirtless +shirtmake/R +shirtmaker/M +shirtsleeve/MS +shirttail/S +shirtwaist/SM +shit/S! +shitting/! +shitty/RT! +Shiva/M +shiverer/M +shiver/GDR +shivery +shiv/SZRM +shivved +shivving +shlemiel's +Shmuel/M +shoal/SRDMGT +shoat/SM +shocker/M +shocking/Y +Shockley/M +shockproof +shock/SGZRD +shoddily +shoddiness/SM +shoddy/RSTP +shod/U +shoehorn/GSMD +shoeing +shoelace/MS +shoemaker/M +shoemake/RZ +shoe/MS +shoer's +shoeshine/MS +shoestring/MS +shoetree/MS +shogunate/SM +shogun/MS +Shoji/M +Sholom/M +shone +shoo/DSG +shoofly +shook/SM +shooter/M +shootout/MS +shoot/SJRGZ +shopkeeper/M +shopkeep/RGZ +shoplifter/M +shoplifting/M +shoplift/SRDGZ +shop/MS +shopped/M +shopper/M +shoppe/RSDGZJ +shopping/M +shoptalk/SM +shopworn +shorebird/S +shore/DSRGMJ +shoreline/SM +Shorewood/M +shoring/M +shortage/MS +shortbread/MS +shortcake/SM +shortchange/DSG +shortcoming/MS +shortcrust +shortcut/MS +shortcutting +shortener/M +shortening/M +shorten/RDGJ +shortfall/SM +shorthand/DMS +Shorthorn/M +shorthorn/MS +shortie's +shortish +shortlist/GD +Short/M +shortness/MS +short/SGTXYRDNP +shortsightedness/S +shortsighted/YP +shortstop/MS +shortwave/SM +shorty/SM +Shoshana/M +Shoshanna/M +Shoshone/SM +Shostakovitch/M +shotgunned +shotgunner +shotgunning +shotgun/SM +shot/MS +shotted +shotting +shoulder/GMD +shouldn't +should/TZR +shout/SGZRDM +shove/DSRG +shoveler/M +shovelful/MS +shovel/MDRSZG +shover/M +showbiz +showbizzes +showboat/SGDM +showcase/MGSD +showdown/MS +shower/GDM +showery/TR +show/GDRZJS +showgirl/SM +showily +showiness/MS +showing/M +showman/M +showmanship/SM +showmen +shown +showoff/S +showpiece/SM +showplace/SM +showroom/MS +showy/RTP +shpt +shrank +shrapnel/SM +shredded +shredder/MS +shredding +shred/MS +Shreveport/M +shrewdness/SM +shrewd/RYTP +shrew/GSMD +shrewishness/M +shrewish/PY +shrieker/M +shriek/SGDRMZ +shrift/SM +shrike/SM +shrill/DRTGPS +shrillness/MS +shrilly +shrimp/MDGS +shrine/SDGM +shrinkage/SM +shrinker/M +shrinking/U +shrink/SRBG +shrivel/GSD +shriven +shrive/RSDG +Shropshire/M +shroud/GSMD +shrubbed +shrubbery/SM +shrubbing +shrubby/TR +shrub/SM +shrugged +shrugging +shrug/S +shrunk/N +shtick/S +shucker/M +shuck/SGMRD +shucks/S +shudder/DSG +shuddery +shuffleboard/MS +shuffled/A +shuffle/GDSRZ +shuffles/A +shuffling/A +Shulman/M +Shu/M +shunned +shunning +shun/S +shunter/M +shunt/GSRD +Shurlocke/M +Shurlock/M +Shurwood/M +shush/SDG +shutdown/MS +shuteye/SM +shutoff/M +shutout/SM +shut/S +shutterbug/S +shutter/DMGS +shuttering/M +shutting +shuttlecock/MDSG +shuttle/MGDS +shy/DRSGTZY +shyer +shyest +Shylockian/M +Shylock/M +shyness/SM +shyster/SM +Siamese/M +Siam/M +Siana/M +Sianna/M +Sian's +Sibbie/M +Sibby/M +Sibeal/M +Sibelius/M +Sibella/M +Sibelle/M +Sibel/M +Siberia/M +Siberian/S +sibilance/M +sibilancy/M +sibilant/SY +Sibilla/M +Sibley/M +sibling/SM +Sib/M +Sibylla/M +Sibylle/M +sibylline +Sibyl/M +sibyl/SM +Siciliana/M +Sicilian/S +Sicily/M +sickbay/M +sickbed/S +sickener/M +sickening/Y +sicken/JRDG +sicker/Y +sick/GXTYNDRSP +sickie/SM +sickish/PY +sickle/SDGM +sickliness/M +sickly/TRSDPG +sickness/MS +sicko/S +sickout/S +sickroom/SM +sic/S +sidearm/S +sideband/MS +sidebar/MS +sideboard/SM +sideburns +sidecar/MS +sided/A +sidedness +side/ISRM +sidekick/MS +sidelight/SM +sideline/MGDRS +sidelong +sideman/M +sidemen +sidepiece/S +sidereal +sider/FA +sides/A +sidesaddle/MS +sideshow/MS +sidesplitting +sidestepped +sidestepping +sidestep/S +sidestroke/GMSD +sideswipe/GSDM +sidetrack/SDG +sidewalk/MS +sidewall/MS +sidewards +sideway/SM +sidewinder/SM +siding/SM +sidle/DSG +Sid/M +Sidnee/M +Sidney/M +Sidoney/M +Sidonia/M +Sidonnie/M +SIDS +siege/GMDS +Siegel/M +Siegfried/M +Sieglinda/M +Siegmund/M +Siemens/M +Siena/M +sienna/SM +Sierpinski/M +sierra/SM +siesta/MS +sieve/GZMDS +Siffre/M +sifted/UA +sifter/M +sift/GZJSDR +Sigfrid/M +Sigfried/M +SIGGRAPH/M +sigh/DRG +sigher/M +sighs +sighted/P +sighter/M +sighting/S +sight/ISM +sightless/Y +sightliness/UM +sightly/TURP +sightread +sightseeing/S +sightsee/RZ +Sigismond/M +Sigismondo/M +Sigismund/M +Sigismundo/M +Sig/M +sigma/SM +sigmoid +Sigmund/M +signal/A +signaled +signaler/S +signaling +signalization/S +signalize/GSD +signally +signalman/M +signalmen +signals +signal's +signatory/SM +signature/MS +signboard/MS +signed/FU +signer/SC +signet/SGMD +sign/GARDCS +significance/IMS +significantly/I +significant/YS +signification/M +signify/DRSGNX +signing/S +Signora/M +signora/SM +signore/M +signori +signories +signorina/SM +signorine +Signor/M +signor/SFM +signpost/DMSG +sign's +signs/F +Sigrid/M +Sigurd/M +Sigvard/M +Sihanouk/M +Sikhism/MS +Sikh/MS +Sikhs +Sikkimese +Sikkim/M +Sikorsky/M +silage/GMSD +Silas/M +Sileas/M +siled +Sile/M +silence/MZGRSD +silencer/M +silentness/M +silent/TSPRY +Silesia/M +silhouette/GMSD +silica/SM +silicate/SM +siliceous +silicide/M +silicone/SM +silicon/MS +silicoses +silicosis/M +silken/DG +silk/GXNDMS +silkily +silkiness/SM +silkscreen/SM +silkworm/MS +silky/RSPT +silliness/SM +sill/MS +silly/PRST +silo/GSM +siltation/M +silt/MDGS +siltstone/M +silty/RT +Silurian/S +Silvain/M +Silva/M +Silvana/M +Silvan/M +Silvano/M +Silvanus/M +silverer/M +silverfish/MS +Silverman/M +silver/RDYMGS +silversmith/M +silversmiths +Silverstein/M +silverware/SM +silvery/RTP +Silvester/M +Silvia/M +Silvie/M +Silvio/M +Si/M +SIMD +Simenon/M +Simeon/M +simian/S +similar/EY +similarity/EMS +simile/SM +similitude/SME +Simla/M +simmer/GSD +Simmonds/M +Simmons/M +Simmonsville/M +Sim/MS +Simms/M +Simona/M +Simone/M +Simonette/M +simonize/SDG +Simon/M +Simonne/M +simony/MS +simpatico +simper/GDS +simpleminded/YP +simpleness/S +simple/RSDGTP +simpleton/SM +simplex/S +simplicity/MS +simplified/U +simplify/ZXRSDNG +simplistic +simplistically +simply +Simpson/M +simulacrum/M +Simula/M +SIMULA/M +simulate/XENGSD +simulation/ME +simulative +simulator/SEM +simulcast/GSD +simultaneity/SM +simultaneousness/M +simultaneous/YP +Sinai/M +Sinatra/M +since +sincere/IY +sincereness/M +sincerer +sincerest +sincerity/MIS +Sinclair/M +Sinclare/M +Sindbad/M +Sindee/M +Sindhi/M +sinecure/MS +sinecurist/M +sine/SM +sinew/SGMD +sinewy +sinfulness/SM +sinful/YP +Singaporean/S +Singapore/M +sing/BGJZYDR +Singborg/M +singeing +singer/M +Singer/M +singe/S +singing/Y +singlehanded/Y +singleness/SM +single/PSDG +Singleton/M +singleton/SM +singletree/SM +singlet/SM +singsong/GSMD +singularity/SM +singularization/M +singular/SY +Sinhalese/M +sinisterness/M +sinister/YP +sinistral/Y +sinkable/U +sinker/M +sink/GZSDRB +sinkhole/SM +Sinkiang/M +sinking/M +sinlessness/M +sinless/YP +sin/MAGS +sinned +sinner/MS +sinning +sinter/DM +sinuosity/MS +sinuousities +sinuousness/M +sinuous/PY +sinusitis/SM +sinus/MS +sinusoidal/Y +sinusoid/MS +Siobhan/M +Siouxie/M +Sioux/M +siphon/DMSG +siphons/U +sipped +sipper/SM +sipping +sip/S +sired/C +sire/MS +siren/M +sires/C +siring/C +Sirius/M +sirloin/MS +Sir/MS +sirocco/MS +sirred +sirring +sirup's +sir/XGMNDS +sisal/MS +Sisely/M +Sisile/M +sis/S +Sissie/M +sissified +Sissy/M +sissy/TRSM +sister/GDYMS +sisterhood/MS +sisterliness/MS +sisterly/P +sister's/A +Sistine +Sisyphean +Sisyphus/M +sit/AG +sitarist/SM +sitar/SM +sitcom/SM +site/DSJM +sits +sitter/MS +sitting/SM +situate/GNSDX +situational/Y +situationist +situation/M +situ/S +situs/M +Siusan/M +Siva/M +Siward/M +sixfold +sixgun +six/MRSH +sixpence/MS +sixpenny +sixshooter +sixteen/HRSM +sixteenths +sixths +sixth/Y +sixtieths +sixty/SMH +sizableness/M +sizable/P +sized/UA +size/GJDRSBMZ +sizer/M +sizes/A +sizing/M +sizzler/M +sizzle/RSDG +SJ +Sjaelland/M +SK +ska/S +skateboard/SJGZMDR +skater/M +skate/SM +skat/JMDRGZ +skedaddle/GSD +skeet/RMS +skein/MDGS +skeletal/Y +skeleton/MS +Skell/M +Skelly/M +skeptical/Y +skepticism/MS +skeptic/SM +sketchbook/SM +sketcher/M +sketchily +sketchiness/MS +sketch/MRSDZG +sketchpad +sketchy/PRT +skew/DRSPGZ +skewer/GDM +skewing/M +skewness/M +skidded +skidding +skid/S +skiff/GMDS +skiing/M +skilfully +skill/DMSG +skilled/U +skillet/MS +skillfulnesses +skillfulness/MU +skillful/YUP +skilling/M +skimmed +skimmer/MS +skimming/SM +ski/MNJSG +skimp/GDS +skimpily +skimpiness/MS +skimpy/PRT +skim/SM +skincare +skindive/G +skinflint/MS +skinhead/SM +skinless +skinned +Skinner/M +skinner/SM +skinniness/MS +skinning +skinny/TRSP +skin/SM +skintight +Skip/M +skipped +Skipper/M +skipper/SGDM +Skippie/M +skipping +Skipp/RM +Skippy/M +skip/S +Skipton/M +skirmisher/M +skirmish/RSDMZG +skirter/M +skirting/M +skirt/RDMGS +skit/GSMD +skitter/SDG +skittishness/SM +skittish/YP +skittle/SM +skivvy/GSDM +skoal/SDG +Skopje/M +skulduggery/MS +skulker/M +skulk/SRDGZ +skullcap/MS +skullduggery's +skull/SDM +skunk/GMDS +skycap/MS +skydiver/SM +skydiving/MS +Skye/M +skyhook +skyjacker/M +skyjack/ZSGRDJ +Skylab/M +skylarker/M +skylark/SRDMG +Skylar/M +Skyler/M +skylight/MS +skyline/MS +Sky/M +sky/MDRSGZ +skyrocket/GDMS +skyscraper/M +skyscrape/RZ +skyward/S +skywave +skyway/M +skywriter/MS +skywriting/MS +slabbed +slabbing +slab/MS +slacken/DG +slacker/M +slackness/MS +slack/SPGTZXYRDN +Slade/M +slagged +slagging +slag/MS +slain +slake/DSG +slaked/U +slalom/SGMD +slammed +slammer/S +slamming +slam/S +slander/MDRZSG +slanderousness/M +slanderous/PY +slang/SMGD +slangy/TR +slanting/Y +slant/SDG +slantwise +slapdash/S +slaphappy/TR +slap/MS +slapped +slapper +slapping +slapstick/MS +slash/GZRSD +slashing/Y +slater/M +Slater/M +slate/SM +slather/SMDG +slating/M +slat/MDRSGZ +slatted +slattern/MYS +slatting +slaughterer/M +slaughterhouse/SM +slaughter/SJMRDGZ +slave/DSRGZM +slaveholder/SM +slaver/GDM +slavery/SM +Slavic/M +slavishness/SM +slavish/YP +Slav/MS +Slavonic/M +slaw/MS +slay/RGZS +sleaze/S +sleazily +sleaziness/SM +sleazy/RTP +sledded +sledder/S +sledding +sledgehammer/MDGS +sledge/SDGM +sled/SM +sleekness/S +sleek/PYRDGTS +sleeper/M +sleepily +sleepiness/SM +sleeping/M +sleeplessness/SM +sleepless/YP +sleepover/S +sleep/RMGZS +sleepwalker/M +sleepwalk/JGRDZS +sleepwear/M +sleepyhead/MS +sleepy/PTR +sleet/DMSG +sleety/TR +sleeveless +sleeve/SDGM +sleeving/M +sleigh/GMD +sleighs +sleight/SM +sleken/DG +slenderize/DSG +slenderness/MS +slender/RYTP +slept +Slesinger/M +sleuth/GMD +sleuths +slew/DGS +slice/DSRGZM +sliced/U +slicer/M +slicker/M +slickness/MS +slick/PSYRDGTZ +slider/M +slide/S +slid/GZDR +slight/DRYPSTG +slighter/M +slighting/Y +slightness/S +slime/SM +sliminess/S +slimline +slimmed +slimmer/S +slimmest +slimming/S +slimness/S +slim/SPGYD +slimy/PTR +sling/GMRS +slingshot/MS +slings/U +slink/GS +slinky/RT +slipcase/MS +slipcover/GMDS +slipknot/SM +slippage/SM +slipped +slipper/GSMD +slipperiness/S +slippery/PRT +slipping +slipshod +slip/SM +slipstream/MDGS +slipway/SM +slither/DSG +slithery +slit/SM +slitted +slitter/S +slitting +sliver/GSDM +slivery +Sloane/M +Sloan/M +slobber/SDG +slobbery +slob/MS +Slocum/M +sloe/MS +sloganeer/MG +slogan/MS +slogged +slogging +slog/S +sloop/SM +slop/DRSGZ +sloped/U +slope/S +slopped +sloppily +sloppiness/SM +slopping +sloppy/RTP +slosh/GSDM +slothfulness/MS +slothful/PY +sloth/GDM +sloths +slot/MS +slotted +slotting +slouch/DRSZG +sloucher/M +slouchy/RT +slough/GMD +sloughs +Slovakia/M +Slovakian/S +Slovak/S +Slovene/S +Slovenia/M +Slovenian/S +slovenliness/SM +slovenly/TRP +sloven/YMS +slowcoaches +slowdown/MS +slowish +slowness/MS +slow/PGTYDRS +slowpoke/MS +SLR +sludge/SDGM +sludgy/TR +slue/MGDS +sluggard/MS +slugged +slugger/SM +slugging +sluggishness/SM +sluggish/YP +slug/MS +sluice/SDGM +slumberer/M +slumber/MDRGS +slumberous +slumlord/MS +slummed +slummer +slumming +slum/MS +slummy/TR +slump/DSG +slung/U +slunk +slur/MS +slurp/GSD +slurred +slurried/M +slurring +slurrying/M +slurry/MGDS +slushiness/SM +slush/SDMG +slushy/RTP +slut/MS +sluttish +slutty/TR +Sly/M +slyness/MS +sly/RTY +smacker/M +smack/SMRDGZ +smallholders +smallholding/MS +smallish +Small/M +smallness/S +smallpox/SM +small/SGTRDP +smalltalk +smalltime +Smallwood/M +smarmy/RT +smarten/GD +smartness/S +smartypants +smart/YRDNSGTXP +smasher/M +smash/GZRSD +smashing/Y +smashup/S +smattering/SM +smearer/M +smear/GRDS +smeary/TR +smeller/M +smelliness/MS +smell/SBRDG +smelly/TRP +smelter/M +smelt/SRDGZ +Smetana/M +smidgen/MS +smilax/MS +smile/GMDSR +smiley/M +smilies +smiling/UY +smirch/SDG +smirk/GSMD +Smirnoff/M +smite/GSR +smiter/M +smith/DMG +smithereens +Smithfield/M +Smith/M +smiths +Smithsonian/M +Smithson/M +Smithtown/M +smithy/SM +smitten +Smitty/M +Sm/M +smocking/M +smock/SGMDJ +smoggy/TR +smog/SM +smoke/GZMDSRBJ +smokehouse/MS +smokeless +smoker/M +smokescreen/S +smokestack/MS +Smokey/M +smokiness/S +smoking/M +smoky/RSPT +smoldering/Y +smolder/SGD +Smolensk/M +Smollett/M +smooch/SDG +smoothen/DG +smoother/M +smoothie/SM +smoothness/MS +smooths +smooth/TZGPRDNY +smörgĺsbord/SM +smote +smother/GSD +SMSA/MS +SMTP +Smucker/M +smudge/GSD +smudginess/M +smudgy/TRP +smugged +smugger +smuggest +smugging +smuggle/JZGSRD +smuggler/M +smugness/MS +smug/YSP +smut/SM +Smuts/M +smutted +smuttiness/SM +smutting +smutty/TRP +Smyrna/M +snack/SGMD +snaffle/GDSM +snafu/DMSG +snagged +snagging +snag/MS +snail/GSDM +Snake +snakebird/M +snakebite/MS +snake/DSGM +snakelike +snakeroot/M +snaky/TR +snapback/M +snapdragon/MS +snapped/U +snapper/SM +snappily +snappiness/SM +snapping/U +snappishness/SM +snappish/PY +snappy/PTR +snapshot/MS +snapshotted +snapshotting +snap/US +snare/DSRGM +snarer/M +snarf/JSGD +snarler/M +snarling/Y +snarl/UGSD +snarly/RT +snatch/DRSZG +snatcher/M +snazzily +snazzy/TR +Snead/M +sneaker/MD +sneakily +sneakiness/SM +sneaking/Y +sneak/RDGZS +sneaky/PRT +Sneed/M +sneerer/M +sneer/GMRDJS +sneering/Y +sneeze/SRDG +Snell/M +snicker/GMRD +snick/MRZ +snideness/M +Snider/M +snide/YTSRP +sniffer/M +sniff/GZSRD +sniffle/GDRS +sniffler/M +sniffles/M +snifter/MDSG +snigger's +sniper/M +snipe/SM +snipped +snipper/SM +snippet/SM +snipping +snippy/RT +snip/SGDRZ +snitch/GDS +snit/SM +sniveler/M +snivel/JSZGDR +Sn/M +snobbery/SM +snobbishness/S +snobbish/YP +snobby/RT +snob/MS +Snodgrass/M +snood/SGDM +snooker/GMD +snook/SMRZ +snooper/M +snoop/SRDGZ +Snoopy/M +snoopy/RT +snootily +snootiness/MS +snoot/SDMG +snooty/TRP +snooze/GSD +snore/DSRGZ +snorkel/ZGSRDM +snorter/M +snort/GSZRD +snot/MS +snotted +snottily +snottiness/SM +snotting +snotty/TRP +snout/SGDM +snowball/SDMG +snowbank/SM +Snowbelt/SM +snowbird/SM +snowblower/S +snowboard/GZDRJS +snowbound +snowcapped +snowdrift/MS +snowdrop/MS +snowfall/MS +snowfield/MS +snowflake/MS +snow/GDMS +snowily +snowiness/MS +Snow/M +snowman/M +snowmen +snowmobile/GMDRS +snowplough/M +snowploughs +snowplow/SMGD +snowshed +snowshoeing +snowshoe/MRS +snowshoer/M +snowstorm/MS +snowsuit/S +snowy/RTP +snubbed +snubber +snubbing +snub/SP +snuffbox/SM +snuffer/M +snuff/GZSYRD +snuffle/GDSR +snuffler/M +snuffly/RT +snugged +snugger +snuggest +snugging +snuggle/GDS +snuggly +snugness/MS +snug/SYP +Snyder/M +so +SO +soaker/M +soak/GDRSJ +soapbox/DSMG +soapiness/S +soap/MDRGS +soapstone/MS +soapsud/S +soapy/RPT +soar/DRJSG +soarer/M +soaring/Y +sobbed +sobbing/Y +soberer/M +soberness/SM +sober/PGTYRD +sobriety/SIM +sobriquet/MS +sob/SZR +Soc +soccer/MS +sociabilities +sociability/IM +sociable/S +sociably/IU +socialism/SM +socialistic +socialist/SM +socialite/SM +sociality/M +socialization/SM +socialized/U +socializer/M +socialize/RSDG +socially/U +social/SY +societal/Y +society/MS +socio +sociobiology/M +sociocultural/Y +sociodemographic +socioeconomically +socioeconomic/S +sociolinguistics/M +sociological/MY +sociologist/SM +sociology/SM +sociometric +sociometry/M +sociopath/M +sociopaths +socket/SMDG +sock/GDMS +Socorro/M +Socrates/M +Socratic/S +soc/S +soda/SM +sodded +sodden/DYPSG +soddenness/M +sodding +Soddy/M +sodium/MS +sod/MS +sodomite/MS +sodomize/GDS +Sodom/M +sodomy/SM +soever +sofa/SM +Sofia/M +Sofie/M +softball/MS +softbound +softener/M +soften/ZGRD +softhearted +softie's +softness/MS +soft/SPXTYNR +software/MS +softwood/SM +softy/SM +soggily +sogginess/S +soggy/RPT +Soho/M +soigné +soiled/U +soil/SGMD +soirée/SM +sojourn/RDZGSM +solace/GMSRD +solacer/M +solaria +solarium/M +solar/S +solder/RDMSZG +soldier/MDYSG +soldiery/MS +sold/RU +solecism/MS +soled/FA +solemness +solemnify/GSD +solemnity/MS +solemnization/SM +solemnize/GSD +solemnness/SM +solemn/PTRY +solenoid/MS +soler/F +soles/IFA +sole/YSP +sol/GSMDR +solicitation/S +solicited/U +solicitor/MS +solicitousness/S +solicitous/YP +solicit/SDG +solicitude/MS +solidarity/MS +solidi +solidification/M +solidify/NXSDG +solidity/S +solidness/SM +solid/STYRP +solidus/M +soliloquies +soliloquize/DSG +soliloquy/M +soling/NM +solipsism/MS +solipsist/S +Solis/M +solitaire/SM +solitary/SP +solitude/SM +Sollie/M +Solly/M +Sol/MY +solo/DMSG +soloist/SM +Solomon/SM +Solon/M +Soloviev/M +solstice/SM +solubility/IMS +soluble/SI +solute/ENAXS +solute's +solution/AME +solvable/UI +solvating +solve/ABSRDZG +solved/EU +solvency/IMS +solvent/IS +solvently +solvent's +solver/MEA +solves/E +solving/E +Solzhenitsyn/M +Somalia/M +Somalian/S +Somali/MS +soma/M +somatic +somberness/SM +somber/PY +sombre +sombrero/SM +somebody'll +somebody/SM +someday +somehow +someone'll +someone/SM +someplace/M +somersault/DSGM +Somerset/M +somerset/S +somersetted +somersetting +Somerville/M +something/S +sometime/S +someway/S +somewhat/S +somewhere/S +some/Z +sommelier/SM +Somme/M +somnambulism/SM +somnambulist/SM +somnolence/MS +somnolent/Y +Somoza/M +sonar/SM +sonata/MS +sonatina/SM +Sondheim/M +Sondra/M +Sonenberg/M +songbag +songbird/SM +songbook/S +songfest/MS +songfulness/M +songful/YP +Songhai/M +Songhua/M +song/MS +songster/MS +songstress/SM +songwriter/SM +songwriting +Sonia/M +sonic/S +Sonja/M +Son/M +sonnet/MDSG +Sonnie/M +Sonni/M +Sonnnie/M +Sonny/M +sonny/SM +Sonoma/M +Sonora/M +sonority/S +sonorousness/SM +sonorous/PY +son/SMY +Sontag/M +sonuvabitch +Sonya/M +Sony/M +soonish +soon/TR +soothe +soother/M +sooth/GZTYSRDMJ +soothingness/M +soothing/YP +sooths +soothsayer/M +soothsay/JGZR +soot/MGDS +sooty/RT +SOP +Sophey/M +Sophia/SM +Sophie/M +Sophi/M +sophism/SM +sophister/M +sophistical +sophisticatedly +sophisticated/U +sophisticate/XNGDS +sophistication/MU +sophistic/S +sophist/RMS +sophistry/SM +Sophoclean +Sophocles/M +sophomore/SM +sophomoric +Sophronia/M +soporifically +soporific/SM +sopped +sopping/S +soppy/RT +soprano/SM +sop/SM +Sopwith/M +sorbet/SM +Sorbonne/M +sorcerer/MS +sorceress/S +sorcery/MS +Sorcha/M +sordidness/SM +sordid/PY +sorehead/SM +soreness/S +Sorensen/M +Sorenson/M +sore/PYTGDRS +sorghum/MS +sorority/MS +sorrel/SM +Sorrentine/M +sorrily +sorriness/SM +sorrower/M +sorrowfulness/SM +sorrowful/YP +sorrow/GRDMS +sorry/PTSR +sorta +sortable +sorted/U +sorter/MS +sort/FSAGD +sortieing +sortie/MSD +sort's +sos +SOS +Sosa/M +Sosanna/M +Soto/M +sot/SM +sottish +soubriquet's +soufflé/MS +sough/DG +soughs +sought/U +soulfulness/MS +soulful/YP +soulless/Y +soul/MDS +sound/AUD +soundboard/MS +sounders +sounder's +sounder/U +soundest +sounding/AY +soundings +sounding's +soundless/Y +soundly/U +soundness/UMS +soundproof/GSD +soundproofing/M +sound's +sounds/A +soundtrack/MS +soupçon/SM +soup/GMDS +Souphanouvong/M +soupy/RT +source/ASDMG +sourceless +sourdough +sourdoughs +sourish +sourness/MS +sourpuss/MS +sour/TYDRPSG +Sousa/M +sousaphone/SM +sous/DSG +souse +sou/SMH +Southampton/M +southbound +southeastern +southeaster/YM +Southeast/MS +southeast/RZMS +southeastward/S +southerly/S +souther/MY +southerner/M +Southerner/MS +southernisms +southernmost +southern/PZSYR +Southey/M +Southfield/M +southing/M +southland/M +South/M +southpaw/MS +south/RDMG +souths +Souths +southward/S +southwestern +southwester/YM +Southwest/MS +southwest/RMSZ +southwestward/S +souvenir/SM +sou'wester +sovereignty/MS +sovereign/YMS +soviet/MS +Soviet/S +sow/ADGS +sowbelly/M +sowens/M +sower/DS +Soweto/M +sown/A +sox's +soybean/MS +Soyinka/M +soy/MS +Soyuz/M +Spaatz/M +spacecraft/MS +space/DSRGZMJ +spaceflight/S +spaceman/M +spacemen +spaceport/SM +spacer/M +spaceship/MS +spacesuit/MS +spacewalk/GSMD +Spacewar/M +spacewoman +spacewomen +spacey +spacial +spacier +spaciest +spaciness +spacing/M +spaciousness/SM +spacious/PY +Spackle +spade/DSRGM +spadeful/SM +spader/M +spadework/SM +spadices +spadix/M +Spafford/M +spaghetti/SM +Spahn/M +Spain/M +spake +Spalding/M +Spam/M +spa/MS +Span +spandex/MS +spandrels +spangle/GMDS +Spanglish/S +Spaniard/SM +spanielled +spanielling +spaniel/SM +Spanish/M +spanker/M +spanking/M +spank/SRDJG +span/MS +spanned/U +spanner/SM +spanning +SPARC/M +SPARCstation/M +spar/DRMGTS +spareness/MS +spare/PSY +spareribs +sparer/M +sparing/UY +sparker/M +sparkle/DRSGZ +sparkler/M +Sparkman/M +Sparks +spark/SGMRD +sparky/RT +sparling/SM +sparred +sparrer +sparring/U +sparrow/MS +sparseness/S +sparse/YP +sparsity/S +spars/TR +Spartacus/M +Sparta/M +spartan +Spartan/S +spasm/GSDM +spasmodic +spasmodically +spastic/S +spate/SM +spathe/MS +spatiality/M +spatial/Y +spat/MS +spatted +spatter/DGS +spatterdock/M +spatting +spatula/SM +spavin/DMS +spawner/M +spawn/MRDSG +spay/DGS +SPCA +speakable/U +speakeasy/SM +speaker/M +Speaker's +speakership/M +speaking/U +speak/RBGZJS +spearer/M +spearfish/SDMG +spearhead/GSDM +spearmint/MS +spear/MRDGS +Spears +spec'd +specialism/MS +specialist/MS +specialization/SM +specialized/U +specialize/GZDSR +specializing/U +special/SRYP +specialty/MS +specie/MS +specif +specifiability +specifiable +specifiably +specifically +specification/SM +specificity/S +specific/SP +specified/U +specifier/SM +specifies +specify/AD +specifying +specimen/SM +spec'ing +speciousness/SM +specious/YP +speck/GMDS +speckle/GMDS +spec/SM +spectacle/MSD +spectacular/SY +spectator/SM +specter/DMS +specter's/A +spectralness/M +spectral/YP +spectra/M +spectrogram/MS +spectrographically +spectrograph/M +spectrography/M +spectrometer/MS +spectrometric +spectrometry/M +spectrophotometer/SM +spectrophotometric +spectrophotometry/M +spectroscope/SM +spectroscopic +spectroscopically +spectroscopy/SM +spectrum/M +specularity +specular/Y +speculate/VNGSDX +speculation/M +speculative/Y +speculator/SM +sped +speech/GMDS +speechlessness/SM +speechless/YP +speedboat/GSRM +speedboating/M +speeder/M +speedily +speediness/SM +speedometer/MS +speed/RMJGZS +speedster/SM +speedup/MS +speedway/SM +speedwell/MS +speedy/PTR +speer/M +speleological +speleologist/S +speleology/MS +spellbinder/M +spellbind/SRGZ +spellbound +spelldown/MS +spelled/A +speller/M +spelling/M +spell/RDSJGZ +spells/A +spelunker/MS +spelunking/S +Spencerian +Spencer/M +Spence/RM +spender/M +spend/SBJRGZ +spendthrift/MS +Spenglerian +Spengler/M +Spense/MR +Spenserian +Spenser/M +spent/U +spermatophyte/M +spermatozoa +spermatozoon/M +spermicidal +spermicide/MS +sperm/SM +Sperry/M +spew/DRGZJS +spewer/M +SPF +sphagnum/SM +sphere/SDGM +spherical/Y +spheric/S +spherics/M +spheroidal/Y +spheroid/SM +spherule/MS +sphincter/SM +Sphinx/M +sphinx/MS +Spica/M +spic/DGM +spicebush/M +spice/SM +spicily +spiciness/SM +spicule/MS +spicy/PTR +spider/SM +spiderweb/S +spiderwort/M +spidery/TR +Spiegel/M +Spielberg/M +spiel/GDMS +spier/M +spiffy/TDRSG +spigot/MS +spike/GMDSR +Spike/M +spiker/M +spikiness/SM +spiky/PTR +spillage/SM +Spillane/M +spillover/SM +spill/RDSG +spillway/SM +spinach/MS +spinal/YS +spindle/JGMDRS +spindly/RT +spinelessness/M +spineless/YP +spine/MS +spinet/SM +spininess/M +spinnability/M +spinnaker/SM +spinneret/MS +spinner/SM +spinning/SM +Spinoza/M +spin/S +spinsterhood/SM +spinsterish +spinster/MS +spiny/PRT +spiracle/SM +spiraea's +spiral/YDSG +spire/AIDSGF +spirea/MS +spire's +spiritedness/M +spirited/PY +spirit/GMDS +spiritless +spirits/I +spiritualism/SM +spiritualistic +spiritualist/SM +spirituality/SM +spiritual/SYP +spirituous +spirochete/SM +Spiro/M +spiry/TR +spitball/SM +spite/CSDAG +spitefuller +spitefullest +spitefulness/MS +spiteful/PY +spite's/A +spitfire/SM +spit/SGD +spitted +spitting +spittle/SM +spittoon/SM +Spitz/M +splashdown/MS +splasher/M +splash/GZDRS +splashily +splashiness/MS +splashy/RTP +splat/SM +splatted +splatter/DSG +splatting +splayfeet +splayfoot/MD +splay/SDG +spleen/SM +splendidness/M +splendid/YRPT +splendorous +splendor/SM +splenetic/S +splicer/M +splice/RSDGZJ +spline/MSD +splinter/GMD +splintery +splint/SGZMDR +splits/M +split/SM +splittable +splitter/MS +splitting/S +splodge/SM +splotch/MSDG +splotchy/RT +splurge/GMDS +splutterer/M +splutter/RDSG +Sp/M +Spock/M +spoilables +spoilage/SM +spoil/CSZGDR +spoiled/U +spoiler/MC +spoilsport/SM +Spokane/M +spoke/DSG +spoken/U +spokeshave/MS +spokesman/M +spokesmen +spokespeople +spokesperson/S +spokeswoman/M +spokeswomen +spoliation/MCS +spongecake +sponge/GMZRSD +sponger/M +sponginess/S +spongy/TRP +sponsor/DGMS +sponsorship/S +spontaneity/SM +spontaneousness/M +spontaneous/PY +spoof/SMDG +spookiness/MS +spook/SMDG +spooky/PRT +spool/SRDMGZ +spoonbill/SM +spoonerism/SM +spoonful/MS +spoon/GSMD +spoor/GSMD +sporadically +sporadic/Y +spore/DSGM +sporran/MS +sportiness/SM +sporting/Y +sportiveness/M +sportive/PY +sportscast/RSGZM +sportsmanlike/U +sportsman/MY +sportsmanship/MS +sportsmen +sportswear/M +sportswoman/M +sportswomen +sportswriter/S +sport/VGSRDM +sporty/PRT +Sposato/M +spotlessness/MS +spotless/YP +spotlight/GDMS +spotlit +spot/MSC +spotted/U +spotter/MS +spottily +spottiness/SM +spotting/M +spotty/RTP +spousal/MS +spouse/GMSD +spouter/M +spout/SGRD +sprain/SGD +sprang/S +sprat/SM +sprawl/GSD +sprayed/UA +sprayer/M +spray/GZSRDM +sprays/A +spreadeagled +spreader/M +spread/RSJGZB +spreadsheet/S +spreeing +spree/MDS +sprigged +sprigging +sprightliness/MS +sprightly/PRT +sprig/MS +springboard/MS +springbok/MS +springeing +springer/M +Springfield/M +springily +springiness/SM +springing/M +springlike +spring/SGZR +Springsteen/M +springtime/MS +springy/TRP +sprinkle/DRSJZG +sprinkler/DM +sprinkling/M +Sprint/M +sprint/SGZMDR +sprite/SM +spritz/GZDSR +sprocket/DMGS +sprocketed/U +Sproul/M +sprout/GSD +spruce/GMTYRSDP +spruceness/SM +sprue/M +sprung/U +spryness/S +spry/TRY +SPSS +spudded +spudding +spud/MS +Spuds/M +spume/DSGM +spumone's +spumoni/S +spumy/TR +spun +spunk/GSMD +spunky/SRT +spurge/MS +spuriousness/SM +spurious/PY +spur/MS +spurn/RDSG +spurred +spurring +spurt/SGD +sputa +Sputnik +sputnik/MS +sputter/DRGS +sputum/M +spy/DRSGM +spyglass/MS +sq +sqq +sqrt +squabbed +squabber +squabbest +squabbing +squabbler/M +squabble/ZGDRS +squab/SM +squadded +squadding +squadron/MDGS +squad/SM +squalidness/SM +squalid/PRYT +squaller/M +squall/GMRDS +squally/RT +squalor/SM +squamous/Y +squander/GSRD +Squanto +square/GMTYRSDP +squareness/SM +squarer/M +Squaresville/M +squarish +squash/GSRD +squashiness/M +squashy/RTP +squatness/MS +squat/SPY +squatted +squatter/SMDG +squattest +squatting +squawker/M +squawk/GRDMZS +squaw/SM +squeaker/M +squeakily +squeakiness/S +squeak/RDMGZS +squeaky/RPT +squealer/M +squeal/MRDSGZ +squeamishness/SM +squeamish/YP +squeegee/DSM +squeegeeing +squeeze/GZSRDB +squeezer/M +squelcher/M +squelch/GDRS +squelchy/RT +squibbed +Squibb/GM +squibbing +Squibbing/M +squib/SM +squidded +squidding +squid/SM +squiggle/MGDS +squiggly/RT +squinter/M +squint/GTSRD +squinting/Y +squirehood +squire/SDGM +squirm/SGD +squirmy/TR +squirrel/SGYDM +squirter/M +squirt/GSRD +squish/GSD +squishy/RTP +Sr +Srinagar/M +SRO +S's +SS +SSA +SSE +ssh +s's/KI +SSS +SST +SSW +ST +stabbed +stabber/S +stabbing/S +stability/ISM +stabilizability +stabilization/CS +stabilization's +stabilize/CGSD +stabilizer/MS +stableman/M +stablemate +stablemen +stableness/UM +stable/RSDGMTP +stabler/U +stable's/F +stables/F +stablest/U +stabling/M +stably/U +stab/YS +staccato/S +Stacee/M +Stace/M +Stacey/M +Stacia/M +Stacie/M +Staci/M +stackable +stacker/M +stack's +stack/USDG +Stacy/M +stadias +stadia's +stadium/MS +Stael/M +Stafani/M +staff/ADSG +Staffard/M +staffer/MS +Stafford/M +Staffordshire/M +staffroom +staff's +Staford/M +stag/DRMJSGZ +stagecoach/MS +stagecraft/MS +stagehand/MS +stager/M +stage/SM +stagestruck +stagflation/SM +stagged +staggerer/M +stagger/GSJDR +staggering/Y +staggers/M +stagging +staginess/M +staging/M +stagnancy/SM +stagnant/Y +stagnate/NGDSX +stagnation/M +stagy/PTR +Stahl/M +staidness/MS +staid/YRTP +stained/U +stainer/M +stainless/YS +stain/SGRD +staircase/SM +stair/MS +stairway/SM +stairwell/MS +stake/DSGM +stakeholder/S +stakeout/SM +stalactite/SM +stalag/M +stalagmite/SM +stalemate/SDMG +staleness/MS +stale/PGYTDSR +Staley/M +Stalingrad/M +Stalinist +Stalin/SM +stalker/M +stalk/MRDSGZJ +stall/DMSJG +stalled/I +stallholders +stallion/SM +Stallone/M +stalls/I +stalwartness/M +stalwart/PYS +Sta/M +stamen/MS +Stamford/M +stamina/SM +staminate +stammer/DRSZG +stammerer/M +stammering/Y +stampede/MGDRS +stampeder/M +stamped/U +stamper/M +stamp/RDSGZJ +stance/MIS +stancher/M +stanch/GDRST +stanchion/SGMD +standalone +standardization/AMS +standardized/U +standardize/GZDSR +standardizer/M +standardizes/A +standard/YMS +standby +standbys +standee/MS +Standford/M +standing/M +Standish/M +standoffish +standoff/SM +standout/MS +standpipe/MS +standpoint/SM +stand/SJGZR +standstill/SM +Stanfield/M +Stanford/M +Stanislas/M +Stanislaus/M +Stanislavsky/M +Stanislaw/M +stank/S +Stanleigh/M +Stanley/M +Stanly/M +stannic +stannous +Stanton/M +Stanwood/M +Stan/YMS +stanza/MS +staph/M +staphs +staphylococcal +staphylococci +staphylococcus/M +stapled/U +stapler/M +Stapleton/M +staple/ZRSDGM +starboard/SDMG +starchily +starchiness/MS +starch/MDSG +starchy/TRP +stardom/MS +star/DRMGZS +stardust/MS +stare/S +starfish/SM +Stargate/M +stargaze/ZGDRS +staring/U +Starkey/M +Stark/M +starkness/MS +stark/SPGTYRD +Starla/M +Starlene/M +starless +starlet/MS +starlight/MS +starling/MS +Starlin/M +starlit +Star/M +starred +starring +Starr/M +starry/TR +starship +starstruck +start/ASGDR +starter/MS +startle/GDS +startling/PY +startup/SM +starvation/MS +starveling/M +starver/M +starve/RSDG +stash/GSD +stasis/M +stat/DRSGV +statecraft/MS +stated/U +statehood/MS +statehouse/S +Statehouse's +state/IGASD +statelessness/MS +stateless/P +stateliness/MS +stately/PRT +statement/MSA +Staten/M +stater/M +stateroom/SM +stateside +state's/K +states/K +statesmanlike +statesman/MY +statesmanship/SM +statesmen +stateswoman +stateswomen +statewide +statical/Y +static/S +statics/M +stationarity +stationary/S +stationer/M +stationery/MS +stationmaster/M +station/SZGMDR +statistical/Y +statistician/MS +statistic/MS +Statler/M +stator/SM +statuary/SM +statue/MSD +statuesque/YP +statuette/MS +stature/MS +status/SM +statute/SM +statutorily +statutory/P +Stauffer/M +staunchness/S +staunch/PDRSYTG +stave/DGM +Stavro/MS +stay/DRGZS +stayer/M +std +STD +stdio +steadfastness/MS +steadfast/PY +steadily/U +steadiness's +steadiness/US +steading/M +stead/SGDM +steady/DRSUTGP +steakhouse/SM +steak/SM +stealer/M +stealing/M +steal/SRHG +stealthily +stealthiness/MS +stealth/M +stealths +stealthy/PTR +steamboat/MS +steamer/MDG +steamfitter/S +steamfitting/S +steamily +steaminess/SM +steamroller/DMG +steamroll/GZRDS +steam/SGZRDMJ +steamship/SM +steamy/RSTP +Stearne/M +Stearn/SM +steed/SM +Steele/M +steeliness/SM +steelmaker/M +steel/SDMGZ +steelworker/M +steelwork/ZSMR +steelyard/MS +steely/TPRS +Steen/M +steepen/GD +steeper/M +steeplebush/M +steeplechase/GMSD +steeplejack/MS +steeple/MS +steepness/S +steep/SYRNDPGTX +steerage/MS +steerer/M +steer/SGBRDJ +steersman/M +steersmen +steeves +Stefa/M +Stefania/M +Stefanie/M +Stefan/M +Stefano/M +Steffane/M +Steffen/M +Steffie/M +Steffi/M +stegosauri +stegosaurus/S +Steinbeck/SM +Steinberg/M +Steinem/M +Steiner/M +Steinmetz/M +Stein/RM +stein/SGZMRD +Steinway/M +Stella/M +stellar +stellated +Ste/M +stemless +stemmed/U +stemming +stem/MS +stemware/MS +stench/GMDS +stenciler/M +stencil/GDRMSZ +stencillings +Stendhal/M +Stendler/M +Stengel/M +stenographer/SM +stenographic +stenography/SM +steno/SM +stenotype/M +stentorian +stepbrother/MS +stepchild/M +stepchildren +stepdaughter/MS +stepfather/SM +Stepha/M +Stephana/M +Stephanie/M +Stephani/M +Stephan/M +Stephannie/M +Stephanus/M +Stephenie/M +Stephen/MS +Stephenson/M +Stephie/M +Stephi/M +Stephine/M +stepladder/SM +step/MIS +stepmother/SM +stepparent/SM +stepper/M +steppe/RSDGMZ +steppingstone/S +stepsister/SM +stepson/SM +stepwise +stereographic +stereography/M +stereo/GSDM +stereophonic +stereoscope/MS +stereoscopic +stereoscopically +stereoscopy/M +stereotype/GMZDRS +stereotypic +stereotypical/Y +sterile +sterility/SM +sterilization/SM +sterilized/U +sterilize/RSDGZ +sterilizes/A +Sterling/M +sterling/MPYS +sterlingness/M +sternal +Sternberg/M +Sterne/M +Stern/M +sternness/S +Sterno +stern/SYRDPGT +sternum/SM +steroidal +steroid/MS +stertorous +Stesha/M +stethoscope/SM +stet/MS +stetson/MS +Stetson/SM +stetted +stetting +Steuben/M +Stevana/M +stevedore/GMSD +Steve/M +Stevena/M +Steven/MS +Stevenson/M +Stevie/M +Stevy/M +steward/DMSG +stewardess/SM +Steward/M +stewardship/MS +Stewart/M +stew/GDMS +st/GBJ +sticker/M +stickily +stickiness/SM +stickleback/MS +stickle/GZDR +stickler/M +stick/MRDSGZ +stickpin/SM +stickup/SM +sticky/GPTDRS +Stieglitz/M +stiffen/JZRDG +stiff/GTXPSYRND +stiffness/MS +stifle/GJRSD +stifler/M +stifling/Y +stigma/MS +stigmata +stigmatic/S +stigmatization/C +stigmatizations +stigmatization's +stigmatize/DSG +stigmatized/U +stile/GMDS +stiletto/MDSG +stillbirth/M +stillbirths +stillborn/S +stiller/MI +stillest +Stillman/M +Stillmann/M +stillness/MS +still/RDIGS +Stillwell/M +stilted/PY +stilt/GDMS +Stilton/MS +Stimson/M +stimulant/MS +stimulated/U +stimulate/SDVGNX +stimulation/M +stimulative/S +stimulator/M +stimulatory +stimuli/M +stimulus/MS +Stine/M +stinger/M +sting/GZR +stingily +stinginess/MS +stinging/Y +stingray/MS +stingy/RTP +stinkbug/S +stinker/M +stink/GZRJS +stinking/Y +stinkpot/M +Stinky/M +stinky/RT +stinter/M +stinting/U +stint/JGRDMS +stipendiary +stipend/MS +stipple/JDRSG +stippler/M +stipulate/XNGSD +stipulation/M +Stirling/M +stirred/U +stirrer/SM +stirring/YS +stirrup/SM +stir/S +stitch/ASDG +stitcher/M +stitchery/S +stitching/MS +stitch's +St/M +stoat/SM +stochastic +stochastically +stochasticity +stockade/SDMG +stockbreeder/SM +stockbroker/MS +stockbroking/S +stocker/SM +Stockhausen/M +stockholder/SM +Stockholm/M +stockily +stockiness/SM +stockinet's +stockinette/S +stocking/MDS +stockist/MS +stockpile/GRSD +stockpiler/M +stockpot/MS +stockroom/MS +stock's +stock/SGAD +stocktaking/MS +Stockton/M +stockyard/SM +stocky/PRT +Stoddard/M +stodge/M +stodgily +stodginess/S +stodgy/TRP +stogy/SM +stoical/Y +stoichiometric +stoichiometry/M +stoicism/SM +Stoicism/SM +stoic/MS +Stoic/MS +stoke/DSRGZ +stoker/M +stokes/M +Stokes/M +STOL +stole/MDS +stolen +stolidity/S +stolidness/S +stolid/PTYR +stolon/SM +stomachache/MS +stomacher/M +stomach/RSDMZG +stomachs +stomp/DSG +stonecutter/SM +stone/DSRGM +Stonehenge/M +stoneless +Stone/M +stonemason/MS +stoner/M +stonewall/GDS +stoneware/MS +stonewashed +stonework/SM +stonewort/M +stonily +stoniness/MS +stony/TPR +stood +stooge/SDGM +stool/SDMG +stoop/SDG +stopcock/MS +stopgap/SM +stoplight/SM +stopover/MS +stoppable/U +stoppage/MS +Stoppard/M +stopped/U +stopper/GMDS +stopping/M +stopple/GDSM +stop's +stops/M +stop/US +stopwatch/SM +storage/SM +store/ADSRG +storefront/SM +storehouse/MS +storekeeper/M +storekeep/ZR +storeroom/SM +store's +stork/SM +stormbound +stormer/M +Stormie/M +stormily +Stormi/M +storminess/S +Storm/M +storm/SRDMGZ +stormtroopers +Stormy/M +stormy/PTR +storyboard/MDSG +storybook/MS +story/GSDM +storyline +storyteller/SM +storytelling/MS +Stouffer/M +stoup/SM +stouten/DG +stouthearted +Stout/M +stoutness/MS +stout/STYRNP +stove/DSRGM +stovepipe/SM +stover/M +stowage/SM +stowaway/MS +Stowe/M +stow/GDS +Strabo/M +straddler/M +straddle/ZDRSG +Stradivari/SM +Stradivarius/M +strafe/GRSD +strafer/M +straggle/GDRSZ +straggly/RT +straightaway/S +straightedge/MS +straightener/M +straighten/ZGDR +straightforwardness/MS +straightforward/SYP +straightjacket's +straightness/MS +straight/RNDYSTXGP +straightway/S +strain/ASGZDR +strained/UF +strainer/MA +straining/F +strains/F +straiten/DG +straitjacket/GDMS +straitlaced +straitness/M +strait/XTPSMGYDNR +stranded/P +strand/SDRG +strangeness/SM +strange/PYZTR +stranger/GMD +stranglehold/MS +strangle/JDRSZG +strangles/M +strangulate/NGSDX +strangulation/M +strapless/S +strapped/U +strapping/S +strap's +strap/US +Strasbourg/M +stratagem/SM +strata/MS +strategical/Y +strategic/S +strategics/M +strategist/SM +strategy/SM +Stratford/M +strati +stratification/M +stratified/U +stratify/NSDGX +stratigraphic +stratigraphical +stratigraphy/M +stratosphere/SM +stratospheric +stratospherically +stratum/M +stratus/M +Strauss +Stravinsky/M +strawberry/SM +strawflower/SM +straw/SMDG +strayer/M +stray/GSRDM +streak/DRMSGZ +streaker/M +streaky/TR +streamed/U +streamer/M +stream/GZSMDR +streaming/M +streamline/SRDGM +streetcar/MS +streetlight/SM +street/SMZ +streetwalker/MS +streetwise +Streisand/M +strengthen/AGDS +strengthener/MS +strength/NMX +strengths +strenuousness/SM +strenuous/PY +strep/MS +streptococcal +streptococci +streptococcus/M +streptomycin/SM +stress/DSMG +stressed/U +stressful/YP +stretchability/M +stretchable/U +stretch/BDRSZG +stretcher/DMG +stretchy/TRP +strew/GDHS +strewn +striae +stria/M +striate/DSXGN +striated/U +striation/M +stricken +Strickland/M +strict/AF +stricter +strictest +strictly +strictness/S +stricture/SM +stridden +stridency/S +strident/Y +strider/M +stride/RSGM +strife/SM +strikebreaker/M +strikebreaking/M +strikebreak/ZGR +strikeout/S +striker/M +strike/RSGZJ +striking/Y +Strindberg/M +stringed +stringency/S +stringent/Y +stringer/MS +stringiness/SM +stringing/M +string's +string/SAG +stringy/RTP +striper/M +stripe/SM +strip/GRDMS +stripling/M +stripped/U +stripper/MS +stripping +stripteaser/M +striptease/SRDGZM +stripy/RT +strive/JRSG +striven +striver/M +strobe/SDGM +stroboscope/SM +stroboscopic +strode +stroke/ZRSDGM +stroking/M +stroller/M +stroll/GZSDR +Stromberg/M +Stromboli/M +Strom/M +strongbow +strongbox/MS +Strongheart/M +stronghold/SM +strongish +Strong/M +strongman/M +strongmen +strongroom/MS +strong/YRT +strontium/SM +strophe/MS +strophic +stropped +stropping +strop/SM +strove +struck +structuralism/M +structuralist/SM +structural/Y +structured/AU +structureless +structures/A +structure/SRDMG +structuring/A +strudel/MS +struggle/GDRS +struggler/M +strummed +strumming +strumpet/GSDM +strum/S +strung/UA +strut/S +strutted +strutter/M +strutting +strychnine/MS +Stuart/MS +stubbed/M +stubbing +Stubblefield/MS +stubble/SM +stubbly/RT +stubbornness/SM +stubborn/SGTYRDP +stubby/SRT +stub/MS +stuccoes +stucco/GDM +stuck/U +studbook/SM +studded +studding/SM +Studebaker/M +studentship/MS +student/SM +studiedness/M +studied/PY +studier/SM +studio/MS +studiousness/SM +studious/PY +stud/MS +study/AGDS +stuffily +stuffiness/SM +stuffing/M +stuff/JGSRD +stuffy/TRP +stultify/NXGSD +Stu/M +stumble/GZDSR +stumbling/Y +stumpage/M +stumper/M +stump/RDMSG +stumpy/RT +stung +stunk +stunned +stunner/M +stunning/Y +stun/S +stunted/P +stunt/GSDM +stupefaction/SM +stupefy/DSG +stupendousness/M +stupendous/PY +stupidity/SM +stupidness/M +stupid/PTYRS +stupor/MS +sturdily +sturdiness/SM +sturdy/SRPT +sturgeon/SM +Sturm/M +stutter/DRSZG +Stuttgart/M +Stuyvesant/M +sty/DSGM +Stygian +styled/A +style/GZMDSR +styles/A +styli +styling/A +stylishness/S +stylish/PY +stylistically +stylistic/S +stylist/MS +stylites +stylization/MS +stylize/DSG +stylos +stylus/SM +stymieing +stymie/SD +stymy's +styptic/S +styrene/MS +Styrofoam/S +Styx/M +suable +Suarez/M +suasion/EMS +suaveness/S +suave/PRYT +suavity/SM +subaltern/SM +subarctic/S +subareas +Subaru/M +subassembly/M +subatomic/S +subbasement/SM +subbed +subbing +subbranch/S +subcaste/M +subcategorizing +subcategory/SM +subchain +subclassifications +subclass/MS +subclauses +subcommand/S +subcommittee/SM +subcompact/S +subcomponent/MS +subcomputation/MS +subconcept +subconsciousness/SM +subconscious/PSY +subconstituent +subcontinental +subcontinent/MS +subcontractor/SM +subcontract/SMDG +subcultural +subculture/GMDS +subcutaneous/Y +subdirectory/S +subdistrict/M +subdivide/SRDG +subdivision/SM +subdued/Y +subdue/GRSD +subduer/M +subexpression/MS +subfamily/SM +subfield/MS +subfile/SM +subfreezing +subgoal/SM +subgraph +subgraphs +subgroup/SGM +subharmonic/S +subheading/M +subhead/MGJS +subhuman/S +subindex/M +subinterval/MS +subj +subject/GVDMS +subjection/SM +subjectiveness/M +subjective/PSY +subjectivist/S +subjectivity/SM +subjoin/DSG +subjugate/NGXSD +subjugation/M +subjunctive/S +sublayer +sublease/DSMG +sublet/S +subletting +sublimate/GNSDX +sublimation/M +sublime/GRSDTYP +sublimeness/M +sublimer/M +subliminal/Y +sublimity/SM +sublist/SM +subliterary +sublunary +submachine +submarginal +submarine/MZGSRD +submariner/M +submerge/DSG +submergence/SM +submerse/XNGDS +submersible/S +submersion/M +submicroscopic +submission/SAM +submissiveness/MS +submissive/PY +submit/SA +submittable +submittal +submitted/A +submitter/S +submitting/A +submode/S +submodule/MS +sub/MS +subnational +subnet/SM +subnetwork/SM +subnormal/SY +suboptimal +suborbital +suborder/MS +subordinately/I +subordinates/I +subordinate/YVNGXPSD +subordination/IMS +subordinator +subornation/SM +suborn/GSD +subpage +subparagraph/M +subpart/MS +subplot/MS +subpoena/GSDM +subpopulation/MS +subproblem/SM +subprocess/SM +subprofessional/S +subprogram/SM +subproject +subproof/SM +subquestion/MS +subrange/SM +subregional/Y +subregion/MS +subrogation/M +subroutine/SM +subsample/MS +subschema/MS +subscribe/ASDG +subscriber/SM +subscripted/U +subscription/MS +subscript/SGD +subsection/SM +subsegment/SM +subsentence +subsequence/MS +subsequent/SYP +subservience/SM +subservient/SY +subset/MS +subsidence/MS +subside/SDG +subsidiarity +subsidiary/MS +subsidization/MS +subsidized/U +subsidizer/M +subsidize/ZRSDG +subsidy/MS +subsistence/MS +subsistent +subsist/SGD +subsocietal +subsoil/DRMSG +subsonic +subspace/MS +subspecies/M +substance/MS +substandard +substantially/IU +substantialness/M +substantial/PYS +substantiated/U +substantiate/VGNSDX +substantiation/MFS +substantiveness/M +substantive/PSYM +substantivity +substation/MS +substerilization +substitutability +substituted/U +substitute/NGVBXDRS +substitutionary +substitution/M +substitutive/Y +substrata +substrate/MS +substratum/M +substring/S +substructure/SM +subsume/SDG +subsurface/S +subsystem/MS +subtable/S +subtask/SM +subteen/SM +subtenancy/MS +subtenant/SM +subtend/DS +subterfuge/SM +subterranean/SY +subtest +subtext/SM +subtitle/DSMG +subtleness/M +subtle/RPT +subtlety/MS +subtly/U +subtopic/SM +subtotal/GSDM +subtracter/M +subtraction/MS +subtract/SRDZVG +subtrahend/SM +subtree/SM +subtropical +subtropic/S +subtype/MS +subunit/SM +suburbanite/MS +suburbanization/MS +suburbanized +suburbanizing +suburban/S +suburbia/SM +suburb/MS +subvention/MS +subversion/SM +subversiveness/MS +subversive/SPY +subverter/M +subvert/SGDR +subway/MDGS +subzero +succeeder/M +succeed/GDRS +successfulness/M +successful/UY +succession/SM +successiveness/M +successive/YP +success/MSV +successor/MS +successorship +succinctness/SM +succinct/RYPT +succored/U +succorer/M +succor/SGZRDM +succotash/SM +succubus/M +succulence/SM +succulency/MS +succulent/S +succumb/SDG +such +suchlike +sucker/DMG +suck/GZSDRB +suckle/SDJG +suckling/M +Sucre/M +sucrose/MS +suction/SMGD +Sudanese/M +Sudanic/M +Sudan/M +suddenness/SM +sudden/YPS +Sudetenland/M +sud/S +suds/DSRG +sudsy/TR +sued/DG +suede/SM +Suellen/M +Sue/M +suer/M +suet/MS +Suetonius/M +suety +sue/ZGDRS +Suez/M +sufferance/SM +sufferer/M +suffering/M +suffer/SJRDGZ +suffice/GRSD +sufficiency/SIM +sufficient/IY +suffixation/S +suffixed/U +suffix/GMRSD +suffocate/XSDVGN +suffocating/Y +Suffolk/M +suffragan/S +suffrage/MS +suffragette/MS +suffragist/SM +suffuse/VNGSDX +suffusion/M +Sufi/M +Sufism/M +sugarcane/S +sugarcoat/GDS +sugarless +sugarplum/MS +sugar/SJGMD +sugary/TR +suggest/DRZGVS +suggester/M +suggestibility/SM +suggestible +suggestion/MS +suggestiveness/MS +suggestive/PY +sugillate +Suharto/M +suicidal/Y +suicide/GSDM +Sui/M +suitability/SU +suitableness/S +suitable/P +suitably/U +suitcase/MS +suited/U +suite/SM +suiting/M +suit/MDGZBJS +suitor/SM +Sukarno/M +Sukey/M +Suki/M +sukiyaki/SM +Sukkoth's +Sukkot/S +Sula/M +Sulawesi/M +Suleiman/M +sulfaquinoxaline +sulfa/S +sulfate/MSDG +sulfide/S +sulfite/M +sulfonamide/SM +sulfur/DMSG +sulfuric +sulfurousness/M +sulfurous/YP +sulk/GDS +sulkily +sulkiness/S +sulky/RSPT +Sulla/M +sullenness/MS +sullen/TYRP +sullied/U +Sullivan/M +sully/GSD +Sully/M +sulphate/SM +sulphide/MS +sulphuric +sultana/SM +sultanate/MS +sultan/SM +sultrily +sultriness/SM +sultry/PRT +Sulzberger/M +sumach's +sumac/SM +Sumatra/M +Sumatran/S +sumer/F +Sumeria/M +Sumerian/M +summability/M +summable +summand/MS +summarily +summarization/MS +summarized/U +summarize/GSRDZ +summarizer/M +summary/MS +summation/FMS +summed +Summerdale/M +summerhouse/MS +summer/SGDM +Summer/SM +summertime/MS +summery/TR +summing +summit/GMDS +summitry/MS +summoner/M +summon/JSRDGZ +summons/MSDG +sum/MRS +Sumner/M +sumo/SM +sump/SM +sumptuousness/SM +sumptuous/PY +Sumter/M +Sun +sunbaked +sunbathe +sunbather/M +sunbathing/M +sunbaths +sunbath/ZRSDG +sunbeam/MS +Sunbelt/M +sunblock/S +sunbonnet/MS +sunburn/GSMD +sunburst/MS +suncream +sundae/MS +Sundanese/M +Sundas +Sunday/MS +sunder/SDG +sundial/MS +sundowner/M +sundown/MRDSZG +sundris +sundry/S +sunfish/SM +sunflower/MS +sunglass/MS +Sung/M +sung/U +sunk/SN +sunlamp/S +sunless +sunlight/MS +sunlit +sun/MS +sunned +Sunni/MS +sunniness/SM +sunning +Sunnite/SM +Sunny/M +sunny/RSTP +Sunnyvale/M +sunrise/GMS +sunroof/S +sunscreen/S +sunset/MS +sunsetting +sunshade/MS +Sunshine/M +sunshine/MS +sunshiny +sunspot/SM +sunstroke/MS +suntanned +suntanning +suntan/SM +sunup/MS +superabundance/MS +superabundant +superannuate/GNXSD +superannuation/M +superbness/M +superb/YRPT +supercargoes +supercargo/M +supercharger/M +supercharge/SRDZG +superciliousness/SM +supercilious/PY +supercity/S +superclass/M +supercomputer/MS +supercomputing +superconcept +superconducting +superconductivity/SM +superconductor/SM +supercooled +supercooling +supercritical +superdense +super/DG +superego/SM +supererogation/MS +supererogatory +superficiality/S +superficial/SPY +superfine +superfix/M +superfluity/MS +superfluousness/S +superfluous/YP +superheat/D +superheroes +superhero/SM +superhighway/MS +superhumanness/M +superhuman/YP +superimpose/SDG +superimposition/MS +superintendence/S +superintendency/SM +superintendent/SM +superintend/GSD +superiority/MS +Superior/M +superior/SMY +superlativeness/M +superlative/PYS +superlunary +supermachine +superman/M +Superman/M +supermarket/SM +supermen +supermodel +supermom/S +supernal +supernatant +supernaturalism/M +supernaturalness/M +supernatural/SPY +supernormal/Y +supernovae +supernova/MS +supernumerary/S +superordinate +superpose/BSDG +superposition/MS +superpower/MS +superpredicate +supersaturate/XNGDS +supersaturation/M +superscribe/GSD +superscript/DGS +superscription/SM +superseder/M +supersede/SRDG +supersensitiveness/M +supersensitive/P +superset/MS +supersonically +supersonic/S +supersonics/M +superstar/SM +superstition/SM +superstitious/YP +superstore/S +superstructural +superstructure/SM +supertanker/SM +supertitle/MSDG +superuser/MS +supervene/GSD +supervention/S +supervised/U +supervise/SDGNX +supervision/M +supervisor/SM +supervisory +superwoman/M +superwomen +supineness/M +supine/PSY +supper/DMG +supplanter/M +supplant/SGRD +supplemental/S +supplementary/S +supplementation/S +supplementer/M +supplement/SMDRG +suppleness/SM +supple/SPLY +suppliant/S +supplicant/MS +supplicate/NGXSD +supplication/M +supplier/AM +suppl/RDGT +supply/MAZGSRD +supportability/M +supportable/UI +supported/U +supporter/M +supporting/Y +supportive/Y +support/ZGVSBDR +supposed/Y +suppose/SRDBJG +supposition/MS +suppository/MS +suppressant/S +suppressed/U +suppressible/I +suppression/SM +suppressive/P +suppressor/S +suppress/VGSD +suppurate/NGXSD +suppuration/M +supp/YDRGZ +supra +supranational +supranationalism/M +suprasegmental +supremacist/SM +supremacy/SM +supremal +supremeness/M +supreme/PSRTY +supremo/M +sup/RSZ +supt +Supt/M +Surabaya/M +Surat/M +surcease/DSMG +surcharge/MGSD +surcingle/MGSD +surd/M +sured/I +surefire +surefooted +surely +sureness/MS +sureness's/U +sure/PU +surer/I +surest +surety/SM +surfaced/UA +surface/GSRDPZM +surfacer/AMS +surfaces/A +surfacing/A +surfactant/SM +surfboard/MDSG +surfeit/SDRMG +surfer/M +surfing/M +surf/SJDRGMZ +surged/A +surge/GYMDS +surgeon/MS +surgery/MS +surges/A +surgical/Y +Suriname +Surinamese +Surinam's +surliness/SM +surly/TPR +surmiser/M +surmise/SRDG +surmountable/IU +surmount/DBSG +surname/GSDM +surpassed/U +surpass/GDS +surpassing/Y +surplice/SM +surplus/MS +surplussed +surplussing +surprised/U +surprise/MGDRSJ +surpriser/M +surprising/YU +surrealism/MS +surrealistic +surrealistically +surrealist/S +surreality +surreal/S +surrender/DRSG +surrenderer/M +surreptitiousness/S +surreptitious/PY +surrey/SM +surrogacy/S +surrogate/SDMNG +surrogation/M +surrounding/M +surround/JGSD +surtax/SDGM +surveillance/SM +surveillant +surveyed/A +surveying/M +survey/JDSG +surveyor/MS +surveys/A +survivability/M +survivable/U +survivalist/S +survival/MS +survive/SRDBG +survivor/MS +survivorship/M +Surya/M +Sus +Susana/M +Susanetta/M +Susan/M +Susannah/M +Susanna/M +Susanne/M +Susann/M +susceptibilities +susceptibility/IM +susceptible/I +Susette/M +sushi/SM +Susie/M +Susi/M +suspected/U +suspecter/M +suspect/GSDR +suspecting/U +suspend/DRZGS +suspended/UA +suspender/M +suspenseful +suspense/MXNVS +suspension/AM +suspensive/Y +suspensor/M +suspicion/GSMD +suspiciousness/M +suspicious/YP +Susquehanna/M +Sussex/M +sustainability +sustainable/U +sustain/DRGLBS +sustainer/M +sustainment/M +sustenance/MS +Susy/M +Sutherland/M +Sutherlan/M +sutler/MS +Sutton/M +suture/GMSD +SUV +Suva/M +Suwanee/M +Suzanna/M +Suzanne/M +Suzann/M +suzerain/SM +suzerainty/MS +Suzette/M +Suzhou/M +Suzie/M +Suzi/M +Suzuki/M +Suzy/M +Svalbard/M +svelte/RPTY +Svend/M +Svengali +Sven/M +Sverdlovsk/M +Svetlana/M +SW +swabbed +swabbing +swabby/S +Swabian/SM +swab/MS +swaddle/SDG +swagged +swagger/GSDR +swagging +swag/GMS +Swahili/MS +swain/SM +SWAK +swallower/M +swallow/GDRS +swallowtail/SM +swam +swami/SM +swamper/M +swampland/MS +swamp/SRDMG +swampy/RPT +Swanee/M +swankily +swankiness/MS +swank/RDSGT +swanky/PTRS +swanlike +swan/MS +swanned +swanning +Swansea/M +Swanson/M +swappable/U +swapped +swapper/SM +swapping +swap/S +sward/MSGD +swarmer/M +swarm/GSRDM +swarthiness/M +Swarthmore/M +swarthy/RTP +swart/P +Swartz/M +swashbuckler/SM +swashbuckling/S +swash/GSRD +swastika/SM +SWAT +swatch/MS +swathe +swather/M +swaths +swath/SRDMGJ +swat/S +swatted +swatter/MDSG +swatting +swayback/SD +sway/DRGS +swayer/M +Swaziland/M +Swazi/SM +swearer/M +swear/SGZR +swearword/SM +sweatband/MS +sweater/M +sweatily +sweatiness/M +sweatpants +sweat/SGZRM +sweatshirt/S +sweatshop/MS +sweaty/TRP +Swedenborg/M +Sweden/M +swede/SM +Swede/SM +Swedish +Swed/MN +Sweeney/SM +sweeper/M +sweepingness/M +sweeping/PY +sweep/SBRJGZ +sweeps/M +sweepstakes +sweepstake's +sweetbread/SM +sweetbrier/SM +sweetcorn +sweetened/U +sweetener/M +sweetening/M +sweeten/ZDRGJ +sweetheart/MS +sweetie/MS +sweeting/M +sweetish/Y +Sweet/M +sweetmeat/MS +sweetness/MS +sweetshop +sweet/TXSYRNPG +swellhead/DS +swelling/M +swell/SJRDGT +swelter/DJGS +sweltering/Y +Swen/M +Swenson/M +swept +sweptback +swerve/GSD +swerving/U +swifter/M +swift/GTYRDPS +Swift/M +swiftness/MS +swigged +swigging +swig/SM +swill/SDG +swimmer/MS +swimming/MYS +swim/S +swimsuit/MS +Swinburne/M +swindle/GZRSD +swindler/M +swineherd/MS +swine/SM +swingeing +swinger/M +swinging/Y +swing/SGRZJB +swingy/R +swinishness/M +swinish/PY +Swink/M +swipe/DSG +swirling/Y +swirl/SGRD +swirly/TR +swish/GSRD +swishy/R +swiss +Swiss/S +switchback/GDMS +switchblade/SM +switchboard/MS +switcher/M +switch/GBZMRSDJ +switchgear +switchman/M +switchmen/M +switchover/M +Switzerland/M +Switzer/M +Switz/MR +swivel/GMDS +swizzle/RDGM +swob's +swollen +swoon/GSRD +swooning/Y +swoop/RDSG +swoosh/GSD +swop's +sword/DMSG +swordfish/SM +swordplayer/M +swordplay/RMS +swordsman/M +swordsmanship/SM +swordsmen +swordtail/M +swore +sworn +swot/S +swum +swung +s/XJBG +sybarite/MS +sybaritic +Sybila/M +Sybilla/M +Sybille/M +Sybil/M +Sybyl/M +sycamore/SM +sycophancy/S +sycophantic +sycophantically +sycophant/SYM +Sydelle/M +Sydel/M +Syd/M +Sydney/M +Sykes/M +Sylas/M +syllabicate/GNDSX +syllabication/M +syllabicity +syllabic/S +syllabification/M +syllabify/GSDXN +syllabi's +syllable/SDMG +syllabub/M +syllabus/MS +syllabusss +syllogism/MS +syllogistic +Sylow/M +sylphic +sylphlike +sylph/M +sylphs +Sylvania/M +Sylvan/M +sylvan/S +Sylvester/M +Sylvia/M +Sylvie/M +Syman/M +symbiont/M +symbioses +symbiosis/M +symbiotic +symbol/GMDS +symbolical/Y +symbolics/M +symbolic/SM +symbolism/MS +symbolist/MS +symbolization/MAS +symbolized/U +symbolize/GZRSD +symbolizes/A +Symington/M +symmetric +symmetrically/U +symmetricalness/M +symmetrical/PY +symmetrization/M +symmetrizing +symmetry/MS +Symon/M +sympathetically/U +sympathetic/S +sympathized/U +sympathizer/M +sympathize/SRDJGZ +sympathizing/MYUS +sympathy/MS +symphonic +symphonists +symphony/MS +symposium/MS +symptomatic +symptomatically +symptomatology/M +symptom/MS +syn +synagogal +synagogue/SM +synapse/SDGM +synaptic +synchronism/M +synchronization's +synchronization/SA +synchronize/AGCDS +synchronized/U +synchronizer/MS +synchronousness/M +synchronous/YP +synchrony +synchrotron/M +syncopate/VNGXSD +syncopation/M +syncope/MS +sync/SGD +syndicalist +syndicate/XSDGNM +syndic/SM +syndrome/SM +synergism/SM +synergistic +synergy/MS +synfuel/S +Synge/M +synod/SM +synonymic +synonymous/Y +synonym/SM +synonymy/MS +synopses +synopsis/M +synopsized +synopsizes +synopsizing +synoptic/S +syntactical/Y +syntactics/M +syntactic/SY +syntax/MS +syntheses +synthesis/M +synthesized/U +synthesize/GZSRD +synthesizer/M +synthesizes/A +synthetically +synthetic/S +syphilis/MS +syphilitic/S +syphilized +syphilizing +Syracuse/M +Syriac/M +Syria/M +Syrian/SM +syringe/GMSD +syrup/DMSG +syrupy +sys +systematical/Y +systematics/M +systematic/SP +systematization/SM +systematized/U +systematizer/M +systematize/ZDRSG +systematizing/U +systemically +systemic/S +systemization/SM +system/MS +systole/MS +systolic +Szilard/M +Szymborska/M +TA +Tabasco/MS +Tabatha/M +Tabbatha/M +tabbed +Tabbie/M +Tabbi/M +tabbing +Tabbitha/M +Tabb/M +tabbouleh +tabboulehs +tabby/GSD +Tabby/M +Taber/M +Tabernacle/S +tabernacle/SDGM +Tabina/M +Tabitha/M +tabla/MS +tableau/M +tableaux +tablecloth/M +tablecloths +table/GMSD +tableland/SM +tablespoonful/MS +tablespoon/SM +tablet/MDGS +tabletop/MS +tableware/SM +tabling/M +tabloid/MS +Tab/MR +taboo/GSMD +Tabor/M +tabor/MDGS +Tabriz/SM +tab/SM +tabula +tabular/Y +tabulate/XNGDS +tabulation/M +tabulator/MS +tachometer/SM +tachometry +tachycardia/MS +tachyon/SM +tacitness/MS +taciturnity/MS +taciturn/Y +Tacitus/M +tacit/YP +tacker/M +tack/GZRDMS +tackiness/MS +tackler/M +tackle/RSDMZG +tackling/M +tacky/RSTP +Tacoma/M +taco/MS +tact/FSM +tactfulness/S +tactful/YP +tactical/Y +tactician/MS +tactic/SM +tactile/Y +tactility/S +tactlessness/SM +tactless/PY +tactual/Y +Taddeo/M +Taddeusz/M +Tadd/M +Tadeas/M +Tadeo/M +Tades +Tadio/M +Tad/M +tadpole/MS +tad/SM +Tadzhikistan's +Tadzhikstan/M +Taegu/M +Taejon/M +taffeta/MS +taffrail/SM +Taffy/M +taffy/SM +Taft/M +Tagalog/SM +tagged/U +tagger/S +tagging +Tagore/M +tag/SM +Tagus/M +Tahitian/S +Tahiti/M +Tahoe/M +Taichung/M +taiga/MS +tailback/MS +tail/CMRDGAS +tailcoat/S +tailer/AM +tailgate/MGRSD +tailgater/M +tailing/MS +taillessness/M +tailless/P +taillight/MS +tailor/DMJSGB +Tailor/M +tailpipe/SM +tailspin/MS +tailwind/SM +Tainan/M +Taine/M +taint/DGS +tainted/U +Taipei/M +Taite/M +Tait/M +Taiwanese +Taiwan/M +Taiyuan/M +Tajikistan +takeaway/S +taken/A +takeoff/SM +takeout/S +takeover/SM +taker/M +take/RSHZGJ +takes/IA +taking/IA +Taklamakan/M +Talbert/M +Talbot/M +talcked +talcking +talc/SM +talcum/S +talebearer/SM +talented/M +talentless +talent/SMD +taler/M +tale/RSMN +tali +Talia/M +Taliesin/M +talion/M +talismanic +talisman/SM +talkativeness/MS +talkative/YP +talker/M +talk/GZSRD +talkie/M +talky/RST +Talladega/M +Tallahassee/M +Tallahatchie/M +Tallahoosa/M +tallboy/MS +Tallchief/M +Talley/M +Talleyrand/M +Tallia/M +Tallie/M +Tallinn/M +tallish +tallness/MS +Tallou/M +tallow/DMSG +tallowy +tall/TPR +Tallulah/M +tally/GRSDZ +tallyho/DMSG +Tally/M +Talmudic +Talmudist/MS +Talmud/MS +talon/SMD +talus/MS +Talyah/M +Talya/M +Ta/M +tamable/M +tamale/SM +tamarack/SM +Tamarah/M +Tamara/M +tamarind/MS +Tamar/M +Tamarra/M +Tamas +tambourine/MS +tamed/U +Tameka/M +tameness/S +Tamera/M +Tamerlane/M +tame/SYP +Tamika/M +Tamiko/M +Tamil/MS +Tami/M +Tam/M +Tamma/M +Tammany/M +Tammara/M +tam/MDRSTZGB +Tammie/M +Tammi/M +Tammy/M +Tampa/M +Tampax/M +tampered/U +tamperer/M +tamper/ZGRD +tampon/DMSG +tamp/SGZRD +Tamqrah/M +Tamra/M +tanager/MS +Tanaka/M +Tana/M +Tananarive/M +tanbark/SM +Tancred/M +tandem/SM +Tandie/M +Tandi/M +tandoori/S +Tandy/M +Taney/M +T'ang +Tanganyika/M +tangelo/SM +tangency/M +tangential/Y +tangent/SM +tangerine/MS +tang/GSYDM +tangibility/MIS +tangible/IPS +tangibleness's/I +tangibleness/SM +tangibly/I +Tangier/M +tangle's +tangle/UDSG +tango/MDSG +Tangshan/M +tangy/RST +Tanhya/M +Tania/M +Tani/M +Tanisha/M +Tanitansy/M +tankard/MS +tanker/M +tankful/MS +tank/GZSRDM +Tan/M +tan/MS +tanned/U +Tannenbaum/M +Tanner/M +tanner/SM +tannery/MS +tannest +Tanney/M +Tannhäuser/M +Tannie/M +tanning/SM +tannin/SM +Tann/RM +Tanny/M +Tansy/M +tansy/SM +tantalization/SM +tantalized/U +tantalize/GZSRD +tantalizingly/S +tantalizingness/S +tantalizing/YP +tantalum/MS +Tantalus/M +tantamount +tantra/S +tantrum/SM +Tanya/M +Tanzania/M +Tanzanian/S +taoism +Taoism/MS +Taoist/MS +taoist/S +Tao/M +tao/S +Tapdance/M +taped/U +tapeline/S +taperer/M +taper/GRD +tape/SM +tapestry/GMSD +tapeworm/MS +tapioca/MS +tapir/MS +tap/MSDRJZG +tapped/U +tapper/MS +tappet/MS +tapping/M +taproom/MS +taproot/SM +taps/M +Tarah/M +Tara/M +tarantella/MS +tarantula/MS +Tarawa/M +Tarazed/M +Tarbell/M +tardily +tardiness/S +tardy/TPRS +tare/MS +target/GSMD +tar/GSMD +tariff/DMSG +Tarim/M +Tarkington/M +tarmacked +tarmacking +tarmac/S +tarnished/U +tarnish/GDS +tarn/MS +taro/MS +tarot/MS +tarpapered +tarpaulin/MS +tarp/MS +tarpon/MS +tarragon/SM +Tarrah/M +Tarra/M +Tarrance/M +tarred/M +tarring/M +tarry/TGRSD +Tarrytown/M +tarsal/S +tarsi +tarsus/M +tartan/MS +tartaric +Tartar's +tartar/SM +Tartary/M +tartness/MS +tart/PMYRDGTS +Tartuffe/M +Taryn/M +Tarzan/M +Tasha/M +Tashkent/M +Tasia/M +task/GSDM +taskmaster/SM +taskmistress/MS +Tasmania/M +Tasmanian/S +tassellings +tassel/MDGS +Tass/M +tasted/EU +tastefulness/SME +tasteful/PEY +taste/GZMJSRD +tastelessness/SM +tasteless/YP +taster/M +taste's/E +tastes/E +tastily +tastiness/MS +tasting/E +tasty/RTP +tatami/MS +Tatar/SM +Tate/M +tater/M +Tatiana/M +Tatiania/M +tat/SRZ +tatted +tatterdemalion/SM +tattered/M +tatter/GDS +tatting/SM +tattler/M +tattle/RSDZG +tattletale/SM +tattooer/M +tattooist/MS +tattoo/ZRDMGS +tatty/R +Tatum/M +taught/AU +taunter/M +taunting/Y +taunt/ZGRDS +taupe/SM +Taurus/SM +tau/SM +tauten/GD +tautness/S +tautological/Y +tautologous +tautology/SM +taut/PGTXYRDNS +taverner/M +tavern/RMS +tawdrily +tawdriness/SM +tawdry/SRTP +Tawney/M +Tawnya/M +tawny/RSMPT +Tawsha/M +taxable/S +taxably +taxation/MS +taxed/U +taxicab/MS +taxidermist/SM +taxidermy/MS +taxi/MDGS +taximeter/SM +taxing/Y +taxiway/MS +taxonomic +taxonomically +taxonomist/SM +taxonomy/SM +taxpayer/MS +taxpaying/M +tax/ZGJMDRSB +Taylor/SM +Tb +TB +TBA +Tbilisi/M +tbs +tbsp +Tchaikovsky/M +Tc/M +TCP +TD +TDD +Te +teabag/S +teacake/MS +teacart/M +teachable/P +teach/AGS +teacher/MS +teaching/SM +teacloth +teacupful/MS +teacup/MS +Teador/M +teahouse/SM +teakettle/SM +teak/SM +teakwood/M +tealeaves +teal/MS +tea/MDGS +teammate/MS +team/MRDGS +teamster/MS +teamwork/SM +teapot/MS +tearaway +teardrop/MS +tearer/M +tearfulness/M +tearful/YP +teargas/S +teargassed +teargassing +tearjerker/S +tearoom/MS +tear/RDMSG +teary/RT +Teasdale/M +tease/KS +teasel/DGSM +teaser/M +teashop/SM +teasing/Y +teaspoonful/MS +teaspoon/MS +teas/SRDGZ +teatime/MS +teat/MDS +tech/D +technetium/SM +technicality/MS +technicalness/M +technical/YSP +technician/MS +Technicolor/MS +Technion/M +technique/SM +technocracy/MS +technocratic +technocrat/S +technological/Y +technologist/MS +technology/MS +technophobia +technophobic +techs +tectonically +tectonic/S +tectonics/M +Tecumseh/M +Tedda/M +Teddie/M +Teddi/M +Tedd/M +Teddy/M +teddy/SM +Tedie/M +Tedi/M +tediousness/SM +tedious/YP +tedium/MS +Ted/M +Tedman/M +Tedmund/M +Tedra/M +tee/DRSMH +teeing +teem/GSD +teemingness/M +teeming/PY +teenager/M +teenage/RZ +Teena/M +teen/SR +teenybopper/SM +teeny/RT +teepee's +teeshirt/S +teeter/GDS +teethe +teether/M +teething/M +teethmarks +teeth/RSDJMG +teetotaler/M +teetotalism/MS +teetotal/SRDGZ +TEFL +Teflon/MS +Tegucigalpa/M +Teheran's +Tehran +TEirtza/M +tektite/SM +Tektronix/M +telecast/SRGZ +telecommunicate/NX +telecommunication/M +telecommute/SRDZGJ +telecoms +teleconference/GMJSD +Teledyne/M +Telefunken/M +telegenic +telegrammed +telegramming +telegram/MS +telegraphic +telegraphically +telegraphist/MS +telegraph/MRDGZ +telegraphs +telegraphy/MS +telekineses +telekinesis/M +telekinetic +Telemachus/M +Telemann/M +telemarketer/S +telemarketing/S +telemeter/DMSG +telemetric +telemetry/MS +teleological/Y +teleology/M +telepathic +telepathically +telepathy/SM +telephone/SRDGMZ +telephonic +telephonist/SM +telephony/MS +telephotography/MS +telephoto/S +teleprinter/MS +teleprocessing/S +teleprompter +TelePrompter/M +TelePrompTer/S +telescope/GSDM +telescopic +telescopically +teletext/S +telethon/MS +teletype/SM +Teletype/SM +teletypewriter/SM +televangelism/S +televangelist/S +televise/SDXNG +television/M +televisor/MS +televisual +telex/GSDM +Telex/M +tell/AGS +Teller/M +teller/SDMG +telling/YS +Tell/MR +telltale/MS +tellurium/SM +telly/SM +Telnet/M +TELNET/M +telnet/S +telomeric +tel/SY +Telugu/M +temblor/SM +temerity/MS +Tempe/M +temperamental/Y +temperament/SM +temperance/IMS +tempera/SLM +temperately/I +temperateness's/I +temperateness/SM +temperate/SDGPY +temperature/MS +tempered/UE +temper/GRDM +tempering/E +temper's/E +tempers/E +tempest/DMSG +tempestuousness/SM +tempestuous/PY +template/FS +template's +Temple/M +Templeman/M +temple/SDM +Templeton/M +Temp/M +tempoes +tempo/MS +temporal/YS +temporarily +temporarinesses +temporariness/FM +temporary/SFP +temporize/GJZRSD +temporizer/M +temporizings/U +temporizing/YM +temp/SGZTMRD +temptation/MS +tempted +tempter/S +tempt/FS +tempting/YS +temptress/MS +tempura/SM +tenabilities +tenability/UM +tenableness/M +tenable/P +tenably +tenaciousness/S +tenacious/YP +tenacity/S +tenancy/MS +tenanted/U +tenant/MDSG +tenantry/MS +tench/M +tended/UE +tendency/MS +tendentiousness/SM +tendentious/PY +tendered +tenderer +tenderest +tenderfoot/MS +tender/FS +tenderheartedness/MS +tenderhearted/YP +tendering +tenderizer/M +tenderize/SRDGZ +tenderloin/SM +tenderly +tenderness/SM +tending/E +tendinitis/S +tend/ISFRDG +tendon/MS +tendril/SM +tends/E +tenebrous +tenement/MS +tenet/SM +Tenex/M +TENEX/M +tenfold/S +ten/MHB +Tenneco/M +tenner +Tennessean/S +Tennessee/M +Tenney/M +tennis/SM +Tenn/M +Tennyson/M +Tenochtitlan/M +tenon/GSMD +tenor/MS +tenpin/SM +tense/IPYTNVR +tenseness's/I +tenseness/SM +tensile +tensional/I +tension/GMRDS +tensionless +tensions/E +tension's/I +tensity/IMS +tensorial +tensor/MS +tenspot +tens/SRDVGT +tentacle/MSD +tentativeness/S +tentative/SPY +tented/UF +tenterhook/MS +tenter/M +tent/FSIM +tenths +tenth/SY +tenting/F +tenuity/S +tenuousness/SM +tenuous/YP +tenure/SDM +Teodoor/M +Teodora/M +Teodorico/M +Teodor/M +Teodoro/M +tepee/MS +tepidity/S +tepidness/S +tepid/YP +tequila/SM +Tera/M +teratogenic +teratology/MS +terbium/SM +tercel/M +tercentenary/S +tercentennial/S +Terence/M +Terencio/M +Teresa/M +Terese/M +Tereshkova/M +Teresina/M +Teresita/M +Teressa/M +Teriann/M +Teri/M +Terkel/M +termagant/SM +termcap +termer/M +terminable/CPI +terminableness/IMC +terminal/SYM +terminate/CXNV +terminated/U +terminates +terminating +termination/MC +terminative/YC +terminator/SM +termini +terminological/Y +terminology/MS +terminus/M +termite/SM +term/MYRDGS +ternary/S +tern/GIDS +tern's +terpsichorean +Terpsichore/M +terrace/MGSD +terracing/M +terracotta +terrain/MS +Terra/M +terramycin +Terrance/M +Terran/M +terrapin/MS +terrarium/MS +terrazzo/SM +Terrell/M +Terrel/M +Terre/M +Terrence/M +terrestrial/YMS +terribleness/SM +terrible/P +terribly +Terrie/M +terrier/M +terrifically +terrific/Y +terrify/GDS +terrifying/Y +Terrijo/M +Terrill/M +Terri/M +terrine/M +territoriality/M +Territorial/SM +territorial/SY +Territory's +territory/SM +terrorism/MS +terroristic +terrorist/MS +terrorized/U +terrorizer/M +terrorize/RSDZG +terror/MS +terr/S +terrycloth +Terrye/M +Terry/M +terry/ZMRS +terseness/SM +terse/RTYP +Tersina/M +tertian +Tertiary +tertiary/S +Terza/M +TESL +Tesla/M +TESOL +Tessa/M +tessellate/XDSNG +tessellation/M +tesseral +Tessie/M +Tessi/M +Tess/M +Tessy/M +testability/M +testable/U +testamentary +testament/SM +testate/IS +testator/MS +testatrices +testatrix +testbed/S +testcard +tested/AKU +tester/MFCKS +testes/M +testicle/SM +testicular +testifier/M +testify/GZDRS +testily +testimonial/SM +testimony/SM +testiness/S +testing/S +testis/M +testosterone/SM +test/RDBFZGSC +tests/AK +test's/AKF +testy/RTP +tetanus/MS +tetchy/TR +tether/DMSG +tethered/U +Tethys/M +Tetons +tetrachloride/M +tetracycline/SM +tetrafluoride +tetragonal/Y +tetrahalides +tetrahedral/Y +tetrahedron/SM +tetrameron +tetrameter/SM +tetra/MS +tetrasodium +tetravalent +Teutonic +Teuton/SM +Texaco/M +Texan/S +Texas/MS +Tex/M +TeX/M +textbook/SM +text/FSM +textile/SM +Textron/M +textual/FY +textural/Y +textured/U +texture/MGSD +T/G +Thacher/M +Thackeray/M +Thaddeus/M +Thaddus/M +Thadeus/M +Thad/M +Thailand/M +Thaine/M +Thain/M +Thai/S +thalami +thalamus/M +Thales/M +Thalia/M +thalidomide/MS +thallium/SM +thallophyte/M +Thames +than +Thane/M +thane/SM +Thanh/M +thanker/M +thankfuller +thankfullest +thankfulness/SM +thankful/YP +thanklessness/SM +thankless/PY +thanksgiving/MS +Thanksgiving/S +thank/SRDG +Thant/M +Thar/M +Thatcher/M +thatching/M +thatch/JMDRSZG +Thatch/MR +that'd +that'll +that/MS +thaumaturge/M +thaw/DGS +Thaxter/M +Thayer/M +Thayne/M +THC +the +Theadora/M +Thea/M +theatergoer/MS +theatergoing/MS +theater/SM +theatricality/SM +theatrical/YS +theatric/S +theatrics/M +Thebault/M +Thebes +Theda/M +Thedrick/M +Thedric/M +thee/DS +theeing +theft/MS +Theiler/M +their/MS +theism/SM +theistic +theist/SM +Thekla/M +Thelma/M +themas +thematically +thematics +thematic/U +theme/MS +them/GD +Themistocles/M +themselves +thence +thenceforth +thenceforward/S +Theobald/M +theocracy/SM +theocratic +Theocritus/M +theodolite/MS +Theodora/M +Theodore/M +Theodoric/M +Theodor/M +Theodosia/M +Theodosian +Theodosius/M +theologian/SM +theological/Y +theologists +theology/MS +Theo/M +theorem/MS +theoretical/Y +theoretician/MS +theoretic/S +theoretics/M +theorist/SM +theorization/SM +theorize/ZGDRS +theory/MS +theosophic +theosophical +theosophist/MS +Theosophy +theosophy/SM +therapeutically +therapeutic/S +therapeutics/M +therapist/MS +therapy/MS +Theravada/M +thereabout/S +thereafter +thereat +thereby +there'd +therefor +therefore +therefrom +therein +there'll +there/MS +thereof +thereon +Theresa/M +Therese/M +Theresina/M +Theresita/M +Theressa/M +thereto +theretofore +thereunder +thereunto +thereupon +therewith +Therine/M +thermal/YS +thermionic/S +thermionics/M +thermistor/MS +therm/MS +thermocouple/MS +thermodynamical/Y +thermodynamic/S +thermodynamics/M +thermoelastic +thermoelectric +thermoformed +thermoforming +thermogravimetric +thermoluminescence/M +thermometer/MS +thermometric +thermometry/M +thermonuclear +thermopile/M +thermoplastic/S +thermopower +thermo/S +thermosetting +thermos/S +Thermos/SM +thermostable +thermostatically +thermostatic/S +thermostatics/M +thermostat/SM +thermostatted +thermostatting +Theron/M +thesauri +thesaurus/MS +these/S +Theseus/M +thesis/M +thespian/S +Thespian/S +Thespis/M +Thessalonian +Thessaloníki/M +Thessaly/M +theta/MS +thew/SM +they +they'd +they'll +they're +they've +th/GNJX +Thia/M +thiamine/MS +Thibaud/M +Thibaut/M +thickener/M +thickening/M +thicken/RDJZG +thicket/SMD +thickheaded/M +thickish +thickness/MS +thickset/S +thick/TXPSRNY +thief/M +Thiensville/M +Thieu/M +thievery/MS +thieve/SDJG +thievishness/M +thievish/P +thighbone/SM +thigh/DM +thighs +thimble/DSMG +thimbleful/MS +Thimbu/M +Thimphu +thine +thingamabob/MS +thingamajig/SM +thing/MP +thinkableness/M +thinkable/U +thinkably/U +think/AGRS +thinker/MS +thinkingly/U +thinking/SMYP +thinned +thinner/MS +thinness/MS +thinnest +thinning +thinnish +thin/STPYR +thiocyanate/M +thiouracil/M +third/DYGS +thirster/M +thirst/GSMDR +thirstily +thirstiness/S +thirsty/TPR +thirteen/MHS +thirteenths +thirtieths +thirty/HMS +this +this'll +thistledown/MS +thistle/SM +thither +Th/M +tho +thole/GMSD +Thomasa/M +Thomasina/M +Thomasine/M +Thomasin/M +Thoma/SM +Thomism/M +Thomistic +Thom/M +Thompson/M +Thomson/M +thong/SMD +thoracic +thorax/MS +Thorazine +Thoreau/M +thoriate/D +Thorin/M +thorium/MS +Thor/M +Thornburg/M +Thorndike/M +Thornie/M +thorniness/S +Thorn/M +thorn/SMDG +Thornton/M +Thorny/M +thorny/PTR +thoroughbred/S +thoroughfare/MS +thoroughgoing +thoroughness/SM +thorough/PTYR +Thorpe/M +Thorstein/M +Thorsten/M +Thorvald/M +those +Thoth/M +thou/DSG +though +thoughtfully +thoughtfulness/S +thoughtful/U +thoughtlessness/MS +thoughtless/YP +thought/MS +thousandfold +thousand/SHM +thousandths +Thrace/M +Thracian/M +thralldom/S +thrall/GSMD +thrash/DSRZGJ +thrasher/M +thrashing/M +threadbare/P +threader/M +threading/A +threadlike +thread/MZDRGS +thready/RT +threatener/M +threaten/GJRD +threatening/Y +threat/MDNSXG +threefold +three/MS +threepence/M +threepenny +threescore/S +threesome/SM +threnody/SM +thresh/DSRZG +thresher/M +threshold/MDGS +threw +thrice +thriftily +thriftiness/S +thriftless +thrift/SM +thrifty/PTR +thriller/M +thrilling/Y +thrill/ZMGDRS +thriver/M +thrive/RSDJG +thriving/Y +throatily +throatiness/MS +throat/MDSG +throaty/PRT +throbbed +throbbing +throb/S +throeing +throe/SDM +thrombi +thromboses +thrombosis/M +thrombotic +thrombus/M +Throneberry/M +throne/CGSD +throne's +throng/GDSM +throttle/DRSZMG +throttler/M +throughout +throughput/SM +throughway's +through/Y +throwaway/SM +throwback/MS +thrower/M +thrown +throwout +throw/SZGR +thrummed +thrumming +thrum/S +thrush/MS +thruster/M +thrust/ZGSR +Thruway/MS +thruway/SM +Thunderbird/M +Thu +Thucydides/M +thudded +thudding +thud/MS +thuggee/M +thuggery/SM +thuggish +thug/MS +Thule/M +thulium/SM +thumbnail/MS +thumbscrew/SM +thumb/SMDG +thumbtack/GMDS +thump/RDMSG +thunderbolt/MS +thunderclap/SM +thundercloud/SM +thunderer/M +thunderhead/SM +thundering/Y +thunderous/Y +thundershower/MS +thunderstorm/MS +thunderstruck +thundery +thunder/ZGJDRMS +thunk +Thurber/M +Thurman/M +Thur/MS +Thursday/SM +Thurstan/M +Thurston/M +thus/Y +thwack/DRSZG +thwacker/M +thwarter/M +thwart/GSDRY +thy +thyme/SM +thymine/MS +thymus/SM +thyratron/M +thyristor/MS +thyroglobulin +thyroidal +thyroid/S +thyronine +thyrotoxic +thyrotrophic +thyrotrophin +thyrotropic +thyrotropin/M +thyroxine/M +thyself +Tia/M +Tianjin +tiara/MS +Tiberius/M +Tiber/M +Tibetan/S +Tibet/M +tibiae +tibial +tibia/M +Tibold/M +Tiburon/M +ticker/M +ticket/SGMD +tick/GZJRDMS +ticking/M +tickler/M +tickle/RSDZG +ticklishness/MS +ticklish/PY +ticktacktoe/S +ticktock/SMDG +tic/MS +Ticonderoga/M +tidal/Y +tidbit/MS +tiddlywinks/M +tide/GJDS +tideland/MS +tidewater/SM +tideway/SM +tidily/U +tidiness/USM +tidying/M +tidy/UGDSRPT +tie/AUDS +tieback/MS +Tiebold/M +Tiebout/M +tiebreaker/SM +Tieck/M +Tiena/M +Tienanmen/M +Tientsin's +tier/DGM +Tierney/M +Tiertza/M +Tiffanie/M +Tiffani/M +tiffany/M +Tiffany/M +tiff/GDMS +Tiffie/M +Tiffi/M +Tiff/M +Tiffy/M +tigerish +tiger/SM +tightener/M +tighten/JZGDR +tightfisted +tightness/MS +tightrope/SM +tight/STXPRNY +tightwad/MS +tigress/SM +Tigris/M +Tijuana/M +tike's +Tilda/M +tilde/MS +Tildie/M +Tildi/M +Tildy/M +tile/DRSJMZG +tiled/UE +Tiler/M +tiles/U +tiling/M +tillable +tillage/SM +till/EGSZDR +tiller/GDM +tiller's/E +Tillich/M +Tillie/M +Tillman/M +Tilly/M +tilth/M +tilt/RDSGZ +Ti/M +timber/DMSG +timbering/M +timberland/SM +timberline/S +timbrel/SM +timbre/MS +Timbuktu/M +ti/MDRZ +timebase +time/DRSJMYZG +timekeeper/MS +timekeeping/SM +timelessness/S +timeless/PY +timeliness/SMU +timely/UTRP +timeout/S +timepiece/MS +timer/M +timescale/S +timeserver/MS +timeserving/S +timeshare/SDG +timespan +timestamped +timestamps +timetable/GMSD +timeworn +Timex/M +timezone/S +timidity/SM +timidness/MS +timid/RYTP +Timi/M +timing/M +Timmie/M +Timmi/M +Tim/MS +Timmy/M +Timofei/M +Timon/M +timorousness/MS +timorous/YP +Timoteo/M +Timothea/M +Timothee/M +Timotheus/M +Timothy/M +timothy/MS +timpani +timpanist/S +Timur/M +Tina/M +tincture/SDMG +tinderbox/MS +tinder/MS +Tine/M +tine/SM +tinfoil/MS +tingeing +tinge/S +ting/GYDM +tingle/SDG +tingling/Y +tingly/TR +Ting/M +tinily +tininess/MS +tinker/SRDMZG +Tinkertoy +tinkle/SDG +tinkling/M +tinkly +tin/MDGS +tinned +tinner/M +tinnily +tinniness/SM +tinning/M +tinnitus/MS +tinny/RSTP +tinplate/S +tinsel/GMDYS +Tinseltown/M +tinsmith/M +tinsmiths +tinter/M +tintinnabulation/MS +Tintoretto/M +tint/SGMRDB +tintype/SM +tinware/MS +tiny/RPT +Tioga/M +Tiphanie/M +Tiphani/M +Tiphany/M +tipi's +tip/MS +tipoff +Tippecanoe/M +tipped +Tipperary/M +tipper/MS +tippet/MS +tipping +tippler/M +tipple/ZGRSD +tippy/R +tipsily +tipsiness/SM +tipster/SM +tipsy/TPR +tiptoeing +tiptoe/SD +tiptop/S +tirade/SM +Tirana's +Tirane +tired/AYP +tireder +tiredest +tiredness/S +tirelessness/SM +tireless/PY +tire/MGDSJ +tires/A +Tiresias/M +tiresomeness/S +tiresome/PY +tiring/AU +Tirolean/S +Tirol/M +tiro's +Tirrell/M +tis +Tisha/M +Tish/M +tissue/MGSD +titanate/M +Titania/M +titanic +titanically +Titanic/M +titanium/SM +titan/SM +Titan/SM +titbit's +titer/M +tither/M +tithe/SRDGZM +tithing/M +Titian/M +titian/S +Titicaca/M +titillate/XSDVNG +titillating/Y +titillation/M +titivate/NGDSX +titivation/M +titled/AU +title/GMSRD +titleholder/SM +titling/A +titmice +titmouse/M +tit/MRZS +Tito/SM +titrate/SDGN +titration/M +titted +titter/GDS +titting +tittle/SDMG +titular/SY +Titus/M +tizzy/SM +TKO +Tlaloc/M +TLC +Tlingit/M +Tl/M +TM +Tm/M +tn +TN +tnpk +TNT +toad/SM +toadstool/SM +toady/GSDM +toadyism/M +toaster/M +toastmaster/MS +toastmistress/S +toast/SZGRDM +toasty/TRS +tobacconist/SM +tobacco/SM +tobaggon/SM +Tobago/M +Tobe/M +Tobey/M +Tobiah/M +Tobias/M +Tobie/M +Tobi/M +Tobin/M +Tobit/M +toboggan/MRDSZG +Tobye/M +Toby/M +Tocantins/M +toccata/M +Tocqueville +tocsin/MS +to/D +today'll +today/SM +Toddie/M +toddler/M +toddle/ZGSRD +Todd/M +Toddy/M +toddy/SM +Tod/M +toecap/SM +toeclip/S +TOEFL +toehold/MS +toeing +toe/MS +toenail/DMGS +toffee/SM +tofu/S +toga/SMD +toge +togetherness/MS +together/P +togged +togging +toggle/SDMG +Togolese/M +Togo/M +tog/SMG +Toiboid/M +toilet/GMDS +toiletry/MS +toilette/SM +toil/SGZMRD +toilsomeness/M +toilsome/PY +Toinette/M +Tojo/M +tokamak +Tokay/M +toke/GDS +tokenism/SM +tokenized +token/SMDG +Tokugawa/M +Tokyoite/MS +Tokyo/M +Toland/M +told/AU +Toledo/SM +tole/MGDS +tolerability/IM +tolerable/I +tolerably/I +tolerance/SIM +tolerant/IY +tolerate/XVNGSD +toleration/M +Tolkien +tollbooth/M +tollbooths +toll/DGS +Tolley/M +tollgate/MS +tollhouse/M +tollway/S +Tolstoy/M +toluene/MS +Tolyatti/M +tomahawk/SGMD +Tomasina/M +Tomasine/M +Toma/SM +Tomaso/M +tomatoes +tomato/M +Tombaugh/M +tomb/GSDM +Tombigbee/M +tomblike +tombola/M +tomboyish +tomboy/MS +tombstone/MS +tomcat/SM +tomcatted +tomcatting +Tome/M +tome/SM +tomfoolery/MS +tomfool/M +Tomi/M +Tomkin/M +Tomlin/M +Tom/M +tommed +Tommie/M +Tommi/M +tomming +tommy/M +Tommy/M +tomographic +tomography/MS +tomorrow/MS +Tompkins/M +Tomsk/M +tom/SM +tomtit/SM +tonality/MS +tonal/Y +tonearm/S +tone/ISRDZG +tonelessness/M +toneless/YP +toner/IM +tone's +Tonga/M +Tongan/SM +tong/GRDS +tongueless +tongue/SDMG +tonguing/M +Tonia/M +tonic/SM +Tonie/M +tonight/MS +Toni/M +Tonio/M +tonk/MS +tonnage/SM +tonne/MS +Tonnie/M +tonsillectomy/MS +tonsillitis/SM +tonsil/SM +ton/SKM +tonsorial +tonsure/SDGM +Tonto/M +Tonya/M +Tonye/M +Tony/M +tony/RT +toodle +too/H +took/A +tool/AGDS +toolbox/SM +tooler/SM +tooling/M +toolkit/SM +toolmaker/M +toolmake/ZRG +toolmaking/M +tool's +toolsmith +Toomey/M +tooter/M +toot/GRDZS +toothache/SM +toothbrush/MSG +tooth/DMG +toothily +toothless +toothmarks +toothpaste/SM +toothpick/MS +tooths +toothsome +toothy/TR +tootle/SRDG +tootsie +Tootsie/M +toots/M +tootsy/MS +topaz/MS +topcoat/MS +topdressing/S +Topeka/M +toper/M +topflight +topgallant/M +topiary/S +topicality/MS +topical/Y +topic/MS +topknot/MS +topless +topmast/MS +topmost +topnotch/R +topocentric +topographer/SM +topographic +topographical/Y +topography/MS +topological/Y +topologist/MS +topology/MS +topped +topper/MS +topping/MS +topple/GSD +topsail/MS +topside/SRM +top/SMDRG +topsoil/GDMS +topspin/MS +Topsy/M +toque/MS +Torah/M +Torahs +torchbearer/SM +torchlight/S +torch/SDMG +toreador/SM +Tore/M +tore/S +Torey/M +Torie/M +tori/M +Tori/M +Torin/M +torment/GSD +tormenting/Y +tormentor/MS +torn +tornadoes +tornado/M +toroidal/Y +toroid/MS +Toronto/M +torpedoes +torpedo/GMD +torpidity/S +torpid/SY +torpor/MS +Torquemada/M +torque/MZGSRD +Torrance/M +Torre/MS +torrence +Torrence/M +Torrens/M +torrential +torrent/MS +Torrey/M +Torricelli/M +torridity/SM +torridness/SM +torrid/RYTP +Torrie/M +Torrin/M +Torr/XM +Torry/M +torsional/Y +torsion/IAM +torsions +torsi's +tor/SLM +torso/SM +tors/S +tort/ASFE +tortellini/MS +torte/MS +torten +tortilla/MS +tortoiseshell/SM +tortoise/SM +Tortola/M +tortoni/MS +tort's +Tortuga/M +tortuousness/MS +tortuous/PY +torture/ZGSRD +torturous +torus/MS +Tory/SM +Tosca/M +Toscanini/M +Toshiba/M +toss/SRDGZ +tossup/MS +totaler/M +totalistic +totalitarianism/SM +totalitarian/S +totality/MS +totalizator/S +totalizing +total/ZGSRDYM +totemic +totem/MS +toter/M +tote/S +toting/M +tot/MDRSG +Toto/M +totted +totterer/M +tottering/Y +totter/ZGRDS +totting +toucan/MS +touchable/U +touch/ASDG +touchdown/SM +touché +touched/U +toucher/M +touchily +touchiness/SM +touching/SY +touchline/M +touchscreen +touchstone/SM +touchy/TPR +toughen/DRZG +toughener/M +toughness/SM +toughs +tough/TXGRDNYP +Toulouse/M +toupee/SM +toured/CF +tourer/M +tour/GZSRDM +touring/F +tourism/SM +touristic +tourist/SM +touristy +tourmaline/SM +tournament/MS +tourney/GDMS +tourniquet/MS +tour's/CF +tours/CF +tousle/GSD +touter/M +tout/SGRD +Tova/M +Tove/M +towardliness/M +towardly/P +towards +toward/YU +towboat/MS +tow/DRSZG +towelette/S +towel/GJDMS +toweling/M +tower/GMD +towering/Y +towhead/MSD +towhee/SM +towline/MS +towner/M +Townes +Towney/M +townhouse/S +Townie/M +townie/S +Townley/M +Town/M +Townsend/M +townsfolk +township/MS +townsman/M +townsmen +townspeople/M +town/SRM +townswoman/M +townswomen +Towny/M +towpath/M +towpaths +towrope/MS +Towsley/M +toxemia/MS +toxicity/MS +toxicological +toxicologist/SM +toxicology/MS +toxic/S +toxin/MS +toyer/M +toymaker +toy/MDRSG +Toynbee/M +Toyoda/M +Toyota/M +toyshop +tr +traceability/M +traceableness/M +traceable/P +trace/ASDG +traceback/MS +traced/U +Tracee/M +traceless/Y +Trace/M +tracepoint/SM +tracer/MS +tracery/MDS +trace's +Tracey/M +tracheae +tracheal/M +trachea/M +tracheotomy/SM +Tracie/M +Traci/M +tracing/SM +trackage +trackball/S +trackbed +tracked/U +tracker/M +trackless +tracksuit/SM +track/SZGMRD +tractability/SI +tractable/I +tractably/I +tract/ABS +Tractarians +traction/KSCEMAF +tractive/KFE +tractor/FKMASC +tract's +tracts/CEFK +Tracy/M +trademark/GSMD +trader/M +tradesman/M +tradesmen +tradespeople +tradespersons +trade/SRDGZM +tradeswoman/M +tradeswomen +traditionalism/MS +traditionalistic +traditionalist/MS +traditionalized +traditionally +traditional/U +tradition/SM +traduce/DRSGZ +Trafalgar/M +trafficked +trafficker/MS +trafficking/S +traffic/SM +tragedian/SM +tragedienne/MS +tragedy/MS +tragically +tragicomedy/SM +tragicomic +tragic/S +trailblazer/MS +trailblazing/S +trailer/GDM +trails/F +trailside +trail/SZGJRD +trainable +train/ASDG +trained/U +trainee/MS +traineeships +trainer/MS +training/SM +trainman/M +trainmen +trainspotter/S +traipse/DSG +trait/MS +traitorous/Y +traitor/SM +Trajan/M +trajectory/MS +trammed +trammeled/U +trammel/GSD +tramming +tram/MS +trample/DGRSZ +trampler/M +trampoline/GMSD +tramp/RDSZG +tramway/M +trance/MGSD +tranche/SM +Tran/M +tranquility/S +tranquilized/U +tranquilize/JGZDSR +tranquilizer/M +tranquilizes/A +tranquilizing/YM +tranquillize/GRSDZ +tranquillizer/M +tranquilness/M +tranquil/PTRY +transact/GSD +transactional +transaction/MS +transactor/SM +transalpine +transaminase +transatlantic +Transcaucasia/M +transceiver/SM +transcendence/MS +transcendentalism/SM +transcendentalist/SM +transcendental/YS +transcendent/Y +transcend/SDG +transconductance +transcontinental +transcribe/DSRGZ +transcriber/M +transcription/SM +transcript/SM +transcultural +transducer/SM +transduction/M +transect/DSG +transept/SM +transferability/M +transferal/MS +transfer/BSMD +transferee/M +transference/SM +transferor/MS +transferral/SM +transferred +transferrer/SM +transferring +transfiguration/SM +transfigure/SDG +transfinite/Y +transfix/SDG +transformational +transformation/MS +transform/DRZBSG +transformed/U +transformer/M +transfuse/XSDGNB +transfusion/M +transgression/SM +transgressor/S +transgress/VGSD +trans/I +transience/SM +transiency/S +transient/YS +transistorize/GDS +transistor/SM +Transite/M +transitional/Y +transition/MDGS +transitivenesses +transitiveness/IM +transitive/PIY +transitivity/MS +transitoriness/M +transitory/P +transit/SGVMD +transl +translatability/M +translatable/U +translated/AU +translate/VGNXSDB +translational +translation/M +translator/SM +transliterate/XNGSD +translucence/SM +translucency/MS +translucent/Y +transmigrate/XNGSD +transmissible +transmission/MSA +transmissive +transmit/AS +transmittable +transmittal/SM +transmittance/MS +transmitted/A +transmitter/SM +transmitting/A +transmogrification/M +transmogrify/GXDSN +transmutation/SM +transmute/GBSD +transnational/S +transoceanic +transom/SM +transonic +transpacific +transparency/MS +transparentness/M +transparent/YP +transpiration/SM +transpire/GSD +transplantation/S +transplant/GRDBS +transpolar +transponder/MS +transportability +transportable/U +transportation/SM +transport/BGZSDR +transpose/BGSD +transposed/U +transposition/SM +Transputer/M +transsexualism/MS +transsexual/SM +transship/LS +transshipment/SM +transshipped +transshipping +transubstantiation/MS +Transvaal/M +transversal/YM +transverse/GYDS +transvestism/SM +transvestite/SM +transvestitism +Transylvania/M +trapdoor/S +trapeze/DSGM +trapezium/MS +trapezoidal +trapezoid/MS +trap/MS +trappable/U +trapped +trapper/SM +trapping/S +Trappist/MS +trapshooting/SM +trashcan/SM +trashiness/SM +trash/SRDMG +trashy/TRP +Trastevere/M +trauma/MS +traumatic +traumatically +traumatize/SDG +travail/SMDG +traveled/U +traveler/M +travelog's +travelogue/S +travel/SDRGZJ +Traver/MS +traversal/SM +traverse/GBDRS +traverser/M +travertine/M +travesty/SDGM +Travis/M +Travus/M +trawler/M +trawl/RDMSZG +tray/SM +treacherousness/SM +treacherous/PY +treachery/SM +treacle/DSGM +treacly +treader/M +treadle/GDSM +treadmill/MS +tread/SAGD +Treadwell/M +treas +treason/BMS +treasonous +treasure/DRSZMG +treasurer/M +treasurership +treasury/SM +Treasury/SM +treatable +treated/U +treater/S +treatise/MS +treatment/MS +treat's +treat/SAGDR +treaty/MS +treble/SDG +Treblinka/M +treeing +treeless +treelike +tree/MDS +treetop/SM +trefoil/SM +Trefor/M +trekked +trekker/MS +Trekkie/M +trekking +trek/MS +trellis/GDSM +Tremaine/M +Tremain/M +trematode/SM +Tremayne/M +tremble/JDRSG +trembler/M +trembles/M +trembly +tremendousness/M +tremendous/YP +tremolo/MS +tremor/MS +tremulousness/SM +tremulous/YP +trenchancy/MS +trenchant/Y +trencherman/M +trenchermen +trencher/SM +trench/GASD +trench's +trendily +trendiness/S +trend/SDMG +trendy/PTRS +Trenna/M +Trent/M +Trenton/M +trepanned +trepidation/MS +Tresa/M +Trescha/M +trespasser/M +trespass/ZRSDG +Tressa/M +tressed/E +tresses/E +tressing/E +tress/MSDG +trestle/MS +Trevar/M +Trevelyan/M +Trever/M +Trevino/M +Trevor/M +Trev/RM +Trey/M +trey/MS +triableness/M +triable/P +triadic +triad/MS +triage/SDMG +trial/ASM +trialization +trialled +trialling +triamcinolone +triangle/SM +triangulable +triangularization/S +triangular/Y +triangulate/YGNXSD +triangulation/M +Triangulum/M +Trianon/M +Triassic +triathlon/S +triatomic +tribalism/MS +tribal/Y +tribe/MS +tribesman/M +tribesmen +tribeswoman +tribeswomen +tribulate/NX +tribulation/M +tribunal/MS +tribune/SM +tributary/MS +tribute/EGSF +tribute's +trice/GSDM +tricentennial/S +triceps/SM +triceratops/M +trichinae +trichina/M +trichinoses +trichinosis/M +trichloroacetic +trichloroethane +trichotomy/M +trichromatic +Tricia/M +trickery/MS +trick/GMSRD +trickily +trickiness/SM +trickle/DSG +trickster/MS +tricky/RPT +tricolor/SMD +tricycle/SDMG +trident/SM +tridiagonal +tried/UA +triennial/SY +trier/AS +trier's +tries/A +Trieste/M +triffid/S +trifle/MZGJSRD +trifler/M +trifluoride/M +trifocals +trigged +trigger/GSDM +triggest +trigging +triglyceride/MS +trigonal/Y +trigonometric +trigonometrical +trigonometry/MS +trigram/S +trig/S +trihedral +trike/GMSD +trilateral/S +trilby/SM +trilingual +trillion/SMH +trillionth/M +trillionths +trillium/SM +trill/RDMGS +trilobite/MS +trilogy/MS +trimaran/MS +Trimble/M +trimer/M +trimester/MS +trimmed/U +trimmer/MS +trimmest +trimming/MS +trimness/S +trimodal +trimonthly +trim/PSYR +Trimurti/M +Trina/M +Trinidad/M +trinitarian/S +trinitrotoluene/SM +trinity/MS +Trinity/MS +trinketer/M +trinket/MRDSG +triode/MS +trio/SM +trioxide/M +tripartite/N +tripartition/M +tripe/MS +triphenylarsine +triphenylphosphine +triphenylstibine +triphosphopyridine +triple/GSD +triplet/SM +triplex/S +triplicate/SDG +triplication/M +triply/GDSN +Trip/M +tripodal +tripod/MS +tripoli/M +Tripoli/M +tripolyphosphate +tripos/SM +tripped +Trippe/M +tripper/MS +tripping/Y +Tripp/M +trip/SMY +triptych/M +triptychs +tripwire/MS +trireme/SM +Tris +trisect/GSD +trisection/S +trisector +Trisha/M +Trish/M +trisodium +Trista/M +Tristam/M +Tristan/M +tristate +trisyllable/M +tritely/F +triteness/SF +trite/SRPTY +tritium/MS +triton/M +Triton/M +triumphal +triumphalism +triumphant/Y +triumph/GMD +triumphs +triumvirate/MS +triumvir/MS +triune +trivalent +trivet/SM +trivia +triviality/MS +trivialization/MS +trivialize/DSG +trivial/Y +trivium/M +Trixie/M +Trixi/M +Trix/M +Trixy/M +Trobriand/M +trochaic/S +trochee/SM +trod/AU +trodden/UA +trodes +troff/MR +troglodyte/MS +troika/SM +Trojan/MS +troll/DMSG +trolled/F +trolleybus/S +trolley/SGMD +trolling/F +trollish +Trollope/M +trollop/GSMD +trolly's +trombone/MS +trombonist/SM +tromp/DSG +Trondheim/M +trooper/M +troopship/SM +troop/SRDMZG +trope/SM +Tropez/M +trophic +trophy/MGDS +tropical/SY +tropic/MS +tropism/SM +tropocollagen +troposphere/MS +tropospheric +troth/GDM +troths +trot/S +Trotsky/M +trotted +trotter/SM +trotting +troubadour/SM +troubled/U +trouble/GDRSM +troublemaker/MS +troubler/M +troubleshooter/M +troubleshoot/SRDZG +troubleshot +troublesomeness/M +troublesome/YP +trough/M +troughs +trounce/GZDRS +trouncer/M +troupe/MZGSRD +trouper/M +trouser/DMGS +trousseau/M +trousseaux +Troutman/M +trout/SM +trove/SM +troweler/M +trowel/SMDRGZ +trow/SGD +Troyes +Troy/M +troy/S +Trstram/M +truancy/MS +truant/SMDG +truce/SDGM +Truckee/M +trucker/M +trucking/M +truckle/GDS +truckload/MS +truck/SZGMRDJ +truculence/SM +truculent/Y +Truda/M +Trudeau/M +Trude/M +Trudey/M +trudge/SRDG +Trudie/M +Trudi/M +Trudy/M +true/DRSPTG +truelove/MS +Trueman/M +trueness/M +truer/U +truest/U +truffle/MS +truism/SM +Trujillo/M +Trula/M +truly/U +Trumaine/M +Truman/M +Trumann/M +Trumbull/M +trump/DMSG +trumpery/SM +trumpeter/M +trumpet/MDRZGS +Trump/M +truncate/NGDSX +truncation/M +truncheon/MDSG +trundle/GZDSR +trundler/M +trunk/GSMD +trunnion/SM +trusser/M +trussing/M +truss/SRDG +trusted/EU +trusteeing +trustee/MDS +trusteeship/SM +truster/M +trustful/EY +trustfulness/SM +trustiness/M +trusting/Y +trust/RDMSG +trusts/E +trustworthier +trustworthiest +trustworthiness/MS +trustworthy/UP +trusty/PTMSR +Truth +truthfulness/US +truthful/UYP +truths/U +truth/UM +TRW +trying/Y +try/JGDRSZ +tryout/MS +trypsin/M +tryst/GDMS +ts +T's +tsarevich +tsarina's +tsarism/M +tsarist +tsetse/S +Tsimshian/M +Tsiolkovsky/M +Tsitsihar/M +tsp +tsunami/MS +Tsunematsu/M +Tswana/M +TTL +tty/M +ttys +Tuamotu/M +Tuareg/M +tubae +tubal +tuba/SM +tubbed +tubbing +tubby/TR +tubeless +tubercle/MS +tubercular/S +tuberculin/MS +tuberculoses +tuberculosis/M +tuberculous +tuber/M +tuberose/SM +tuberous +tube/SM +tubing/M +tub/JMDRSZG +Tubman/M +tubular/Y +tubule/SM +tucker/GDM +Tucker/M +tuck/GZSRD +Tuckie/M +Tuck/RM +Tucky/M +Tucson/M +Tucuman/M +Tudor/MS +Tue/S +Tuesday/SM +tufter/M +tuft/GZSMRD +tufting/M +tugboat/MS +tugged +tugging +tug/S +tuition/ISM +Tulane/M +tularemia/S +tulip/SM +tulle/SM +Tulley/M +Tull/M +Tully/M +Tulsa/M +tum +tumbledown +tumbler/M +tumbleweed/MS +tumble/ZGRSDJ +tumbrel/SM +tumescence/S +tumescent +tumidity/MS +tumid/Y +tummy/SM +tumor/MDS +tumorous +Tums/M +tumult/SGMD +tumultuousness/M +tumultuous/PY +tumulus/M +tunableness/M +tunable/P +tuna/SM +tundra/SM +tun/DRJZGBS +tune/CSDG +tunefulness/MS +tuneful/YP +tuneless/Y +tuner/M +tune's +tuneup/S +tung +tungstate/M +tungsten/SM +Tunguska/M +Tungus/M +tunic/MS +tuning/A +tuning's +Tunisia/M +Tunisian/S +Tunis/M +tunned +tunneler/M +tunnel/MRDSJGZ +tunning +tunny/SM +tupelo/M +Tupi/M +tuple/SM +tuppence/M +Tupperware +Tupungato/M +turban/SDM +turbid +turbidity/SM +turbinate/SD +turbine/SM +turbocharged +turbocharger/SM +turbofan/MS +turbojet/MS +turboprop/MS +turbo/SM +turbot/MS +turbulence/SM +turbulent/Y +turd/MS +tureen/MS +turf/DGSM +turfy/RT +Turgenev/M +turgidity/SM +turgidness/M +turgid/PY +Turing/M +Turin/M +Turkestan/M +Turkey/M +turkey/SM +Turkic/SM +Turkish +Turkmenistan/M +turk/S +Turk/SM +turmeric/MS +turmoil/SDMG +turnabout/SM +turnaround/MS +turn/AZGRDBS +turnbuckle/SM +turncoat/SM +turned/U +turner/M +Turner/M +turning/MS +turnip/SMDG +turnkey/MS +turnoff/MS +turnout/MS +turnover/SM +turnpike/MS +turnround/MS +turnstile/SM +turnstone/M +turntable/SM +turpentine/GMSD +Turpin/M +turpitude/SM +turquoise/SM +turret/SMD +turtleback/MS +turtledove/MS +turtleneck/SDM +turtle/SDMG +turves's +turvy +Tuscaloosa/M +Tuscan +Tuscany/M +Tuscarora/M +Tuscon/M +tush/SDG +Tuskegee/M +tusker/M +tusk/GZRDMS +tussle/GSD +tussock/MS +tussocky +Tussuad/M +Tutankhamen/M +tutelage/MS +tutelary/S +Tut/M +tutored/U +tutorial/MS +tutor/MDGS +tutorship/S +tut/S +Tutsi +tutted +tutting +tutti/S +Tuttle/M +tutu/SM +Tuvalu +tuxedo/SDM +tux/S +TVA +TV/M +TVs +twaddle/GZMRSD +twaddler/M +Twain/M +twain/S +TWA/M +twang/MDSG +twangy/TR +twas +tweak/SGRD +tweediness/M +Tweedledee/M +Tweedledum/M +Tweed/M +twee/DP +tweed/SM +tweedy/PTR +tween +tweeter/M +tweet/ZSGRD +tweezer/M +tweeze/ZGRD +twelfth +twelfths +twelvemonth/M +twelvemonths +twelve/MS +twentieths +twenty/MSH +twerp/MS +twice/R +twiddle/GRSD +twiddler/M +twiddly/RT +twigged +twigging +twiggy/RT +twig/SM +Twila/M +twilight/MS +twilit +twill/SGD +twiner/M +twine/SM +twinge/SDMG +Twinkie +twinkler/M +twinkle/RSDG +twinkling/M +twinkly +twinned +twinning +twin/RDMGZS +twirler/M +twirling/Y +twirl/SZGRD +twirly/TR +twisted/U +twister/M +twists/U +twist/SZGRD +twisty +twitch/GRSD +twitchy/TR +twit/S +twitted +twitterer/M +twitter/SGRD +twittery +twitting +twixt +twofer/MS +twofold/S +two/MS +twopence/SM +twopenny/S +twosome/MS +twp +Twp +TWX +Twyla/M +TX +t/XTJBG +Tybalt/M +Tybie/M +Tybi/M +tycoon/MS +tyeing +Tye/M +tying/UA +tyke/SM +Tylenol/M +Tyler/M +Ty/M +Tymon/M +Tymothy/M +tympani +tympanist/SM +tympanum/SM +Tynan/M +Tyndale/M +Tyndall/M +Tyne/M +typeahead +typecast/SG +typed/AU +typedef/S +typeface/MS +typeless +type/MGDRSJ +types/A +typescript/SM +typeset/S +typesetter/MS +typesetting/SM +typewriter/M +typewrite/SRJZG +typewriting/M +typewritten +typewrote +typhoid/SM +Typhon/M +typhoon/SM +typhus/SM +typicality/MS +typically +typicalness/M +typical/U +typification/M +typify/SDNXG +typing/A +typist/MS +typographer/SM +typographic +typographical/Y +typography/MS +typological/Y +typology/MS +typo/MS +tyrannic +tyrannicalness/M +tyrannical/PY +tyrannicide/M +tyrannizer/M +tyrannize/ZGJRSD +tyrannizing/YM +tyrannosaur/MS +tyrannosaurus/S +tyrannous +tyranny/MS +tyrant/MS +Tyree/M +tyreo +Tyrolean/S +Tyrol's +Tyrone/M +tyrosine/M +tyro/SM +Tyrus/M +Tyson/M +tzarina's +tzar's +Tzeltal/M +u +U +UAR +UART +UAW +Ubangi/M +ubiquitous/YP +ubiquity/S +Ucayali/M +Uccello/M +UCLA/M +Udale/M +Udall/M +udder/SM +Udell/M +Ufa/M +ufologist/S +ufology/MS +UFO/S +Uganda/M +Ugandan/S +ugh +ughs +uglification +ugliness/MS +uglis +ugly/PTGSRD +Ugo/M +uh +UHF +Uighur +Ujungpandang/M +UK +ukase/SM +Ukraine/M +Ukrainian/S +ukulele/SM +UL +Ula/M +Ulberto/M +ulcerate/NGVXDS +ulceration/M +ulcer/MDGS +ulcerous +Ulick/M +Ulises/M +Ulla/M +Ullman/M +ulnae +ulna/M +ulnar +Ulrica/M +Ulrich/M +Ulrick/M +Ulric/M +Ulrika/M +Ulrikaumeko/M +Ulrike/M +Ulster/M +ulster/MS +ult +ulterior/Y +ultimas +ultimate/DSYPG +ultimateness/M +ultimatum/MS +ultimo +ultracentrifugally +ultracentrifugation +ultracentrifuge/M +ultraconservative/S +ultrafast +ultrahigh +ultralight/S +ultramarine/SM +ultramodern +ultramontane +ultra/S +ultrashort +ultrasonically +ultrasonic/S +ultrasonics/M +ultrasound/SM +ultrastructure/M +Ultrasuede +ultraviolet/SM +Ultrix/M +ULTRIX/M +ululate/DSXGN +ululation/M +Ulyanovsk/M +Ulysses/M +um +umbel/MS +umber/GMDS +Umberto/M +umbilical/S +umbilici +umbilicus/M +umbrage/MGSD +umbrageous +umbra/MS +umbrella/GDMS +Umbriel/M +Umeko/M +umiak/MS +umlaut/GMDS +umpire/MGSD +ump/MDSG +umpteen/H +UN +unabated/Y +unabridged/S +unacceptability +unacceptable +unaccepted +unaccommodating +unaccountability +unaccustomed/Y +unadapted +unadulterated/Y +unadventurous +unalienability +unalterableness/M +unalterable/P +unalterably +Una/M +unambiguity +unambiguous +unambitious +unamused +unanimity/SM +unanimous/Y +unanticipated/Y +unapologetic +unapologizing/M +unappeasable +unappeasably +unappreciative +unary +unassailableness/M +unassailable/P +unassertive +unassumingness/M +unassuming/PY +unauthorized/PY +unavailing/PY +unaware/SPY +unbalanced/P +unbar +unbarring +unbecoming/P +unbeknown +unbelieving/Y +unbiased/P +unbid +unbind/G +unblessed +unblinking/Y +unbodied +unbolt/G +unbreakability +unbred +unbroken +unbuckle +unbudging/Y +unburnt +uncap +uncapping +uncatalogued +uncauterized/MS +unceasing/Y +uncelebrated +uncertain/P +unchallengeable +unchangingness/M +unchanging/PY +uncharacteristic +uncharismatic +unchastity +unchristian +uncial/S +uncivilized/Y +unclassified +uncle/MSD +unclouded/Y +uncodable +uncollected +uncoloredness/M +uncolored/PY +uncombable +uncommunicative +uncompetitive +uncomplicated +uncomprehending/Y +uncompromisable +unconcerned/P +unconcern/M +unconfirmed +unconfused +unconscionableness/M +unconscionable/P +unconscionably +unconstitutional +unconsumed +uncontentious +uncontrollability +unconvertible +uncool +uncooperative +uncork/G +uncouple/G +uncouthness/M +uncouth/YP +uncreate/V +uncritical +uncross/GB +uncrowded +unction/IM +unctions +unctuousness/MS +unctuous/PY +uncustomary +uncut +undated/I +undaunted/Y +undeceive +undecided/S +undedicated +undefinability +undefinedness/M +undefined/P +undelete +undeliverability +undeniableness/M +undeniable/P +undeniably +undependable +underachiever/M +underachieve/SRDGZ +underact/GDS +underadjusting +underage/S +underarm/DGS +underbedding +underbelly/MS +underbidding +underbid/S +underbracing +underbrush/MSDG +undercarriage/MS +undercharge/GSD +underclassman +underclassmen +underclass/S +underclothes +underclothing/MS +undercoating/M +undercoat/JMDGS +underconsumption/M +undercooked +undercount/S +undercover +undercurrent/SM +undercut/S +undercutting +underdeveloped +underdevelopment/MS +underdog/MS +underdone +undereducated +underemphasis +underemployed +underemployment/SM +underenumerated +underenumeration +underestimate/NGXSD +underexploited +underexpose/SDG +underexposure/SM +underfed +underfeed/SG +underfloor +underflow/GDMS +underfoot +underfund/DG +underfur/MS +undergarment/SM +undergirding +undergoes +undergo/G +undergone +undergrad/MS +undergraduate/MS +underground/RMS +undergrowth/M +undergrowths +underhand/D +underhandedness/MS +underhanded/YP +underheat +underinvestment +underlaid +underlain/S +underlay/GS +underlie +underline/GSDJ +underling/MS +underlip/SM +underloaded +underly/GS +undermanned +undermentioned +undermine/SDG +undermost +underneath +underneaths +undernourished +undernourishment/SM +underpaid +underpants +underpart/MS +underpass/SM +underpay/GSL +underpayment/SM +underperformed +underpinned +underpinning/MS +underpin/S +underplay/SGD +underpopulated +underpopulation/M +underpowered +underpricing +underprivileged +underproduction/MS +underrate/GSD +underregistration/M +underreported +underreporting +underrepresentation/M +underrepresented +underscore/SDG +undersealed +undersea/S +undersecretary/SM +undersell/SG +undersexed +undershirt/SM +undershoot/SG +undershorts +undershot +underside/SM +undersigned/M +undersign/SGD +undersized +undersizes +undersizing +underskirt/MS +undersold +underspecification +underspecified +underspend/G +understaffed +understandability/M +understandably +understanding/YM +understand/RGSJB +understate/GSDL +understatement/MS +understocked +understood +understrength +understructure/SM +understudy/GMSD +undertaken +undertaker/M +undertake/SRGZJ +undertaking/M +underthings +undertone/SM +undertook +undertow/MS +underused +underusing +underutilization/M +underutilized +undervaluation/S +undervalue/SDG +underwater/S +underway +underwear/M +underweight/S +underwent +underwhelm/DGS +underwood/M +Underwood/M +underworld/MS +underwrite/GZSR +underwriter/M +underwritten +underwrote +under/Y +undeserving +undesigned +undeviating/Y +undialyzed/SM +undiplomatic +undiscerning +undiscriminating +undo/GJ +undoubted/Y +undramatic +undramatized/SM +undress/G +undrinkability +undrinkable +undroppable +undue +undulant +undulate/XDSNG +undulation/M +unearthliness/S +unearthly/P +unearth/YG +unease +uneconomic +uneducated +unemployed/S +unencroachable +unending/Y +unendurable/P +unenergized/MS +unenforced +unenterprising +UNESCO +unethical +uneulogized/SM +unexacting +unexceptionably +unexcited +unexpectedness/MS +unfading/Y +unfailingness/M +unfailing/P +unfamiliar +unfashionable +unfathomably +unfavored +unfeeling +unfeigned/Y +unfelt +unfeminine +unfertile +unfetchable +unflagging +unflappability/S +unflappable +unflappably +unflinching/Y +unfold/LG +unfoldment/M +unforced +unforgeable +unfossilized/MS +unfraternizing/SM +unfrozen +unfulfillable +unfunny +unfussy +ungainliness/MS +ungainly/PRT +Ungava/M +ungenerous +ungentle +unglamorous +ungrammaticality +ungrudging +unguent/MS +ungulate/MS +unharmonious +unharness/G +unhistorical +unholy/TP +unhook/DG +unhydrolyzed/SM +unhygienic +Unibus/M +unicameral +UNICEF +unicellular +Unicode/M +unicorn/SM +unicycle/MGSD +unicyclist/MS +unideal +unidimensional +unidiomatic +unidirectionality +unidirectional/Y +unidolized/MS +unifiable +unification/MA +unifier/MS +unifilar +uniformity/MS +uniformness/M +uniform/TGSRDYMP +unify/AXDSNG +unilateralism/M +unilateralist +unilateral/Y +unimodal +unimpeachably +unimportance +unimportant +unimpressive +unindustrialized/MS +uninhibited/YP +uninominal +uninsured +unintellectual +unintended +uninteresting +uninterruptedness/M +uninterrupted/YP +unintuitive +uninviting +union/AEMS +unionism/SM +unionist/SM +Unionist/SM +unionize +Union/MS +UniPlus/M +unipolar +uniprocessor/SM +uniqueness/S +unique/TYSRP +Uniroyal/M +unisex/S +UniSoft/M +unison/MS +Unisys/M +unitarianism/M +Unitarianism/SM +unitarian/MS +Unitarian/MS +unitary +unite/AEDSG +united/Y +uniter/M +unitize/GDS +unit/VGRD +unity/SEM +univ +Univac/M +univalent/S +univalve/MS +univariate +universalism/M +universalistic +universality/SM +universalize/DSRZG +universalizer/M +universal/YSP +universe/MS +university/MS +Unix/M +UNIX/M +unjam +unkempt +unkind/TP +unkink +unknightly +unknowable/S +unknowing +unlabored +unlace/G +unlearn/G +unlikeable +unlikeliness/S +unlimber/G +unlimited +unlit +unliterary +unloose/G +unlucky/TP +unmagnetized/MS +unmanageably +unmannered/Y +unmask/G +unmeaning +unmeasured +unmeetable +unmelodious +unmemorable +unmemorialized/MS +unmentionable/S +unmerciful +unmeritorious +unmethodical +unmineralized/MS +unmissable +unmistakably +unmitigated/YP +unmnemonic +unmobilized/SM +unmoral +unmount/B +unmovable +unmoving +unnaturalness/M +unnavigable +unnerving/Y +unobliging +unoffensive +unofficial +unorganized/YP +unorthodox +unpack/G +unpaintable +unpalatability +unpalatable +unpartizan +unpatronizing +unpeople +unperceptive +unperson +unperturbed/Y +unphysical +unpick/G +unpicturesque +unpinning +unpleasing +unploughed +unpolarized/SM +unpopular +unpractical +unprecedented/Y +unpredictable/S +unpreemphasized +unpremeditated +unpretentiousness/M +unprincipled/P +unproblematic +unproductive +unpropitious +unprovable +unproven +unprovocative +unpunctual +unquestionable +unraisable +unravellings +unreadability +unread/B +unreal +unrealizable +unreasoning/Y +unreceptive +unrecordable +unreflective +unrelenting/Y +unremitting/Y +unrepeatability +unrepeated +unrepentant +unreported +unrepresentative +unreproducible +unrest/G +unrestrained/P +unrewarding +unriddle +unripe/P +unromantic +unruliness/SM +unruly/PTR +unsaleable +unsanitary +unsavored/YP +unsavoriness/M +unseal/GB +unsearchable +unseasonal +unseeing/Y +unseen/S +unselfconsciousness/M +unselfconscious/P +unselfishness/M +unsellable +unsentimental +unset +unsettledness/M +unsettled/P +unsettling/Y +unshapely +unshaven +unshorn +unsighted +unsightliness/S +unskilful +unsociability +unsociable/P +unsocial +unsound/PT +unspeakably +unspecific +unspectacular +unspoilt +unspoke +unsporting +unstable/P +unstigmatized/SM +unstilted +unstinting/Y +unstopping +unstrapping +unstudied +unstuffy +unsubdued +unsubstantial +unsubtle +unsuitable +unsuspecting/Y +unswerving/Y +unsymmetrical +unsympathetic +unsystematic +unsystematized/Y +untactful +untalented +untaxing +unteach/B +untellable +untenable +unthinking +until/G +untiring/Y +unto +untouchable/MS +untowardness/M +untoward/P +untraceable +untrue +untruthfulness/M +untwist/G +Unukalhai/M +unusualness/M +unutterable +unutterably +unvocalized/MS +unvulcanized/SM +unwaivering +unwarrantable +unwarrantably +unwashed/PS +unwearable +unwearied/Y +unwed +unwedge +unwelcome +unwell/M +unwieldiness/MS +unwieldy/TPR +unwind/B +unwomanly +unworkable/S +unworried +unwrap +unwrapping +unyielding/Y +unyoke +unzip +up +Upanishads +uparrow +upbeat/SM +upbraid/GDRS +upbringing/M +upbring/JG +UPC +upchuck/SDG +upcome/G +upcountry/S +updatability +updater/M +update/RSDG +Updike/M +updraft/SM +upend/SDG +upfield +upfront +upgradeable +upgrade/DSJG +upheaval/MS +upheld +uphill/S +upholder/M +uphold/RSGZ +upholster/ADGS +upholsterer/SM +upholstery/MS +UPI +upkeep/SM +uplander/M +upland/MRS +uplifter/M +uplift/SJDRG +upload/GSD +upmarket +upon +upped +uppercase/GSD +upperclassman/M +upperclassmen +uppercut/S +uppercutting +uppermost +upper/S +upping +uppish +uppity +upraise/GDS +uprated +uprating +uprear/DSG +upright/DYGSP +uprightness/S +uprise/RGJ +uprising/M +upriver/S +uproariousness/M +uproarious/PY +uproar/MS +uproot/DRGS +uprooter/M +ups +UPS +upscale/GDS +upset/S +upsetting/MS +upshot/SM +upside/MS +upsilon/MS +upslope +upstage/DSRG +upstairs +upstandingness/M +upstanding/P +upstart/MDGS +upstate/SR +upstream/DSG +upstroke/MS +upsurge/DSG +upswing/GMS +upswung +uptake/SM +upthrust/GMS +uptight +uptime +Upton/M +uptown/RS +uptrend/M +upturn/GDS +upwardness/M +upward/SYP +upwelling +upwind/S +uracil/MS +Ural/MS +Urania/M +uranium/MS +Uranus/M +uranyl/M +Urbain/M +Urbana/M +urbane/Y +urbanism/M +urbanite/SM +urbanity/SM +urbanization/MS +urbanize/DSG +Urban/M +urbanologist/S +urbanology/S +Urbano/M +urban/RT +Urbanus/M +urchin/SM +Urdu/M +urea/SM +uremia/MS +uremic +ureter/MS +urethane/MS +urethrae +urethral +urethra/M +urethritis/M +Urey/M +urge/GDRSJ +urgency/SM +urgent/Y +urger/M +Uriah/M +uric +Uriel/M +urinal/MS +urinalyses +urinalysis/M +urinary/MS +urinate/XDSNG +urination/M +urine/MS +Uri/SM +URL +Ur/M +urning/M +urn/MDGS +urogenital +urological +urologist/S +urology/MS +Urquhart/M +Ursala/M +Ursa/M +ursine +Ursola/M +Urson/M +Ursula/M +Ursulina/M +Ursuline/M +urticaria/MS +Uruguayan/S +Uruguay/M +Urumqi +US +USA +usability/S +usable/U +usably/U +USAF +usage/SM +USART +USCG +USC/M +USDA +us/DRSBZG +used/U +use/ESDAG +usefulness/SM +useful/YP +uselessness/MS +useless/PY +Usenet/M +Usenix/M +user/M +USG/M +usherette/SM +usher/SGMD +USIA +USMC +USN +USO +USP +USPS +USS +USSR +Ustinov/M +usu +usuals +usual/UPY +usurer/SM +usuriousness/M +usurious/PY +usurpation/MS +usurper/M +usurp/RDZSG +usury/SM +UT +Utahan/SM +Utah/M +Uta/M +Ute/M +utensil/SM +uteri +uterine +uterus/M +Utica/M +utile/I +utilitarianism/MS +utilitarian/S +utility/MS +utilization/MS +utilization's/A +utilize/GZDRS +utilizer/M +utilizes/A +utmost/S +Utopia/MS +utopianism/M +utopian's +Utopian/S +utopia/S +Utrecht/M +Utrillo/M +utterance/MS +uttered/U +utterer/M +uttermost/S +utter/TRDYGS +uucp/M +UV +uvula/MS +uvular/S +uxorious +Uzbekistan +Uzbek/M +Uzi/M +V +VA +vacancy/MS +vacantness/M +vacant/PY +vacate/NGXSD +vacationist/SM +vacationland +vacation/MRDZG +vaccinate/NGSDX +vaccination/M +vaccine/SM +vaccinial +vaccinia/M +Vachel/M +vacillate/XNGSD +vacillating/Y +vacillation/M +vacillator/SM +Vaclav/M +vacua's +vacuity/MS +vacuo +vacuolated/U +vacuolate/SDGN +vacuole/SM +vacuolization/SM +vacuousness/MS +vacuous/PY +vacuum/GSMD +Vader/M +Vaduz/M +vagabondage/MS +vagabond/DMSG +vagarious +vagary/MS +vaginae +vaginal/Y +vagina/M +vagrancy/MS +vagrant/SMY +vagueing +vagueness/MS +vague/TYSRDP +Vail/M +vaingloriousness/M +vainglorious/YP +vainglory/MS +vain/TYRP +val +valance/SDMG +Valaree/M +Valaria/M +Valarie/M +Valdemar/M +Valdez/M +Valeda/M +valediction/MS +valedictorian/MS +valedictory/MS +Vale/M +valence/SM +Valencia/MS +valency/MS +Valene/M +Valenka/M +Valentia/M +Valentijn/M +Valentina/M +Valentine/M +valentine/SM +Valentin/M +Valentino/M +Valenzuela/M +Valera/M +Valeria/M +Valerian/M +Valerie/M +Valerye/M +Valéry/M +vale/SM +valet/GDMS +valetudinarianism/MS +valetudinarian/MS +Valhalla/M +valiance/S +valiantness/M +valiant/SPY +Valida/M +validated/AU +validate/INGSDX +validates/A +validation/AMI +validity/IMS +validnesses +validness/MI +valid/PIY +Valina/M +valise/MS +Valium/S +Valkyrie/SM +Vallejo +Valle/M +Valletta/M +valley/SM +Vallie/M +Valli/M +Vally/M +Valma/M +Val/MY +Valois/M +valor/MS +valorous/Y +Valparaiso/M +Valry/M +valuable/IP +valuableness/IM +valuables +valuably/I +valuate/NGXSD +valuation/CSAM +valuator/SM +value/CGASD +valued/U +valuelessness/M +valueless/P +valuer/SM +value's +values/E +valve/GMSD +valveless +valvular +Va/M +vamoose/GSD +vamp/ADSG +vamper +vampire/MGSD +vamp's +vanadium/MS +Vance/M +Vancouver/M +vandalism/MS +vandalize/GSD +vandal/MS +Vandal/MS +Vanda/M +Vandenberg/M +Vanderbilt/M +Vanderburgh/M +Vanderpoel/M +Vandyke/SM +vane/MS +Vanessa/M +Vang/M +vanguard/MS +Vania/M +vanilla/MS +vanisher/M +vanish/GRSDJ +vanishing/Y +vanity/SM +Van/M +Vanna/M +vanned +Vannie/M +Vanni/M +vanning +Vanny/M +vanquisher/M +vanquish/RSDGZ +van/SMD +vantage/MS +Vanuatu +Vanya/M +Vanzetti/M +vapidity/MS +vapidness/SM +vapid/PY +vaporer/M +vaporing/MY +vaporisation +vaporise/DSG +vaporization/AMS +vaporize/DRSZG +vaporizer/M +vapor/MRDJGZS +vaporous +vapory +vaquero/SM +VAR +Varanasi/M +Varese/M +Vargas/M +variability/IMS +variableness/IM +variable/PMS +variables/I +variably/I +variance/I +variances +variance's +Varian/M +variant/ISY +variate/MGNSDX +variational +variation/M +varicolored/MS +varicose/S +variedly +varied/U +variegate/NGXSD +variegation/M +varier/M +varietal/S +variety/MS +various/PY +varistor/M +Varityping/M +varlet/MS +varmint/SM +varnished/U +varnisher/M +varnish/ZGMDRS +var/S +varsity/MS +varying/UY +vary/SRDJG +vascular +vasectomy/SM +Vaseline/DSMG +vase/SM +Vasili/MS +Vasily/M +vasomotor +Vasquez/M +vassalage/MS +vassal/GSMD +Vassar/M +Vassili/M +Vassily/M +vastness/MS +vast/PTSYR +v/ASV +VAT +Vatican/M +vat/SM +vatted +vatting +vaudeville/SM +vaudevillian/SM +Vaudois +Vaughan/M +Vaughn/M +vaulter/M +vaulting/M +vault/ZSRDMGJ +vaunter/M +vaunt/GRDS +VAXes +Vax/M +VAX/M +Vazquez/M +vb +VCR +VD +VDT +VDU +vealed/A +vealer/MA +veal/MRDGS +veals/A +Veblen/M +vectorial +vectorization +vectorized +vectorizing +vector's/F +vector/SGDM +Veda/MS +Vedanta/M +veejay/S +veep/S +veer/DSG +veering/Y +vegan/SM +Vega/SM +Vegemite/M +veges +vegetable/MS +vegetarianism/MS +vegetarian/SM +vegetate/DSNGVX +vegetation/M +vegetative/PY +vegged +veggie/S +vegging +veg/M +vehemence/MS +vehemency/S +vehement/Y +vehicle/SM +vehicular +veiling/MU +veil's +veil/UGSD +vein/GSRDM +veining/M +vela/M +Vela/M +velarize/SDG +velar/S +Velásquez/M +Velázquez +Velcro/SM +veld/SM +veldt's +Velez/M +Vella/M +vellum/MS +Velma/M +velocipede/SM +velocity/SM +velor/S +velour's +velum/M +Velveeta/M +velveteen/MS +velvet/GSMD +Velvet/M +velvety/RT +venality/MS +venal/Y +venation/SM +vend/DSG +vender's/K +vendetta/MS +vendible/S +vendor/MS +veneerer/M +veneer/GSRDM +veneering/M +venerability/S +venerable/P +venerate/XNGSD +veneration/M +venereal +venetian +Venetian/SM +Venezuela/M +Venezuelan/S +vengeance/MS +vengeful/APY +vengefulness/AM +venialness/M +venial/YP +Venice/M +venireman/M +veniremen +venison/SM +Venita/M +Venn/M +venomousness/M +venomous/YP +venom/SGDM +venous/Y +venter/M +ventilated/U +ventilate/XSDVGN +ventilation/M +ventilator/MS +vent/ISGFD +ventral/YS +ventricle/MS +ventricular +ventriloquies +ventriloquism/MS +ventriloquist/MS +ventriloquy +vent's/F +Ventura/M +venture/RSDJZG +venturesomeness/SM +venturesome/YP +venturi/S +venturousness/MS +venturous/YP +venue/MAS +Venusian/S +Venus/S +veraciousness/M +veracious/YP +veracities +veracity/IM +Veracruz/M +Veradis +Vera/M +verandahed +veranda/SDM +verbalization/MS +verbalized/U +verbalizer/M +verbalize/ZGRSD +verballed +verballing +verbal/SY +verbatim +verbena/MS +verbiage/SM +verb/KSM +verbose/YP +verbosity/SM +verboten +verdant/Y +Verde/M +Verderer/M +verdict/SM +verdigris/GSDM +Verdi/M +verdure/SDM +Vere/M +Verena/M +Verene/M +verge/FGSD +Verge/M +verger/SM +verge's +Vergil's +veridical/Y +Veriee/M +verifiability/M +verifiableness/M +verifiable/U +verification/S +verified/U +verifier/MS +verify/GASD +Verile/M +verily +Verina/M +Verine/M +verisimilitude/SM +veritableness/M +veritable/P +veritably +verity/MS +Verlag/M +Verlaine/M +Verla/M +Vermeer/M +vermicelli/MS +vermiculite/MS +vermiform +vermilion/MS +vermin/M +verminous +Vermonter/M +Vermont/ZRM +vermouth/M +vermouths +vernacular/YS +vernal/Y +Verna/M +Verne/M +Vernen/M +Verney/M +Vernice/M +vernier/SM +Vern/NM +Vernon/M +Vernor/M +Verona/M +Veronese/M +Veronica/M +veronica/SM +Veronika/M +Veronike/M +Veronique/M +verrucae +verruca/MS +versa +Versailles/M +Versatec/M +versatileness/M +versatile/YP +versatility/SM +versed/UI +verse's +verses/I +verse/XSRDAGNF +versicle/M +versification/M +versifier/M +versify/GDRSZXN +versing/I +version/MFISA +verso/SM +versus +vertebrae +vertebral/Y +vertebra/M +vertebrate/IMS +vertebration/M +vertex/SM +vertical/YPS +vertices's +vertiginous +vertigoes +vertigo/M +verve/SM +very/RT +Vesalius/M +vesicle/SM +vesicular/Y +vesiculate/GSD +Vespasian/M +vesper/SM +Vespucci/M +vessel/MS +vestal/YS +Vesta/M +vest/DIGSL +vestibular +vestibule/SDM +vestige/SM +vestigial/Y +vesting/SM +vestment/ISM +vestryman/M +vestrymen +vestry/MS +vest's +vesture/SDMG +Vesuvius/M +vetch/SM +veteran/SM +veterinarian/MS +veterinary/S +veter/M +veto/DMG +vetoes +vet/SMR +vetted +vetting/A +Vevay/M +vexation/SM +vexatiousness/M +vexatious/PY +vexed/Y +vex/GFSD +VF +VFW +VG +VGA +vhf +VHF +VHS +VI +via +viability/SM +viable/I +viably +viaduct/MS +Viagra/M +vial/MDGS +viand/SM +vibe/S +vibraharp/MS +vibrancy/MS +vibrant/YS +vibraphone/MS +vibraphonist/SM +vibrate/XNGSD +vibrational/Y +vibration/M +vibrato/MS +vibrator/SM +vibratory +vibrio/M +vibrionic +viburnum/SM +vicarage/SM +vicariousness/MS +vicarious/YP +vicar/SM +vice/CMS +viced +vicegerent/MS +vicennial +Vicente/M +viceregal +viceroy/SM +Vichy/M +vichyssoise/MS +vicing +vicinity/MS +viciousness/S +vicious/YP +vicissitude/MS +Vickers/M +Vickie/M +Vicki/M +Vicksburg/M +Vicky/M +Vick/ZM +Vic/M +victimization/SM +victimized/U +victimizer/M +victimize/SRDZG +victim/SM +Victoir/M +Victoria/M +Victorianism/S +Victorian/S +victoriousness/M +victorious/YP +Victor/M +victor/SM +victory/MS +Victrola/SM +victualer/M +victual/ZGSDR +vicuńa/S +Vidal/M +Vida/M +videlicet +videocassette/S +videoconferencing +videodisc/S +videodisk/SM +video/GSMD +videophone/SM +videotape/SDGM +Vidovic/M +Vidovik/M +Vienna/M +Viennese/M +Vientiane/M +vier/M +vie/S +Vietcong/M +Viet/M +Vietminh/M +Vietnamese/M +Vietnam/M +viewed/A +viewer/AS +viewer's +viewfinder/MS +viewgraph/SM +viewing/M +viewless/Y +view/MBGZJSRD +viewpoint/SM +views/A +vigesimal +vigilance/MS +vigilante/SM +vigilantism/MS +vigilantist +vigilant/Y +vigil/SM +vignette/MGDRS +vignetter/M +vignetting/M +vignettist/MS +vigor/MS +vigorousness/M +vigorous/YP +vii +viii +Vijayawada/M +Viki/M +Viking/MS +viking/S +Vikki/M +Vikky/M +Vikram/M +Vila +vile/AR +vilely +vileness/MS +vilest +Vilhelmina/M +vilification/M +vilifier/M +vilify/GNXRSD +villager/M +village/RSMZ +villainousness/M +villainous/YP +villain/SM +villainy/MS +Villa/M +villa/MS +Villarreal/M +ville +villeinage/SM +villein/MS +villi +Villon/M +villus/M +Vilma/M +Vilnius/M +Vilyui/M +Vi/M +vi/MDR +vim/MS +vinaigrette/MS +Vina/M +Vince/M +Vincent/MS +Vincenty/M +Vincenz/M +vincible/I +Vinci/M +Vindemiatrix/M +vindicate/XSDVGN +vindication/M +vindicator/SM +vindictiveness/MS +vindictive/PY +vinegar/DMSG +vinegary +vine/MGDS +vineyard/SM +Vinita/M +Vin/M +Vinnie/M +Vinni/M +Vinny/M +vino/MS +vinous +Vinson/M +vintage/MRSDG +vintager/M +vintner/MS +vinyl/SM +violable/I +Viola/M +Violante/M +viola/SM +violate/VNGXSD +violator/MS +Viole/M +violence/SM +violent/Y +Violet/M +violet/SM +Violetta/M +Violette/M +violinist/SM +violin/MS +violist/MS +viol/MSB +violoncellist/S +violoncello/MS +viper/MS +viperous +VIP/S +viragoes +virago/M +viral/Y +vireo/SM +Virge/M +Virgie/M +Virgilio/M +Virgil/M +virginal/YS +Virgina/M +Virginia/M +Virginian/S +Virginie/M +virginity/SM +virgin/SM +Virgo/MS +virgule/MS +virile +virility/MS +virologist/S +virology/SM +virtual/Y +virtue/SM +virtuosity/MS +virtuosoes +virtuoso/MS +virtuousness/SM +virtuous/PY +virulence/SM +virulent/Y +virus/MS +visage/MSD +Visakhapatnam's +Visa/M +visa/SGMD +Visayans +viscera +visceral/Y +viscid/Y +viscoelastic +viscoelasticity +viscometer/SM +viscose/MS +viscosity/MS +viscountcy/MS +viscountess/SM +viscount/MS +viscousness/M +viscous/PY +viscus/M +vise/CAXNGSD +viselike +vise's +Vishnu/M +visibility/ISM +visible/PI +visibly/I +Visigoth/M +Visigoths +visionariness/M +visionary/PS +vision/KMDGS +vision's/A +visitable/U +visitant/SM +visitation/SM +visited/U +visit/GASD +visitor/MS +vis/MDSGV +visor/SMDG +VISTA +vista/GSDM +Vistula/M +visualization/AMS +visualized/U +visualizer/M +visualizes/A +visualize/SRDZG +visual/SY +vitae +vitality/MS +vitalization/AMS +vitalize/ASDGC +vital/SY +vita/M +Vita/M +vitamin/SM +Vite/M +Vitia/M +vitiate/XGNSD +vitiation/M +viticulture/SM +viticulturist/S +Vitim/M +Vito/M +Vitoria/M +vitreous/YSP +vitrifaction/S +vitrification/M +vitrify/XDSNG +vitrine/SM +vitriolic +vitriol/MDSG +vitro +vittles +Vittoria/M +Vittorio/M +vituperate/SDXVGN +vituperation/M +vituperative/Y +Vitus/M +vivace/S +vivaciousness/MS +vivacious/YP +vivacity/SM +viva/DGS +Vivaldi +Viva/M +vivaria +vivarium/MS +vivaxes +Vivekananda/M +vive/Z +Vivia/M +Viviana/M +Vivian/M +Vivianna/M +Vivianne/M +vividness/SM +vivid/PTYR +Vivie/M +Viviene/M +Vivien/M +Vivienne/M +vivifier +vivify/NGASD +Vivi/MN +viviparous +vivisect/DGS +vivisectional +vivisectionist/SM +vivisection/MS +Viviyan/M +Viv/M +vivo +Vivyan/M +Vivyanne/M +vixenish/Y +vixen/SM +viz +vizier/MS +vizor's +VJ +Vladamir/M +Vladimir/M +Vladivostok/M +Vlad/M +VLF +VLSI +VMS/M +VOA +vocable/SM +vocab/S +vocabularian +vocabularianism +vocabulary/MS +vocalic/S +vocalise's +vocalism/M +vocalist/MS +vocalization/SM +vocalized/U +vocalizer/M +vocalize/ZGDRS +vocal/SY +vocation/AKMISF +vocational/Y +vocative/KYS +vociferate/NGXSD +vociferation/M +vociferousness/MS +vociferous/YP +vocoded +vocoder +vodka/MS +voe/S +Vogel/M +vogue/GMSRD +vogueing +voguish +voiceband +voiced/CU +voice/IMGDS +voicelessness/SM +voiceless/YP +voicer/S +voices/C +voicing/C +voidable +void/C +voided +voider/M +voiding +voidness/M +voids +voilŕ +voile/MS +volar +volatileness/M +volatile/PS +volatility/MS +volatilization/MS +volatilize/SDG +volcanically +volcanic/S +volcanism/M +volcanoes +volcano/M +vole/MS +Volga/M +Volgograd/M +vol/GSD +volitionality +volitional/Y +volition/MS +Volkswagen/SM +volleyball/MS +volleyer/M +volley/SMRDG +Vol/M +Volstead/M +voltage/SM +voltaic +Voltaire/M +Volta/M +volt/AMS +Volterra/M +voltmeter/MS +volubility/S +voluble/P +volubly +volume/SDGM +volumetric +volumetrically +voluminousness/MS +voluminous/PY +voluntarily/I +voluntariness/MI +voluntarism/MS +voluntary/PS +volunteer/DMSG +voluptuary/SM +voluptuousness/S +voluptuous/YP +volute/S +Volvo/M +vomit/GRDS +Vonda/M +Von/M +Vonnegut/M +Vonnie/M +Vonni/M +Vonny/M +voodoo/GDMS +voodooism/S +voraciousness/MS +voracious/YP +voracity/MS +Voronezh/M +Vorster/M +vortex/SM +vortices's +vorticity/M +votary/MS +vote/CSDG +voter/SM +vote's +votive/YP +voucher/GMD +vouchsafe/SDG +vouch/SRDGZ +vowelled +vowelling +vowel/MS +vower/M +vow/SMDRG +voyage/GMZJSRD +voyager/M +voyageur/SM +voyeurism/MS +voyeuristic +voyeur/MS +VP +vs +V's +VT +Vt/M +VTOL +vulcanization/SM +vulcanized/U +vulcanize/SDG +Vulcan/M +vulgarian/MS +vulgarism/MS +vulgarity/MS +vulgarization/S +vulgarize/GZSRD +vulgar/TSYR +Vulgate/SM +Vulg/M +vulnerability/SI +vulnerable/IP +vulnerably/I +vulpine +vulturelike +vulture/SM +vulturous +vulvae +vulva/M +vying +Vyky/M +WA +Waals +Wabash/M +WAC +Wacke/M +wackes +wackiness/MS +wacko/MS +wacky/RTP +Waco/M +Wac/S +wadded +wadding/SM +waddle/GRSD +Wade/M +wader/M +wade/S +wadi/SM +wad/MDRZGS +Wadsworth/M +wafer/GSMD +waffle/GMZRSD +Wafs +wafter/M +waft/SGRD +wag/DRZGS +waged/U +wager/GZMRD +wage/SM +wagged +waggery/MS +wagging +waggishness/SM +waggish/YP +waggle/SDG +waggly +Wagnerian +Wagner/M +wagoner/M +wagon/SGZMRD +wagtail/SM +Wahl/M +waif/SGDM +Waikiki/M +wailer/M +wail/SGZRD +wain/GSDM +Wain/M +wainscot/SGJD +Wainwright/M +wainwright/SM +waistband/MS +waistcoat/GDMS +waister/M +waist/GSRDM +waistline/MS +Waite/M +waiter/DMG +Waiter/M +wait/GSZJRD +Wait/MR +waitpeople +waitperson/S +waitress/GMSD +waiver/MB +waive/SRDGZ +Wakefield/M +wakefulness/MS +wakeful/PY +Wake/M +wake/MGDRSJ +waken/SMRDG +waker/M +wakeup +Waksman/M +Walbridge/M +Walcott/M +Waldemar/M +Walden/M +Waldensian +Waldheim/M +Wald/MN +Waldo/M +Waldon/M +Waldorf/M +wale/DRSMG +Wales +Walesa/M +Walford/M +Walgreen/M +waling/M +walkabout/M +walkaway/SM +walker/M +Walker/M +walk/GZSBJRD +walkie +Walkman/S +walkout/SM +walkover/SM +walkway/MS +wallaby/MS +Wallace/M +Wallache/M +wallah/M +Wallas/M +wallboard/MS +Wallenstein/M +Waller/M +wallet/SM +walleye/MSD +wallflower/MS +Wallie/M +Wallis +Walliw/M +Walloon/SM +walloper/M +walloping/M +wallop/RDSJG +wallower/M +wallow/RDSG +wallpaper/DMGS +wall/SGMRD +Wall/SMR +Wally/M +wally/S +walnut/SM +Walpole/M +Walpurgisnacht +walrus/SM +Walsh/M +Walter/M +Walther/M +Walton/M +waltzer/M +Walt/ZMR +waltz/MRSDGZ +Walworth/M +Waly/M +wampum/SM +Wanamaker/M +Wanda/M +wanderer/M +wander/JZGRD +wanderlust/SM +Wandie/M +Wandis/M +wand/MRSZ +wane/S +Waneta/M +wangler/M +wangle/RSDGZ +Wang/M +Wanids/M +Wankel/M +wanna +wannabe/S +wanned +wanner +wanness/S +wannest +wanning +wan/PGSDY +Wansee/M +Wansley/M +wanted/U +wanter/M +want/GRDSJ +wantonness/S +wanton/PGSRDY +wapiti/MS +warble/GZRSD +warbler/M +warbonnet/S +ward/AGMRDS +Warde/M +warden/DMGS +Warden/M +warder/DMGS +Ward/MN +wardrobe/MDSG +wardroom/MS +wardship/M +wards/I +warehouseman/M +warehouse/MGSRD +Ware/MG +ware/MS +warfare/SM +Warfield/M +war/GSMD +warhead/MS +Warhol/M +warhorse/SM +warily/U +warinesses/U +wariness/MS +Waring/M +warless +warlike +warlock/SM +warlord/MS +warmblooded +warmed/A +warmer/M +warmheartedness/SM +warmhearted/PY +warmish +warmness/MS +warmongering/M +warmonger/JGSM +warms/A +warmth/M +warmths +warm/YRDHPGZTS +warned/U +warner/M +Warner/M +warn/GRDJS +warning/YM +Warnock/M +warpaint +warpath/M +warpaths +warper/M +warplane/MS +warp/MRDGS +warranted/U +warranter/M +warrant/GSMDR +warranty/SDGM +warred/M +warrener/M +Warren/M +warren/SZRM +warring/M +warrior/MS +Warsaw/M +wars/C +warship/MS +warthog/S +wartime/SM +wart/MDS +warty/RT +Warwick/M +wary/URPT +Wasatch/M +washable/S +wash/AGSD +washbasin/SM +washboard/SM +washbowl/SM +Washburn/M +washcloth/M +washcloths +washday/M +washed/U +washer/GDMS +washerwoman/M +washerwomen +washing/SM +Washingtonian/S +Washington/M +Wash/M +Washoe/M +washout/SM +washrag/SM +washroom/MS +washstand/SM +washtub/MS +washy/RT +wasn't +WASP +waspishness/SM +waspish/PY +Wasp's +wasp/SM +was/S +wassail/GMDS +Wasserman/M +Wassermann/M +wastage/SM +wastebasket/SM +wastefulness/S +wasteful/YP +wasteland/MS +wastepaper/MS +waster/DG +waste/S +wastewater +wast/GZSRD +wasting/Y +wastrel/MS +Watanabe/M +watchable/U +watchband/SM +watchdogged +watchdogging +watchdog/SM +watched/U +watcher/M +watchfulness/MS +watchful/PY +watch/JRSDGZB +watchmake/JRGZ +watchmaker/M +watchman/M +watchmen +watchpoints +watchtower/MS +watchword/MS +waterbird/S +waterborne +Waterbury/M +watercolor/DMGS +watercolorist/SM +watercourse/SM +watercraft/M +watercress/SM +waterer/M +waterfall/SM +waterfowl/M +waterfront/SM +Watergate/M +waterhole/S +Waterhouse/M +wateriness/SM +watering/M +water/JGSMRD +waterless +waterlily/S +waterline/S +waterlogged +waterloo +Waterloo/SM +waterman/M +watermark/GSDM +watermelon/SM +watermill/S +waterproof/PGRDSJ +watershed/SM +waterside/MSR +watersider/M +Waters/M +waterspout/MS +watertightness/M +watertight/P +Watertown/M +waterway/MS +waterwheel/S +waterworks/M +watery/PRT +Watkins +WATS +Watson/M +wattage/SM +Watteau/M +Wattenberg/M +Watterson/M +wattle/SDGM +Watt/MS +watt/TMRS +Watusi/M +Wat/ZM +Waugh/M +Waukesha/M +Waunona/M +Waupaca/M +Waupun/M +Wausau/M +Wauwatosa/M +waveband/MS +waveform/SM +wavefront/MS +waveguide/MS +Waveland/M +wavelength/M +wavelengths +wavelet/SM +wavelike +wavenumber +waver/GZRD +wavering/YU +Waverley/M +Waverly/M +Wave/S +wave/ZGDRS +wavily +waviness/MS +wavy/SRTP +waxer/M +waxiness/MS +wax/MNDRSZG +waxwing/MS +waxwork/MS +waxy/PRT +wayfarer/MS +wayfaring/S +waylaid +Wayland/M +Waylan/M +waylayer/M +waylay/GRSZ +wayleave/MS +Waylen/M +Waylin/M +Waylon/M +Way/M +waymarked +way/MS +Wayne/M +Waynesboro/M +wayside/MS +waywardness/S +wayward/YP +WC +we +weakener/M +weaken/ZGRD +weakfish/SM +weakish +weakliness/M +weakling/SM +weakly/RTP +weakness/MS +weak/TXPYRN +weal/MHS +wealthiness/MS +wealth/M +wealths +wealthy/PTR +weaner/M +weanling/M +wean/RDGS +weapon/GDMS +weaponless +weaponry/MS +wearable/S +wearer/M +wearied/U +wearily +weariness/MS +wearing/Y +wearisomeness/M +wearisome/YP +wear/RBSJGZ +wearying/Y +weary/TGPRSD +weasel/SGMDY +weatherbeaten +weathercock/SDMG +weatherer/M +Weatherford/M +weathering/M +weatherize/GSD +weatherman/M +weather/MDRYJGS +weathermen +weatherperson/S +weatherproof/SGPD +weatherstripped +weatherstripping/S +weatherstrip/S +weaver/M +Weaver/M +weaves/A +weave/SRDGZ +weaving/A +webbed +Webber/M +webbing/MS +Webb/RM +weber/M +Weber/M +Webern/M +webfeet +webfoot/M +Web/MR +website/S +web/SMR +Webster/MS +Websterville/M +we'd +wedded/A +Weddell/M +wedder +wedding/SM +wedge/SDGM +wedgie/RST +Wedgwood/M +wedlock/SM +Wed/M +Wednesday/SM +wed/SA +weeder/M +weediness/M +weedkiller/M +weedless +wee/DRST +weed/SGMRDZ +weedy/TRP +weeing +weekday/MS +weekender/M +weekend/SDRMG +weekly/S +weeknight/SM +Weeks/M +week/SYM +weenie/M +ween/SGD +weeny/RSMT +weeper/M +weep/SGZJRD +weepy/RST +weevil/MS +weft/SGMD +Wehr/M +Weibull/M +Weidar/M +Weider/M +Weidman/M +Weierstrass/M +weighed/UA +weigher/M +weigh/RDJG +weighs/A +weighted/U +weighter/M +weightily +weightiness/SM +weighting/M +weight/JMSRDG +weightlessness/SM +weightless/YP +weightlifter/S +weightlifting/MS +weighty/TPR +Weill/M +Wei/M +Weinberg/M +Weiner/M +Weinstein/M +weirdie/SM +weirdness/MS +weirdo/SM +weird/YRDPGTS +weir/SDMG +Weisenheimer/M +Weiss/M +Weissman/M +Weissmuller/M +Weizmann/M +Welbie/M +Welby/M +Welcher/M +Welches +welcomeness/M +welcome/PRSDYG +welcoming/U +welder/M +Weldon/M +weld/SBJGZRD +Weldwood/M +welfare/SM +welkin/SM +we'll +Welland/M +wellbeing/M +Weller/M +Wellesley/M +Welles/M +wellhead/SM +Wellington/MS +wellington/S +Wellman/M +wellness/MS +well/SGPD +Wells/M +wellspring/SM +Wellsville/M +Welmers/M +Welsh +welsher/M +Welshman/M +Welshmen +welsh/RSDGZ +Welshwoman/M +Welshwomen +welter/GD +welterweight/MS +welt/GZSMRD +wencher/M +wench/GRSDM +Wendall/M +Wenda/M +wend/DSG +Wendeline/M +Wendell/M +Wendel/M +Wendie/M +Wendi/M +Wendye/M +Wendy/M +wen/M +Wenonah/M +Wenona/M +went +Wentworth/M +wept/U +were +we're +weren't +werewolf/M +werewolves +Werner/M +Wernher/M +Werther/M +werwolf's +Wes +Wesleyan +Wesley/M +Wessex/M +Wesson/M +westbound +Westbrooke/M +Westbrook/M +Westchester/M +wester/DYG +westerly/S +westerner/M +westernization/MS +westernize/GSD +westernmost +Western/ZRS +western/ZSR +Westfield/M +Westhampton/M +Westinghouse/M +westing/M +Westleigh/M +Westley/M +Westminster/M +Westmore/M +West/MS +Weston/M +Westphalia/M +Westport/M +west/RDGSM +westward/S +Westwood/M +wetback/MS +wetland/S +wetness/MS +wet/SPY +wettable +wetter/S +wettest +wetting +we've +Weyden/M +Weyerhauser/M +Weylin/M +Wezen/M +WFF +whacker/M +whack/GZRDS +whaleboat/MS +whalebone/SM +whale/GSRDZM +Whalen/M +whaler/M +whaling/M +whammed +whamming/M +wham/MS +whammy/S +wharf/SGMD +Wharton/M +wharves +whatchamacallit/MS +what'd +whatever +what/MS +whatnot/MS +what're +whatsoever +wheal/MS +wheatgerm +Wheaties/M +Wheatland/M +wheat/NMXS +Wheaton/M +Wheatstone/M +wheedle/ZDRSG +wheelbarrow/GSDM +wheelbase/MS +wheelchair/MS +wheeler/M +Wheeler/M +wheelhouse/SM +wheelie/MS +wheeling/M +Wheeling/M +Wheelock/M +wheel/RDMJSGZ +wheelwright/MS +whee/S +wheeze/SDG +wheezily +wheeziness/SM +wheezy/PRT +Whelan/M +whelk/MDS +Wheller/M +whelm/DGS +whelp/DMGS +whence/S +whenever +when/S +whensoever +whereabout/S +whereas/S +whereat +whereby +where'd +wherefore/MS +wherein +where/MS +whereof +whereon +where're +wheresoever +whereto +whereupon +wherever +wherewith +wherewithal/SM +wherry/DSGM +whether +whet/S +whetstone/MS +whetted +whetting +whew/GSD +whey/MS +which +whichever +whiff/GSMD +whiffle/DRSG +whiffler/M +whiffletree/SM +whig/S +Whig/SM +while/GSD +whilom +whilst +whimmed +whimming +whimper/DSG +whimsey's +whimsicality/MS +whimsical/YP +whim/SM +whimsy/TMDRS +whine/GZMSRD +whining/Y +whinny/GTDRS +whiny/RT +whipcord/SM +whiplash/SDMG +Whippany/M +whipped +whipper/MS +whippersnapper/MS +whippet/MS +whipping/SM +Whipple/M +whippletree/SM +whippoorwill/SM +whipsaw/GDMS +whips/M +whip/SM +whirligig/MS +whirlpool/MS +whirl/RDGS +whirlwind/MS +whirlybird/MS +whirly/MS +whirred +whirring +whir/SY +whisker/DM +whiskery +whiskey/SM +whisk/GZRDS +whisperer/M +whisper/GRDJZS +whispering/YM +whist/GDMS +whistleable +whistle/DRSZG +whistler/M +Whistler/M +whistling/M +Whitaker/M +Whitby/M +Whitcomb/M +whitebait/M +whitecap/MS +whiteface/M +Whitefield/M +whitefish/SM +Whitehall/M +Whitehead/M +whitehead/S +Whitehorse/M +Whiteleaf/M +Whiteley/M +White/MS +whitener/M +whiteness/MS +whitening/M +whiten/JZDRG +whiteout/S +white/PYS +whitespace +whitetail/S +whitewall/SM +whitewash/GRSDM +whitewater +Whitewater/M +whitey/MS +Whitfield/M +whither/DGS +whitier +whitiest +whiting/M +whitish +Whitley/M +Whitlock/M +Whit/M +Whitman/M +Whitney/M +whit/SJGTXMRND +Whitsunday/MS +Whittaker/M +whitter +Whittier +whittle/JDRSZG +whittler/M +whiz +whizkid +whizzbang/S +whizzed +whizzes +whizzing +WHO +whoa/S +who'd +whodunit/SM +whoever +wholegrain +wholeheartedness/MS +wholehearted/PY +wholemeal +wholeness/S +wholesale/GZMSRD +wholesaler/M +wholesomeness/USM +wholesome/UYP +whole/SP +wholewheat +who'll +wholly +whom +who/M +whomever +whomsoever +whoopee/S +whooper/M +whoop/SRDGZ +whoosh/DSGM +whop +whopper/MS +whopping/S +who're +whorehouse/SM +whoreish +whore/SDGM +whorish +whorl/SDM +whose +whoso +whosoever +who've +why +whys +WI +Wiatt/M +Wichita/M +wickedness/MS +wicked/RYPT +wicker/M +wickerwork/MS +wicketkeeper/SM +wicket/SM +wick/GZRDMS +wicking/M +widemouthed +widener/M +wideness/S +widen/SGZRD +wide/RSYTP +widespread +widgeon's +widget/SM +widower/M +widowhood/S +widow/MRDSGZ +width/M +widths +widthwise +Wieland/M +wielder/M +wield/GZRDS +Wiemar/M +wiener/SM +wienie/SM +Wier/M +Wiesel/M +wife/DSMYG +wifeless +wifely/RPT +wigeon/MS +wigged +wigging/M +Wiggins +wiggler/M +wiggle/RSDGZ +wiggly/RT +wight/SGDM +wiglet/S +wigmaker +wig/MS +Wigner/M +wigwagged +wigwagging +wigwag/S +wigwam/MS +Wilberforce/M +Wilbert/M +Wilbur/M +Wilburn/M +Wilburt/M +Wilcox/M +Wilda/M +wildcat/SM +wildcatted +wildcatter/MS +wildcatting +wildebeest/SM +Wilde/MR +Wilden/M +Wilder/M +wilderness/SM +wilder/P +wildfire/MS +wildflower/S +wildfowl/M +wilding/M +wildlife/M +wildness/MS +Wildon/M +wild/SPGTYRD +wile/DSMG +Wileen/M +Wilek/M +Wiley/M +Wilford/M +Wilfred/M +Wilfredo/M +Wilfrid/M +wilfulness's +Wilhelmina/M +Wilhelmine/M +Wilhelm/M +Wilie/M +wilily +wiliness/MS +Wilkerson/M +Wilkes/M +Wilkins/M +Wilkinson/M +Willabella/M +Willa/M +Willamette/M +Willamina/M +Willard/M +Willcox/M +Willdon/M +willed/U +Willem/M +Willemstad/M +willer/M +Willetta/M +Willette/M +Willey/M +willfulness/S +willful/YP +Williamsburg/M +William/SM +Williamson/M +Willied/M +Willie/M +willies +Willi/MS +willinger +willingest +willingness's +willingness/US +willing/UYP +Willisson/M +williwaw/MS +Will/M +Willoughby/M +willower/M +Willow/M +willow/RDMSG +willowy/TR +willpower/MS +will/SGJRD +Willy/SDM +Willyt/M +Wilma/M +Wilmar/M +Wilmer/M +Wilmette/M +Wilmington/M +Wilona/M +Wilone/M +Wilow/M +Wilshire/M +Wilsonian +Wilson/M +wilt/DGS +Wilt/M +Wilton/M +wily/PTR +Wimbledon/M +wimp/GSMD +wimpish +wimple/SDGM +wimpy/RT +wince/SDG +Winchell/M +wincher/M +winchester/M +Winchester/MS +winch/GRSDM +windbag/SM +windblown +windbreak/MZSR +windburn/GSMD +winded +winder/UM +windfall/SM +windflower/MS +Windham/M +Windhoek/M +windily +windiness/SM +winding/MS +windjammer/SM +windlass/GMSD +windless/YP +windmill/GDMS +window/DMGS +windowless +windowpane/SM +Windows +windowsill/SM +windpipe/SM +windproof +windrow/GDMS +wind's +winds/A +windscreen/MS +windshield/SM +windsock/MS +Windsor/MS +windstorm/MS +windsurf/GZJSRD +windswept +windup/MS +wind/USRZG +Windward/M +windward/SY +Windy/M +windy/TPR +wineglass/SM +winegrower/SM +Winehead/M +winemake +winemaster +wine/MS +winery/MS +Winesap/M +wineskin/M +Winfield/M +Winfred/M +Winfrey/M +wingback/M +wingding/MS +wingeing +winger/M +wing/GZRDM +wingless +winglike +wingman +wingmen +wingspan/SM +wingspread/MS +wingtip/S +Winifield/M +Winifred/M +Wini/M +winker/M +wink/GZRDS +winking/U +Winkle/M +winkle/SDGM +winless +Win/M +winnable +Winnah/M +Winna/M +Winnebago/M +Winne/M +winner/MS +Winnetka/M +Winnie/M +Winnifred/M +Winni/M +winning/SY +Winnipeg/M +Winn/M +winnow/SZGRD +Winny/M +Winograd/M +wino/MS +Winonah/M +Winona/M +Winooski/M +Winsborough/M +Winsett/M +Winslow/M +winsomeness/SM +winsome/PRTY +Winston/M +winterer/M +wintergreen/SM +winterize/GSD +Winters +winter/SGRDYM +wintertime/MS +Winthrop/M +wintriness/M +wintry/TPR +winy/RT +win/ZGDRS +wipe/DRSZG +wiper/M +wirehair/MS +wireless/MSDG +wireman/M +wiremen +wirer/M +wire's +wires/A +wiretap/MS +wiretapped +wiretapper/SM +wiretapping +wire/UDA +wiriness/S +wiring/SM +wiry/RTP +Wisc +Wisconsinite/SM +Wisconsin/M +wisdoms +wisdom/UM +wiseacre/MS +wisecrack/GMRDS +wised +wisely/TR +Wise/M +wiseness +wisenheimer/M +Wisenheimer/M +wises +wise/URTY +wishbone/MS +wishfulness/M +wishful/PY +wish/GZSRD +wishy +wising +Wis/M +wisp/MDGS +wispy/RT +wist/DGS +wisteria/SM +wistfulness/MS +wistful/PY +witchcraft/SM +witchdoctor/S +witchery/MS +witch/SDMG +withal +withdrawal/MS +withdrawer/M +withdrawnness/M +withdrawn/P +withdraw/RGS +withdrew +withe/M +wither/GDJ +withering/Y +Witherspoon/M +with/GSRDZ +withheld +withholder/M +withhold/SJGZR +within/S +without/S +withs +withstand/SG +withstood +witlessness/MS +witless/PY +Wit/M +witness/DSMG +witnessed/U +wit/PSM +witted +witter/G +Wittgenstein/M +witticism/MS +Wittie/M +wittily +wittiness/SM +wittings +witting/UY +Witt/M +Witty/M +witty/RTP +Witwatersrand/M +wive/GDS +wives/M +wizard/MYS +wizardry/MS +wizen/D +wiz's +wk/Y +Wm/M +WNW +woad/MS +wobble/GSRD +wobbler/M +wobbliness/S +wobbly/PRST +Wodehouse/M +woebegone/P +woefuller +woefullest +woefulness/SM +woeful/PY +woe/PSM +woke +wok/SMN +Wolcott/M +wold/MS +Wolfe/M +wolfer/M +Wolff/M +Wolfgang/M +wolfhound/MS +Wolfie/M +wolfishness/M +wolfish/YP +Wolf/M +wolfram/MS +wolf/RDMGS +Wolfy/M +Wollongong/M +Wollstonecraft/M +Wolsey/M +Wolverhampton/M +wolverine/SM +Wolverton/M +wolves/M +woman/GSMYD +womanhood/MS +womanish +womanized/U +womanizer/M +womanize/RSDZG +womanizes/U +womankind/M +womanlike +womanliness/SM +womanly/PRT +wombat/MS +womb/SDM +womenfolk/MS +women/MS +wonderer/M +wonderfulness/SM +wonderful/PY +wonder/GLRDMS +wondering/Y +wonderland/SM +wonderment/SM +wondrousness/M +wondrous/YP +Wong/M +wonk/S +wonky/RT +wonned +wonning +won/SG +won't +wontedness/MU +wonted/PUY +wont/SGMD +Woodard/M +Woodberry/M +woodbine/SM +woodblock/S +Woodbury/M +woodcarver/S +woodcarving/MS +woodchopper/SM +woodchuck/MS +woodcock/MS +woodcraft/MS +woodcut/SM +woodcutter/MS +woodcutting/MS +woodenness/SM +wooden/TPRY +woodgrain/G +woodhen +Woodhull/M +Woodie/M +woodiness/MS +woodland/SRM +Woodlawn/M +woodlice +woodlot/S +woodlouse/M +woodman/M +Woodman/M +woodmen +woodpecker/SM +woodpile/SM +Woodrow/M +woodruff/M +woo/DRZGS +woodshedded +woodshedding +woodshed/SM +woodside +Wood/SM +woodsman/M +woodsmen +wood/SMNDG +woodsmoke +woods/R +Woodstock/M +woodsy/TRP +Woodward/MS +woodwind/S +woodworker/M +woodworking/M +woodwork/SMRGZJ +woodworm/M +woodyard +Woody/M +woody/TPSR +woofer/M +woof/SRDMGZ +Woolf/M +woolgatherer/M +woolgathering/M +woolgather/RGJ +woolliness/MS +woolly/RSPT +Woolongong/M +wool/SMYNDX +Woolworth/M +Woonsocket/M +Wooster/M +Wooten/M +woozily +wooziness/MS +woozy/RTP +wop/MS! +Worcestershire/M +Worcester/SM +wordage/SM +word/AGSJD +wordbook/MS +Worden/M +wordily +wordiness/SM +wording/AM +wordless/Y +wordplay/SM +word's +Wordsworth/M +wordy/TPR +wore +workability's +workability/U +workableness/M +workable/U +workably +workaday +workaholic/S +workaround/SM +workbench/MS +workbook/SM +workday/SM +worked/A +worker/M +workfare/S +workforce/S +work/GZJSRDMB +workhorse/MS +workhouse/SM +working/M +workingman/M +workingmen +workingwoman/M +workingwomen +workload/SM +workmanlike +Workman/M +workman/MY +workmanship/MS +workmate/S +workmen/M +workout/SM +workpiece/SM +workplace/SM +workroom/MS +works/A +worksheet/S +workshop/MS +workspace/S +workstation/MS +worktable/SM +worktop/S +workup/S +workweek/SM +worldlier +worldliest +worldliness/USM +worldly/UP +worldwide +world/ZSYM +wormer/M +wormhole/SM +worm/SGMRD +Worms/M +wormwood/SM +wormy/RT +worn/U +worried/Y +worrier/M +worriment/MS +worrisome/YP +worrying/Y +worrywart/SM +worry/ZGSRD +worsen/GSD +worse/SR +worshiper/M +worshipfulness/M +worshipful/YP +worship/ZDRGS +worsted/MS +worst/SGD +worth/DG +worthily/U +worthinesses/U +worthiness/SM +Worthington/M +worthlessness/SM +worthless/PY +Worth/M +worths +worthwhile/P +Worthy/M +worthy/UTSRP +wort/SM +wost +wot +Wotan/M +wouldn't +would/S +wouldst +would've +wound/AU +wounded/U +wounder +wounding +wounds +wound's +wove/A +woven/AU +wovens +wow/SDG +Wozniak/M +WP +wpm +wrack/SGMD +wraith/M +wraiths +Wrangell/M +wrangle/GZDRS +wrangler/M +wraparound/S +wrap/MS +wrapped/U +wrapper/MS +wrapping/SM +wraps/U +wrasse/SM +wrathful/YP +wrath/GDM +wraths +wreak/SDG +wreathe +wreath/GMDS +wreaths +wreckage/MS +wrecker/M +wreck/GZRDS +wrenching/Y +wrench/MDSG +wren/MS +Wren/MS +Wrennie/M +wrester/M +wrestle/JGZDRS +wrestler/M +wrestling/M +wrest/SRDG +wretchedness/SM +wretched/TPYR +wretch/MDS +wriggle/DRSGZ +wriggler/M +wriggly/RT +Wright/M +wright/MS +Wrigley/M +wringer/M +wring/GZRS +wrinkled/U +wrinkle/GMDS +wrinkly/RST +wristband/SM +wrist/MS +wristwatch/MS +writable/U +write/ASBRJG +writer/MA +writeup +writhe/SDG +writing/M +writ/MRSBJGZ +written/UA +Wroclaw +wrongdoer/MS +wrongdoing/MS +wronger/M +wrongfulness/MS +wrongful/PY +wrongheadedness/MS +wrongheaded/PY +wrongness/MS +wrong/PSGTYRD +Wronskian/M +wrote/A +wroth +wrought/I +wrung +wry/DSGY +wryer +wryest +wryness/SM +W's +WSW +wt +W/T +Wuhan/M +Wu/M +Wurlitzer/M +wurst/SM +wuss/S +wussy/TRS +WV +WW +WWI +WWII +WWW +w/XTJGV +WY +Wyatan/M +Wyatt/M +Wycherley/M +Wycliffe/M +Wye/MH +Wyeth/M +Wylie/M +Wylma/M +Wyman/M +Wyndham/M +Wyn/M +Wynne/M +Wynnie/M +Wynn/M +Wynny/M +Wyo/M +Wyomingite/SM +Wyoming/M +WYSIWYG +x +X +Xanadu +Xanthippe/M +Xanthus/M +Xaviera/M +Xavier/M +Xebec/M +Xe/M +XEmacs/M +Xenakis/M +Xena/M +Xenia/M +Xenix/M +xenon/SM +xenophobe/MS +xenophobia/SM +xenophobic +Xenophon/M +Xenos +xerographic +xerography/MS +xerox/GSD +Xerox/MGSD +Xerxes/M +Xever/M +Xhosa/M +Xi'an +Xian/S +Xiaoping/M +xii +xiii +xi/M +Ximenes/M +Ximenez/M +Ximian/SM +Xingu/M +xis +xiv +xix +XL +Xmas/SM +XML +Xochipilli/M +XOR +X's +XS +xterm/M +Xuzhou/M +xv +xvi +xvii +xviii +xx +XXL +xylem/SM +xylene/M +Xylia/M +Xylina/M +xylophone/MS +xylophonist/S +Xymenes/M +Y +ya +yacc/M +Yacc/M +yachting/M +yachtsman +yachtsmen +yachtswoman/M +yachtswomen +yacht/ZGJSDM +yack's +Yagi/M +yahoo/MS +Yahweh/M +Yakima/M +yakked +yakking +yak/SM +Yakut/M +Yakutsk/M +Yale/M +Yalies/M +y'all +Yalonda/M +Yalow/M +Yalta/M +Yalu/M +Yamaha/M +yammer/RDZGS +Yamoussoukro +yam/SM +Yanaton/M +Yance/M +Yancey/M +Yancy/M +Yang/M +Yangon +yang/S +Yangtze/M +Yankee/SM +yank/GDS +Yank/MS +Yaounde/M +yapped +yapping +yap/S +Yaqui/M +yardage/SM +yardarm/SM +Yardley/M +Yard/M +yardman/M +yardmaster/S +yardmen +yard/SMDG +yardstick/SM +yarmulke/SM +yarn/SGDM +Yaroslavl/M +yarrow/MS +Yasmeen/M +Yasmin/M +Yates +yaw/DSG +yawl/SGMD +yawner/M +yawn/GZSDR +yawning/Y +Yb/M +yd +Yeager/M +yeah +yeahs +yearbook/SM +yearling/M +yearlong +yearly/S +yearner/M +yearning/MY +yearn/JSGRD +year/YMS +yea/S +yeastiness/M +yeast/SGDM +yeasty/PTR +Yeats/M +yecch +yegg/MS +Yehudi/M +Yehudit/M +Yekaterinburg/M +Yelena/M +yell/GSDR +yellowhammers +yellowish +Yellowknife/M +yellowness/MS +Yellowstone/M +yellow/TGPSRDM +yellowy +yelper/M +yelp/GSDR +Yeltsin +Yemeni/S +Yemenite/SM +Yemen/M +Yenisei/M +yenned +yenning +yen/SM +Yentl/M +yeomanry/MS +yeoman/YM +yeomen +yep/S +Yerevan/M +Yerkes/M +Yesenia/M +yeshiva/SM +yes/S +yessed +yessing +yesterday/MS +yesteryear/SM +yet +ye/T +yeti/SM +Yetta/M +Yettie/M +Yetty/M +Yevette/M +Yevtushenko/M +yew/SM +y/F +Yggdrasil/M +Yiddish/M +yielded/U +yielding/U +yield/JGRDS +yikes +yin/S +yipe/S +yipped +yippee/S +yipping +yip/S +YMCA +YMHA +Ymir/M +YMMV +Ynes/M +Ynez/M +yo +Yoda/M +yodeler/M +yodel/SZRDG +Yoder/M +yoga/MS +yoghurt's +yogi/MS +yogurt/SM +yoke/DSMG +yoked/U +yokel/SM +yokes/U +yoking/U +Yoknapatawpha/M +Yokohama/M +Yoko/M +Yolanda/M +Yolande/M +Yolane/M +Yolanthe/M +yolk/DMS +yon +yonder +Yong/M +Yonkers/M +yore/MS +Yorgo/MS +Yorick/M +Yorke/M +Yorker/M +yorker/SM +Yorkshire/MS +Yorktown/M +York/ZRMS +Yoruba/M +Yosemite/M +Yoshiko/M +Yoshi/M +Yost/M +you'd +you'll +youngish +Young/M +youngster/MS +Youngstown/M +young/TRYP +you're +your/MS +yourself +yourselves +you/SH +youthfulness/SM +youthful/YP +youths +youth/SM +you've +Yovonnda/M +yow +yowl/GSD +Ypres/M +Ypsilanti/M +yr +yrs +Y's +Ysabel/M +YT +ytterbium/MS +yttrium/SM +yuan/M +Yuba/M +Yucatan +yucca/MS +yuck/GSD +yucky/RT +Yugo/M +Yugoslavia/M +Yugoslavian/S +Yugoslav/M +Yuh/M +Yuki/M +yukked +yukking +Yukon/M +yuk/S +yule/MS +Yule/MS +yuletide/MS +Yuletide/S +Yul/M +Yulma/M +yum +Yuma/M +yummy/TRS +Yunnan/M +yuppie/SM +yup/S +Yurik/M +Yuri/M +yurt/SM +Yves/M +Yvette/M +Yvon/M +Yvonne/M +Yvor/M +YWCA +YWHA +Zabrina/M +Zaccaria/M +Zachariah/M +Zacharia/SM +Zacharie/M +Zachary/M +Zacherie/M +Zachery/M +Zach/M +Zackariah/M +Zack/M +zagging +Zagreb/M +zag/S +Zahara/M +Zaire/M +Zairian/S +Zak/M +Zambezi/M +Zambia/M +Zambian/S +Zamboni +Zamenhof/M +Zamora/M +Zandra/M +Zane/M +Zaneta/M +zaniness/MS +Zan/M +Zanuck/M +zany/PDSRTG +Zanzibar/M +Zapata/M +Zaporozhye/M +Zappa/M +zapped +zapper/S +zapping +zap/S +Zarah/M +Zara/M +Zared/M +Zaria/M +Zarla/M +Zealand/M +zeal/MS +zealot/MS +zealotry/MS +zealousness/SM +zealous/YP +Zea/M +Zebadiah/M +Zebedee/M +Zeb/M +zebra/MS +Zebulen/M +Zebulon/M +zebu/SM +Zechariah/M +Zedekiah/M +Zed/M +Zedong/M +zed/SM +Zeffirelli/M +Zeiss/M +zeitgeist/S +Zeke/M +Zelda/M +Zelig/M +Zellerbach/M +Zelma/M +Zena/M +Zenger/M +Zenia/M +zenith/M +zeniths +Zen/M +Zennist/M +Zeno/M +Zephaniah/M +zephyr/MS +Zephyrus/M +Zeppelin's +zeppelin/SM +Zerk/M +zeroed/M +zeroing/M +zero/SDHMG +zestfulness/MS +zestful/YP +zest/MDSG +zesty/RT +zeta/SM +zeugma/M +Zeus/M +Zhdanov/M +Zhengzhou +Zhivago/M +Zhukov/M +Zia/M +Zibo/M +Ziegfeld/MS +Ziegler/M +zig +zigged +zigging +Ziggy/M +zigzagged +zigzagger +zigzagging +zigzag/MS +zilch/S +zillion/MS +Zilvia/M +Zimbabwean/S +Zimbabwe/M +Zimmerman/M +zincked +zincking +zinc/MS +zing/GZDRM +zingy/RT +zinnia/SM +Zionism/MS +Zionist/MS +Zion/SM +zip/MS +zipped/U +zipper/GSDM +zipping/U +zippy/RT +zips/U +zirconium/MS +zircon/SM +Zita/M +Zitella/M +zither/SM +zit/S +zloty/SM +Zn/M +zodiacal +zodiac/SM +Zoe/M +Zola/M +Zollie/M +Zolly/M +Zomba/M +zombie/SM +zombi's +zonal/Y +Zonda/M +Zondra/M +zoned/A +zone/MYDSRJG +zones/A +zoning/A +zonked +Zonnya/M +zookeepers +zoological/Y +zoologist/SM +zoology/MS +zoom/DGS +zoophyte/SM +zoophytic +zoo/SM +Zorah/M +Zora/M +Zorana/M +Zorina/M +Zorine/M +Zorn/M +Zoroaster/M +Zoroastrianism/MS +Zoroastrian/S +Zorro/M +Zosma/M +zounds/S +Zr/M +Zs +Zsazsa/M +Zsigmondy/M +z/TGJ +Zubenelgenubi/M +Zubeneschamali/M +zucchini/SM +Zukor/M +Zulema/M +Zululand/M +Zulu/MS +Zuni/S +Zürich/M +Zuzana/M +zwieback/MS +Zwingli/M +Zworykin/M +Z/X +zydeco/S +zygote/SM +zygotic +zymurgy/S diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 022017247..36a4cdc30 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -40,14 +40,14 @@ not_at_rot_target not_at_rot_target():Result of LLRotTarget library function cal money money(key id, integer amount):Triggered when L$ is given to task email email(string time, string address, string subj, string message, integer num_left):Triggered when task receives email run_time_permissions run_time_permissions(integer perm):Triggered when an agent grants run time permissions to task -attach attach(key id):Triggered when an agent attaches or detaches from agent +attach attach(key id):Triggered when task attaches or detaches from agent dataserver dataserver(key queryid, string data):Triggered when task receives asynchronous data moving_start moving_start():Triggered when task begins moving moving_end moving_end():Triggered when task stops moving on_rez on_rez(integer start_param):Triggered when task is rezed in from inventory or another task object_rez object_rez(key id):Triggered when task rezes in another task link_message link_message(integer sender_num, integer num, string str, key id):Triggered when task receives a link message via LLMessageLinked library function call -changed changed( integer change ):Triggered various event change the task:(test change with CHANGED_INVENTORY, CHANGED_COLOR, CHANGED_SHAPE, CHANGED_SCALE, CHANGED_TEXTURE, CHANGED_LINK, CHANGED_ALLOWED_DROP, CHANGED_OWNER, CHANGED_REGION, CHANGED_TELEPORT) +changed changed( integer change ):Triggered various event change the task:(test change with CHANGED_INVENTORY, CHANGED_COLOR, CHANGED_SHAPE, CHANGED_SCALE, CHANGED_TEXTURE, CHANGED_LINK, CHANGED_ALLOWED_DROP, CHANGED_OWNER, CHANGED_REGION, CHANGED_TELEPORT, CHANGED_REGION_START, CHANGED_MEDIA) remote_data remote_data(integer event_type, key channel, key message_id, string sender,integer idata, string sdata):Triggered by various XML-RPC calls (event_type will be one of REMOTE_DATA_CHANNEL, REMOTE_DATA_REQUEST, REMOTE_DATA_REPLY) http_response http_response(key request_id, integer status, list metadata, string body):Triggered when task receives a response to one of its llHTTPRequests http_request http_request(key id, string method, string body):Triggered when task receives an http request against a public URL @@ -66,7 +66,9 @@ STATUS_BLOCK_GRAB Passed in the llSetStatus library function. If TRUE, object c STATUS_DIE_AT_EDGE Passed in the llSetStatus library function. If TRUE, objects that reach the edge of the world just die:rather than teleporting back to the owner STATUS_RETURN_AT_EDGE Passed in the llSetStatus library function. If TRUE, script rezzed objects that reach the edge of the world:are returned rather than killed:STATUS_RETURN_AT_EDGE trumps STATUS_DIE_AT_EDGE if both are set STATUS_CAST_SHADOWS Passed in the llSetStatus library function. If TRUE, object casts shadows on other objects -AGENT Passed in llSensor library function to look for other Agents +AGENT Passed in llSensor library function to look for other Agents; DEPRECATED: Use AGENT_BY_LEGACY_NAME +AGENT_BY_USERNAME Passed in llSensor library function to look for other Agents by username +AGENT_BY_LEGACY_NAME Passed in llSensor library function to look for other Agents by legacy name ACTIVE Passed in llSensor library function to look for moving objects PASSIVE Passed in llSensor library function to look for objects that aren't moving SCRIPTED Passed in llSensor library function to look for scripted objects @@ -108,6 +110,7 @@ AGENT_TYPING Returned by llGetAgentInfo if the Agent is typing AGENT_CROUCHING Returned by llGetAgentInfo if the Agent is crouching AGENT_BUSY Returned by llGetAgentInfo if the Agent is busy AGENT_ALWAYS_RUN Returned by llGetAgentInfo if the Agent has 'Always Run' enabled +AGENT_AUTOPILOT Returned by llGetAgentInfo if the Agent is under autopilot control PSYS_PART_FLAGS PSYS_PART_START_COLOR @@ -319,6 +322,7 @@ CHANGED_OWNER Parameter of changed event handler used to indicate change to tas CHANGED_REGION Parameter of changed event handler used to indicate the region has changed CHANGED_TELEPORT Parameter of changed event handler used to indicate teleport has completed CHANGED_REGION_START Parameter of changed event handler used to indicate the region has been restarted +CHANGED_MEDIA Parameter of changed event handler used to indicate that media has changed on a face of the task TYPE_INTEGER Indicates that the list entry is holding an integer TYPE_FLOAT Indicates that the list entry is holding an float @@ -351,6 +355,9 @@ PRIM_BUMP_SHINY Followed by an integer face, one of PRIM_SHINY_NONE, PRIM_SHINY PRIM_FULLBRIGHT Followed by an integer face, and TRUE or FALSE PRIM_TEXGEN Followed by an integer face, and one of PRIM_TEXGEN_DEFAULT or PRIM_TEXGEN_PLANAR PRIM_GLOW Followed by an integer face, and a float from 0.0 to 1.0 specifying glow amount +PRIM_TEXT For primitive hovertext. Followed by a string, a vector color and a float alpha +PRIM_NAME For primitive name (from server v1.40 onwards). Followed by a string. +PRIM_DESC For primitive description (from server v1.40 onwards). Followed by a string. PRIM_TYPE_BOX Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear PRIM_TYPE_CYLINDER Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear @@ -457,6 +464,7 @@ PARCEL_FLAG_ALLOW_LANDMARK Used with llGetParcelFlags to find if a parcel allo PARCEL_FLAG_ALLOW_TERRAFORM Used with llGetParcelFlags to find if a parcel allows anyone to terraform the land PARCEL_FLAG_ALLOW_DAMAGE Used with llGetParcelFlags to find if a parcel allows damage PARCEL_FLAG_ALLOW_CREATE_OBJECTS Used with llGetParcelFlags to find if a parcel allows anyone to create objects +PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS Used with llGetParcelFlags to find if a parcel allows group members or objects to create objects PARCEL_FLAG_USE_ACCESS_GROUP Used with llGetParcelFlags to find if a parcel limits access to a group PARCEL_FLAG_USE_ACCESS_LIST Used with llGetParcelFlags to find if a parcel limits access to a list of residents PARCEL_FLAG_USE_BAN_LIST Used with llGetParcelFlags to find if a parcel uses a ban list @@ -507,11 +515,52 @@ CLICK_ACTION_PAY Used with llSetClickAction to set pay as the default act CLICK_ACTION_OPEN Used with llSetClickAction to set open as the default action when object is clicked CLICK_ACTION_PLAY Used with llSetClickAction to set play as the default action when object is clicked CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked +CLICK_ACTION_ZOOM Used with llSetClickAction to set zoom in as the default action when object is clicked TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid. TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid. TOUCH_INVALID_FACE Value returned by llDetectedTouchFace() when the touch position is not valid. +PRIM_MEDIA_ALT_IMAGE_ENABLE Used with ll{Get,Set}PrimMediaParams to enable the default alt image for media +PRIM_MEDIA_CONTROLS Used with ll{Get,Set}PrimMediaParams to determine the controls shown for media +PRIM_MEDIA_CURRENT_URL Used with ll{Get,Set}PrimMediaParams to navigate/access the current URL +PRIM_MEDIA_HOME_URL Used with ll{Get,Set}PrimMediaParams to access the home URL +PRIM_MEDIA_AUTO_LOOP Used with ll{Get,Set}PrimMediaParams to determine if media should auto-loop (if applicable) +PRIM_MEDIA_AUTO_PLAY Used with ll{Get,Set}PrimMediaParams to determine if media should start playing as soon as it is created +PRIM_MEDIA_AUTO_SCALE Used with ll{Get,Set}PrimMediaParams to determine if media should scale to fit the face it is on +PRIM_MEDIA_AUTO_ZOOM Used with ll{Get,Set}PrimMediaParams to determine if the user would zoom in when viewing media +PRIM_MEDIA_FIRST_CLICK_INTERACT Used with ll{Get,Set}PrimMediaParams to determine whether the user interacts with media or not when she first clicks it (versus selection) +PRIM_MEDIA_WIDTH_PIXELS Used with ll{Get,Set}PrimMediaParams to access the media's width in pixels +PRIM_MEDIA_HEIGHT_PIXELS Used with ll{Get,Set}PrimMediaParams to access the media's height in pixels +PRIM_MEDIA_WHITELIST_ENABLE Used with ll{Get,Set}PrimMediaParams to determine if the domain whitelist is enabled +PRIM_MEDIA_WHITELIST Used with ll{Get,Set}PrimMediaParams to access the media's list of allowable URL prefixes to navigate to +PRIM_MEDIA_PERMS_INTERACT Used with ll{Get,Set}PrimMediaParams to determine the permissions for who can interact with the media +PRIM_MEDIA_PERMS_CONTROL Used with ll{Get,Set}PrimMediaParams to determine the permissions for who has controls +PRIM_MEDIA_PARAM_MAX The value of the largest media param + +PRIM_MEDIA_CONTROLS_STANDARD Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_CONTROLS value meaning "standard controls" +PRIM_MEDIA_CONTROLS_MINI Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_CONTROLS value meaning "mini controls" + +PRIM_MEDIA_PERM_NONE Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, no permissions +PRIM_MEDIA_PERM_OWNER Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, owner permissions +PRIM_MEDIA_PERM_GROUP Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, group permissions +PRIM_MEDIA_PERM_ANYONE Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, anyone has permissions + +PRIM_MEDIA_MAX_URL_LENGTH Used with ll{Get,Set}PrimMediaParams, the maximum length of PRIM_MEDIA_CURRENT_URL or PRIM_MEDIA_HOME_URL +PRIM_MEDIA_MAX_WHITELIST_SIZE Used with ll{Get,Set}PrimMediaParams, the maximum length, in bytes, of PRIM_MEDIA_WHITELIST +PRIM_MEDIA_MAX_WHITELIST_COUNT Used with ll{Get,Set}PrimMediaParams, the maximum number of items allowed in PRIM_MEDIA_WHITELIST +PRIM_MEDIA_MAX_WIDTH_PIXELS Used with ll{Get,Set}PrimMediaParams, the maximum width allowed in PRIM_MEDIA_WIDTH_PIXELS +PRIM_MEDIA_MAX_HEIGHT_PIXELS Used with ll{Get,Set}PrimMediaParams, the maximum width allowed in PRIM_MEDIA_HEIGHT_PIXELS + +STATUS_OK Result of function call was success +STATUS_MALFORMED_PARAMS Function was called with malformed params +STATUS_TYPE_MISMATCH Argument(s) passed to function had a type mismatch +STATUS_BOUNDS_ERROR Argument(s) passed to function had a bounds error +STATUS_NOT_FOUND Object or other item was not found +STATUS_NOT_SUPPORTED Feature not supported +STATUS_INTERNAL_ERROR An internal error occurred +STATUS_WHITELIST_FAILED URL failed to pass whitelist + WL_WATER_COLOR Windlight Water Colour WL_WATER_FOG_DENSITY_EXPONENT Windlight Water Fog Density Exponent WL_UNDERWATER_FOG_MODIFIER Windlight Underwater Fog Modifier @@ -532,6 +581,7 @@ WL_DENSITY_MULTIPLIER Windlight Density Multiplier WL_DISTANCE_MULTIPLIER Windlight Distance Multiplier WL_MAX_ALTITUDE Windlight Max Altitude WL_SUN_MOON_COLOR Windlight Sun/Moon Colour +WL_SUN_MOON_POSITION Windlight Sun/Moon Position WL_AMBIENT Windlight Ambient Colour WL_EAST_ANGLE Windlight Sun/Position East WL_SUN_GLOW_FOCUS Windlight Sun Glow Focus @@ -554,7 +604,8 @@ WL_DRAW_CLASSIC_CLOUDS Windlight Draw Classic Clouds NULL_KEY Indicates an empty key EOF Indicates the last line of a notecard was read TEXTURE_BLANK UUID for the "Blank" texture -TEXTURE_DEFAULT UUID for the "Default Media" texture +TEXTURE_DEFAULT Alias for TEXTURE_PLYWOOD +TEXTURE_MEDIA UUID for the "Default Media" texture TEXTURE_PLYWOOD UUID for the default "Plywood" texture TEXTURE_TRANSPARENT UUID for the "White - Transparent" texture @@ -593,9 +644,11 @@ return Leave current function or event handler # Comment [one_sided_delimiter .8, .3, .15] // Comment:Non-functional commentary or disabled code +[two_sided_delimiter .8, .3, .15] +/* */ Comment:Non-functional commentary or disabled code # String literals -[two_sided_delimiter 0, .2, 0] -" String literal +[two_sided_delimiter_esc 0, .2, 0] +" " String literal #functions are supplied by the program now. diff --git a/indra/newview/app_settings/mime_types.xml b/indra/newview/app_settings/mime_types.xml index 715ac02b6..61067da06 100644 --- a/indra/newview/app_settings/mime_types.xml +++ b/indra/newview/app_settings/mime_types.xml @@ -1,445 +1,478 @@ - - - - (Unknown) - - - none - - - media_plugin_webkit - - - - - icn_media_web.tga - - - text/html - - - This location has Web content - - - Show Web content - - - true - - - false - - - - - - video/* - - - icn_media_movie.tga - - - There is a movie to play here - - - Play movie - - - false - - - true - - - - - - icn_media_web.tga - - - image/* - - - There is an image at this location - - - View this location's image - - - false - - - false - - - - - - icn_media_web.tga - - - audio/* - - - There is audio at this location - - - Play this location's audio - - - false - - - true - - - - - - movie - - - media_plugin_quicktime - - - - - - none - - - media_plugin_quicktime - - - - - - none - - - - - - audio - - - - - - movie - - - - - - image - - - - - - movie - - - media_plugin_quicktime - - - - - - web - - - - - - audio - - - - - - image - - - - - - image - - - - - - image - - - - - - movie - - - media_plugin_quicktime - - - - - - web - - - - - - image - - - - - - audio - - - media_plugin_quicktime - - - - - - audio - - - media_plugin_quicktime - - - - - - audio - - - media_plugin_quicktime - - - - - - audio - - - media_plugin_quicktime - - - - - - image - - - media_plugin_webkit - - - - - - image - - - media_plugin_webkit - - - - - - image - - - media_plugin_webkit - - - - - - image - - - media_plugin_webkit - - - - - - image - - - media_plugin_webkit - - - - - - image - - - media_plugin_webkit - - - - - - web - - - media_plugin_webkit - - - - - - text - - - media_plugin_webkit - - - - - - text - - - media_plugin_webkit - - - - - - movie - - - media_plugin_quicktime - - - - - - movie - - - media_plugin_quicktime - - - - - - movie - - - media_plugin_quicktime - - - - - - movie - - - media_plugin_quicktime - - - - - - movie - - - media_plugin_quicktime - - - - - - movie - - - media_plugin_quicktime - - - + + + + (Unknown) + + + none + + + media_plugin_webkit + + + + + icn_media_web.tga + + + text/html + + + This location has Web content + + + Show Web content + + + true + + + false + + + + + + video/* + + + icn_media_movie.tga + + + There is a movie to play here + + + Play movie + + + false + + + true + + + + + + icn_media_web.tga + + + image/* + + + There is an image at this location + + + View this location's image + + + false + + + false + + + + + + icn_media_web.tga + + + audio/* + + + There is audio at this location + + + Play this location's audio + + + false + + + true + + + + + + movie + + + media_plugin_quicktime + + + + + + none + + + media_plugin_webkit + + + + + + none + + + media_plugin_webkit + + + + + + audio + + + media_plugin_quicktime + + + + + + movie + + + media_plugin_quicktime + + + + + + image + + + media_plugin_webkit + + + + + + movie + + + media_plugin_quicktime + + + + + + web + + + media_plugin_webkit + + + + + + audio + + + media_plugin_quicktime + + + + + + image + + + media_plugin_webkit + + + + + + image + + + media_plugin_webkit + + + + + + image + + + media_plugin_webkit + + + + + + movie + + + media_plugin_webkit + + + + + + web + + + media_plugin_webkit + + + + + + image + + + media_plugin_webkit + + + + + + audio + + + media_plugin_quicktime + + + + + + audio + + + media_plugin_quicktime + + + + + + audio + + + media_plugin_quicktime + + + + + + audio + + + media_plugin_quicktime + + + + + + image + + + media_plugin_webkit + + + + + + image + + + media_plugin_webkit + + + + + + image + + + media_plugin_webkit + + + + + + image + + + media_plugin_webkit + + + + + + image + + + media_plugin_webkit + + + + + + image + + + media_plugin_webkit + + + + + + web + + + media_plugin_webkit + + + + + + text + + + media_plugin_webkit + + + + + + text + + + media_plugin_webkit + + + + + + movie + + + media_plugin_quicktime + + + + + + movie + + + media_plugin_quicktime + + + + + + movie + + + media_plugin_quicktime + + + + + + movie + + + media_plugin_quicktime + + + + + + movie + + + media_plugin_quicktime + + + + + + movie + + + media_plugin_quicktime + + + diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d2870de2c..b821681a3 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1,14070 +1,14171 @@ - - - - Include - - settings_ascent.xml - settings_ascent_coa.xml - settings_sh.xml - settings_rlv.xml - - - FloaterObjectBackuptRect - - Comment - Rectangle for the object backup floater - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - - MediaEnableFilter - - Comment - Enable media domain filtering - Persist - 1 - Type - Boolean - Value - 0 - - MediaFilterRect - - Comment - Rectangle for Media Filter floater - Persist - 1 - Type - Rect - Value - - 0 - 100 - 100 - 100 - - - - UseServersideWindlightSettings - - Comment - Whether or not to use Windlight settings presented by the server. - Persist - 1 - Type - Boolean - Value - 1 - - - FloaterLocalbitmapbrowserRect - - Comment - LOLRectangle - Persist - 1 - Type - Rect - Value - - 0 - 400 - 400 - 0 - - - - - - ShowAOSitPopup - - Comment - Show AO sit popup - Persist - 1 - Type - Boolean - Value - 0 - - EnableAORemote - - Comment - Enable AO quick access remote in toolbar - Persist - 1 - Type - Boolean - Value - 0 - - - DisableInternalFlyUpAnimation - - Comment - Disables the internal hover up animation (on your local computer only). Enable if you use an AO and wear hand attachments like rings, prim nails etc. that often loose their correct position while flying. - Persist - 1 - Type - Boolean - Value - 0 - - - AOEnabled - - Comment - Turn on Animation Overrider - Persist - 1 - Type - Boolean - Value - 0 - - AOAdvanced - - Comment - Advanced options - Persist - 0 - Type - Boolean - Value - 0 - - AOSitsEnabled - - Comment - Overrides sit animations. - Persist - 1 - Type - Boolean - Value - 1 - - AONoStandsInMouselook - - Comment - Disables stand anims during mouselook - Persist - 1 - Type - Boolean - Value - 1 - - AOStandInterval - - Comment - AO stand time in seconds - Persist - 1 - Type - F32 - Value - 20 - - AOStandRandomize - - Comment - Randomize stand anims - Persist - 1 - Type - Boolean - Value - 0 - - AORect - - Comment - Rectangle for AO window - Persist - 1 - Type - Rect - Value - - 0 - 100 - 100 - 100 - - - - - ClientDefinitionsURL - - Comment - Where to fetch updated client definitions from - Persist - 1 - Type - String - Value - http://app.singularityviewer.org/client_definitions.xml - - - LastSelectedGrid - - Comment - Last grid selected from the grid pulldown - Persist - 1 - Type - String - Value - - - ShowcaseURLDefault - - Comment - URL to load for the Showcase tab in Second Life - Persist - 1 - Type - String - Value - http://secondlife.com/app/showcase/index.php? - - - CheckForGridUpdates - - Comment - Fetch list of grids from Hippo server - Persist - 1 - Type - Boolean - Value - 0 - - DefaultGrid - - Comment - Nickname of the default grid - Persist - 1 - Type - String - Value - secondlife - - - VivoxLicenseAccepted - - Comment - By setting to true, you agree to accept the Vivox license agreement at http://www.vivox.com/vivox_aup.html - Persist - 1 - Type - Boolean - Value - 0 - - - WarnFirstVoiceLicense - - Comment - Enables FirstVoiceLicense window on login - Persist - 1 - Type - Boolean - Value - 1 - - - - ShyotlRenderUseStreamVBO - - Comment - Use VBO's for stream buffers - Persist - 1 - Type - Boolean - Value - 0 - - ResetFocusOnSelfClick - - Comment - Setting this to TRUE resets your camera when you left-click your avatar - Persist - 1 - Type - Boolean - Value - 1 - - - MoyFastMiniMap - - Comment - Don't show buildings on mini-map - Persist - 1 - Type - Boolean - Value - 0 - - BeauchampFloaterGroupTitlesRect - - Comment - Rectangle for group titles window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 500 - 0 - - - OptionShowGroupNameInChatIM - - Comment - Show group name in IM notification - Persist - 1 - Type - Boolean - Value - 1 - - OptionPlayTpSound - - Comment - Play sound effect on teleport - Persist - 1 - Type - Boolean - Value - 1 - - OptionRotateCamAfterLocalTP - - Comment - Play sound effect on teleport - Persist - 1 - Type - Boolean - Value - 0 - - OptionOffsetTPByAgentHeight - - Comment - Play sound effect on teleport - Persist - 1 - Type - Boolean - Value - 1 - - InventorySortOrder - - Comment - Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) - Type - U32 - Value - 3 - - Blacklist.Settings - - Comment - List for blacklisting assets DO NOT EDIT DIRECTLY use the floater - Persist - 1 - Type - LLSD - Value - - - - - LinksForChattingObjects - - Comment - Show links for chatting objects (0=no, 1=for others' objects, 2=for all objects) - Persist - 1 - Type - U32 - Value - 0 - - DisablePointAtAndBeam - - Comment - Disable pointing at objects and the pointat beam - Persist - 1 - Type - Boolean - Value - 1 - - PrivateLookAt - - Comment - When TRUE, do not disclose what we are looking at - Persist - 1 - Type - Boolean - Value - 0 - - ShowSelectionBeam - - Comment - Show selection particle beam when selecting or interacting with objects. - Persist - 1 - Type - Boolean - Value - 1 - - BroadcastViewerEffects - - Comment - Broadcast Viewer Effects - Persist - 1 - Type - Boolean - Value - 0 - - EmeraldUseProperArc - - Comment - Enables/Disables a fixed ARC counter - Persist - 1 - Type - Boolean - Value - 0 - - EmeraldBoobMass - - Comment - Mass of boobs. - Persist - 1 - Type - F32 - Value - 54.0 - - EmeraldBoobHardness - - Comment - Hardness (dampening) of boobs. - Persist - 1 - Type - F32 - Value - 51 - - EmeraldBreastPhysicsToggle - - Comment - Enables/Disables breast physics - Persist - 1 - Type - Boolean - Value - 1 - - EmeraldBreastSportsBra - - Comment - allows disabling the physics for 1 av, in case their outfit looks wrong with it on - Persist - 1 - Type - Boolean - Value - 0 - - EmeraldBoobVelMax - - Comment - Max amount of velocity boobs can have - Persist - 1 - Type - F32 - Value - 64 - - EmeraldBoobFriction - - Comment - Internal friction (brings boobs to rest). Shouldn't ever be above 1. - Persist - 1 - Type - F32 - Value - 80 - - EmeraldBoobVelMin - - Comment - Friction Fraction of FPS (used to keep friction uniform through FPS change). - Persist - 1 - Type - F32 - Value - 24 - - EmeraldBoobXYInfluence - - Comment - Amount of influence along the X and Y planes. - Persist - 1 - Type - F32 - Value - 0.1 - - wlfAdvSettingsPopup - - Comment - Show Windlight popup - Persist - 0 - Type - Boolean - Value - 1 - - WoLfVerticalIMTabs - - Comment - Vertical IM Tabs - Persist - 1 - Type - Boolean - Value - 1 - - - AgentChatColor - - Comment - Color of chat messages from other residents - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - IsCOA - 1 - - BackgroundChatColor - - Comment - Color of chat bubble background - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.0 - 0.0 - 1.0 - - IsCOA - 1 - - EffectColor - - Comment - Particle effects color - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - IsCOA - 1 - - IMChatColor - - Comment - Color of instant messages from other residents - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - IsCOA - 1 - - llOwnerSayChatColor - - Comment - Color of chat messages from objects only visible to the owner - Persist - 1 - Type - Color4 - Value - - 0.990000009537 - 0.990000009537 - 0.689999997616 - 1.0 - - IsCOA - 1 - - ObjectChatColor - - Comment - Color of chat messages from objects - Persist - 1 - Type - Color4 - Value - - 0.699999988079 - 0.899999976158 - 0.699999988079 - 1 - - IsCOA - 1 - - SkinCurrent - - Comment - The currently selected skin. - Persist - 1 - Type - String - Value - dark - IsCOA - 1 - - SystemChatColor - - Comment - Color of chat messages from SL System - Persist - 1 - Type - Color4 - Value - - 0.800000011921 - 1.0 - 1.0 - 1.0 - - IsCOA - 1 - - UISndAlert - - Comment - Sound file for alerts (uuid for sound asset) - Persist - 1 - Type - String - Value - ed124764-705d-d497-167a-182cd9fa2e6c - IsCOA - 1 - - UISndBadKeystroke - - Comment - Sound file for invalid keystroke (uuid for sound asset) - Persist - 1 - Type - String - Value - 2ca849ba-2885-4bc3-90ef-d4987a5b983a - IsCOA - 1 - - UISndClick - - Comment - Sound file for mouse click (uuid for sound asset) - Persist - 1 - Type - String - Value - 4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6 - IsCOA - 1 - - UISndClickRelease - - Comment - Sound file for mouse button release (uuid for sound asset) - Persist - 1 - Type - String - Value - 4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6 - IsCOA - 1 - - UISndDebugSpamToggle - - Comment - Log UI sound effects as they are played - Persist - 1 - Type - Boolean - Value - 0 - IsCOA - 1 - - UISndHealthReductionF - - Comment - Sound file for female pain (uuid for sound asset) - Persist - 1 - Type - String - Value - 219c5d93-6c09-31c5-fb3f-c5fe7495c115 - IsCOA - 1 - - UISndHealthReductionM - - Comment - Sound file for male pain (uuid for sound asset) - Persist - 1 - Type - String - Value - e057c244-5768-1056-c37e-1537454eeb62 - IsCOA - 1 - - UISndHealthReductionThreshold - - Comment - Amount of health reduction required to trigger "pain" sound - Persist - 1 - Type - F32 - Value - 10.0 - IsCOA - 1 - - UISndInvalidOp - - Comment - Sound file for invalid operations (uuid for sound asset) - Persist - 1 - Type - String - Value - 4174f859-0d3d-c517-c424-72923dc21f65 - IsCOA - 1 - - UISndMoneyChangeDown - - Comment - Sound file for L$ balance increase (uuid for sound asset) - Persist - 1 - Type - String - Value - 104974e3-dfda-428b-99ee-b0d4e748d3a3 - IsCOA - 1 - - UISndMoneyChangeThreshold - - Comment - Amount of change in L$ balance required to trigger "money" sound - Persist - 1 - Type - F32 - Value - 50.0 - IsCOA - 1 - - UISndMoneyChangeUp - - Comment - Sound file for L$ balance decrease(uuid for sound asset) - Persist - 1 - Type - String - Value - 77a018af-098e-c037-51a6-178f05877c6f - IsCOA - 1 - - UISndNewIncomingIMSession - - Comment - Sound file for new instant message session(uuid for sound asset) - Persist - 1 - Type - String - Value - 67cc2844-00f3-2b3c-b991-6418d01e1bb7 - IsCOA - 1 - - UISndObjectCreate - - Comment - Sound file for object creation (uuid for sound asset) - Persist - 1 - Type - String - Value - f4a0660f-5446-dea2-80b7-6482a082803c - IsCOA - 1 - - UISndObjectDelete - - Comment - Sound file for object deletion (uuid for sound asset) - Persist - 1 - Type - String - Value - 0cb7b00a-4c10-6948-84de-a93c09af2ba9 - IsCOA - 1 - - UISndObjectRezIn - - Comment - Sound file for rezzing objects (uuid for sound asset) - Persist - 1 - Type - String - Value - 3c8fc726-1fd6-862d-fa01-16c5b2568db6 - IsCOA - 1 - - UISndObjectRezOut - - Comment - Sound file for derezzing objects (uuid for sound asset) - Persist - 1 - Type - String - Value - 00000000-0000-0000-0000-000000000000 - IsCOA - 1 - - UISndPieMenuAppear - - Comment - Sound file for opening pie menu (uuid for sound asset) - Persist - 1 - Type - String - Value - 8eaed61f-92ff-6485-de83-4dcc938a478e - IsCOA - 1 - - UISndPieMenuHide - - Comment - Sound file for closing pie menu (uuid for sound asset) - Persist - 1 - Type - String - Value - 00000000-0000-0000-0000-000000000000 - IsCOA - 1 - - UISndPieMenuSliceHighlight0 - - Comment - Sound file for selecting pie menu item 0 (uuid for sound asset) - Persist - 1 - Type - String - Value - d9f73cf8-17b4-6f7a-1565-7951226c305d - IsCOA - 1 - - UISndPieMenuSliceHighlight1 - - Comment - Sound file for selecting pie menu item 1 (uuid for sound asset) - Persist - 1 - Type - String - Value - f6ba9816-dcaf-f755-7b67-51b31b6233e5 - IsCOA - 1 - - UISndPieMenuSliceHighlight2 - - Comment - Sound file for selecting pie menu item 2 (uuid for sound asset) - Persist - 1 - Type - String - Value - 7aff2265-d05b-8b72-63c7-dbf96dc2f21f - IsCOA - 1 - - UISndPieMenuSliceHighlight3 - - Comment - Sound file for selecting pie menu item 3 (uuid for sound asset) - Persist - 1 - Type - String - Value - 09b2184e-8601-44e2-afbb-ce37434b8ba1 - IsCOA - 1 - - UISndPieMenuSliceHighlight4 - - Comment - Sound file for selecting pie menu item 4 (uuid for sound asset) - Persist - 1 - Type - String - Value - bbe4c7fc-7044-b05e-7b89-36924a67593c - IsCOA - 1 - - UISndPieMenuSliceHighlight5 - - Comment - Sound file for selecting pie menu item 5 (uuid for sound asset) - Persist - 1 - Type - String - Value - d166039b-b4f5-c2ec-4911-c85c727b016c - IsCOA - 1 - - UISndPieMenuSliceHighlight6 - - Comment - Sound file for selecting pie menu item 6 (uuid for sound asset) - Persist - 1 - Type - String - Value - 242af82b-43c2-9a3b-e108-3b0c7e384981 - IsCOA - 1 - - UISndPieMenuSliceHighlight7 - - Comment - Sound file for selecting pie menu item 7 (uuid for sound asset) - Persist - 1 - Type - String - Value - c1f334fb-a5be-8fe7-22b3-29631c21cf0b - IsCOA - 1 - - UISndSnapshot - - Comment - Sound file for taking a snapshot (uuid for sound asset) - Persist - 1 - Type - String - Value - 3d09f582-3851-c0e0-f5ba-277ac5c73fb4 - IsCOA - 1 - - UISndStartIM - - Comment - Sound file for starting a new IM session (uuid for sound asset) - Persist - 1 - Type - String - Value - c825dfbc-9827-7e02-6507-3713d18916c1 - IsCOA - 1 - - UISndTeleportOut - - Comment - Sound file for teleporting (uuid for sound asset) - Persist - 1 - Type - String - Value - d7a9a565-a013-2a69-797d-5332baa1a947 - IsCOA - 1 - - UISndTyping - - Comment - Sound file for starting to type a chat message (uuid for sound asset) - Persist - 1 - Type - String - Value - 5e191c7b-8996-9ced-a177-b2ac32bfea06 - IsCOA - 1 - - UISndWindowClose - - Comment - Sound file for closing a window (uuid for sound asset) - Persist - 1 - Type - String - Value - 2c346eda-b60c-ab33-1119-b8941916a499 - IsCOA - 1 - - UISndWindowOpen - - Comment - Sound file for opening a window (uuid for sound asset) - Persist - 1 - Type - String - Value - c80260ba-41fd-8a46-768a-6bf236360e3a - IsCOA - 1 - - UserChatColor - - Comment - Color of your chat messages - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - IsCOA - 1 - - - AFKTimeout - - Comment - Time before automatically setting AFK (away from keyboard) mode (seconds) - Persist - 1 - Type - F32 - Value - 300.0 - - AdvanceSnapshot - - Comment - Display advanced parameter settings in snaphot interface - Persist - 1 - Type - Boolean - Value - 0 - - AlertedUnsupportedHardware - - Comment - Set if there's unsupported hardware and we've already done a notification. - Persist - 1 - Type - Boolean - Value - 0 - - AllowIdleAFK - - Comment - Automatically set AFK (away from keyboard) mode when idle - Persist - 1 - Type - Boolean - Value - 1 - - AllowMultipleViewers - - Comment - Allow multiple viewers. - Persist - 1 - Type - Boolean - Value - 1 - - AllowTapTapHoldRun - - Comment - Tapping a direction key twice and holding it down makes avatar run - Persist - 1 - Type - Boolean - Value - 1 - - AnimateTextures - - Comment - Enable texture animation (debug) - Persist - 1 - Type - Boolean - Value - 1 - - AnimationDebug - - Comment - Show active animations in a bubble above avatars head - Persist - 1 - Type - Boolean - Value - 0 - - PreviewAnimInWorld - - Comment - Play animation preview in-world when uploading - Persist - 1 - Type - Boolean - Value - 0 - - AppearanceCameraMovement - - Comment - When entering appearance editing mode, camera zooms in on currently selected portion of avatar - Persist - 1 - Type - Boolean - Value - 1 - - ApplyColorImmediately - - Comment - Preview selections in color picker immediately - Persist - 1 - Type - Boolean - Value - 1 - - ApplyTextureImmediately - - Comment - Preview selections in texture picker immediately - Persist - 1 - Type - Boolean - Value - 1 - - ArrowKeysMoveAvatar - - Comment - While cursor is in chat entry box, arrow keys still control your avatar - Persist - 1 - Type - Boolean - Value - 1 - - AskedAboutCrashReports - - Comment - Turns off dialog asking if you want to enable crash reporting - Persist - 1 - Type - Boolean - Value - 0 - - AuctionShowFence - - Comment - When auctioning land, include parcel boundary marker in snapshot - Persist - 1 - Type - Boolean - Value - 1 - - AudioLevelAmbient - - Comment - Audio level of environment sounds - Persist - 1 - Type - F32 - Value - 0.5 - - AudioLevelDoppler - - Comment - Scale of doppler effect on moving audio sources (1.0 = normal, <1.0 = diminished doppler effect, >1.0 = enhanced doppler effect) - Persist - 1 - Type - F32 - Value - 1.0 - - AudioLevelMaster - - Comment - Master audio level, or overall volume - Persist - 1 - Type - F32 - Value - 1.0 - - AudioLevelMedia - - Comment - Audio level of Quicktime movies - Persist - 1 - Type - F32 - Value - 1.0 - - AudioLevelMic - - Comment - Audio level of microphone input - Persist - 1 - Type - F32 - Value - 1.0 - - AudioLevelMusic - - Comment - Audio level of streaming music - Persist - 1 - Type - F32 - Value - 1.0 - - AudioLevelRolloff - - Comment - Controls the distance-based dropoff of audio volume (fraction or multiple of default audio rolloff) - Persist - 1 - Type - F32 - Value - 1.0 - - AudioLevelSFX - - Comment - Audio level of in-world sound effects - Persist - 1 - Type - F32 - Value - 1.0 - - AudioLevelUI - - Comment - Audio level of UI sound effects - Persist - 1 - Type - F32 - Value - 0.5 - - AudioLevelVoice - - Comment - Audio level of voice chat - Persist - 1 - Type - F32 - Value - 0.5 - - AudioStreamingMusic - - Comment - Enable streaming audio - Persist - 1 - Type - Boolean - Value - 1 - - AudioStreamingVideo - - Comment - Enable streaming video - Persist - 1 - Type - Boolean - Value - 0 - - AuditTexture - - Comment - Enable texture auditting. - Persist - 1 - Type - Boolean - Value - 0 - - AutoAcceptNewInventory - - Comment - Automatically accept new notecards/textures/landmarks - Persist - 1 - Type - Boolean - Value - 0 - - AutoLeveling - - Comment - Keep Flycam level. - Persist - 1 - Type - Boolean - Value - 1 - - AutoLoadWebProfiles - - Comment - Automatically load ALL profile webpages without asking first. - Persist - 1 - Type - Boolean - Value - 0 - - AutoLogin - - Comment - Login automatically using last username/password combination - Persist - 0 - Type - Boolean - Value - 0 - - AutoMimeDiscovery - - Comment - Enable viewer mime type discovery of media URLs - Persist - 1 - Type - Boolean - Value - 0 - - AutoPilotLocksCamera - - Comment - Keep camera position locked when avatar walks to selected position - Persist - 1 - Type - Boolean - Value - 0 - - AutoSnapshot - - Comment - Update snapshot when camera stops moving, or any parameter changes - Persist - 1 - Type - Boolean - Value - 0 - - AutomaticFly - - Comment - Fly by holding jump key or using "Fly" command (FALSE = fly by using "Fly" command only) - Persist - 1 - Type - Boolean - Value - 1 - - AvatarAxisDeadZone0 - - Comment - Avatar axis 0 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - AvatarAxisDeadZone1 - - Comment - Avatar axis 1 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - AvatarAxisDeadZone2 - - Comment - Avatar axis 2 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - AvatarAxisDeadZone3 - - Comment - Avatar axis 3 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - AvatarAxisDeadZone4 - - Comment - Avatar axis 4 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - AvatarAxisDeadZone5 - - Comment - Avatar axis 5 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - AvatarAxisScale0 - - Comment - Avatar axis 0 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - AvatarAxisScale1 - - Comment - Avatar axis 1 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - AvatarAxisScale2 - - Comment - Avatar axis 2 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - AvatarAxisScale3 - - Comment - Avatar axis 3 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - AvatarAxisScale4 - - Comment - Avatar axis 4 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - AvatarAxisScale5 - - Comment - Avatar axis 5 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - AvatarBacklight - - Comment - Add rim lighting to avatar rendering to approximate shininess of skin - Persist - 1 - Type - Boolean - Value - 1 - - AvatarFeathering - - Comment - Avatar feathering (less is softer) - Persist - 1 - Type - F32 - Value - 16.0 - - AvatarPickerSortOrder - - Comment - Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) - Persist - 1 - Type - U32 - Value - 2 - - AvatarSex - - Comment - - Persist - 0 - Type - U32 - Value - 0 - - BackgroundYieldTime - - Comment - Amount of time to yield every frame to other applications when SL is not the foreground window (milliseconds) - Persist - 1 - Type - S32 - Value - 40 - - FloaterBlacklistRect - - Comment - LOLRectangle - Persist - 1 - Type - Rect - Value - - 0 - 400 - 400 - 0 - - - BackwardBtnRect - - Comment - - Persist - 0 - Type - Rect - Value - - 45 - 29 - 66 - 4 - - - BasicHelpRect - - Comment - Rectangle for help window - Persist - 1 - Type - Rect - Value - - 0 - 404 - 467 - 0 - - - BeaconAlwaysOn - - Comment - Beacons / highlighting always on - Persist - 1 - Type - Boolean - Value - 0 - - BrowserHomePage - - Comment - [NOT USED] - Persist - 1 - Type - String - Value - http://www.singularityviewer.org - - BrowserCookiesEnabled - - Comment - Enable Cookes in WebKit - Persist - 1 - Type - Boolean - Value - 1 - - BrowserPluginsEnabled - - Comment - Enable Mozilla Plug-Ins in WebKit - Persist - 1 - Type - Boolean - Value - 1 - - BrowserJavascriptEnabled - - Comment - Enable JavaScript execution in WebKit - Persist - 1 - Type - Boolean - Value - 1 - - PluginAttachDebuggerToPlugins - - Comment - TODO: understand what this actually does -.-sg - Persist - 1 - Type - Boolean - Value - 0 - - BlockAvatarAppearanceMessages - - Comment - Ignore's appearance messages (for simulating Ruth) - Persist - 1 - Type - Boolean - Value - 0 - - BrowserProxyAddress - - Comment - Address for the Web Proxy - Persist - 1 - Type - String - Value - - - BrowserProxyEnabled - - Comment - Use Web Proxy - Persist - 1 - Type - Boolean - Value - 0 - - BrowserProxyExclusions - - Comment - [NOT USED] - Persist - 1 - Type - String - Value - - - BrowserProxyPort - - Comment - Port for Web Proxy - Persist - 1 - Type - S32 - Value - 3128 - - BrowserProxySocks45 - - Comment - [NOT USED] - Persist - 1 - Type - S32 - Value - 5 - - Socks5ProxyEnabled - - Comment - Use Socks5 Proxy - Persist - 1 - Type - Boolean - Value - 0 - - Socks5HttpProxyType - - Comment - Proxy type to use for HTTP operations - Persist - 1 - Type - String - Value - None - - Socks5ProxyHost - - Comment - Socks 5 Proxy Host - Persist - 1 - Type - String - Value - - - Socks5ProxyPort - - Comment - Socks 5 Proxy Port - Persist - 1 - Type - U32 - Value - 1080 - - Socks5Username - - Comment - Socks 5 Username - Persist - 1 - Type - String - Value - - - Socks5Password - - Comment - Socks 5 Password - Persist - 1 - Type - String - Value - - - Socks5AuthType - - Comment - Selected Auth mechanism for Socks5 - Persist - 1 - Type - String - Value - None - - BuildAxisDeadZone0 - - Comment - Build axis 0 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - BuildAxisDeadZone1 - - Comment - Build axis 1 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - BuildAxisDeadZone2 - - Comment - Build axis 2 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - BuildAxisDeadZone3 - - Comment - Build axis 3 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - BuildAxisDeadZone4 - - Comment - Build axis 4 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - BuildAxisDeadZone5 - - Comment - Build axis 5 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - BuildAxisScale0 - - Comment - Build axis 0 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - BuildAxisScale1 - - Comment - Build axis 1 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - BuildAxisScale2 - - Comment - Build axis 2 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - BuildAxisScale3 - - Comment - Build axis 3 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - BuildAxisScale4 - - Comment - Build axis 4 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - BuildAxisScale5 - - Comment - Build axis 5 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - BuildBtnState - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - BuildFeathering - - Comment - Build feathering (less is softer) - Persist - 1 - Type - F32 - Value - 16.0 - - BulkChangeIncludeAnimations - - Comment - Bulk permission changes affect animations - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeAnimations - - Comment - Bulk permission changes affect animations - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeAnimations - - Comment - Bulk permission changes affect animations - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeAnimations - - Comment - Bulk permission changes affect animations - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeBodyParts - - Comment - Bulk permission changes affect body parts - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeClothing - - Comment - Bulk permission changes affect clothing - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeGestures - - Comment - Bulk permission changes affect gestures - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeLandmarks - - Comment - Bulk permission changes affect landmarks - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeNotecards - - Comment - Bulk permission changes affect notecards - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeObjects - - Comment - Bulk permission changes affect objects - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeScripts - - Comment - Bulk permission changes affect scripts - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeSounds - - Comment - Bulk permission changes affect sounds - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeIncludeTextures - - Comment - Bulk permission changes affect textures - Persist - 1 - Type - Boolean - Value - 1 - - BulkChangeEveryoneCopy - - Comment - Bulk changed objects can be copied by everyone - Persist - 1 - Type - Boolean - Value - 0 - - BulkChangeNextOwnerCopy - - Comment - Bulk changed objects can be copied by next owner - Persist - 1 - Type - Boolean - Value - 0 - - BulkChangeNextOwnerModify - - Comment - Bulk changed objects can be modified by next owner - Persist - 1 - Type - Boolean - Value - 0 - - BulkChangeNextOwnerTransfer - - Comment - Bulk changed objects can be resold or given away by next owner - Persist - 1 - Type - Boolean - Value - 0 - - BulkChangeShareWithGroup - - Comment - Bulk changed objects are shared with the currently active group - Persist - 1 - Type - Boolean - Value - 0 - - ButtonFlashCount - - Comment - Number of flashes after which flashing buttons stay lit up - Persist - 1 - Type - S32 - Value - 8 - - ButtonFlashRate - - Comment - Frequency at which buttons flash (hz) - Persist - 1 - Type - F32 - Value - 1.25 - - ButtonHPad - - Comment - Default horizontal spacing between buttons (pixels) - Persist - 1 - Type - S32 - Value - 10 - - ButtonHeight - - Comment - Default height for normal buttons (pixels) - Persist - 1 - Type - S32 - Value - 20 - - ButtonHeightSmall - - Comment - Default height for small buttons (pixels) - Persist - 1 - Type - S32 - Value - 16 - - ButtonVPad - - Comment - Default vertical spacing between buttons (pixels) - Persist - 1 - Type - S32 - Value - 1 - - CacheLocation - - Comment - Controls the location of the local disk cache - Persist - 1 - Type - String - Value - - - CacheSize - - Comment - Controls amount of hard drive space reserved for local file caching in MB - Persist - 1 - Type - U32 - Value - 500 - - CacheValidateCounter - - Comment - Used to distribute cache validation - Persist - 1 - Type - U32 - Value - 0 - - CameraMouseWheelZoom - - Comment - Camera zooms in and out with mousewheel - Persist - 1 - Type - Boolean - Value - 1 - - CameraAngle - - Comment - Camera field of view angle (Radians) - Persist - 1 - Type - F32 - Value - 1.047197551 - - CameraOffset - - Comment - Render with camera offset from view frustum (rendering debug) - Persist - 1 - Type - Boolean - Value - 0 - - CameraOffsetBuild - - Comment - Default camera position relative to focus point when entering build mode - Persist - 1 - Type - Vector3 - Value - - -6.0 - 0.0 - 6.0 - - - CameraOffsetDefault - - Comment - Default camera offset from avatar - Persist - 1 - Type - Vector3 - Value - - -3.0 - 0.0 - 0.75 - - - CameraOffsetScale - - Comment - Scales the default offset - Persist - 1 - Type - F32 - Value - 1.0 - - CameraPosOnLogout - - Comment - Camera position when last logged out (global coordinates) - Persist - 1 - Type - Vector3D - Value - - 0.0 - 0.0 - 0.0 - - - CameraPositionSmoothing - - Comment - Smooths camera position over time - Persist - 1 - Type - F32 - Value - 1.0 - - ChatBarStealsFocus - - Comment - Whenever keyboard focus is removed from the UI, and the chat bar is visible, the chat bar takes focus - Persist - 1 - Type - Boolean - Value - 1 - - ChatBubbleOpacity - - Comment - Opacity of chat bubble background (0.0 = completely transparent, 1.0 = completely opaque) - Persist - 1 - Type - F32 - Value - 0.5 - - ChatFontSize - - Comment - Size of chat text in chat console (0 = small, 1 = big) - Persist - 1 - Type - S32 - Value - 1 - - ChatFullWidth - - Comment - Chat console takes up full width of SL window - Persist - 1 - Type - Boolean - Value - 1 - - ChatHistoryTornOff - - Comment - Show chat history window separately from Communicate window. - Persist - 1 - Type - Boolean - Value - 0 - - ChatOnlineNotification - - Comment - Provide notifications for when friend log on and off of SL - Persist - 1 - Type - Boolean - Value - 1 - - HideNotificationsInChat - - Comment - Do not echo/log notifications in chat - Persist - 1 - Type - Boolean - Value - 0 - - ChatPersistTime - - Comment - Time for which chat stays visible in console (seconds) - Persist - 1 - Type - F32 - Value - 20.0 - - ChatShowTimestamps - - Comment - Show timestamps in chat - Persist - 1 - Type - Boolean - Value - 1 - - ChatSpacing - - Comment - Add extra vertical spacing between local chat lines - Persist - 1 - Type - S32 - Value - 0 - - ChatVisible - - Comment - Chat bar is visible - Persist - 1 - Type - Boolean - Value - 1 - - ChatterboxRect - - Comment - Rectangle for chatterbox window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 350 - 0 - - - CheesyBeacon - - Comment - Enable cheesy beacon effects - Persist - 1 - Type - Boolean - Value - 0 - - ClientSettingsFile - - Comment - Persisted client settings file name (per install). - Persist - 0 - Type - String - Value - - - CloseChatOnReturn - - Comment - Close chat after hitting return - Persist - 1 - Type - Boolean - Value - 0 - - CloseSnapshotOnKeep - - Comment - Close snapshot window after saving snapshot - Persist - 1 - Type - Boolean - Value - 1 - - CmdLineDisableVoice - - Comment - Disable Voice. - Persist - 0 - Type - Boolean - Value - 0 - - CmdLineAgentURI - - Comment - URL of agent host to connect to in Agent Domain. - Persist - 0 - Type - String - Value - - - CmdLineGridChoice - - Comment - The user's grid choice or ip address. - Persist - 0 - Type - String - Value - - - CmdLineHelperURI - - Comment - Command line specified helper web CGI prefix to use. - Persist - 0 - Type - String - Value - - - CmdLineLoginURI - - Comment - Command line specified login server and CGI prefix to use. - Persist - 0 - Type - LLSD - Value - - - - - CmdLineRegionURI - - Comment - URL of region to connect to through Agent Domain. - Persist - 0 - Type - String - Value - - - ColorPaletteEntry01 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.0 - 0.0 - 1.0 - - - ColorPaletteEntry02 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 0.5 - 0.5 - 1.0 - - - ColorPaletteEntry03 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 0.0 - 0.0 - 1.0 - - - ColorPaletteEntry04 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 0.5 - 0.0 - 1.0 - - - ColorPaletteEntry05 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.5 - 0.0 - 1.0 - - - ColorPaletteEntry06 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.5 - 0.5 - 1.0 - - - ColorPaletteEntry07 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.0 - 0.5 - 1.0 - - - ColorPaletteEntry08 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 0.0 - 0.5 - 1.0 - - - ColorPaletteEntry09 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 0.5 - 0.0 - 1.0 - - - ColorPaletteEntry10 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.25 - 0.25 - 1.0 - - - ColorPaletteEntry11 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.5 - 1.0 - 1.0 - - - ColorPaletteEntry12 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.25 - 0.5 - 1.0 - - - ColorPaletteEntry13 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 0.0 - 1.0 - 1.0 - - - ColorPaletteEntry14 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 0.25 - 0.0 - 1.0 - - - ColorPaletteEntry15 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - - ColorPaletteEntry16 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - - ColorPaletteEntry17 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - - ColorPaletteEntry18 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.75 - 0.75 - 0.75 - 1.0 - - - ColorPaletteEntry19 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 0.0 - 0.0 - 1.0 - - - ColorPaletteEntry20 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 0.0 - 1.0 - - - ColorPaletteEntry21 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 1.0 - 0.0 - 1.0 - - - ColorPaletteEntry22 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 1.0 - 1.0 - 1.0 - - - ColorPaletteEntry23 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.0 - 1.0 - 1.0 - - - ColorPaletteEntry24 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 0.0 - 1.0 - 1.0 - - - ColorPaletteEntry25 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 0.5 - 1.0 - - - ColorPaletteEntry26 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.0 - 1.0 - 0.5 - 1.0 - - - ColorPaletteEntry27 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 1.0 - 1.0 - 1.0 - - - ColorPaletteEntry28 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 0.5 - 0.5 - 1.0 - 1.0 - - - ColorPaletteEntry29 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 0.0 - 0.5 - 1.0 - - - ColorPaletteEntry30 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 0.5 - 0.0 - 1.0 - - - ColorPaletteEntry31 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - - ColorPaletteEntry32 - - Comment - Color picker palette entry - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - - ColumnHeaderDropDownDelay - - Comment - Time in seconds of mouse click before column header shows sort options list - Persist - 1 - Type - F32 - Value - 0.300000011921 - - CompileOutputRect - - Comment - Rectangle for script Recompile Everything output window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 300 - 0 - - - ConnectAsGod - - Comment - Log in a god if you have god access. - Persist - 1 - Type - Boolean - Value - 0 - - ConnectionPort - - Comment - Custom connection port number - Persist - 1 - Type - U32 - Value - 13000 - - ConnectionPortEnabled - - Comment - Use the custom connection port? - Persist - 1 - Type - Boolean - Value - 0 - - ConsoleBackgroundOpacity - - Comment - Opacity of chat console (0.0 = completely transparent, 1.0 = completely opaque) - Persist - 1 - Type - F32 - Value - 0.700 - - ConsoleBufferSize - - Comment - Size of chat console history (lines of chat) - Persist - 1 - Type - S32 - Value - 40 - - ConsoleMaxLines - - Comment - Max number of lines of chat text visible in console. - Persist - 1 - Type - S32 - Value - 40 - - ContactsTornOff - - Comment - Show contacts window separately from Communicate window. - Persist - 1 - Type - Boolean - Value - 0 - - CookiesEnabled - - Comment - Accept cookies from Web sites? - Persist - 1 - Type - Boolean - Value - 1 - - CreateToolCopyCenters - - Comment - - Persist - 0 - Type - Boolean - Value - 1 - - CreateToolCopyRotates - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - CreateToolCopySelection - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - CreateToolKeepSelected - - Comment - After using create tool, keep the create tool active - Persist - 1 - Type - Boolean - Value - 0 - - Cursor3D - - Comment - Tread Joystick values as absolute positions (not deltas). - Persist - 1 - Type - Boolean - Value - 1 - - CustomServer - - Comment - Specifies IP address or hostname of grid to which you connect - Persist - 1 - Type - String - Value - - - DebugBeaconLineWidth - - Comment - Size of lines for Debug Beacons - Persist - 1 - Type - S32 - Value - 1 - - DebugInventoryFilters - - Comment - Turn on debugging display for inventory filtering - Persist - 1 - Type - Boolean - Value - 0 - - DebugPermissions - - Comment - Log permissions for selected inventory items - Persist - 1 - Type - Boolean - Value - 0 - - DebugPluginDisableTimeout - - Comment - Disable the code which watches for plugins that are crashed or hung - Persist - 1 - Type - Boolean - Value - 0 - - DebugShowColor - - Comment - Show color under cursor - Persist - 1 - Type - Boolean - Value - 0 - - DebugShowRenderInfo - - Comment - Show depth buffer contents - Persist - 1 - Type - Boolean - Value - 0 - - DebugShowRenderMatrices - - Comment - Display values of current view and projection matrices. - Persist - 1 - Type - Boolean - Value - 0 - - DebugShowTime - - Comment - Show depth buffer contents - Persist - 1 - Type - Boolean - Value - 0 - - DebugStatModeFPS - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeBandwidth - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModePacketLoss - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatMode - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeKTrisDrawnFr - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeKTrisDrawnSec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeTotalObjs - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeNewObjs - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeTextureCount - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeRawCount - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeGLMem - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeFormattedMem - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeRawMem - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeBoundMem - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModePacketsIn - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModePacketsOut - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeObjects - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeTexture - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeAsset - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeLayers - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeActualIn - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeActualOut - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeVFSPendingOps - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeTimeDialation - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimFPS - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModePhysicsFPS - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModePinnedObjects - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeLowLODObjects - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeMemoryAllocated - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeAgentUpdatesSec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeMainAgents - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeChildAgents - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimObjects - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimActiveObjects - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimActiveScripts - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimScriptEvents - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimInPPS - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimOutPPS - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimPendingDownloads - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - SimPendingUploads - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimTotalUnackedBytes - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimFrameMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimNetMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimSimPhysicsMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimSimOtherMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimAgentMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimImagesMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimScriptMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimSpareMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimSimPhysicsStepMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimSimPhysicsShapeUpdateMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimSimPhysicsOtherMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimSleepMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugStatModeSimPumpIOMsec - - Comment - Mode of stat in Statistics floater - Persist - 1 - Type - S32 - Value - -1 - - DebugViews - - Comment - Display debugging info for views. - Persist - 1 - Type - Boolean - Value - 0 - - DebugWindowProc - - Comment - Log windows messages - Persist - 1 - Type - Boolean - Value - 0 - - DefaultObjectTexture - - Comment - Texture used as 'Default' in texture picker. (UUID texture reference) - Persist - 1 - Type - String - Value - 89556747-24cb-43ed-920b-47caed15465f - - DisableCameraConstraints - - Comment - Disable the normal bounds put on the camera by avatar position - Persist - 1 - Type - Boolean - Value - 0 - - DisableRendering - - Comment - Disable GL rendering and GUI (load testing) - Persist - 1 - Type - Boolean - Value - 0 - - DisableVerticalSync - - Comment - Update frames as fast as possible (FALSE = update frames between display scans) - Persist - 1 - Type - Boolean - Value - 1 - - DisplayAvatarAgentTarget - - Comment - Show avatar positioning locators (animation debug) - Persist - 1 - Type - Boolean - Value - 0 - - DisplayChat - - Comment - Display Latest Chat message on LCD - Persist - 1 - Type - Boolean - Value - 1 - - DisplayDebug - - Comment - Display Network Information on LCD - Persist - 1 - Type - Boolean - Value - 1 - - DisplayDebugConsole - - Comment - Display Console Debug Information on LCD - Persist - 1 - Type - Boolean - Value - 1 - - DisplayIM - - Comment - Display Latest IM message on LCD - Persist - 1 - Type - Boolean - Value - 1 - - DisplayLinden - - Comment - Display Account Information on LCD - Persist - 1 - Type - Boolean - Value - 1 - - DisplayRegion - - Comment - Display Location information on LCD - Persist - 1 - Type - Boolean - Value - 1 - - DisplayTimecode - - Comment - Display timecode on screen - Persist - 1 - Type - Boolean - Value - 0 - - Disregard128DefaultDrawDistance - - Comment - Whether to use the auto default to 128 draw distance - Persist - 1 - Type - Boolean - Value - 1 - - Disregard96DefaultDrawDistance - - Comment - Whether to use the auto default to 96 draw distance - Persist - 1 - Type - Boolean - Value - 1 - - DoubleClickAutoPilot - - Comment - Enable double-click auto pilot - Persist - 1 - Type - Boolean - Value - 0 - - DoubleClickTeleport - - Comment - Enable double-click to teleport where allowed - Persist - 1 - Type - Boolean - Value - 0 - - DoubleClickTeleportMiniMap - - Comment - Enable double-click-teleport for the mini-map - Persist - 1 - Type - Boolean - Value - 0 - - DragAndDropToolTipDelay - - Comment - Seconds before displaying tooltip when performing drag and drop operation - Persist - 1 - Type - F32 - Value - 0.10000000149 - - DropShadowButton - - Comment - Drop shadow width for buttons (pixels) - Persist - 1 - Type - S32 - Value - 2 - - DropShadowFloater - - Comment - Drop shadow width for floaters (pixels) - Persist - 1 - Type - S32 - Value - 5 - - DropShadowSlider - - Comment - Drop shadow width for sliders (pixels) - Persist - 1 - Type - S32 - Value - 3 - - DropShadowTooltip - - Comment - Drop shadow width for tooltips (pixels) - Persist - 1 - Type - S32 - Value - 4 - - DynamicCameraStrength - - Comment - Amount camera lags behind avatar motion (0 = none, 30 = avatar velocity) - Persist - 1 - Type - F32 - Value - 2.0 - - EditCameraMovement - - Comment - When entering build mode, camera moves up above avatar - Persist - 1 - Type - Boolean - Value - 0 - - EditLinkedParts - - Comment - Select individual parts of linked objects - Persist - 0 - Type - Boolean - Value - 0 - - DecimalsForTools - - Comment - Number of decimals for the edit tool position, size and rotation settings (0 to 5) - Persist - 1 - Type - U32 - Value - 5 - - EffectScriptChatParticles - - Comment - 1 = normal behavior, 0 = disable display of swirling lights when scripts communicate - Persist - 1 - Type - Boolean - Value - 1 - - EnableRippleWater - - Comment - Whether to use ripple water shader or not - Persist - 1 - Type - Boolean - Value - 1 - - EnableVoiceChat - - Comment - Enable talking to other residents with a microphone - Persist - 1 - Type - Boolean - Value - 0 - - EnergyFromTop - - Comment - - Persist - 0 - Type - S32 - Value - 20 - - EnergyHeight - - Comment - - Persist - 0 - Type - S32 - Value - 40 - - EnergyWidth - - Comment - - Persist - 0 - Type - S32 - Value - 175 - - EveryoneCopy - - Comment - Everyone can copy the newly created objects - Persist - 1 - Type - Boolean - Value - 0 - - FPSLogFrequency - - Comment - Seconds between display of FPS in log (0 for never) - Persist - 1 - Type - F32 - Value - 60.0 - - FPSLogFrequency - - Comment - Seconds between display of FPS in log (0 for never) - Persist - 1 - Type - F32 - Value - 10.0 - - FilterItemsPerFrame - - Comment - Maximum number of inventory items to match against search filter every frame (lower to increase framerate while searching, higher to improve search speed) - Persist - 1 - Type - S32 - Value - 500 - - FindLandArea - - Comment - Enables filtering of land search results by area - Persist - 1 - Type - Boolean - Value - 0 - - FindLandPrice - - Comment - Enables filtering of land search results by price - Persist - 1 - Type - Boolean - Value - 1 - - FindLandType - - Comment - Controls which type of land you are searching for in Find Land interface ("All", "Auction", "For Sale") - Persist - 1 - Type - String - Value - All - - FindPeopleOnline - - Comment - Limits people search to only users who are logged on - Persist - 1 - Type - Boolean - Value - 1 - - FindPlacesPictures - - Comment - Display only results of find places that have pictures - Persist - 1 - Type - Boolean - Value - 1 - - FirstLoginThisInstall - - Comment - Specifies that you have not successfully logged in since you installed the latest update - Persist - 1 - Type - Boolean - Value - 1 - - FirstName - - Comment - Login first name - Persist - 1 - Type - String - Value - - - FirstPersonAvatarVisible - - Comment - Display avatar and attachments below neck while in mouselook - Persist - 1 - Type - Boolean - Value - 0 - - FirstPersonBtnState - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - FirstRunThisInstall - - Comment - Specifies that you have not run the viewer since you installed the latest update - Persist - 1 - Type - Boolean - Value - 1 - - FixedWeather - - Comment - Weather effects do not change over time - Persist - 1 - Type - Boolean - Value - 0 - - LongDateFormat - - Comment - Long date format to use - Persist - 1 - Type - String - Value - %A %d %B %Y - - ShortDateFormat - - Comment - Short date format to use - Persist - 1 - Type - String - Value - %Y-%m-%d - - ShortTimeFormat - - Comment - Short time format (hours and minutes) to use - Persist - 1 - Type - String - Value - %H:%M - - LongTimeFormat - - Comment - Long time format (hours, minutes and seconds) to use - Persist - 1 - Type - String - Value - %H:%M:%S - - TimestampFormat - - Comment - Timestamp format to use - Persist - 1 - Type - String - Value - %a %d %b %Y %H:%M:%S - - SecondsInChatAndIMs - - Comment - TRUE to add seconds to timestamps for IM and chat - Persist - 1 - Type - Boolean - Value - 0 - - FloaterAboutRect - - Comment - Rectangle for About window - Persist - 1 - Type - Rect - Value - - 0 - 440 - 470 - 0 - - - FloaterActiveSpeakersRect - - Comment - Rectangle for active speakers window - Persist - 1 - Type - Rect - Value - - 0 - 300 - 250 - 0 - - - FloaterActiveSpeakersSortAscending - - Comment - Whether to sort up or down - Persist - 1 - Type - Boolean - Value - 1 - - FloaterActiveSpeakersSortColumn - - Comment - Column name to sort on - Persist - 1 - Type - String - Value - speaking_status - - FloaterAreaSearchRect - - Comment - Rectangle for the area search floater - Persist - 1 - Type - Rect - Value - - 0 - 400 - 200 - 0 - - - FloaterAdvancedSkyRect - - Comment - Rectangle for Advanced Sky Editor - Persist - 1 - Type - Rect - Value - - 0 - 220 - 700 - 0 - - - FloaterAdvancedWaterRect - - Comment - Rectangle for Advanced Water Editor - Persist - 1 - Type - Rect - Value - - 0 - 240 - 700 - 0 - - - FloaterAudioVolumeRect - - Comment - Rectangle for Audio Volume window - Persist - 1 - Type - Rect - Value - - 0 - 440 - 470 - 0 - - - FloaterBeaconsRect - - Comment - Rectangle for beacon and highlight controls - Persist - 1 - Type - Rect - Value - - 200 - 250 - 250 - 200 - - - FloaterBuildOptionsRect - - Comment - Rectangle for build options window. - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - FloaterVFSRect - - Comment - Rectangle for local assets window. - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - FloaterBumpRect - - Comment - Rectangle for Bumps/Hits window - Persist - 1 - Type - Rect - Value - - 0 - 180 - 400 - 0 - - - FloaterBuyContentsRect - - Comment - Rectangle for Buy Contents window - Persist - 1 - Type - Rect - Value - - 0 - 250 - 300 - 0 - - - FloaterBuyRect - - Comment - Rectangle for buy window - Persist - 1 - Type - Rect - Value - - 0 - 250 - 300 - 0 - - - FloaterCameraRect3 - - Comment - Rectangle for camera control window - Persist - 1 - Type - Rect - Value - - 0 - 64 - 176 - 0 - - - FloaterChatRect - - Comment - Rectangle for chat history - Persist - 1 - Type - Rect - Value - - 0 - 172 - 500 - 0 - - - FloaterClothingRect - - Comment - Rectangle for clothing window - Persist - 1 - Type - Rect - Value - - 0 - 480 - 320 - 0 - - - FloaterContactsRect - - Comment - Rectangle for chat history - Persist - 1 - Type - Rect - Value - - 0 - 390 - 395 - 0 - - - FloaterCustomizeAppearanceRect - - Comment - Rectangle for avatar customization window - Persist - 1 - Type - Rect - Value - - 0 - 540 - 494 - 0 - - - FloaterDayCycleRect - - Comment - Rectangle for Day Cycle Editor - Persist - 1 - Type - Rect - Value - - 0 - 646 - 275 - 0 - - - FloaterEnvRect - - Comment - Rectangle for Environment Editor - Persist - 1 - Type - Rect - Value - - 0 - 150 - 600 - 0 - - - FloaterFindRect2 - - Comment - Rectangle for Find window - Persist - 1 - Type - Rect - Value - - 0 - 570 - 780 - 0 - - - FloaterFriendsRect - - Comment - Rectangle for friends window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 250 - 0 - - - FloaterGestureRect2 - - Comment - Rectangle for gestures window - Persist - 1 - Type - Rect - Value - - 0 - 465 - 350 - 0 - - - FloaterHUDRect2 - - Comment - Rectangle for HUD Floater window - Persist - 1 - Type - Rect - Value - - - 0 - 292 - 362 - 0 - - - FloaterHtmlRect - - Comment - Rectangle for HTML window - Persist - 1 - Type - Rect - Value - - 100 - 460 - 370 - 100 - - - FloaterIMRect - - Comment - Rectangle for IM window - Persist - 1 - Type - Rect - Value - - 0 - 160 - 500 - 0 - - - FloaterInspectRect - - Comment - Rectangle for Object Inspect window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 400 - 0 - - - FloaterInventoryRect - - Comment - Rectangle for inventory window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 300 - 0 - - - FloaterJoystickRect - - Comment - Rectangle for joystick controls window. - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - FloaterLagMeter - - Comment - Rectangle for lag meter - Persist - 1 - Type - Rect - Value - - 0 - 142 - 350 - 0 - - - ShowRadar - - Comment - Show the radar floater - Persist - 1 - Type - Boolean - Value - 0 - - FloaterRadarRect - - Comment - Rectangle for Radar - Persist - 1 - Type - Rect - Value - - 0 - 400 - 200 - 0 - - - RadarKeepOpen - - Comment - Keeps radar updates running in background - Persist - 1 - Type - Boolean - Value - 0 - - RadarUpdateRate - - Comment - Radar update rate (0 = high, 1 = medium, 2 = low) - Persist - 1 - Type - U32 - Value - 1 - - RadarAlertSim - - Comment - Whether the radar emits chat alerts for avatars entering/exiting sim - Persist - 1 - Type - Boolean - Value - 0 - - RadarAlertDraw - - Comment - Whether the radar emits chat alerts for avatars entering/exiting draw distance - Persist - 1 - Type - Boolean - Value - 0 - - RadarAlertShoutRange - - Comment - Whether the radar emits chat alerts for avatars entering/exiting shout range - Persist - 1 - Type - Boolean - Value - 0 - - RadarAlertChatRange - - Comment - Whether the radar emits chat alerts for avatars entering/exiting chat range - Persist - 1 - Type - Boolean - Value - 1 - - RadarChatAlerts - - Comment - Whether the radar emits chat alerts regarding the status of avatars it displays - Persist - 1 - Type - Boolean - Value - 0 - - RadarChatKeys - - Comment - Enable private chat alerts for avatars entering the region - Persist - 1 - Type - Boolean - Value - 0 - - FloaterLandRect5 - - Comment - Rectangle for About Land window - Persist - 1 - Type - Rect - Value - - 0 - 370 - 460 - 0 - - - FloaterLandmarkRect - - Comment - Rectangle for landmark picker - Persist - 1 - Type - Rect - Value - - 0 - 290 - 310 - 0 - - - FloaterMediaRect - - Comment - Rectangle for media browser window - Persist - 1 - Type - Rect - Value - - 16 - 650 - 600 - 128 - - - FloaterMiniMapRect - - Comment - Rectangle for world map - Persist - 1 - Type - Rect - Value - - 0 - 225 - 200 - 0 - - - FloaterMoveRect2 - - Comment - Rectangle for avatar control window - Persist - 1 - Type - Rect - Value - - 0 - 58 - 135 - 0 - - - FloaterMuteRect3 - - Comment - Rectangle for mute window - Persist - 1 - Type - Rect - Value - - 0 - 300 - 300 - 0 - - - FloaterObjectIMInfo - - Comment - Rectangle for floater object im info windows - Persist - 1 - Type - Rect - Value - - 0 - 300 - 300 - 0 - - - FloaterOpenObjectRect - - Comment - Rectangle for Open Object window - Persist - 1 - Type - Rect - Value - - 0 - 350 - 300 - 0 - - - FloaterPayRectB - - Comment - Rectangle for pay window - Persist - 1 - Type - Rect - Value - - 0 - 150 - 400 - 0 - - - FloaterPermPrefsRect - - Comment - Rectangle for initial permissions preferences - Persist - 1 - Type - Rect - Value - - 200 - 250 - 250 - 200 - - - FloaterRegionInfo - - Comment - Rectangle for region info window - Persist - 1 - Type - Rect - Value - - 0 - 512 - 480 - 0 - - - FloaterScriptDebugRect - - Comment - Rectangle for Script Error/Debug window - Persist - 1 - Type - Rect - Value - - 0 - 130 - 450 - 0 - - - FloaterSnapshotRect - - Comment - Rectangle for snapshot window - Persist - 1 - Type - Rect - Value - - 0 - 200 - 200 - 400 - - - FloaterSoundsRect - - Comment - Rectangle for sounds log floater. - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - FloaterSoundsLogAvatars - - Comment - Show SoundTriggers/gestures played by agents in the log. Also includes collision sounds if enabled - Persist - 1 - Type - Boolean - Value - 1 - - FloaterSoundsLogObjects - - Comment - Show sounds played by objects in the log. Also includes collision sounds if enabled - Persist - 1 - Type - Boolean - Value - 1 - - FloaterSoundsLogCollisions - - Comment - Don't filter out default collision sounds in the log - Persist - 1 - Type - Boolean - Value - 1 - - FloaterSoundsLogRepeats - - Comment - Only show one entry for each unique asset ID in the log - Persist - 1 - Type - Boolean - Value - 1 - - FloaterStatisticsRect - - Comment - Rectangle for chat history - Persist - 1 - Type - Rect - Value - - 0 - 400 - 250 - 0 - - - FloaterTeleportHistoryRect - - Comment - Rectangle for teleport history window - Persist - 1 - Type - Rect - Value - - 20 - 20 - 470 - 200 - - - FloaterViewBottom - - Comment - [DO NOT MODIFY] Controls layout of floating windows within SL window - Persist - 1 - Type - S32 - Value - -1 - - FloaterWorldMapRect2 - - Comment - Rectangle for world map window - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - FloaterAORect - - Comment - Rectangle for AO editor. - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - FloaterAvatarsRect - - Comment - Rectangle for avatar radar. - Persist - 1 - Type - Rect - Value - - 200 - 905 - 396 - 734 - - - FloaterInterceptorRect - - Comment - Rectangle for interceptor floater. - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - FloaterKeyToolRect - - Comment - Rectangle for KeyTool floater. - Persist - 1 - Type - Rect - Value - - 439 - 759 - 593 - 443 - - - KeyToolAutomaticOpen - - Comment - Automatically open KeyTool results - Persist - 1 - Type - Boolean - Value - 1 - - KeyToolAutomaticClose - - Comment - Automatically close KeyTool floater when a result is found - Persist - 1 - Type - Boolean - Value - 1 - - FloaterSoundsRect - - Comment - Rectangle for sounds log floater. - Persist - 1 - Type - Rect - Value - - 0 - 0 - 0 - 0 - - - FloaterSoundsLogAvatars - - Comment - Show SoundTriggers/gestures played by agents in the log. Also includes collision sounds if enabled - Persist - 1 - Type - Boolean - Value - 1 - - FloaterSoundsLogObjects - - Comment - Show sounds played by objects in the log. Also includes collision sounds if enabled - Persist - 1 - Type - Boolean - Value - 1 - - FloaterSoundsLogCollisions - - Comment - Don't filter out default collision sounds in the log - Persist - 1 - Type - Boolean - Value - 1 - - FloaterSoundsLogRepeats - - Comment - Only show one entry for each unique asset ID in the log - Persist - 1 - Type - Boolean - Value - 1 - - FlyBtnState - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - AlwaysAllowFly - - Comment - Ignore parcel/region setting that blocks flying - Persist - 1 - Type - Boolean - Value - 1 - - FlycamAbsolute - - Comment - Treat Flycam values as absolute positions (not deltas). - Persist - 1 - Type - Boolean - Value - 0 - - FlycamAxisDeadZone0 - - Comment - Flycam axis 0 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - FlycamAxisDeadZone1 - - Comment - Flycam axis 1 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - FlycamAxisDeadZone2 - - Comment - Flycam axis 2 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - FlycamAxisDeadZone3 - - Comment - Flycam axis 3 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - FlycamAxisDeadZone4 - - Comment - Flycam axis 4 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - FlycamAxisDeadZone5 - - Comment - Flycam axis 5 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - FlycamAxisDeadZone6 - - Comment - Flycam axis 6 dead zone. - Persist - 1 - Type - F32 - Value - 0.1 - - FlycamAxisScale0 - - Comment - Flycam axis 0 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - FlycamAxisScale1 - - Comment - Flycam axis 1 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - FlycamAxisScale2 - - Comment - Flycam axis 2 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - FlycamAxisScale3 - - Comment - Flycam axis 3 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - FlycamAxisScale4 - - Comment - Flycam axis 4 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - FlycamAxisScale5 - - Comment - Flycam axis 5 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - FlycamAxisScale6 - - Comment - Flycam axis 6 scaler. - Persist - 1 - Type - F32 - Value - 1.0 - - FlycamFeathering - - Comment - Flycam feathering (less is softer) - Persist - 1 - Type - F32 - Value - 16.0 - - FlycamZoomDirect - - Comment - Map flycam zoom axis directly to camera zoom. - Persist - 1 - Type - Boolean - Value - 0 - - FlyingAtExit - - Comment - Was flying when last logged out, so fly when logging in - Persist - 1 - Type - Boolean - Value - 0 - - FocusOffsetDefault - - Comment - Default focus point offset relative to avatar (x-axis is forward) - Persist - 1 - Type - Vector3 - Value - - 1.0 - 0.0 - 1.0 - - - FocusPosOnLogout - - Comment - Camera focus point when last logged out (global coordinates) - Persist - 1 - Type - Vector3D - Value - - 0.0 - 0.0 - 0.0 - - - FolderAutoOpenDelay - - Comment - Seconds before automatically expanding the folder under the mouse when performing inventory drag and drop - Persist - 1 - Type - F32 - Value - 0.75 - - FolderLoadingMessageWaitTime - - Comment - Seconds to wait before showing the LOADING... text in folder views - Persist - 1 - Type - F32 - Value - 0.5 - - FontMonospace - - Comment - Name of monospace font that definitely exists (Truetype file name) - Persist - 0 - Type - String - Value - DejaVuSansMono.ttf - - FontSansSerif - - Comment - Name of primary sans-serif font that definitely exists (Truetype file name) - Persist - 0 - Type - String - Value - DroidSans.ttf - - FontSansSerifBundledFallback - - Comment - Name of secondary sans-serif font that definitely exists (Truetype file name) - Persist - 0 - Type - String - Value - DejaVuSansCondensed.ttf - - FontSansSerifBold - - Comment - Name of bold font (Truetype file name) - Persist - 0 - Type - String - Value - DroidSans-Bold.ttf - - FontSansSerifFallback - - Comment - Name of sans-serif font (Truetype file name) - Persist - 0 - Type - String - Value - - - FontSansSerifFallbackScale - - Comment - Scale of fallback font relative to huge font (fraction of huge font size) - Persist - 1 - Type - F32 - Value - 1.00 - - FontScreenDPI - - Comment - Font resolution, higher is bigger (pixels per inch) - Persist - 1 - Type - F32 - Value - 96.0 - - FontSizeHuge - - Comment - Size of huge font (points, or 1/72 of an inch) - Persist - 1 - Type - F32 - Value - 14.0 - - FontSizeLarge - - Comment - Size of large font (points, or 1/72 of an inch) - Persist - 1 - Type - F32 - Value - 11.0 - - FontSizeMedium - - Comment - Size of medium font (points, or 1/72 of an inch) - Persist - 1 - Type - F32 - Value - 9.5 - - FontSizeMonospace - - Comment - Size of monospaced font (points, or 1/72 of an inch) - Persist - 1 - Type - F32 - Value - 9.0 - - FontSizeSmall - - Comment - Size of small font (points, or 1/72 of an inch) - Persist - 1 - Type - F32 - Value - 8.5 - - ForceNotecardDragCargoPermissive - - Comment - For testing what does and does not work when using HTTPS upload - Persist - 1 - Type - Boolean - Value - 0 - - ForceNotecardDragCargoAcceptance - - Comment - For testing what does and does not work when using HTTPS upload - Persist - 1 - Type - Boolean - Value - 0 - - ForceShowGrid - - Comment - Always show grid dropdown on login screen - Persist - 1 - Type - Boolean - Value - 0 - - ForceMandatoryUpdate - - Comment - For QA: On next startup, forces the auto-updater to run - Persist - 1 - Type - Boolean - Value - 0 - - ForwardBtnRect - - Comment - - Persist - 0 - Type - Rect - Value - - 45 - 54 - 66 - 29 - - - FreezeTime - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - FullScreen - - Comment - Run SL in fullscreen mode - Persist - 1 - Type - Boolean - Value - 0 - - FullScreenAspectRatio - - Comment - Aspect ratio of fullscreen display (width / height) - Persist - 1 - Type - F32 - Value - 1.33329999447 - - FullScreenAutoDetectAspectRatio - - Comment - Automatically detect proper aspect ratio for fullscreen display - Persist - 1 - Type - Boolean - Value - 1 - - FullScreenHeight - - Comment - Fullscreen resolution in height - Persist - 1 - Type - S32 - Value - 768 - - FullScreenWidth - - Comment - Fullscreen resolution in width - Persist - 1 - Type - S32 - Value - 1024 - - GridCrossSections - - Comment - Highlight cross sections of prims with grid manipulation plane. - Persist - 1 - Type - Boolean - Value - 0 - - GridDrawSize - - Comment - Visible extent of 2D snap grid (meters) - Persist - 1 - Type - F32 - Value - 12.0 - - GridMode - - Comment - Snap grid reference frame (0 = world, 1 = local, 2 = reference object) - Persist - 1 - Type - S32 - Value - 0 - - GridOpacity - - Comment - Grid line opacity (0.0 = completely transparent, 1.0 = completely opaque) - Persist - 1 - Type - F32 - Value - 0.699999988079 - - GridResolution - - Comment - Size of single grid step (meters) - Persist - 1 - Type - F32 - Value - 0.5 - - GridSubUnit - - Comment - Display fractional grid steps, relative to grid size - Persist - 1 - Type - Boolean - Value - 0 - - GridSubdivision - - Comment - Maximum number of times to divide single snap grid unit when GridSubUnit is true - Persist - 1 - Type - S32 - Value - 32 - - GroupNotifyBoxHeight - - Comment - Height of group notice messages - Persist - 1 - Type - S32 - Value - 260 - - GroupNotifyBoxWidth - - Comment - Width of group notice messages - Persist - 1 - Type - S32 - Value - 400 - - HTMLLinkColor - - Comment - Color of hyperlinks - Persist - 1 - Type - Color4 - Value - - 0.600000023842 - 0.600000023842 - 1.0 - 1.0 - - - HelpHomeURL - - Comment - URL of initial help page - Persist - 1 - Type - String - Value - help/index.html - - HelpLastVisitedURL - - Comment - URL of last help page, will be shown next time help is accessed - Persist - 1 - Type - String - Value - help/index.html - - HighResSnapshot - - Comment - Double resolution of snapshot from current window resolution - Persist - 1 - Type - Boolean - Value - 0 - - HtmlFindRect - - Comment - Rectangle for HTML find window - Persist - 1 - Type - Rect - Value - - 16 - 650 - 600 - 128 - - - HtmlHelpLastPage - - Comment - Last URL visited via help system - Persist - 1 - Type - String - Value - - - HtmlHelpRect - - Comment - Rectangle for HTML help window - Persist - 1 - Type - Rect - Value - - 16 - 650 - 600 - 128 - - - HtmlReleaseMessage - - Comment - Rectangle for HTML Release Message Floater window - Persist - 1 - Type - Rect - Value - - 46 - 520 - 400 - 128 - - - IMInChatConsole - - Comment - Copy IM into chat console - Persist - 1 - Type - Boolean - Value - 1 - - IMInChatHistory - - Comment - Copy IM into chat history - Persist - 1 - Type - Boolean - Value - 0 - - IMShowTimestamps - - Comment - Show timestamps in IM - Persist - 1 - Type - Boolean - Value - 1 - - IgnorePixelDepth - - Comment - Ignore pixel depth settings. - Persist - 1 - Type - Boolean - Value - 0 - - ImagePipelineUseHTTP - - Comment - If TRUE use HTTP GET to fetch textures from the server - Persist - 1 - Type - Boolean - Value - 1 - - InBandwidth - - Comment - Incoming bandwidth throttle (bps) - Persist - 1 - Type - F32 - Value - 0.0 - - InstallLanguage - - Comment - Language passed from installer (for UI) - Persist - 1 - Type - String - Value - en-us - - FetchInventoryOnLogin - - Comment - Automatically fetch the inventory in the background after login - Persist - 1 - Type - Boolean - Value - 1 - - InventoryAutoOpenDelay - - Comment - Seconds before automatically opening inventory when mouse is over inventory button when performing inventory drag and drop - Persist - 1 - Type - F32 - Value - 1.0 - - InventorySortOrder - - Comment - Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) - Persist - 1 - Type - U32 - Value - 7 - - InvertMouse - - Comment - When in mouselook, moving mouse up looks down and vice verse (FALSE = moving up looks up) - Persist - 1 - Type - Boolean - Value - 0 - - JoystickAvatarEnabled - - Comment - Enables the Joystick to control Avatar movement. - Persist - 1 - Type - Boolean - Value - 1 - - JoystickAxis0 - - Comment - Flycam hardware axis mapping for internal axis 0 ([0, 5]). - Persist - 1 - Type - S32 - Value - 1 - - JoystickAxis1 - - Comment - Flycam hardware axis mapping for internal axis 1 ([0, 5]). - Persist - 1 - Type - S32 - Value - 0 - - JoystickAxis2 - - Comment - Flycam hardware axis mapping for internal axis 2 ([0, 5]). - Persist - 1 - Type - S32 - Value - 2 - - JoystickAxis3 - - Comment - Flycam hardware axis mapping for internal axis 3 ([0, 5]). - Persist - 1 - Type - S32 - Value - 4 - - JoystickAxis4 - - Comment - Flycam hardware axis mapping for internal axis 4 ([0, 5]). - Persist - 1 - Type - S32 - Value - 3 - - JoystickAxis5 - - Comment - Flycam hardware axis mapping for internal axis 5 ([0, 5]). - Persist - 1 - Type - S32 - Value - 5 - - JoystickAxis6 - - Comment - Flycam hardware axis mapping for internal axis 6 ([0, 5]). - Persist - 1 - Type - S32 - Value - -1 - - JoystickBuildEnabled - - Comment - Enables the Joystick to move edited objects. - Persist - 1 - Type - Boolean - Value - 0 - - JoystickEnabled - - Comment - Enables Joystick Input. - Persist - 1 - Type - Boolean - Value - 0 - - JoystickFlycamEnabled - - Comment - Enables the Joystick to control the flycam. - Persist - 0 - Type - Boolean - Value - 1 - - JoystickInitialized - - Comment - Whether or not a joystick has been detected and initiailized. - Persist - 1 - Type - String - Value - - - JoystickRunThreshold - - Comment - Input threshold to initiate running - Persist - 1 - Type - F32 - Value - 0.25 - - KeepAspectForSnapshot - - Comment - Use full window when taking snapshot, regardless of requested image size - Persist - 1 - Type - Boolean - Value - 1 - - LandBrushSize - - Comment - Size of affected region when using teraform tool - Persist - 1 - Type - F32 - Value - 2.0 - - LCDDestination - - Comment - Which LCD to use - Persist - 1 - Type - S32 - Value - 0 - - LSLFindCaseInsensitivity - - Comment - Use case insensitivity when searching in LSL editor - Persist - 1 - Type - Boolean - Value - 0 - - LSLHelpRect - - Comment - Rectangle for LSL help window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 400 - 0 - - - LSLHelpURL - - Comment - URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword - Persist - 1 - Type - String - Value - http://wiki.secondlife.com/wiki/[LSL_STRING] - - LagMeterShrunk - - Comment - Last large/small state for lag meter - Persist - 1 - Type - Boolean - Value - 0 - - Language - - Comment - Language specifier (for UI) - Persist - 1 - Type - String - Value - default - - LanguageIsPublic - - Comment - Let other residents see our language information - Persist - 1 - Type - Boolean - Value - 1 - - TranslateLanguage - - Comment - Translate Language specifier - Persist - 1 - Type - String - Value - default - - TranslateChat - - Comment - Translate incoming chat messages - Persist - 1 - Type - Boolean - Value - 0 - - LastFeatureVersion - - Comment - [DO NOT MODIFY] Version number for tracking hardware changes - Persist - 1 - Type - S32 - Value - 0 - - LastFindPanel - - Comment - Controls which find operation appears by default when clicking "Find" button - Persist - 1 - Type - String - Value - find_all_panel - - LastName - - Comment - Login last name - Persist - 1 - Type - String - Value - - - LastPrefTab - - Comment - Last selected tab in preferences window - Persist - 1 - Type - S32 - Value - 0 - - LastRunVersion - - Comment - Version number of last instance of the viewer that you ran - Persist - 1 - Type - String - Value - 0.0.0 - - LastSnapshotToEmailHeight - - Comment - The height of the last email snapshot, in px - Persist - 1 - Type - S32 - Value - 768 - - LastSnapshotToEmailWidth - - Comment - The width of the last email snapshot, in px - Persist - 1 - Type - S32 - Value - 1024 - - LastSnapshotToDiskHeight - - Comment - The height of the last disk snapshot, in px - Persist - 1 - Type - S32 - Value - 768 - - LastSnapshotToDiskWidth - - Comment - The width of the last disk snapshot, in px - Persist - 1 - Type - S32 - Value - 1024 - - LastSnapshotToInventoryHeight - - Comment - The height of the last texture snapshot, in px - Persist - 1 - Type - S32 - Value - 512 - - LastSnapshotToInventoryWidth - - Comment - The width of the last texture snapshot, in px - Persist - 1 - Type - S32 - Value - 512 - - LastSnapshotType - - Comment - Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image) - Persist - 1 - Type - S32 - Value - 0 - - LeftClickShowMenu - - Comment - Left click opens pie menu (FALSE = left click touches or grabs object) - Persist - 1 - Type - Boolean - Value - 0 - - LegacyMultiAttachmentSupport - - Comment - Converts legacy "secondary attachment points" to multi-attachments for other avatars - Persist - 1 - Type - Boolean - Value - 1 - - LimitDragDistance - - Comment - Limit translation of object via translate tool - Persist - 1 - Type - Boolean - Value - 1 - - LimitSelectDistance - - Comment - Disallow selection of objects beyond max select distance - Persist - 1 - Type - Boolean - Value - 0 - - LipSyncAah - - Comment - Aah (jaw opening) babble loop - Persist - 1 - Type - String - Value - 257998776531013446642343 - - LipSyncAahPowerTransfer - - Comment - Transfer curve for Voice Interface power to aah lip sync amplitude - Persist - 1 - Type - String - Value - 0000123456789 - - LipSyncEnabled - - Comment - 0 disable lip-sync, 1 enable babble loop - Persist - 1 - Type - Boolean - Value - 1 - - LipSyncOoh - - Comment - Ooh (mouth width) babble loop - Persist - 1 - Type - String - Value - 1247898743223344444443200000 - - LipSyncOohAahRate - - Comment - Rate to babble Ooh and Aah (/sec) - Persist - 1 - Type - F32 - Value - 24.0 - - LipSyncOohPowerTransfer - - Comment - Transfer curve for Voice Interface power to ooh lip sync amplitude - Persist - 1 - Type - String - Value - 0012345566778899 - - LocalCacheVersion - - Comment - Version number of cache - Persist - 1 - Type - S32 - Value - 0 - - LogMessages - - Comment - Log network traffic - Persist - 1 - Type - Boolean - Value - 0 - - LoginAsGod - - Comment - Attempt to login with god powers (Linden accounts only) - Persist - 1 - Type - Boolean - Value - 0 - - LoginLastLocation - - Comment - Login at same location you last logged out - Persist - 1 - Type - Boolean - Value - 1 - - LoginPage - - Comment - Login authentication page. - Persist - 1 - Type - String - Value - - - LosslessJ2CUpload - - Comment - Use lossless compression for small image uploads - Persist - 1 - Type - Boolean - Value - 0 - - MainloopTimeoutDefault - - Comment - Timeout duration for mainloop lock detection, in seconds. - Persist - 1 - Type - F32 - Value - 20.0 - - MapServerURL - - Comment - World map URL template for locating map tiles - Persist - 0 - Type - String - Value - http://map.secondlife.com.s3.amazonaws.com/ - - UseWebMapTiles - - Comment - Use web map tiles whenever possible - Persist - 1 - Type - Boolean - Value - 1 - - MapOverlayIndex - - Comment - Currently selected world map type - Persist - 1 - Type - S32 - Value - 0 - - MapScale - - Comment - World map zoom level (pixels per region) - Persist - 1 - Type - F32 - Value - 128.0 - - MapShowAgentCount - - Comment - Show number of agents next to region names on world map - Persist - 1 - Type - Boolean - Value - 1 - - MapShowPGEvents - - Comment - Show PG events on world map - Persist - 1 - Type - Boolean - Value - 1 - - MapShowMatureEvents - - Comment - Show mature events on world map - Persist - 1 - Type - Boolean - Value - 0 - - MapShowAdultEvents - - Comment - Show adult events on world map - Persist - 1 - Type - Boolean - Value - 0 - - MapShowInfohubs - - Comment - Show infohubs on the world map - Persist - 1 - Type - Boolean - Value - 1 - - MapShowLandForSale - - Comment - Show land for sale on world map - Persist - 1 - Type - Boolean - Value - 0 - - MapShowPeople - - Comment - Show other users on world map - Persist - 1 - Type - Boolean - Value - 1 - - MapShowTelehubs - - Comment - Show telehubs on world map - Persist - 1 - Type - Boolean - Value - 1 - - Marker - - Comment - [NOT USED] - Persist - 1 - Type - String - Value - - - MaxDragDistance - - Comment - Maximum allowed translation distance in a single operation of translate tool (meters from start point) - Persist - 1 - Type - F32 - Value - 48.0 - - MaxSelectDistance - - Comment - Maximum allowed selection distance (meters from avatar) - Persist - 1 - Type - F32 - Value - 64.0 - - MeanCollisionBump - - Comment - You have experienced an abuse of being bumped by an object or avatar - Persist - 1 - Type - Boolean - Value - 0 - - MeanCollisionPhysical - - Comment - You have experienced an abuse from a physical object - Persist - 1 - Type - Boolean - Value - 0 - - MeanCollisionPushObject - - Comment - You have experienced an abuse of being pushed by a scripted object - Persist - 1 - Type - Boolean - Value - 0 - - MeanCollisionScripted - - Comment - You have experienced an abuse from a scripted object - Persist - 1 - Type - Boolean - Value - 0 - - MeanCollisionSelected - - Comment - You have experienced an abuse of being pushed via a selected object - Persist - 1 - Type - Boolean - Value - 0 - - MediaControlFadeTime - - Comment - Amount of time (in seconds) that the media control fades - Persist - 1 - Type - F32 - Value - 1.5 - - MediaControlTimeout - - Comment - Amount of time (in seconds) for media controls to fade with no mouse activity - Persist - 1 - Type - F32 - Value - 3.0 - - MediaOnAPrimUI - - Comment - Whether or not to show the "link sharing" UI - Persist - 1 - Type - Boolean - Value - 0 - - MemoryLogFrequency - - Comment - Seconds between display of Memory in log (0 for never) - Persist - 1 - Type - F32 - Value - 600.0 - - MenuAccessKeyTime - - Comment - Time (seconds) in which the menu key must be tapped to move focus to the menu bar - Persist - 1 - Type - F32 - Value - 0.25 - - MenuBarHeight - - Comment - - Persist - 0 - Type - S32 - Value - 18 - - MenuBarWidth - - Comment - - Persist - 0 - Type - S32 - Value - 410 - - MigrateCacheDirectory - - Comment - Check for old version of disk cache to migrate to current location - Persist - 1 - Type - Boolean - Value - 1 - - MiniMapPrimMaxRadius - - Comment - Radius of the largest prim to show on the MiniMap. Increasing beyond 256 may cause client lag. - Persist - 1 - Type - F32 - Value - 256.0 - - MiniMapCenter - - Comment - Sets the focal point of the minimap. (0=None, 1=Camera) - Persist - 1 - Type - S32 - Value - 1 - - MiniMapRotate - - Comment - Rotate miniature world map to avatar direction - Persist - 1 - Type - Boolean - Value - 1 - - MiniMapScale - - Comment - Miniature world map zoom level (pixels per region) - Persist - 1 - Type - F32 - Value - 128.0 - - MouseSensitivity - - Comment - Controls responsiveness of mouse when in mouselook mode (fraction or multiple of default mouse sensitivity) - Persist - 1 - Type - F32 - Value - 3.0 - - MouseSmooth - - Comment - Smooths out motion of mouse when in mouselook mode. - Persist - 1 - Type - Boolean - Value - 0 - - MouseSun - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - MouselookBtnState - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - MoveDownBtnRect - - Comment - - Persist - 0 - Type - Rect - Value - - 91 - 29 - 116 - 4 - - - MoveUpBtnRect - - Comment - - Persist - 0 - Type - Rect - Value - - 91 - 54 - 116 - 29 - - - DisableWindAudio - - Comment - Disable the wind audio effect - Persist - 1 - Type - Boolean - Value - 0 - - MuteAmbient - - Comment - Ambient sound effects, such as wind noise, play at 0 volume - Persist - 1 - Type - Boolean - Value - 0 - - MuteAudio - - Comment - All audio plays at 0 volume (streaming audio still takes up bandwidth, for example) - Persist - 1 - Type - Boolean - Value - 0 - - MuteMedia - - Comment - Media plays at 0 volume (streaming audio still takes up bandwidth) - Persist - 1 - Type - Boolean - Value - 0 - - MuteMusic - - Comment - Music plays at 0 volume (streaming audio still takes up bandwidth) - Persist - 1 - Type - Boolean - Value - 0 - - MuteSounds - - Comment - Sound effects play at 0 volume - Persist - 1 - Type - Boolean - Value - 0 - - MuteUI - - Comment - UI sound effects play at 0 volume - Persist - 1 - Type - Boolean - Value - 0 - - MuteVoice - - Comment - Voice plays at 0 volume (streaming audio still takes up bandwidth) - Persist - 1 - Type - Boolean - Value - 0 - - MuteWhenMinimized - - Comment - Mute audio when SL window is minimized - Persist - 1 - Type - Boolean - Value - 1 - - NearMeRange - - Comment - Search radius for nearby avatars - Persist - 1 - Type - F32 - Value - 20 - - NextOwnerCopy - - Comment - Newly created objects can be copied by next owner - Persist - 1 - Type - Boolean - Value - 0 - - NextOwnerModify - - Comment - Newly created objects can be modified by next owner - Persist - 1 - Type - Boolean - Value - 0 - - NextOwnerTransfer - - Comment - Newly created objects can be resold or given away by next owner - Persist - 1 - Type - Boolean - Value - 1 - - NewCacheLocation - - Comment - Change the location of the local disk cache to this - Persist - 1 - Type - String - Value - - - NextLoginLocation - - Comment - Location to log into by default. - Persist - 1 - Type - String - Value - - - Nimble - - Comment - Disables landing and jumping delays. - Persist - 1 - Type - Boolean - Value - 0 - - NoAudio - - Comment - Disable audio playback. - Persist - 1 - Type - Boolean - Value - 0 - - NoHardwareProbe - - Comment - Disable hardware probe. - Persist - 1 - Type - Boolean - Value - 0 - - NoInventoryLibrary - - Comment - Do not request inventory library. - Persist - 1 - Type - Boolean - Value - 0 - - NoPreload - - Comment - Disable sound and image preload. - Persist - 1 - Type - Boolean - Value - 0 - - NoVerifySSLCert - - Comment - Do not verify SSL peers. - Persist - 1 - Type - Boolean - Value - 0 - - NotecardEditorRect - - Comment - Rectangle for notecard editor - Persist - 1 - Type - Rect - Value - - 0 - 400 - 400 - 0 - - - NotifyBoxHeight - - Comment - Height of notification messages - Persist - 1 - Type - S32 - Value - 200 - - NotifyBoxWidth - - Comment - Width of notification messages - Persist - 1 - Type - S32 - Value - 350 - - NotifyMoneyChange - - Comment - Pop up notifications for all L$ transactions - Persist - 1 - Type - Boolean - Value - 1 - - NotifyTipDuration - - Comment - Length of time that notification tips stay on screen (seconds) - Persist - 1 - Type - F32 - Value - 4.0 - - NumSessions - - Comment - Number of successful logins to Second Life - Persist - 1 - Type - S32 - Value - 0 - - NumpadControl - - Comment - How numpad keys control your avatar. 0 = Like the normal arrow keys, 1 = Numpad moves avatar when numlock is off, 2 = Numpad moves avatar regardless of numlock (use this if you have no numlock) - Persist - 1 - Type - S32 - Value - 0 - - OpenDebugStatAdvanced - - Comment - Expand advanced performance stats display - Persist - 1 - Type - Boolean - Value - 0 - - OpenDebugStatBasic - - Comment - Expand basic performance stats display - Persist - 1 - Type - Boolean - Value - 1 - - OpenDebugStatNet - - Comment - Expand network stats display - Persist - 1 - Type - Boolean - Value - 1 - - OpenDebugStatRender - - Comment - Expand render stats display - Persist - 1 - Type - Boolean - Value - 1 - - OpenDebugStatSim - - Comment - Expand simulator performance stats display - Persist - 1 - Type - Boolean - Value - 1 - - OpenDebugStatTexture - - Comment - Expand Texture performance stats display - Persist - 1 - Type - Boolean - Value - 0 - - OpenDebugStatPhysicsDetails - - Comment - Expand Physics Details performance stats display - Persist - 1 - Type - Boolean - Value - 0 - - OpenDebugStatSimTime - - Comment - Expand Simulator Time performance stats display - Persist - 1 - Type - Boolean - Value - 0 - - OpenDebugStatSimTimeDetails - - Comment - Expand Simulator Time Details performance stats display - Persist - 1 - Type - Boolean - Value - 0 - - OutBandwidth - - Comment - Outgoing bandwidth throttle (bps) - Persist - 1 - Type - F32 - Value - 0.0 - - OverdrivenColor - - Comment - Color of various indicators when resident is speaking too loud. - Persist - 1 - Type - Color4 - Value - - 1.0 - 0.0 - 0.0 - 1.0 - - - OverlayTitle - - Comment - Controls watermark text message displayed on screen when "ShowOverlayTitle" is enabled (one word, underscores become spaces) - Persist - 1 - Type - String - Value - Set_via_OverlayTitle_in_settings.xml - - PTTCurrentlyEnabled - - Comment - Use Push to Talk mode - Persist - 0 - Type - Boolean - Value - 1 - - PacketDropPercentage - - Comment - Percentage of packets dropped by the client. - Persist - 1 - Type - F32 - Value - 0.0 - - ParcelMediaAutoPlayEnable - - Comment - Auto play parcel media when available - Persist - 1 - Type - Boolean - Value - 0 - - PerAccountSettingsFile - - Comment - Persisted client settings file name (per user). - Persist - 0 - Type - String - Value - - - PermissionsCautionEnabled - - Comment - When enabled, changes the handling of script permission requests to help avoid accidental granting of certain permissions, such as the debit permission - Persist - 0 - Type - Boolean - Value - 1 - - PermissionsCautionNotifyBoxHeight - - Comment - Height of caution-style notification messages - Persist - 0 - Type - S32 - Value - 344 - - RevokePermsOnStandUp - - Comment - When enabled, revokes any permission granted to an object you don't own and from which your avatar is standing up - Persist - 1 - Type - Boolean - Value - 0 - - PermissionsManagerRect - - Comment - Rectangle for permissions manager window - Persist - 1 - Type - Rect - Value - - 0 - 85 - 300 - 0 - - - PickerContextOpacity - - Comment - Controls overall opacity of context frustrum connecting color and texture pickers with their swatches - Persist - 1 - Type - F32 - Value - 0.34999999404 - - PicksPerSecondMouseMoving - - Comment - How often to perform hover picks while the mouse is moving (picks per second) - Persist - 1 - Type - F32 - Value - 5.0 - - PicksPerSecondMouseStationary - - Comment - How often to perform hover picks while the mouse is stationary (picks per second) - Persist - 1 - Type - F32 - Value - 0.0 - - PieMenuLineWidth - - Comment - Width of lines in pie menu display (pixels) - Persist - 1 - Type - F32 - Value - 2.5 - - PinTalkViewOpen - - Comment - Stay in IM after hitting return - Persist - 1 - Type - Boolean - Value - 1 - - PingInterpolate - - Comment - Extrapolate object position along velocity vector based on ping delay - Persist - 1 - Type - Boolean - Value - 0 - - PitchFromMousePosition - - Comment - Vertical range over which avatar head tracks mouse position (degrees of head rotation from top of window to bottom) - Persist - 1 - Type - F32 - Value - 90.0 - - PlayTypingAnim - - Comment - Your avatar plays the typing animation whenever you type in the chat bar - Persist - 1 - Type - Boolean - Value - 1 - - PlayTypingSound - - Comment - TRUE to play and hear the typing sound whenever you or another avatar types in the chat bar - Persist - 1 - Type - Boolean - Value - 1 - - PrecachingDelay - - Comment - Delay when logging in to load world before showing it (seconds) - Persist - 1 - Type - F32 - Value - 6.0 - - PreferredMaturity - - Comment - Setting for the user's preferred maturity level. - Persist - 1 - Type - U32 - Value - 13 - - PreviewAnimRect - - Comment - Rectangle for animation preview window - Persist - 1 - Type - Rect - Value - - 0 - 85 - 300 - 0 - - - PreviewClassifiedRect - - Comment - Rectangle for URL preview window - Persist - 1 - Type - Rect - Value - - 0 - 530 - 420 - 0 - - - PreviewEventRect - - Comment - Rectangle for Event preview window - Persist - 1 - Type - Rect - Value - - 0 - 530 - 420 - 0 - - - PreviewLandmarkRect - - Comment - Rectangle for landmark preview window - Persist - 1 - Type - Rect - Value - - 0 - 90 - 300 - 0 - - - PreviewObjectRect - - Comment - Rectangle for object preview window - Persist - 1 - Type - Rect - Value - - 0 - 85 - 300 - 0 - - - PreviewScriptRect - - Comment - Rectangle for script preview window - Persist - 1 - Type - Rect - Value - - 0 - 586 - 576 - 0 - - - SaveScriptsAsMono - - Comment - When set to TRUE, save scripts in inventory as Mono scripts instead of LSL2 - Persist - 1 - Type - Boolean - Value - 1 - - PreviewSoundRect - - Comment - Rectangle for sound preview window - Persist - 1 - Type - Rect - Value - - 0 - 85 - 300 - 0 - - - PreviewTextureRect - - Comment - Rectangle for texture preview window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 400 - 0 - - - PreviewURLRect - - Comment - Rectangle for URL preview window - Persist - 1 - Type - Rect - Value - - 0 - 90 - 300 - 0 - - - PreviewWearableRect - - Comment - Rectangle for wearable preview window - Persist - 1 - Type - Rect - Value - - 0 - 85 - 300 - 0 - - - ProbeHardwareOnStartup - - Comment - Query current hardware configuration on application startup - Persist - 1 - Type - Boolean - Value - 1 - - PropertiesRect - - Comment - Rectangle for inventory item properties window - Persist - 1 - Type - Rect - Value - - 0 - 320 - 350 - 0 - - - PurgeCacheOnNextStartup - - Comment - Clear local file cache next time viewer is run - Persist - 1 - Type - Boolean - Value - 0 - - PurgeCacheOnStartup - - Comment - Clear local file cache every time viewer is run - Persist - 1 - Type - Boolean - Value - 0 - - PushToTalkButton - - Comment - Which button or keyboard key is used for push-to-talk - Persist - 1 - Type - String - Value - MiddleMouse - - PushToTalkToggle - - Comment - Should the push-to-talk button behave as a toggle - Persist - 1 - Type - Boolean - Value - 0 - - QAMode - - Comment - Enable Testing Features. - Persist - 1 - Type - Boolean - Value - 0 - - QuietSnapshotsToDisk - - Comment - Take snapshots to disk without playing animation or sound - Persist - 1 - Type - Boolean - Value - 0 - - QuitAfterSeconds - - Comment - The duration allowed before quitting. - Persist - 1 - Type - F32 - Value - 0.0 - - RadioLandBrushAction - - Comment - Last selected land modification operation (0 = flatten, 1 = raise, 2 = lower, 3 = smooth, 4 = roughen, 5 = revert) - Persist - 1 - Type - S32 - Value - 0 - - RadioLandBrushSize - - Comment - Size of land modification brush (0 = small, 1 = medium, 2 = large) - Persist - 1 - Type - S32 - Value - 0 - - LandBrushForce - - Comment - Multiplier for land modification brush force. - Persist - 1 - Type - F32 - Value - 1.0 - - RecentItemsSortOrder - - Comment - Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) - Persist - 1 - Type - U32 - Value - 1 - - RectangleSelectInclusive - - Comment - Select objects that have at least one vertex inside selection rectangle - Persist - 1 - Type - Boolean - Value - 1 - - RegionTextureSize - - Comment - Terrain texture dimensions (power of 2) - Persist - 1 - Type - U32 - Value - 256 - - RememberPassword - - Comment - Keep password (in encrypted form) for next login - Persist - 1 - Type - Boolean - Value - 1 - - RenderAnisotropic - - Comment - Render textures using anisotropic filtering - Persist - 1 - Type - Boolean - Value - 0 - - RenderAppleUseMultGL - - Comment - Whether we want to use multi-threaded OpenGL on Apple hardware (requires restart of SL). - Persist - 1 - Type - Boolean - Value - 0 - - RenderAttachedLights - - Comment - Render lighted prims that are attached to avatars - Persist - 1 - Type - Boolean - Value - 1 - - RenderAttachedParticles - - Comment - Render particle systems that are attached to avatars - Persist - 1 - Type - Boolean - Value - 1 - - RenderAvatarCloth - - Comment - Controls if avatars use wavy cloth - Persist - 1 - Type - Boolean - Value - 1 - - RenderAvatarLODFactor - - Comment - Controls level of detail of avatars (multiplier for current screen area when calculated level of detail) - Persist - 1 - Type - F32 - Value - 0.5 - - RenderAvatarMaxVisible - - Comment - Maximum number of avatars to display at any one time - Persist - 1 - Type - S32 - Value - 35 - - RenderAvatarInvisible - - Comment - Set your avatar as Invisible - Persist - 0 - Type - Boolean - Value - 0 - - RenderAvatarVP - - Comment - Use vertex programs to perform hardware skinning of avatar - Persist - 1 - Type - Boolean - Value - 1 - - RenderShadowGaussian - - Comment - Gaussian coefficients for the two shadow/SSAO blurring passes (z component unused). - Persist - 1 - Type - Vector3 - Value - - 2.0 - 2.0 - 0.0 - - - RenderShadowNearDist - - Comment - Near clip plane of shadow camera (affects precision of depth shadows). - Persist - 1 - Type - Vector3 - Value - - 256 - 256 - 256 - - - RenderShadowClipPlanes - - Comment - Near clip plane split distances for shadow map frusta. - Persist - 1 - Type - Vector3 - Value - - 4.0 - 8.0 - 24.0 - - - RenderSSAOScale - - Comment - Scaling factor for the area to sample for occluders (pixels at 1 meter away, inversely varying with distance) - Persist - 1 - Type - F32 - Value - 500.0 - - RenderSSAOMaxScale - - Comment - Maximum screen radius for sampling (pixels) - Persist - 1 - Type - U32 - Value - 60 - - RenderSSAOFactor - - Comment - Occlusion sensitivity factor for ambient occlusion (larger is more) - Persist - 1 - Type - F32 - Value - 0.30 - - RenderSSAOEffect - - Comment - Multiplier for (1) value and (2) saturation (HSV definition), for areas which are totally occluded. Blends with original color for partly-occluded areas. (Third component is unused.) - Persist - 1 - Type - Vector3 - Value - - 0.40 - 1.00 - 0.00 - - - RenderBumpmapMinDistanceSquared - - Comment - Maximum distance at which to render bumpmapped primitives (distance in meters, squared) - Persist - 1 - Type - F32 - Value - 100.0 - - RenderNormalMapScale - - Comment - Scaler applied to height map when generating normal maps - Persist - 1 - Type - F32 - Value - 128 - - RenderCubeMap - - Comment - Whether we can render the cube map or not - Persist - 1 - Type - Boolean - Value - 1 - - RenderCustomSettings - - Comment - Do you want to set the graphics settings yourself - Persist - 1 - Type - Boolean - Value - 0 - - RenderDebugGL - - Comment - Enable strict GL debugging. - Persist - 1 - Type - Boolean - Value - 0 - - RenderDebugPipeline - - Comment - Enable strict pipeline debugging. - Persist - 1 - Type - Boolean - Value - 0 - - RenderDebugTextureBind - - Comment - Enable texture bind performance test. - Persist - 1 - Type - Boolean - Value - 0 - - RenderDelayCreation - - Comment - Throttle creation of drawables. - Persist - 1 - Type - Boolean - Value - 0 - - RenderAnimateRes - - Comment - Animate rezing prims. - Persist - 1 - Type - Boolean - Value - 0 - - RenderAnimateTrees - - Comment - Use GL matrix ops to animate tree branches. - Persist - 1 - Type - Boolean - Value - 0 - - RenderDeferredAlphaSoften - - Comment - Scalar for softening alpha surfaces (for soft particles). - Persist - 1 - Type - F32 - Value - 0.75 - - RenderDeferredNoise - - Comment - Noise scalar to hide banding in deferred render. - Persist - 1 - Type - F32 - Value - 4 - - RenderDeferred - - Comment - Use deferred rendering pipeline. - Persist - 1 - Type - Boolean - Value - 0 - - RenderDeferredSunShadow - - Comment - Generate shadows from the sun. - Persist - 1 - Type - Boolean - Value - 1 - - RenderDeferredSunWash - - Comment - Amount local lights are washed out by sun. - Persist - 1 - Type - F32 - Value - 0.5 - - RenderShadowNoise - - Comment - Magnitude of noise on shadow samples. - Persist - 1 - Type - F32 - Value - -0.0001 - - RenderShadowBlurSize - - Comment - Scale of shadow softening kernel. - Persist - 1 - Type - F32 - Value - 0.7 - - RenderShadowBlurSamples - - Comment - Number of samples to take for each pass of shadow blur (value range 1-16). Actual number of samples is value * 2 - 1. - Persist - 1 - Type - U32 - Value - 5 - - RenderDynamicLOD - - Comment - Dynamically adjust level of detail. - Persist - 1 - Type - Boolean - Value - 1 - - RenderFSAASamples - - Comment - Number of samples to use for FSAA (0 = no AA). - Persist - 1 - Type - U32 - Value - 0 - - RenderFarClip - - Comment - Distance of far clip plane from camera (meters) - Persist - 1 - Type - F32 - Value - 256.0 - - SavedRenderFarClip - - Comment - Saved draw distance (used in case of logout during speed rezzing) - Persist - 1 - Type - F32 - Value - 0.0 - - SpeedRez - - Comment - Set to TRUE to increase rezzing speed via draw distance stepping - Persist - 1 - Type - Boolean - Value - 0 - - SpeedRezInterval - - Comment - Interval in seconds between each draw distance increment - Persist - 1 - Type - U32 - Value - 20 - - RenderFastAlpha - - Comment - Use lossy alpha rendering optimization (opaque/nonexistent small alpha faces). - Persist - 1 - Type - Boolean - Value - 0 - - RenderFastUI - - Comment - [NOT USED] - Persist - 1 - Type - Boolean - Value - 0 - - RenderFlexTimeFactor - - Comment - Controls level of detail of flexible objects (multiplier for amount of time spent processing flex objects) - Persist - 1 - Type - F32 - Value - 1.0 - - RenderFogRatio - - Comment - Distance from camera where fog reaches maximum density (fraction or multiple of far clip distance) - Persist - 1 - Type - F32 - Value - 4.0 - - RenderGamma - - Comment - Sets gamma exponent for renderer - Persist - 1 - Type - F32 - Value - 0.0 - - RenderGammaFull - - Comment - Use fully controllable gamma correction, instead of faster, hard-coded gamma correction of 2. - Persist - 1 - Type - Boolean - Value - 1.0 - - RenderGlow - - Comment - Render bloom post effect. - Persist - 1 - Type - Boolean - Value - 1 - - RenderGlowIterations - - Comment - Number of times to iterate the glow (higher = wider and smoother but slower) - Persist - 1 - Type - S32 - Value - 2 - - RenderGlowLumWeights - - Comment - Weights for each color channel to be used in calculating luminance (should add up to 1.0) - Persist - 1 - Type - Vector3 - Value - - 0.299 - 0.587 - 0.114 - - - RenderGlowMaxExtractAlpha - - Comment - Max glow alpha value for brightness extraction to auto-glow. - Persist - 1 - Type - F32 - Value - 0.065 - - RenderGlowMinLuminance - - Comment - Min luminance intensity necessary to consider an object bright enough to automatically glow. - Persist - 1 - Type - F32 - Value - 2.5 - - RenderGlowResolutionPow - - Comment - Glow map resolution power of two. - Persist - 1 - Type - S32 - Value - 9 - - RenderGlowStrength - - Comment - Additive strength of glow. - Persist - 1 - Type - F32 - Value - 0.35 - - RenderGlowWarmthAmount - - Comment - Amount of warmth extraction to use (versus luminance extraction). 0 = lum, 1.0 = warmth - Persist - 1 - Type - F32 - Value - 0.0 - - RenderGlowWarmthWeights - - Comment - Weight of each color channel used before finding the max warmth - Persist - 1 - Type - Vector3 - Value - - 1.0 - 0.5 - 0.7 - - - RenderGlowWidth - - Comment - Glow sample size (higher = wider and softer but eventually more pixelated) - Persist - 1 - Type - F32 - Value - 1.3 - - RenderGround - - Comment - Determines whether we can render the ground pool or not - Persist - 1 - Type - Boolean - Value - 1 - - RenderHUDInSnapshot - - Comment - Display HUD attachments in snapshot - Persist - 1 - Type - Boolean - Value - 0 - - RenderHUDParticles - - Comment - Display particle systems in HUD attachments (experimental) - Persist - 1 - Type - Boolean - Value - 0 - - RenderHighlightSelections - - Comment - Show selection outlines on objects - Persist - 0 - Type - Boolean - Value - 1 - - RenderHiddenSelections - - Comment - Show selection lines on objects that are behind other objects - Persist - 1 - Type - Boolean - Value - 1 - - RenderHideGroupTitle - - Comment - Don't show my group title in my name label - Persist - 1 - Type - Boolean - Value - 0 - - RenderHideGroupTitleAll - - Comment - Show group titles in name labels - Persist - 1 - Type - Boolean - Value - 0 - - RenderInitError - - Comment - Error occured while initializing GL - Persist - 1 - Type - Boolean - Value - 0 - - RenderLightRadius - - Comment - Render the radius of selected lights - Persist - 1 - Type - Boolean - Value - 0 - - RenderLightingDetail - - Comment - Amount of detail for lighting objects/avatars/terrain (0=sun/moon only, 1=enable local lights) - Persist - 1 - Type - S32 - Value - 1 - - RenderMaxPartCount - - Comment - Maximum number of particles to display on screen - Persist - 1 - Type - S32 - Value - 4096 - - RenderMaxNodeSize - - Comment - Maximum size of a single node's vertex data (in KB). - Persist - 1 - Type - S32 - Value - 8192 - - RenderMaxVBOSize - - Comment - Maximum size of a vertex buffer (in KB). - Persist - 1 - Type - S32 - Value - 512 - - RenderName - - Comment - Controls display of names above avatars (0 = never, 1 = fade, 2 = always) - Persist - 1 - Type - S32 - Value - 2 - - RenderNameFadeDuration - - Comment - Time interval over which to fade avatar names (seconds) - Persist - 1 - Type - F32 - Value - 1.0 - - RenderNameHideSelf - - Comment - Don't display own name above avatar - Persist - 1 - Type - Boolean - Value - 0 - - RenderNameShowTime - - Comment - Fade avatar names after specified time (seconds) - Persist - 1 - Type - F32 - Value - 10.0 - - RenderObjectBump - - Comment - Show bumpmapping on primitives - Persist - 1 - Type - Boolean - Value - 1 - - ReSit - - Comment - Sit again if unsat - Persist - 0 - Type - Boolean - Value - 0 - - SpecifiedChannel - - Comment - What the viewer identifies itself as - Persist - 1 - Type - String - Value - AscentViewer - - SpecifiedVersionMaj - - Comment - Client's Major Version - Persist - 1 - Type - U32 - Value - 1 - - SpecifiedVersionMin - - Comment - Client's Minor Version - Persist - 1 - Type - U32 - Value - 4 - - SpecifiedVersionPatch - - Comment - Client's Patch Version - Persist - 1 - Type - U32 - Value - 0 - - SpecifiedVersionBuild - - Comment - Client's Build Version - Persist - 1 - Type - U32 - Value - 100000 - - RenderQualityPerformance - - Comment - Which graphics settings you've chosen - Persist - 1 - Type - U32 - Value - 1 - - RenderReflectionDetail - - Comment - Detail of reflection render pass. - Persist - 1 - Type - S32 - Value - 2 - - RenderReflectionRes - - Comment - Reflection map resolution. - Persist - 1 - Type - S32 - Value - 64 - - RenderResolutionDivisor - - Comment - Divisor for rendering 3D scene at reduced resolution. - Persist - 1 - Type - U32 - Value - 1 - - RenderShaderLightingMaxLevel - - Comment - Max lighting level to use in the shader (class 3 is default, 2 is less lights, 1 is sun/moon only. Works around shader compiler bugs on certain platforms.) - Persist - 1 - Type - S32 - Value - 3 - - RenderShaderLODThreshold - - Comment - Fraction of draw distance defining the switch to a different shader LOD - Persist - 1 - Type - F32 - Value - 1.0 - - RenderShaderParticleThreshold - - Comment - Fraction of draw distance to not use shader on particles - Persist - 1 - Type - F32 - Value - 0.25 - - RenderSunDynamicRange - - Comment - Defines what percent brighter the sun is than local point lights (1.0 = 100% brighter. Value should not be less than 0. ). - Persist - 1 - Type - F32 - Value - 1.0 - - RenderTerrainDetail - - Comment - Detail applied to terrain texturing (0 = none, 1 or 2 = full) - Persist - 1 - Type - S32 - Value - 2 - - RenderTerrainLODFactor - - Comment - Controls level of detail of terrain (multiplier for current screen area when calculated level of detail) - Persist - 1 - Type - F32 - Value - 1.0 - - RenderTerrainScale - - Comment - Terrain detail texture scale - Persist - 1 - Type - F32 - Value - 12.0 - - RenderTextureMemoryMultiple - - Comment - Multiple of texture memory value to use (should fit: 0 < value <= 1.0) - Persist - 1 - Type - F32 - Value - 1.0 - - RenderTreeLODFactor - - Comment - Controls level of detail of vegetation (multiplier for current screen area when calculated level of detail) - Persist - 1 - Type - F32 - Value - 0.5 - - RenderUIInSnapshot - - Comment - Display user interface in snapshot - Persist - 1 - Type - Boolean - Value - 0 - - RenderUnloadedAvatar - - Comment - Show avatars which haven't finished loading - Persist - 1 - Type - Boolean - Value - 0 - - RenderUseFBO - - Comment - Whether we want to use GL_EXT_framebuffer_objects. - Persist - 1 - Type - Boolean - Value - 0 - - RenderUseFarClip - - Comment - If false, frustum culling will ignore far clip plane. - Persist - 1 - Type - Boolean - Value - 1 - - RenderUseImpostors - - Comment - Whether we want to use impostors for far away avatars. - Persist - 1 - Type - Boolean - Value - 1 - - RenderUseShaderLOD - - Comment - Whether we want to have different shaders for LOD - Persist - 1 - Type - Boolean - Value - 1 - - RenderUseShaderNearParticles - - Comment - Whether we want to use shaders on near particles - Persist - 1 - Type - Boolean - Value - 0 - - RenderVBOEnable - - Comment - Use GL Vertex Buffer Objects - Persist - 1 - Type - Boolean - Value - 1 - - RenderVBOMappingDisable - - Comment - Disable VBO glMapBufferARB - Persist - 1 - Type - Boolean - Value - 1 - - RenderVolumeLODFactor - - Comment - Controls level of detail of primitives (multiplier for current screen area when calculated level of detail) - Persist - 1 - Type - F32 - Value - 1.0 - - RenderWater - - Comment - Display water - Persist - 1 - Type - Boolean - Value - 1 - - RenderWaterMipNormal - - Comment - Use mip maps for water normal map. - Persist - 1 - Type - Boolean - Value - 1 - - RenderWaterRefResolution - - Comment - Water planar reflection resolution. - Persist - 1 - Type - S32 - Value - 512 - - RenderWaterReflections - - Comment - Reflect the environment in the water. - Persist - 1 - Type - Boolean - Value - 0 - - RenderWaterVoidCulling - - Comment - Cull void water objects when off-screen. - Persist - 1 - Type - Boolean - Value - 1 - - RotateRight - - Comment - Make the agent rotate to its right. - Persist - 1 - Type - Boolean - Value - 0 - - RotationStep - - Comment - All rotations via rotation tool are constrained to multiples of this unit (degrees) - Persist - 1 - Type - F32 - Value - 1.0 - - RunBtnState - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - RunMultipleThreads - - Comment - If TRUE keep background threads active during render - Persist - 1 - Type - Boolean - Value - 1 - - SafeMode - - Comment - Reset preferences, run in safe mode. - Persist - 1 - Type - Boolean - Value - 0 - - SaveInventoryScriptsAsMono - - Comment - When editing and saving a script in inventory, configure it to compile as mono when dragged into a task - Persist - 1 - Type - Boolean - Value - 0 - - SaveMinidump - - Comment - Save minidump for developer debugging on crash - Persist - 1 - Type - Boolean - Value - 1 - - ShowMapDestinationInChat - - Comment - Show llMapDestination as slurl in chat - Persist - 1 - Type - Boolean - Value - 0 - - DisableScriptTeleportRequest - - Comment - Don't allow scripts to pop the map - Persist - 1 - Type - Boolean - Value - 0 - - DisableClickSit - - Comment - Never sit by clicking a prim - Persist - 1 - Type - Boolean - Value - 0 - - PlayIMSound - - Comment - Play sound when receiving an IM - Persist - 1 - Type - Boolean - Value - 1 - - IMSoundID - - Comment - UUID of sound to play if PlayIMSound enabled - Persist - 1 - Type - String - Value - 4c366008-65da-2e84-9b74-f58a392b94c6 - - OpenIMOnTyping - - Comment - Open IM tab when typing message received - Persist - 1 - Type - Boolean - Value - 1 - - EnableGestures - - Comment - Enables gestures - Persist - 1 - Type - Boolean - Value - 1 - - DisableAgentUpdates - - Comment - Stops regular agent updates - Persist - 0 - Type - Boolean - Value - 0 - - ScaleShowAxes - - Comment - Show indicator of selected scale axis when scaling - Persist - 1 - Type - Boolean - Value - 0 - - RectangleSelectOverlap - - Comment - Selection box works as long as it remotely touches or something - Persist - 0 - Type - Boolean - Value - 0 - - InterceptorAffectYours - - Comment - Controls whether the interceptor stops your own objects too - Persist - 1 - Type - Boolean - Value - 0 - - InterceptorRange - - Comment - Controls the range of the interceptor effect - Persist - 1 - Type - F32 - Value - 10.0 - - ScaleStretchTextures - - Comment - Stretch textures along with object when scaling - Persist - 1 - Type - Boolean - Value - 1 - - ScaleUniform - - Comment - Scale selected objects evenly about center of selection - Persist - 1 - Type - Boolean - Value - 0 - - ScriptErrorColor - - Comment - Color of script error messages - Persist - 1 - Type - Color4 - Value - - 0.8235294117 - 0.2745098039 - 0.2745098039 - 1.0 - - - ScriptErrorsAsChat - - Comment - Display script errors and warning in chat history - Persist - 1 - Type - Boolean - Value - 0 - - ScriptHelpFollowsCursor - - Comment - Scripting help window updates contents based on script editor contents under text cursor - Persist - 1 - Type - Boolean - Value - 0 - - SearchURLDefault - - Comment - URL to load for empty searches - Persist - 1 - HideFromEditor - 1 - Type - String - Value - http://search.secondlife.com/client_search.php? - - SearchURLDefaultOpenSim - - Comment - URL to load for empty OpenSim searches - Persist - 1 - HideFromEditor - 0 - Type - String - Value - http://webi.metaverseink.com/opensim/results.jsp? - - SearchURLQuery - - Comment - URL to use for searches - Persist - 1 - HideFromEditor - 1 - Type - String - Value - http://search.secondlife.com/client_search.php?q=[QUERY]&s=[COLLECTION]& - - SearchURLSuffix2 - - Comment - Parameters added to end of search queries - Persist - 1 - HideFromEditor - 1 - Type - String - Value - lang=[LANG]&mat=[MATURITY]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION] - - SelectMovableOnly - - Comment - Select only objects you can move - Persist - 1 - Type - Boolean - Value - 0 - - SelectOwnedOnly - - Comment - Select only objects you own - Persist - 1 - Type - Boolean - Value - 0 - - SelectionHighlightAlpha - - Comment - Opacity of selection highlight (0.0 = completely transparent, 1.0 = completely opaque) - Persist - 1 - Type - F32 - Value - 0.40000000596 - - SelectionHighlightAlphaTest - - Comment - Alpha value below which pixels are displayed on selection highlight line (0.0 = show all pixels, 1.0 = show now pixels) - Persist - 1 - Type - F32 - Value - 0.1 - - SelectionHighlightThickness - - Comment - Thickness of selection highlight line (fraction of view distance) - Persist - 1 - Type - F32 - Value - 0.00999999977648 - - SelectionHighlightUAnim - - Comment - Rate at which texture animates along U direction in selection highlight line (fraction of texture per second) - Persist - 1 - Type - F32 - Value - 0.0 - - SelectionHighlightUScale - - Comment - Scale of texture display on selection highlight line (fraction of texture size) - Persist - 1 - Type - F32 - Value - 0.1 - - SelectionHighlightVAnim - - Comment - Rate at which texture animates along V direction in selection highlight line (fraction of texture per second) - Persist - 1 - Type - F32 - Value - 0.5 - - SelectionHighlightVScale - - Comment - Scale of texture display on selection highlight line (fraction of texture size) - Persist - 1 - Type - F32 - Value - 1.0 - - ServerChoice - - Comment - [DO NOT MODIFY] Controls which grid you connect to - Persist - 1 - Type - S32 - Value - 0 - - ShareWithGroup - - Comment - Newly created objects are shared with the currently active group - Persist - 1 - Type - Boolean - Value - 0 - - ShowActiveSpeakers - - Comment - Display active speakers list on login - Persist - 1 - Type - Boolean - Value - 0 - - ShowAllObjectHoverTip - - Comment - Show descriptive tooltip when mouse hovers over non-interactive and interactive objects. - Persist - 1 - Type - Boolean - Value - 0 - - ShowAxes - - Comment - Render coordinate frame at your position - Persist - 1 - Type - Boolean - Value - 0 - - ShowBanLines - - Comment - Show in-world ban/access borders - Persist - 1 - Type - Boolean - Value - 1 - - ShowCameraControls - - Comment - Display camera controls on login - Persist - 1 - Type - Boolean - Value - 0 - - ShowChatHistory - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - ShowCommunicate - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - ShowConsoleWindow - - Comment - Show log in separate OS window - Persist - 1 - Type - Boolean - Value - 0 - - ShowCrosshairs - - Comment - Display crosshairs when in mouselook mode - Persist - 1 - Type - Boolean - Value - 1 - - ShowDebugConsole - - Comment - Show log in SL window - Persist - 1 - Type - Boolean - Value - 0 - - ShowDebugStats - - Comment - Show performance stats display - Persist - 1 - Type - Boolean - Value - 0 - - ShowDirectory - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - ShowEmptyFoldersWhenSearching - - Comment - Shows folders that do not have any visible contents when applying a filter to inventory - Persist - 1 - Type - Boolean - Value - 0 - - ShowHoverTips - - Comment - Show descriptive tooltip when mouse hovers over items in world - Persist - 1 - Type - Boolean - Value - 1 - - ShowInventory - - Comment - Open inventory window on login - Persist - 1 - Type - Boolean - Value - 0 - - ShowLandHoverTip - - Comment - Show descriptive tooltip when mouse hovers over land - Persist - 1 - Type - Boolean - Value - 0 - - ShowLeaders - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - ShowPGSearchAll - - Comment - Display results of search All that are flagged as PG - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 1 - - ShowMatureSearchAll - - Comment - Display results of search All that are flagged as mature - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowAdultSearchAll - - Comment - Display results of search All that are flagged as adult - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowPGGroups - - Comment - Display results of find groups that are flagged as PG - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 1 - - ShowMatureGroups - - Comment - Display results of find groups that are flagged as mature - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowAdultGroups - - Comment - Display results of find groups that are flagged as adult - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowPGClassifieds - - Comment - Display results of find classifieds that are flagged as PG - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 1 - - ShowMatureClassifieds - - Comment - Display results of find classifieds that are flagged as mature - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowAdultClassifieds - - Comment - Display results of find classifieds that are flagged as adult - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowPGEvents - - Comment - Display results of find events that are flagged as PG - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 1 - - ShowMatureEvents - - Comment - Display results of find events that are flagged as mature - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowAdultEvents - - Comment - Display results of find events that are flagged as adult - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowPGLand - - Comment - Display results of find land sales that are flagged as PG - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 1 - - ShowMatureLand - - Comment - Display results of find land sales that are flagged as mature - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowAdultLand - - Comment - Display results of find land sales that are flagged as adult - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowPGSims - - Comment - Display results of find places or find popular that are in PG sims - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 1 - - ShowMatureSims - - Comment - Display results of find places or find popular that are in mature sims - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowAdultSims - - Comment - Display results of find places or find popular that are in adult sims - Persist - 1 - HideFromEditor - 1 - Type - Boolean - Value - 0 - - ShowMiniMap - - Comment - Display mini map on login - Persist - 1 - Type - Boolean - Value - 1 - - ShowMovementControls - - Comment - Display movement controls on login - Persist - 1 - Type - Boolean - Value - 0 - - ShowNearClip - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - ShowNewInventory - - Comment - Automatically views new notecards/textures/landmarks - Persist - 1 - Type - Boolean - Value - 1 - - ShowInInventory - - Comment - Automatically opens inventory to show accepted objects - Persist - 1 - Type - Boolean - Value - 1 - - ShowObjectUpdates - - Comment - Show when update messages are received for individual objects - Persist - 0 - Type - Boolean - Value - 0 - - ShowOverlayTitle - - Comment - Prints watermark text message on screen - Persist - 1 - Type - Boolean - Value - 0 - - ShowParcelOwners - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - ShowPermissions - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - ShowPropertyLines - - Comment - Show line overlay demarking property boundaries - Persist - 1 - Type - Boolean - Value - 0 - - ShowSearchBar - - Comment - Show the Search Bar in the Status Overlay - Persist - 1 - Type - Boolean - Value - 0 - - ShowStartLocation - - Comment - Display starting location menu on login screen - Persist - 1 - Type - Boolean - Value - 1 - - ShowTangentBasis - - Comment - Render normal and binormal (debugging bump mapping) - Persist - 1 - Type - Boolean - Value - 0 - - ShowToolBar - - Comment - Show toolbar at bottom of screen - Persist - 1 - Type - Boolean - Value - 1 - - ShowTools - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - ShowTutorial - - Comment - Show tutorial window on login - Persist - 1 - Type - Boolean - Value - 0 - - ShowVoiceChannelPopup - - Comment - Controls visibility of the current voice channel popup above the voice tab - Persist - 1 - Type - Boolean - Value - 0 - - ShowVolumeSettingsPopup - - Comment - Show individual volume slider for voice, sound effects, etc - Persist - 1 - Type - Boolean - Value - 0 - - ShowWorldMap - - Comment - Display world map on login - Persist - 1 - Type - Boolean - Value - 0 - - ShowXUINames - - Comment - Display XUI Names as Tooltips - Persist - 0 - Type - Boolean - Value - 0 - - SitBtnState - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - SkyAmbientScale - - Comment - Controls strength of ambient, or non-directional light from the sun and moon (fraction or multiple of default ambient level) - Persist - 1 - Type - F32 - Value - 0.300000011921 - - SkyEditPresets - - Comment - Whether to be able to edit the sky defaults or not - Persist - 1 - Type - Boolean - Value - 0 - - SkyNightColorShift - - Comment - Controls moonlight color (base color applied to moon as light source) - Persist - 1 - Type - Color3 - Value - - 0.699999988079 - 0.699999988079 - 1.0 - - - SkyOverrideSimSunPosition - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - SkySunDefaultPosition - - Comment - Default position of sun in sky (direction in world coordinates) - Persist - 1 - Type - Vector3 - Value - - 1.0 - 0.0 - 0.1 - - - SkyUseClassicClouds - - Comment - Whether to use the old Second Life particle clouds or not - Persist - 1 - Type - Boolean - Value - 1 - - SlideLeftBtnRect - - Comment - - Persist - 0 - Type - Rect - Value - - 20 - 54 - 45 - 29 - - - SlideRightBtnRect - - Comment - - Persist - 0 - Type - Rect - Value - - 66 - 54 - 91 - 29 - - - SmallAvatarNames - - Comment - Display avatar name text in smaller font - Persist - 1 - Type - Boolean - Value - 1 - - SnapEnabled - - Comment - Enable snapping to grid - Persist - 1 - Type - Boolean - Value - 1 - - SnapMargin - - Comment - Controls maximum distance between windows before they auto-snap together (pixels) - Persist - 1 - Type - S32 - Value - 10 - - SnapToMouseCursor - - Comment - When snapping to grid, center object on nearest grid point to mouse cursor - Persist - 1 - Type - Boolean - Value - 0 - - SnapshotFormat - - Comment - Save snapshots in this format (0 = PNG, 1 = JPEG, 2 = BMP) - Persist - 1 - Type - S32 - Value - 0 - - SnapshotLocalLastResolution - - Comment - Take next local snapshot at this resolution - Persist - 1 - Type - S32 - Value - 0 - - SnapshotPostcardLastResolution - - Comment - Take next postcard snapshot at this resolution - Persist - 1 - Type - S32 - Value - 0 - - SnapshotQuality - - Comment - Quality setting of postcard JPEGs (0 = worst, 100 = best) - Persist - 1 - Type - S32 - Value - 75 - - SnapshotTextureLastResolution - - Comment - Take next texture snapshot at this resolution - Persist - 1 - Type - S32 - Value - 0 - - SpeakingColor - - Comment - Color of various indicators when resident is speaking on a voice channel. - Persist - 1 - Type - Color4 - Value - - 0.0 - 1.0 - 0.0 - 1.0 - - - SpeedTest - - Comment - Performance testing mode, no network - Persist - 1 - Type - Boolean - Value - 0 - - StatsAutoRun - - Comment - Play back autopilot - Persist - 1 - Type - Boolean - Value - 0 - - StatsFile - - Comment - Filename for stats logging output - Persist - 1 - Type - String - Value - fs.txt - - StatsNumRuns - - Comment - Loop autopilot playback this number of times - Persist - 1 - Type - S32 - Value - -1 - - StatsPilotFile - - Comment - Filename for stats logging autopilot path - Persist - 1 - Type - String - Value - pilot.txt - - StatsQuitAfterRuns - - Comment - Quit application after this number of autopilot playback runs - Persist - 1 - Type - Boolean - Value - 0 - - StatsSessionTrackFrameStats - - Comment - Track rendering and network statistics - Persist - 1 - Type - Boolean - Value - 0 - - StatsSummaryFile - - Comment - Filename for stats logging summary - Persist - 1 - Type - String - Value - fss.txt - - StatusBarHeight - - Comment - Height of menu/status bar at top of screen (pixels) - Persist - 1 - Type - S32 - Value - 26 - - StatusBarPad - - Comment - Spacing between popup buttons at bottom of screen (Stand up, Release Controls) - Persist - 1 - Type - S32 - Value - 10 - - SystemLanguage - - Comment - Language indicated by system settings (for UI) - Persist - 1 - Type - String - Value - en-us - - TabToTextFieldsOnly - - Comment - TAB key takes you to next text entry field, instead of next widget - Persist - 1 - Type - Boolean - Value - 0 - - TemporaryUpload - - Comment - Whether or not a upload is temporary - Persist - 0 - Type - Boolean - Value - 0 - - TerrainColorHeightRange - - Comment - Altitude range over which a given terrain texture has effect (meters) - Persist - 1 - Type - F32 - Value - 60.0 - - TerrainColorStartHeight - - Comment - Starting altitude for terrain texturing (meters) - Persist - 1 - Type - F32 - Value - 20.0 - - TextureMemory - - Comment - Amount of memory to use for textures in MB (0 = autodetect) - Persist - 1 - Type - S32 - Value - 0 - - TexturePickerRect - - Comment - Rectangle for texture picker - Persist - 1 - Type - Rect - Value - - 0 - 290 - 350 - 0 - - - TexturePickerShowFolders - - Comment - Show folders with no texures in texture picker - Persist - 1 - Type - Boolean - Value - 1 - - TexturePickerSortOrder - - Comment - Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) - Persist - 1 - Type - U32 - Value - 2 - - ThirdPersonBtnState - - Comment - - Persist - 0 - Type - Boolean - Value - 1 - - ThrottleBandwidthKBPS - - Comment - Maximum allowable downstream bandwidth (kilo bits per second) - Persist - 1 - Type - F32 - Value - 2000.0 - - ToolHelpRect - - Comment - - Persist - 0 - Type - Rect - Value - - 8 - 178 - 75 - 162 - - - ToolTipDelay - - Comment - Seconds before displaying tooltip when mouse stops over UI element - Persist - 1 - Type - F32 - Value - 0.699999988079 - - ToolboxAutoMove - - Comment - [NOT USED] - Persist - 1 - Type - Boolean - Value - 0 - - ToolboxRect - - Comment - Rectangle for tools window - Persist - 1 - Type - Rect - Value - - 0 - 100 - 100 - 100 - - - TrackFocusObject - - Comment - Camera tracks last object zoomed on - Persist - 1 - Type - Boolean - Value - 1 - - TurnLeftBtnRect - - Comment - - Persist - 0 - Type - Rect - Value - - 20 - 29 - 45 - 4 - - - TurnRightBtnRect - - Comment - - Persist - 0 - Type - Rect - Value - - 66 - 29 - 91 - 4 - - - TutorialURL - - Comment - URL for tutorial menu item, set automatically during login - Persist - 0 - Type - String - Value - - - TypeAheadTimeout - - Comment - Time delay before clearing type-ahead buffer in lists (seconds) - Persist - 1 - Type - F32 - Value - 1.5 - - UIAutoScale - - Comment - Keep UI scale consistent across different resolutions - Persist - 1 - Type - Boolean - Value - 1 - - UIFloaterTestBool - - Comment - Example saved setting for the test floater - Persist - 1 - Type - Boolean - Value - 0 - - UIImgBtnCloseActiveUUID - - Comment - - Persist - 0 - Type - String - Value - 47a8c844-cd2a-4b1a-be01-df8b1612fe5d - - UIImgBtnCloseInactiveUUID - - Comment - - Persist - 0 - Type - String - Value - 779e4fa3-9b13-f74a-fba9-3886fe9c86ba - - UIImgBtnClosePressedUUID - - Comment - - Persist - 0 - Type - String - Value - e5821134-23c0-4bd0-af06-7fa95b9fb01a - - UIImgBtnForwardInUUID - - Comment - - Persist - 0 - Type - String - Value - 54197a61-f5d1-4c29-95d2-c071d08849cb - - UIImgBtnForwardOutUUID - - Comment - - Persist - 0 - Type - String - Value - a0eb4021-1b20-4a53-892d-8faa9265a6f5 - - UIImgBtnJumpLeftInUUID - - Comment - - Persist - 0 - Type - String - Value - 9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1 - - UIImgBtnJumpLeftOutUUID - - Comment - - Persist - 0 - Type - String - Value - 3c18c87e-5f50-14e2-e744-f44734aa365f - - UIImgBtnJumpRightInUUID - - Comment - - Persist - 0 - Type - String - Value - 7dabc040-ec13-2309-ddf7-4f161f6de2f4 - - UIImgBtnJumpRightOutUUID - - Comment - - Persist - 0 - Type - String - Value - ff9a71eb-7414-4cf8-866e-a701deb7c3cf - - UIImgBtnLeftInUUID - - Comment - - Persist - 0 - Type - String - Value - 95463c78-aaa6-464d-892d-3a805b6bb7bf - - UIImgBtnLeftOutUUID - - Comment - - Persist - 0 - Type - String - Value - 13a93910-6b44-45eb-ad3a-4d1324c59bac - - UIImgBtnMinimizeActiveUUID - - Comment - - Persist - 0 - Type - String - Value - 34c9398d-bb78-4643-9633-46a2fa3e9637 - - UIImgBtnMinimizeInactiveUUID - - Comment - - Persist - 0 - Type - String - Value - 6e72abba-1378-437f-bf7a-f0c15f3e99a3 - - UIImgBtnMinimizePressedUUID - - Comment - - Persist - 0 - Type - String - Value - 39801651-26cb-4926-af57-7af9352c273c - - UIImgBtnMoveDownInUUID - - Comment - - Persist - 0 - Type - String - Value - b92a70b9-c841-4c94-b4b3-cee9eb460d48 - - UIImgBtnMoveDownOutUUID - - Comment - - Persist - 0 - Type - String - Value - b5abc9fa-9e62-4e03-bc33-82c4c1b6b689 - - UIImgBtnMoveUpInUUID - - Comment - - Persist - 0 - Type - String - Value - 49b4b357-e430-4b56-b9e0-05b8759c3c82 - - UIImgBtnMoveUpOutUUID - - Comment - - Persist - 0 - Type - String - Value - f887146d-829f-4e39-9211-cf872b78f97c - - UIImgBtnPanDownInUUID - - Comment - - Persist - 0 - Type - String - Value - e5821134-23c0-4bd0-af06-7fa95b9fb01a - - UIImgBtnPanDownOutUUID - - Comment - - Persist - 0 - Type - String - Value - 47a8c844-cd2a-4b1a-be01-df8b1612fe5d - - UIImgBtnPanLeftInUUID - - Comment - - Persist - 0 - Type - String - Value - e5821134-23c0-4bd0-af06-7fa95b9fb01a - - UIImgBtnPanLeftOutUUID - - Comment - - Persist - 0 - Type - String - Value - 47a8c844-cd2a-4b1a-be01-df8b1612fe5d - - UIImgBtnPanRightInUUID - - Comment - - Persist - 0 - Type - String - Value - e5821134-23c0-4bd0-af06-7fa95b9fb01a - - UIImgBtnPanRightOutUUID - - Comment - - Persist - 0 - Type - String - Value - 47a8c844-cd2a-4b1a-be01-df8b1612fe5d - - UIImgBtnPanUpInUUID - - Comment - - Persist - 0 - Type - String - Value - e5821134-23c0-4bd0-af06-7fa95b9fb01a - - UIImgBtnPanUpOutUUID - - Comment - - Persist - 0 - Type - String - Value - 47a8c844-cd2a-4b1a-be01-df8b1612fe5d - - UIImgBtnRestoreActiveUUID - - Comment - - Persist - 0 - Type - String - Value - 111b39de-8928-4690-b7b2-e17d5c960277 - - UIImgBtnRestoreInactiveUUID - - Comment - - Persist - 0 - Type - String - Value - 0eafa471-70af-4882-b8c1-40a310929744 - - UIImgBtnRestorePressedUUID - - Comment - - Persist - 0 - Type - String - Value - 90a0ed5c-2e7b-4845-9958-a64a1b30f312 - - UIImgBtnRightInUUID - - Comment - - Persist - 0 - Type - String - Value - 5e616d0d-4335-476f-9977-560bccd009da - - UIImgBtnRightOutUUID - - Comment - - Persist - 0 - Type - String - Value - 5a44fd04-f52b-4c30-8b00-4a31e27614bd - - UIImgBtnScrollDownInUUID - - Comment - - Persist - 0 - Type - String - Value - d2421bab-2eaf-4863-b8f6-5e4c52519247 - - UIImgBtnScrollDownOutUUID - - Comment - - Persist - 0 - Type - String - Value - b4ecdecf-5c8d-44e7-b882-17a77e88ed55 - - UIImgBtnScrollLeftInUUID - - Comment - - Persist - 0 - Type - String - Value - ea137a32-6718-4d05-9c22-7d570d27b2cd - - UIImgBtnScrollLeftOutUUID - - Comment - - Persist - 0 - Type - String - Value - 43773e8d-49aa-48e0-80f3-a04715f4677a - - UIImgBtnScrollRightInUUID - - Comment - - Persist - 0 - Type - String - Value - b749de64-e903-4c3c-ac0b-25fb6fa39cb5 - - UIImgBtnScrollRightOutUUID - - Comment - - Persist - 0 - Type - String - Value - 3d700d19-e708-465d-87f2-46c8c0ee7938 - - UIImgBtnScrollUpInUUID - - Comment - - Persist - 0 - Type - String - Value - a93abdf3-27b5-4e22-a8fa-c48216cd2e3a - - UIImgBtnScrollUpOutUUID - - Comment - - Persist - 0 - Type - String - Value - dad084d7-9a46-452a-b0ff-4b9f1cefdde9 - - UIImgBtnSlideLeftInUUID - - Comment - - Persist - 0 - Type - String - Value - 724996f5-b956-46f6-9844-4fcfce1d5e83 - - UIImgBtnSlideLeftOutUUID - - Comment - - Persist - 0 - Type - String - Value - 82476321-0374-4c26-9567-521535ab4cd7 - - UIImgBtnSlideRightInUUID - - Comment - - Persist - 0 - Type - String - Value - 7eeb57d2-3f37-454d-a729-8b217b8be443 - - UIImgBtnSlideRightOutUUID - - Comment - - Persist - 0 - Type - String - Value - 1fbe4e60-0607-44d1-a50a-032eff56ae75 - - UIImgBtnSpinDownInUUID - - Comment - - Persist - 0 - Type - String - Value - a985ac71-052f-48e6-9c33-d931c813ac92 - - UIImgBtnSpinDownOutUUID - - Comment - - Persist - 0 - Type - String - Value - b6d240dd-5602-426f-b606-bbb49a30726d - - UIImgBtnSpinUpInUUID - - Comment - - Persist - 0 - Type - String - Value - c8450082-96a0-4319-8090-d3ff900b4954 - - UIImgBtnSpinUpOutUUID - - Comment - - Persist - 0 - Type - String - Value - 56576e6e-6710-4e66-89f9-471b59122794 - - UIImgBtnTabBottomInUUID - - Comment - - Persist - 0 - Type - String - Value - c001d8fd-a869-4b6f-86a1-fdcb106df9c7 - - UIImgBtnTabBottomOutUUID - - Comment - - Persist - 0 - Type - String - Value - bf0a8779-689b-48c3-bb9a-6af546366ef4 - - UIImgBtnTabBottomPartialInUUID - - Comment - - Persist - 0 - Type - String - Value - eb0b0904-8c91-4f24-b500-1180b91140de - - UIImgBtnTabBottomPartialOutUUID - - Comment - - Persist - 0 - Type - String - Value - 8dca716c-b29c-403a-9886-91c028357d6e - - UIImgBtnTabTopInUUID - - Comment - - Persist - 0 - Type - String - Value - 16d032e8-817b-4368-8a4e-b7b947ae3889 - - UIImgBtnTabTopOutUUID - - Comment - - Persist - 0 - Type - String - Value - 1ed83f57-41cf-4052-a3b4-2e8bb78d8191 - - UIImgBtnTabTopPartialInUUID - - Comment - - Persist - 0 - Type - String - Value - 7c6c6c26-0e25-4438-89bd-30d8b8e9d704 - - UIImgBtnTabTopPartialOutUUID - - Comment - - Persist - 0 - Type - String - Value - 932ad585-0e45-4a57-aa23-4cf81beeb7b0 - - UIImgBtnTearOffActiveUUID - - Comment - - Persist - 0 - Type - String - Value - 74e1a96f-4833-a24d-a1bb-1bce1468b0e7 - - UIImgBtnTearOffInactiveUUID - - Comment - - Persist - 0 - Type - String - Value - 74e1a96f-4833-a24d-a1bb-1bce1468b0e7 - - UIImgBtnTearOffPressedUUID - - Comment - - Persist - 0 - Type - String - Value - d2524c13-4ba6-af7c-e305-8ac6cc18d86a - - UIImgCheckboxActiveSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - cf4a2ed7-1533-4686-9dde-df9a37ddca55 - - UIImgCheckboxActiveUUID - - Comment - - Persist - 0 - Type - String - Value - 05bb64ee-96fd-4243-b74e-f40a41bc53ba - - UIImgCheckboxInactiveSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - c817c642-9abd-4236-9287-ae0513fe7d2b - - UIImgCheckboxInactiveUUID - - Comment - - Persist - 0 - Type - String - Value - 7d94cb59-32a2-49bf-a516-9e5a2045f9d9 - - UIImgCreateSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - 0098b015-3daf-4cfe-a72f-915369ea97c2 - - UIImgCreateUUID - - Comment - - Persist - 0 - Type - String - Value - 7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b - - UIImgCrosshairsUUID - - Comment - Image to use for crosshair display (UUID texture reference) - Persist - 1 - Type - String - Value - 6e1a3980-bf2d-4274-8970-91e60d85fb52 - - UIImgDefaultEyesUUID - - Comment - - Persist - 0 - Type - String - Value - 6522e74d-1660-4e7f-b601-6f48c1659a77 - - UIImgDefaultGlovesUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultHairUUID - - Comment - - Persist - 0 - Type - String - Value - 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b - - UIImgDefaultJacketUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultPantsUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultShirtUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultShoesUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultSkirtUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultSocksUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultAlphaUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultAlphaUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultAlphaUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDefaultUnderwearUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgDirectionArrowUUID - - Comment - - Persist - 0 - Type - String - Value - 586383e8-4d9b-4fba-9196-2b5938e79c2c - - UIImgFaceSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - b4870163-6208-42a9-9801-93133bf9a6cd - - UIImgFaceUUID - - Comment - - Persist - 0 - Type - String - Value - ce15fd63-b0b6-463c-a37d-ea6393208b3e - - UIImgFocusSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - ab6a730e-ddfd-4982-9a32-c6de3de6d31d - - UIImgFocusUUID - - Comment - - Persist - 0 - Type - String - Value - 57bc39d1-288c-4519-aea6-6d1786a5c274 - - UIImgGrabSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - c1e21504-f136-451d-b8e9-929037812f1d - - UIImgGrabUUID - - Comment - - Persist - 0 - Type - String - Value - c63f124c-6340-4fbf-b59e-0869a44adb64 - - UIImgMoveSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - 46f17c7b-8381-48c3-b628-6a406e060dd6 - - UIImgMoveUUID - - Comment - - Persist - 0 - Type - String - Value - 2fa5dc06-bcdd-4e09-a426-f9f262d4fa65 - - UIImgRadioActiveSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - 52f09e07-5816-4052-953c-94c6c10479b7 - - UIImgRadioActiveUUID - - Comment - - Persist - 0 - Type - String - Value - 7a1ba9b8-1047-4d1e-9cfc-bc478c80b63f - - UIImgRadioInactiveSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - 1975db39-aa29-4251-aea0-409ac09d414d - - UIImgRadioInactiveUUID - - Comment - - Persist - 0 - Type - String - Value - 90688481-67ff-4af0-be69-4aa084bcad1e - - UIImgResizeBottomRightUUID - - Comment - - Persist - 0 - Type - String - Value - e3690e25-9690-4f6c-a745-e7dcd885285a - - UIImgRotateSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - cdfb7fde-0d13-418a-9d89-2bd91019fc95 - - UIImgRotateUUID - - Comment - - Persist - 0 - Type - String - Value - c34b1eaa-aae3-4351-b082-e26c0b636779 - - UIImgScaleSelectedUUID - - Comment - - Persist - 0 - Type - String - Value - 55aa57ef-508a-47f7-8867-85d21c5a810d - - UIImgScaleUUID - - Comment - - Persist - 0 - Type - String - Value - 88a90fef-b448-4883-9344-ecf378a60433 - - UIImgWhiteUUID - - Comment - - Persist - 0 - Type - String - Value - 5748decc-f629-461c-9a36-a35a221fe21f - - UIImgInvisibleUUID - - Comment - - Persist - 0 - Type - String - Value - 38b86f85-2575-52a9-a531-23108d8da837 - - UIScaleFactor - - Comment - Size of UI relative to default layout on 1024x768 screen - Persist - 1 - Type - F32 - Value - 1.0 - - UploadBakedTexOld - - Comment - Forces the baked texture pipeline to upload using the old method. - Persist - 1 - Type - Boolean - Value - 0 - - UseAltKeyForMenus - - Comment - Access menus via keyboard by tapping Alt - Persist - 1 - Type - Boolean - Value - 0 - - UseChatBubbles - - Comment - Show chat above avatars head in chat bubbles - Persist - 1 - Type - Boolean - Value - 0 - - UseDebugMenus - - Comment - Turns on "Debug" menu - Persist - 1 - Type - Boolean - Value - 1 - - UseDefaultColorPicker - - Comment - Use color picker supplied by operating system - Persist - 1 - Type - Boolean - Value - 0 - - UseEnergy - - Comment - - Persist - 0 - Type - Boolean - Value - 1 - - UseExternalBrowser - - Comment - Use default browser when opening web pages instead of in-world browser. - Persist - 1 - Type - Boolean - Value - 0 - - UseFreezeFrame - - Comment - Freeze time when taking snapshots. - Persist - 1 - Type - Boolean - Value - 0 - - UseInventoryLinks - - Comment - When making a new outfit, use links for no-copy items - Persist - 1 - Type - Boolean - Value - 1 - - UseOcclusion - - Comment - Enable object culling based on occlusion (coverage) by other objects - Persist - 1 - Type - Boolean - Value - 1 - - SkipReflectOcclusionUpdates - - Comment - Enable optimization that prevents occlusion updates for refelction pass - Persist - 1 - Type - Boolean - Value - 1 - - UseOutfitFolders - - Comment - When making a new outfit, use Viewer 2 outfit folders - Persist - 1 - Type - Boolean - Value - 1 - - RenderDelayVBUpdate - - Comment - Delay vertex buffer updates until just before rendering - Persist - 1 - Type - Boolean - Value - 1 - - UseNewWalkRun - - Comment - Replace standard walk/run animations with new ones. - Persist - 1 - Type - Boolean - Value - 1 - - UseCrossWalkRun - - Comment - Use opposite gender walk/run animations. - Persist - 1 - Type - Boolean - Value - 0 - - UseStartScreen - - Comment - Whether to load a start screen image or not. - Persist - 1 - Type - Boolean - Value - 1 - - UseWebPagesOnPrims - - Comment - [NOT USED] - Persist - 1 - Type - Boolean - Value - 0 - - UserConnectionPort - - Comment - Port that this client transmits on. - Persist - 1 - Type - U32 - Value - 0 - - UserLogFile - - Comment - User specified log file name. - Persist - 1 - Type - String - Value - - - UserLoginInfo - - Comment - Users loging data. - Persist - 1 - Type - LLSD - Value - - - - VFSOldSize - - Comment - [DO NOT MODIFY] Controls resizing of local file cache - Persist - 1 - Type - U32 - Value - 0 - - VFSSalt - - Comment - [DO NOT MODIFY] Controls local file caching behavior - Persist - 1 - Type - U32 - Value - 1 - - VectorizeEnable - - Comment - Enable general vector operations and data alignment. - Persist - 1 - Type - Boolean - Value - 1 - - VectorizePerfTest - - Comment - Test SSE/vectorization performance and choose fastest version. - Persist - 1 - Type - Boolean - Value - 1 - - VectorizeProcessor - - Comment - 0=Compiler Default, 1=SSE, 2=SSE2, autodetected - Persist - 0 - Type - U32 - Value - 0 - - VectorizeSkin - - Comment - Enable vector operations for avatar skinning. - Persist - 1 - Type - Boolean - Value - 1 - - VelocityInterpolate - - Comment - Extrapolate object motion from last packet based on received velocity - Persist - 1 - Type - Boolean - Value - 1 - - VerboseLogs - - Comment - Display source file and line number for each log item for debugging purposes - Persist - 1 - Type - Boolean - Value - 0 - - VersionChannelName - - Comment - Versioning Channel Name. - Persist - 1 - Type - String - Value - Ascent Viewer Release - - VertexShaderEnable - - Comment - Enable/disable all GLSL shaders (debug) - Persist - 1 - Type - Boolean - Value - 0 - - VivoxAutoPostCrashDumps - - Comment - If true, SLVoice will automatically send crash dumps directly to Vivox. - Persist - 1 - Type - Boolean - Value - 0 - - VivoxDebugLevel - - Comment - Logging level to use when launching the vivox daemon - Persist - 1 - Type - String - Value - -1 - - VivoxDebugSIPURIHostName - - Comment - Hostname portion of vivox SIP URIs (empty string for the default). - Persist - 1 - Type - String - Value - - - VivoxDebugVoiceAccountServerURI - - Comment - URI to the vivox account management server (empty string for the default). - Persist - 1 - Type - String - Value - - - VoiceCallsFriendsOnly - - Comment - Only accept voice calls from residents on your friends list - Persist - 1 - Type - Boolean - Value - 0 - - AutoDisengageMic - - Comment - Automatically turn off the microphone when ending IM calls. - Persist - 1 - Type - Boolean - Value - 1 - - VoiceEarLocation - - Comment - Location of the virtual ear for voice - Persist - 1 - Type - S32 - Value - 0 - - VoiceHost - - Comment - Client SLVoice host to connect to - Persist - 1 - Type - String - Value - 127.0.0.1 - - VoiceImageLevel0 - - Comment - Texture UUID for voice image level 0 - Persist - 1 - Type - String - Value - 041ee5a0-cb6a-9ac5-6e49-41e9320507d5 - - VoiceImageLevel1 - - Comment - Texture UUID for voice image level 1 - Persist - 1 - Type - String - Value - 29de489d-0491-fb00-7dab-f9e686d31e83 - - VoiceImageLevel2 - - Comment - Texture UUID for voice image level 2 - Persist - 1 - Type - String - Value - 29de489d-0491-fb00-7dab-f9e686d31e83 - - VoiceImageLevel3 - - Comment - Texture UUID for voice image level 3 - Persist - 1 - Type - String - Value - 29de489d-0491-fb00-7dab-f9e686d31e83 - - VoiceImageLevel4 - - Comment - Texture UUID for voice image level 4 - Persist - 1 - Type - String - Value - 29de489d-0491-fb00-7dab-f9e686d31e83 - - VoiceImageLevel5 - - Comment - Texture UUID for voice image level 5 - Persist - 1 - Type - String - Value - 29de489d-0491-fb00-7dab-f9e686d31e83 - - VoiceImageLevel6 - - Comment - Texture UUID for voice image level 6 - Persist - 1 - Type - String - Value - 29de489d-0491-fb00-7dab-f9e686d31e83 - - VoiceInputAudioDevice - - Comment - Audio input device to use for voice - Persist - 1 - Type - String - Value - Default - - VoiceOutputAudioDevice - - Comment - Audio output device to use for voice - Persist - 1 - Type - String - Value - Default - - VoicePort - - Comment - Client SLVoice port to connect to - Persist - 1 - Type - U32 - Value - 44125 - - WLSkyDetail - - Comment - Controls vertex detail on the WindLight sky. Lower numbers will give better performance and uglier skies. - Persist - 1 - Type - U32 - Value - 64 - - WarnAboutBadPCI - - Comment - Enables AboutBadPCI warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnAboutDirectX9 - - Comment - Enables AboutDirectX9 warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnAboutOldGraphicsDriver - - Comment - Enables AboutOldGraphicsDriver warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnAboutPCIGraphics - - Comment - Enables AboutPCIGraphics warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnBrowserLaunch - - Comment - Enables BrowserLaunch warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnDeedObject - - Comment - Enables DeedObject warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstAO - - Comment - Enables FirstAO warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstAppearance - - Comment - Enables FirstAppearance warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstAttach - - Comment - Enables FirstAttach warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstBalanceDecrease - - Comment - Enables FirstBalanceDecrease warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstBalanceIncrease - - Comment - Enables FirstBalanceIncrease warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstBuild - - Comment - Enables FirstBuild warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstDebugMenus - - Comment - Enables FirstDebugMenus warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstFlexible - - Comment - Enables FirstFlexible warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstGoTo - - Comment - Enables FirstGoTo warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstInventory - - Comment - Enables FirstInventory warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstLeftClickNoHit - - Comment - Enables FirstLeftClickNoHit warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstMap - - Comment - Enables FirstMap warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstMedia - - Comment - Enables FirstMedia warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstOverrideKeys - - Comment - Enables FirstOverrideKeys warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstSandbox - - Comment - Enables FirstSandbox warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstSculptedPrim - - Comment - Enables FirstSculptedPrim warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstSit - - Comment - Enables FirstSit warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstStreamingMusic - - Comment - Enables FirstStreamingMusic warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstStreamingVideo - - Comment - Enables FirstStreamingVideo warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstTeleport - - Comment - Enables FirstTeleport warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnFirstVoice - - Comment - Enables FirstVoice warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnNewClassified - - Comment - Enables NewClassified warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnQuickTimeInstalled - - Comment - Enables QuickTimeInstalled warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WarnReturnToOwner - - Comment - Enables ReturnToOwner warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - WatchdogEnabled - - Comment - Controls whether the thread watchdog timer is activated. - Persist - 0 - Type - Boolean - Value - 0 - - WaterEditPresets - - Comment - Whether to be able to edit the water defaults or not - Persist - 1 - Type - Boolean - Value - 0 - - WaterGLFogDensityScale - - Comment - Maps shader water fog density to gl fog density - Persist - 1 - Type - F32 - Value - 0.02 - - WaterGLFogDepthFloor - - Comment - Controls how dark water gl fog can get - Persist - 1 - Type - F32 - Value - 0.25 - - WaterGLFogDepthScale - - Comment - Controls how quickly gl fog gets dark under water - Persist - 1 - Type - F32 - Value - 50.0 - - WindLightUseAtmosShaders - - Comment - Whether to enable or disable WindLight atmospheric shaders. - Persist - 1 - Type - Boolean - Value - 1 - - WindowHeight - - Comment - SL viewer window height - Persist - 1 - Type - S32 - Value - 700 - - WindowMaximized - - Comment - SL viewer window maximized on login - Persist - 1 - Type - Boolean - Value - 0 - - WindowWidth - - Comment - SL viewer window width - Persist - 1 - Type - S32 - Value - 1000 - - WindowX - - Comment - X coordinate of lower left corner of SL viewer window, relative to primary display (pixels) - Persist - 1 - Type - S32 - Value - 10 - - WindowY - - Comment - Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels) - Persist - 1 - Type - S32 - Value - 10 - - WornItemsSortOrder - - Comment - Specifies sort key for worn inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) - Persist - 1 - Type - U32 - Value - 7 - - XferThrottle - - Comment - Maximum allowable downstream bandwidth for asset transfers (bits per second) - Persist - 1 - Type - F32 - Value - 150000.0 - - YawFromMousePosition - - Comment - Horizontal range over which avatar head tracks mouse position (degrees of head rotation from left of window to right) - Persist - 1 - Type - F32 - Value - 90.0 - - YieldTime - - Comment - Yield some time to the local host. - Persist - 1 - Type - S32 - Value - -1 - - ZoomDirect - - Comment - Map Joystick zoom axis directly to camera zoom. - Persist - 1 - Type - Boolean - Value - 0 - - ZoomTime - - Comment - Time of transition between different camera modes (seconds) - Persist - 1 - Type - F32 - Value - 0.40000000596 - - particlesbeacon - - Comment - Beacon / Highlight particle generators - Persist - 1 - Type - Boolean - Value - 0 - - physicalbeacon - - Comment - Beacon / Highlight physical objects - Persist - 1 - Type - Boolean - Value - 1 - - renderbeacons - - Comment - Beacon / Highlight particle generators - Persist - 1 - Type - Boolean - Value - 0 - - renderhighlights - - Comment - Beacon / Highlight scripted objects with touch function - Persist - 1 - Type - Boolean - Value - 1 - - renderattachment - - Comment - Render beacons for / Highlight attached objects as well - Persist - 1 - Type - Boolean - Value - 0 - - renderbyowner - - Comment - Render beacons/highlights for objects owned by anyone (0), you (1) or others (2) - Persist - 1 - Type - U32 - Value - 0 - - invisiblesoundsbeacon - - Comment - Beacon / Highlight invisible (non-object) sound generators - Persist - 1 - Type - Boolean - Value - 0 - - scriptsbeacon - - Comment - Beacon / Highlight scripted objects - Persist - 1 - Type - Boolean - Value - 0 - - scripttouchbeacon - - Comment - Beacon / Highlight scripted objects with touch function - Persist - 1 - Type - Boolean - Value - 1 - - soundsbeacon - - Comment - Beacon / Highlight sound generators - Persist - 1 - Type - Boolean - Value - 0 - - LogTextureDownloadsToViewerLog - - Comment - Send texture download details to the viewer log - Persist - 1 - Type - Boolean - Value - 0 - - LogTextureDownloadsToSimulator - - Comment - Send a digest of texture info to the sim - Persist - 1 - Type - Boolean - Value - 0 - - TextureLoggingThreshold - - Comment - Specifies the byte threshold at which texture download data should be sent to the sim. - Persist - 1 - Type - U32 - Value - 1 - - FloaterUploadRect - - Comment - Rectangle for Uploader - Persist - 1 - Type - Rect - Value - - 500 - 450 - 850 - 400 - - - FloaterContactRect - - Comment - Rectangle for Contact Group Manager - Persist - 1 - Type - Rect - Value - - 500 - 450 - 850 - 400 - - - ContactListCollapsed - - Comment - Hide extended friend information in contact list - Persist - 1 - Type - Boolean - Value - 0 - - FloaterHexRect - - Comment - Rectangle for hex editor floater. - Persist - 1 - Type - Rect - Value - - 343 - 687 - 981 - 473 - - - HexEditorColumns - - Comment - Number of columns shown in hex editor - Persist - 1 - Type - U32 - Value - 16 - - FloaterAssetTextEditorRect - - Comment - Rectangle for asset text editor floater. - Persist - 1 - Type - Rect - Value - - 343 - 687 - 981 - 473 - - - RadarListBtnState - - Comment - - Persist - 0 - Type - Boolean - Value - 0 - - WindEnabled - - Comment - Enable the use of wind (affects trees and flexis, among other things) - Persist - 1 - Type - Boolean - Value - 1 - - CloudsEnabled - - Comment - Render Clouds - Persist - 1 - Type - Boolean - Value - 1 - - - + + + + Include + + settings_ascent.xml + settings_ascent_coa.xml + settings_sh.xml + settings_rlv.xml + + + SianaLegacyJ2CSize + + Comment + Use older JPEG2000 size estimation method + Persist + 1 + Type + Boolean + Value + 1 + + + SpellDownloadURL + + Comment + Base url for download dictionaries + Persist + 1 + Type + String + Value + http://app.singularityviewer.org/dict/ + + SpellDisplay + + Comment + Turn on to highlight misspelled text in line edit boxes + Persist + 1 + Type + Boolean + Value + 1 + + SpellInstalled + + Comment + The list of installed dictionaries + Persist + 1 + Type + String + Value + EN_SL + + SpellBase + + Comment + The base dictionary to spell check with + Persist + 1 + Type + String + Value + English (United States of America) + + + ScriptsCanShowUI + + Comment + Allow LSL calls (such as LLMapDestination) to spawn viewer UI + Persist + 1 + Type + Boolean + Value + 1 + + FloaterObjectBackuptRect + + Comment + Rectangle for the object backup floater + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + + MediaEnableFilter + + Comment + Enable media domain filtering + Persist + 1 + Type + Boolean + Value + 0 + + MediaFilterRect + + Comment + Rectangle for Media Filter floater + Persist + 1 + Type + Rect + Value + + 0 + 100 + 100 + 100 + + + + UseServersideWindlightSettings + + Comment + Whether or not to use Windlight settings presented by the server. + Persist + 1 + Type + Boolean + Value + 1 + + + FloaterLocalbitmapbrowserRect + + Comment + LOLRectangle + Persist + 1 + Type + Rect + Value + + 0 + 400 + 400 + 0 + + + + + + ShowAOSitPopup + + Comment + Show AO sit popup + Persist + 1 + Type + Boolean + Value + 0 + + EnableAORemote + + Comment + Enable AO quick access remote in toolbar + Persist + 1 + Type + Boolean + Value + 0 + + + DisableInternalFlyUpAnimation + + Comment + Disables the internal hover up animation (on your local computer only). Enable if you use an AO and wear hand attachments like rings, prim nails etc. that often loose their correct position while flying. + Persist + 1 + Type + Boolean + Value + 0 + + + AOEnabled + + Comment + Turn on Animation Overrider + Persist + 1 + Type + Boolean + Value + 0 + + AOAdvanced + + Comment + Advanced options + Persist + 0 + Type + Boolean + Value + 0 + + AOSitsEnabled + + Comment + Overrides sit animations. + Persist + 1 + Type + Boolean + Value + 1 + + AONoStandsInMouselook + + Comment + Disables stand anims during mouselook + Persist + 1 + Type + Boolean + Value + 1 + + AOStandInterval + + Comment + AO stand time in seconds + Persist + 1 + Type + F32 + Value + 20 + + AOStandRandomize + + Comment + Randomize stand anims + Persist + 1 + Type + Boolean + Value + 0 + + AORect + + Comment + Rectangle for AO window + Persist + 1 + Type + Rect + Value + + 0 + 100 + 100 + 100 + + + + + ClientDefinitionsURL + + Comment + Where to fetch updated client definitions from + Persist + 1 + Type + String + Value + http://app.singularityviewer.org/client_definitions.xml + + + LastSelectedGrid + + Comment + Last grid selected from the grid pulldown + Persist + 1 + Type + String + Value + + + ShowcaseURLDefault + + Comment + URL to load for the Showcase tab in Second Life + Persist + 1 + Type + String + Value + http://secondlife.com/app/showcase/index.php? + + + CheckForGridUpdates + + Comment + Fetch list of grids from Hippo server + Persist + 1 + Type + Boolean + Value + 0 + + DefaultGrid + + Comment + Nickname of the default grid + Persist + 1 + Type + String + Value + secondlife + + + VivoxLicenseAccepted + + Comment + By setting to true, you agree to accept the Vivox license agreement at http://www.vivox.com/vivox_aup.html + Persist + 1 + Type + Boolean + Value + 0 + + + WarnFirstVoiceLicense + + Comment + Enables FirstVoiceLicense window on login + Persist + 1 + Type + Boolean + Value + 1 + + + + ShyotlRenderUseStreamVBO + + Comment + Use VBO's for stream buffers + Persist + 1 + Type + Boolean + Value + 0 + + ResetFocusOnSelfClick + + Comment + Setting this to TRUE resets your camera when you left-click your avatar + Persist + 1 + Type + Boolean + Value + 1 + + + MoyFastMiniMap + + Comment + Don't show buildings on mini-map + Persist + 1 + Type + Boolean + Value + 0 + + BeauchampFloaterGroupTitlesRect + + Comment + Rectangle for group titles window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 500 + 0 + + + OptionShowGroupNameInChatIM + + Comment + Show group name in IM notification + Persist + 1 + Type + Boolean + Value + 1 + + OptionPlayTpSound + + Comment + Play sound effect on teleport + Persist + 1 + Type + Boolean + Value + 1 + + OptionRotateCamAfterLocalTP + + Comment + Play sound effect on teleport + Persist + 1 + Type + Boolean + Value + 0 + + OptionOffsetTPByAgentHeight + + Comment + Play sound effect on teleport + Persist + 1 + Type + Boolean + Value + 1 + + InventorySortOrder + + Comment + Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) + Type + U32 + Value + 3 + + Blacklist.Settings + + Comment + List for blacklisting assets DO NOT EDIT DIRECTLY use the floater + Persist + 1 + Type + LLSD + Value + + + + + LinksForChattingObjects + + Comment + Show links for chatting objects (0=no, 1=for others' objects, 2=for all objects) + Persist + 1 + Type + U32 + Value + 0 + + DisablePointAtAndBeam + + Comment + Disable pointing at objects and the pointat beam + Persist + 1 + Type + Boolean + Value + 1 + + PrivateLookAt + + Comment + When TRUE, do not disclose what we are looking at + Persist + 1 + Type + Boolean + Value + 0 + + ShowSelectionBeam + + Comment + Show selection particle beam when selecting or interacting with objects. + Persist + 1 + Type + Boolean + Value + 1 + + BroadcastViewerEffects + + Comment + Broadcast Viewer Effects + Persist + 1 + Type + Boolean + Value + 0 + + EmeraldUseProperArc + + Comment + Enables/Disables a fixed ARC counter + Persist + 1 + Type + Boolean + Value + 0 + + EmeraldBoobMass + + Comment + Mass of boobs. + Persist + 1 + Type + F32 + Value + 54.0 + + EmeraldBoobHardness + + Comment + Hardness (dampening) of boobs. + Persist + 1 + Type + F32 + Value + 51 + + EmeraldBreastPhysicsToggle + + Comment + Enables/Disables breast physics + Persist + 1 + Type + Boolean + Value + 1 + + EmeraldBreastSportsBra + + Comment + allows disabling the physics for 1 av, in case their outfit looks wrong with it on + Persist + 1 + Type + Boolean + Value + 0 + + EmeraldBoobVelMax + + Comment + Max amount of velocity boobs can have + Persist + 1 + Type + F32 + Value + 64 + + EmeraldBoobFriction + + Comment + Internal friction (brings boobs to rest). Shouldn't ever be above 1. + Persist + 1 + Type + F32 + Value + 80 + + EmeraldBoobVelMin + + Comment + Friction Fraction of FPS (used to keep friction uniform through FPS change). + Persist + 1 + Type + F32 + Value + 24 + + EmeraldBoobXYInfluence + + Comment + Amount of influence along the X and Y planes. + Persist + 1 + Type + F32 + Value + 0.1 + + wlfAdvSettingsPopup + + Comment + Show Windlight popup + Persist + 0 + Type + Boolean + Value + 1 + + WoLfVerticalIMTabs + + Comment + Vertical IM Tabs + Persist + 1 + Type + Boolean + Value + 1 + + + AgentChatColor + + Comment + Color of chat messages from other residents + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + IsCOA + 1 + + BackgroundChatColor + + Comment + Color of chat bubble background + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.0 + 0.0 + 1.0 + + IsCOA + 1 + + EffectColor + + Comment + Particle effects color + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + IsCOA + 1 + + IMChatColor + + Comment + Color of instant messages from other residents + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + IsCOA + 1 + + llOwnerSayChatColor + + Comment + Color of chat messages from objects only visible to the owner + Persist + 1 + Type + Color4 + Value + + 0.990000009537 + 0.990000009537 + 0.689999997616 + 1.0 + + IsCOA + 1 + + ObjectChatColor + + Comment + Color of chat messages from objects + Persist + 1 + Type + Color4 + Value + + 0.699999988079 + 0.899999976158 + 0.699999988079 + 1 + + IsCOA + 1 + + SkinCurrent + + Comment + The currently selected skin. + Persist + 1 + Type + String + Value + dark + IsCOA + 1 + + SystemChatColor + + Comment + Color of chat messages from SL System + Persist + 1 + Type + Color4 + Value + + 0.800000011921 + 1.0 + 1.0 + 1.0 + + IsCOA + 1 + + UISndAlert + + Comment + Sound file for alerts (uuid for sound asset) + Persist + 1 + Type + String + Value + ed124764-705d-d497-167a-182cd9fa2e6c + IsCOA + 1 + + UISndBadKeystroke + + Comment + Sound file for invalid keystroke (uuid for sound asset) + Persist + 1 + Type + String + Value + 2ca849ba-2885-4bc3-90ef-d4987a5b983a + IsCOA + 1 + + UISndClick + + Comment + Sound file for mouse click (uuid for sound asset) + Persist + 1 + Type + String + Value + 4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6 + IsCOA + 1 + + UISndClickRelease + + Comment + Sound file for mouse button release (uuid for sound asset) + Persist + 1 + Type + String + Value + 4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6 + IsCOA + 1 + + UISndDebugSpamToggle + + Comment + Log UI sound effects as they are played + Persist + 1 + Type + Boolean + Value + 0 + IsCOA + 1 + + UISndHealthReductionF + + Comment + Sound file for female pain (uuid for sound asset) + Persist + 1 + Type + String + Value + 219c5d93-6c09-31c5-fb3f-c5fe7495c115 + IsCOA + 1 + + UISndHealthReductionM + + Comment + Sound file for male pain (uuid for sound asset) + Persist + 1 + Type + String + Value + e057c244-5768-1056-c37e-1537454eeb62 + IsCOA + 1 + + UISndHealthReductionThreshold + + Comment + Amount of health reduction required to trigger "pain" sound + Persist + 1 + Type + F32 + Value + 10.0 + IsCOA + 1 + + UISndInvalidOp + + Comment + Sound file for invalid operations (uuid for sound asset) + Persist + 1 + Type + String + Value + 4174f859-0d3d-c517-c424-72923dc21f65 + IsCOA + 1 + + UISndMoneyChangeDown + + Comment + Sound file for L$ balance increase (uuid for sound asset) + Persist + 1 + Type + String + Value + 104974e3-dfda-428b-99ee-b0d4e748d3a3 + IsCOA + 1 + + UISndMoneyChangeThreshold + + Comment + Amount of change in L$ balance required to trigger "money" sound + Persist + 1 + Type + F32 + Value + 50.0 + IsCOA + 1 + + UISndMoneyChangeUp + + Comment + Sound file for L$ balance decrease(uuid for sound asset) + Persist + 1 + Type + String + Value + 77a018af-098e-c037-51a6-178f05877c6f + IsCOA + 1 + + UISndNewIncomingIMSession + + Comment + Sound file for new instant message session(uuid for sound asset) + Persist + 1 + Type + String + Value + 67cc2844-00f3-2b3c-b991-6418d01e1bb7 + IsCOA + 1 + + UISndObjectCreate + + Comment + Sound file for object creation (uuid for sound asset) + Persist + 1 + Type + String + Value + f4a0660f-5446-dea2-80b7-6482a082803c + IsCOA + 1 + + UISndObjectDelete + + Comment + Sound file for object deletion (uuid for sound asset) + Persist + 1 + Type + String + Value + 0cb7b00a-4c10-6948-84de-a93c09af2ba9 + IsCOA + 1 + + UISndObjectRezIn + + Comment + Sound file for rezzing objects (uuid for sound asset) + Persist + 1 + Type + String + Value + 3c8fc726-1fd6-862d-fa01-16c5b2568db6 + IsCOA + 1 + + UISndObjectRezOut + + Comment + Sound file for derezzing objects (uuid for sound asset) + Persist + 1 + Type + String + Value + 00000000-0000-0000-0000-000000000000 + IsCOA + 1 + + UISndPieMenuAppear + + Comment + Sound file for opening pie menu (uuid for sound asset) + Persist + 1 + Type + String + Value + 8eaed61f-92ff-6485-de83-4dcc938a478e + IsCOA + 1 + + UISndPieMenuHide + + Comment + Sound file for closing pie menu (uuid for sound asset) + Persist + 1 + Type + String + Value + 00000000-0000-0000-0000-000000000000 + IsCOA + 1 + + UISndPieMenuSliceHighlight0 + + Comment + Sound file for selecting pie menu item 0 (uuid for sound asset) + Persist + 1 + Type + String + Value + d9f73cf8-17b4-6f7a-1565-7951226c305d + IsCOA + 1 + + UISndPieMenuSliceHighlight1 + + Comment + Sound file for selecting pie menu item 1 (uuid for sound asset) + Persist + 1 + Type + String + Value + f6ba9816-dcaf-f755-7b67-51b31b6233e5 + IsCOA + 1 + + UISndPieMenuSliceHighlight2 + + Comment + Sound file for selecting pie menu item 2 (uuid for sound asset) + Persist + 1 + Type + String + Value + 7aff2265-d05b-8b72-63c7-dbf96dc2f21f + IsCOA + 1 + + UISndPieMenuSliceHighlight3 + + Comment + Sound file for selecting pie menu item 3 (uuid for sound asset) + Persist + 1 + Type + String + Value + 09b2184e-8601-44e2-afbb-ce37434b8ba1 + IsCOA + 1 + + UISndPieMenuSliceHighlight4 + + Comment + Sound file for selecting pie menu item 4 (uuid for sound asset) + Persist + 1 + Type + String + Value + bbe4c7fc-7044-b05e-7b89-36924a67593c + IsCOA + 1 + + UISndPieMenuSliceHighlight5 + + Comment + Sound file for selecting pie menu item 5 (uuid for sound asset) + Persist + 1 + Type + String + Value + d166039b-b4f5-c2ec-4911-c85c727b016c + IsCOA + 1 + + UISndPieMenuSliceHighlight6 + + Comment + Sound file for selecting pie menu item 6 (uuid for sound asset) + Persist + 1 + Type + String + Value + 242af82b-43c2-9a3b-e108-3b0c7e384981 + IsCOA + 1 + + UISndPieMenuSliceHighlight7 + + Comment + Sound file for selecting pie menu item 7 (uuid for sound asset) + Persist + 1 + Type + String + Value + c1f334fb-a5be-8fe7-22b3-29631c21cf0b + IsCOA + 1 + + UISndSnapshot + + Comment + Sound file for taking a snapshot (uuid for sound asset) + Persist + 1 + Type + String + Value + 3d09f582-3851-c0e0-f5ba-277ac5c73fb4 + IsCOA + 1 + + UISndStartIM + + Comment + Sound file for starting a new IM session (uuid for sound asset) + Persist + 1 + Type + String + Value + c825dfbc-9827-7e02-6507-3713d18916c1 + IsCOA + 1 + + UISndTeleportOut + + Comment + Sound file for teleporting (uuid for sound asset) + Persist + 1 + Type + String + Value + d7a9a565-a013-2a69-797d-5332baa1a947 + IsCOA + 1 + + UISndTyping + + Comment + Sound file for starting to type a chat message (uuid for sound asset) + Persist + 1 + Type + String + Value + 5e191c7b-8996-9ced-a177-b2ac32bfea06 + IsCOA + 1 + + UISndWindowClose + + Comment + Sound file for closing a window (uuid for sound asset) + Persist + 1 + Type + String + Value + 2c346eda-b60c-ab33-1119-b8941916a499 + IsCOA + 1 + + UISndWindowOpen + + Comment + Sound file for opening a window (uuid for sound asset) + Persist + 1 + Type + String + Value + c80260ba-41fd-8a46-768a-6bf236360e3a + IsCOA + 1 + + UserChatColor + + Comment + Color of your chat messages + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + IsCOA + 1 + + + AFKTimeout + + Comment + Time before automatically setting AFK (away from keyboard) mode (seconds) + Persist + 1 + Type + F32 + Value + 300.0 + + AdvanceSnapshot + + Comment + Display advanced parameter settings in snaphot interface + Persist + 1 + Type + Boolean + Value + 0 + + AlertedUnsupportedHardware + + Comment + Set if there's unsupported hardware and we've already done a notification. + Persist + 1 + Type + Boolean + Value + 0 + + AllowIdleAFK + + Comment + Automatically set AFK (away from keyboard) mode when idle + Persist + 1 + Type + Boolean + Value + 1 + + AllowMultipleViewers + + Comment + Allow multiple viewers. + Persist + 1 + Type + Boolean + Value + 1 + + AllowTapTapHoldRun + + Comment + Tapping a direction key twice and holding it down makes avatar run + Persist + 1 + Type + Boolean + Value + 1 + + AnimateTextures + + Comment + Enable texture animation (debug) + Persist + 1 + Type + Boolean + Value + 1 + + AnimationDebug + + Comment + Show active animations in a bubble above avatars head + Persist + 1 + Type + Boolean + Value + 0 + + PreviewAnimInWorld + + Comment + Play animation preview in-world when uploading + Persist + 1 + Type + Boolean + Value + 0 + + AppearanceCameraMovement + + Comment + When entering appearance editing mode, camera zooms in on currently selected portion of avatar + Persist + 1 + Type + Boolean + Value + 1 + + ApplyColorImmediately + + Comment + Preview selections in color picker immediately + Persist + 1 + Type + Boolean + Value + 1 + + ApplyTextureImmediately + + Comment + Preview selections in texture picker immediately + Persist + 1 + Type + Boolean + Value + 1 + + ArrowKeysMoveAvatar + + Comment + While cursor is in chat entry box, arrow keys still control your avatar + Persist + 1 + Type + Boolean + Value + 1 + + AskedAboutCrashReports + + Comment + Turns off dialog asking if you want to enable crash reporting + Persist + 1 + Type + Boolean + Value + 0 + + AuctionShowFence + + Comment + When auctioning land, include parcel boundary marker in snapshot + Persist + 1 + Type + Boolean + Value + 1 + + AudioLevelAmbient + + Comment + Audio level of environment sounds + Persist + 1 + Type + F32 + Value + 0.5 + + AudioLevelDoppler + + Comment + Scale of doppler effect on moving audio sources (1.0 = normal, <1.0 = diminished doppler effect, >1.0 = enhanced doppler effect) + Persist + 1 + Type + F32 + Value + 1.0 + + AudioLevelMaster + + Comment + Master audio level, or overall volume + Persist + 1 + Type + F32 + Value + 1.0 + + AudioLevelMedia + + Comment + Audio level of Quicktime movies + Persist + 1 + Type + F32 + Value + 1.0 + + AudioLevelMic + + Comment + Audio level of microphone input + Persist + 1 + Type + F32 + Value + 1.0 + + AudioLevelMusic + + Comment + Audio level of streaming music + Persist + 1 + Type + F32 + Value + 1.0 + + AudioLevelRolloff + + Comment + Controls the distance-based dropoff of audio volume (fraction or multiple of default audio rolloff) + Persist + 1 + Type + F32 + Value + 1.0 + + AudioLevelSFX + + Comment + Audio level of in-world sound effects + Persist + 1 + Type + F32 + Value + 1.0 + + AudioLevelUI + + Comment + Audio level of UI sound effects + Persist + 1 + Type + F32 + Value + 0.5 + + AudioLevelVoice + + Comment + Audio level of voice chat + Persist + 1 + Type + F32 + Value + 0.5 + + AudioStreamingMusic + + Comment + Enable streaming audio + Persist + 1 + Type + Boolean + Value + 1 + + AudioStreamingVideo + + Comment + Enable streaming video + Persist + 1 + Type + Boolean + Value + 0 + + AuditTexture + + Comment + Enable texture auditting. + Persist + 1 + Type + Boolean + Value + 0 + + AutoAcceptNewInventory + + Comment + Automatically accept new notecards/textures/landmarks + Persist + 1 + Type + Boolean + Value + 0 + + AutoLeveling + + Comment + Keep Flycam level. + Persist + 1 + Type + Boolean + Value + 1 + + AutoLoadWebProfiles + + Comment + Automatically load ALL profile webpages without asking first. + Persist + 1 + Type + Boolean + Value + 0 + + AutoLogin + + Comment + Login automatically using last username/password combination + Persist + 0 + Type + Boolean + Value + 0 + + AutoMimeDiscovery + + Comment + Enable viewer mime type discovery of media URLs + Persist + 1 + Type + Boolean + Value + 0 + + AutoPilotLocksCamera + + Comment + Keep camera position locked when avatar walks to selected position + Persist + 1 + Type + Boolean + Value + 0 + + AutoSnapshot + + Comment + Update snapshot when camera stops moving, or any parameter changes + Persist + 1 + Type + Boolean + Value + 0 + + AutomaticFly + + Comment + Fly by holding jump key or using "Fly" command (FALSE = fly by using "Fly" command only) + Persist + 1 + Type + Boolean + Value + 1 + + AvatarAxisDeadZone0 + + Comment + Avatar axis 0 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + AvatarAxisDeadZone1 + + Comment + Avatar axis 1 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + AvatarAxisDeadZone2 + + Comment + Avatar axis 2 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + AvatarAxisDeadZone3 + + Comment + Avatar axis 3 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + AvatarAxisDeadZone4 + + Comment + Avatar axis 4 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + AvatarAxisDeadZone5 + + Comment + Avatar axis 5 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + AvatarAxisScale0 + + Comment + Avatar axis 0 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + AvatarAxisScale1 + + Comment + Avatar axis 1 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + AvatarAxisScale2 + + Comment + Avatar axis 2 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + AvatarAxisScale3 + + Comment + Avatar axis 3 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + AvatarAxisScale4 + + Comment + Avatar axis 4 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + AvatarAxisScale5 + + Comment + Avatar axis 5 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + AvatarBacklight + + Comment + Add rim lighting to avatar rendering to approximate shininess of skin + Persist + 1 + Type + Boolean + Value + 1 + + AvatarFeathering + + Comment + Avatar feathering (less is softer) + Persist + 1 + Type + F32 + Value + 16.0 + + AvatarPickerSortOrder + + Comment + Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) + Persist + 1 + Type + U32 + Value + 2 + + AvatarPhysics + + Comment + Enable avatar wearable physics. + Persist + 1 + Type + Boolean + Value + 1 + + AvatarSex + + Comment + + Persist + 0 + Type + U32 + Value + 0 + + BackgroundYieldTime + + Comment + Amount of time to yield every frame to other applications when SL is not the foreground window (milliseconds) + Persist + 1 + Type + S32 + Value + 40 + + FloaterBlacklistRect + + Comment + LOLRectangle + Persist + 1 + Type + Rect + Value + + 0 + 400 + 400 + 0 + + + BackwardBtnRect + + Comment + + Persist + 0 + Type + Rect + Value + + 45 + 29 + 66 + 4 + + + BasicHelpRect + + Comment + Rectangle for help window + Persist + 1 + Type + Rect + Value + + 0 + 404 + 467 + 0 + + + BeaconAlwaysOn + + Comment + Beacons / highlighting always on + Persist + 1 + Type + Boolean + Value + 0 + + BrowserHomePage + + Comment + [NOT USED] + Persist + 1 + Type + String + Value + http://www.singularityviewer.org + + BrowserCookiesEnabled + + Comment + Enable Cookes in WebKit + Persist + 1 + Type + Boolean + Value + 1 + + BrowserPluginsEnabled + + Comment + Enable Mozilla Plug-Ins in WebKit + Persist + 1 + Type + Boolean + Value + 1 + + BrowserJavascriptEnabled + + Comment + Enable JavaScript execution in WebKit + Persist + 1 + Type + Boolean + Value + 1 + + PluginAttachDebuggerToPlugins + + Comment + TODO: understand what this actually does -.-sg + Persist + 1 + Type + Boolean + Value + 0 + + BlockAvatarAppearanceMessages + + Comment + Ignore's appearance messages (for simulating Ruth) + Persist + 1 + Type + Boolean + Value + 0 + + BrowserProxyAddress + + Comment + Address for the Web Proxy + Persist + 1 + Type + String + Value + + + BrowserProxyEnabled + + Comment + Use Web Proxy + Persist + 1 + Type + Boolean + Value + 0 + + BrowserProxyExclusions + + Comment + [NOT USED] + Persist + 1 + Type + String + Value + + + BrowserProxyPort + + Comment + Port for Web Proxy + Persist + 1 + Type + S32 + Value + 3128 + + BrowserProxySocks45 + + Comment + [NOT USED] + Persist + 1 + Type + S32 + Value + 5 + + Socks5ProxyEnabled + + Comment + Use Socks5 Proxy + Persist + 1 + Type + Boolean + Value + 0 + + Socks5HttpProxyType + + Comment + Proxy type to use for HTTP operations + Persist + 1 + Type + String + Value + None + + Socks5ProxyHost + + Comment + Socks 5 Proxy Host + Persist + 1 + Type + String + Value + + + Socks5ProxyPort + + Comment + Socks 5 Proxy Port + Persist + 1 + Type + U32 + Value + 1080 + + Socks5Username + + Comment + Socks 5 Username + Persist + 1 + Type + String + Value + + + Socks5Password + + Comment + Socks 5 Password + Persist + 1 + Type + String + Value + + + Socks5AuthType + + Comment + Selected Auth mechanism for Socks5 + Persist + 1 + Type + String + Value + None + + BuildAxisDeadZone0 + + Comment + Build axis 0 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + BuildAxisDeadZone1 + + Comment + Build axis 1 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + BuildAxisDeadZone2 + + Comment + Build axis 2 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + BuildAxisDeadZone3 + + Comment + Build axis 3 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + BuildAxisDeadZone4 + + Comment + Build axis 4 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + BuildAxisDeadZone5 + + Comment + Build axis 5 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + BuildAxisScale0 + + Comment + Build axis 0 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + BuildAxisScale1 + + Comment + Build axis 1 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + BuildAxisScale2 + + Comment + Build axis 2 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + BuildAxisScale3 + + Comment + Build axis 3 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + BuildAxisScale4 + + Comment + Build axis 4 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + BuildAxisScale5 + + Comment + Build axis 5 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + BuildBtnState + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + BuildFeathering + + Comment + Build feathering (less is softer) + Persist + 1 + Type + F32 + Value + 16.0 + + BulkChangeIncludeAnimations + + Comment + Bulk permission changes affect animations + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeAnimations + + Comment + Bulk permission changes affect animations + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeAnimations + + Comment + Bulk permission changes affect animations + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeAnimations + + Comment + Bulk permission changes affect animations + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeBodyParts + + Comment + Bulk permission changes affect body parts + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeClothing + + Comment + Bulk permission changes affect clothing + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeGestures + + Comment + Bulk permission changes affect gestures + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeLandmarks + + Comment + Bulk permission changes affect landmarks + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeNotecards + + Comment + Bulk permission changes affect notecards + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeObjects + + Comment + Bulk permission changes affect objects + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeScripts + + Comment + Bulk permission changes affect scripts + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeSounds + + Comment + Bulk permission changes affect sounds + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeIncludeTextures + + Comment + Bulk permission changes affect textures + Persist + 1 + Type + Boolean + Value + 1 + + BulkChangeEveryoneCopy + + Comment + Bulk changed objects can be copied by everyone + Persist + 1 + Type + Boolean + Value + 0 + + BulkChangeNextOwnerCopy + + Comment + Bulk changed objects can be copied by next owner + Persist + 1 + Type + Boolean + Value + 0 + + BulkChangeNextOwnerModify + + Comment + Bulk changed objects can be modified by next owner + Persist + 1 + Type + Boolean + Value + 0 + + BulkChangeNextOwnerTransfer + + Comment + Bulk changed objects can be resold or given away by next owner + Persist + 1 + Type + Boolean + Value + 0 + + BulkChangeShareWithGroup + + Comment + Bulk changed objects are shared with the currently active group + Persist + 1 + Type + Boolean + Value + 0 + + ButtonFlashCount + + Comment + Number of flashes after which flashing buttons stay lit up + Persist + 1 + Type + S32 + Value + 8 + + ButtonFlashRate + + Comment + Frequency at which buttons flash (hz) + Persist + 1 + Type + F32 + Value + 1.25 + + ButtonHPad + + Comment + Default horizontal spacing between buttons (pixels) + Persist + 1 + Type + S32 + Value + 10 + + ButtonHeight + + Comment + Default height for normal buttons (pixels) + Persist + 1 + Type + S32 + Value + 20 + + ButtonHeightSmall + + Comment + Default height for small buttons (pixels) + Persist + 1 + Type + S32 + Value + 16 + + ButtonVPad + + Comment + Default vertical spacing between buttons (pixels) + Persist + 1 + Type + S32 + Value + 1 + + CacheLocation + + Comment + Controls the location of the local disk cache + Persist + 1 + Type + String + Value + + + CacheSize + + Comment + Controls amount of hard drive space reserved for local file caching in MB + Persist + 1 + Type + U32 + Value + 500 + + CacheValidateCounter + + Comment + Used to distribute cache validation + Persist + 1 + Type + U32 + Value + 0 + + CameraMouseWheelZoom + + Comment + Camera zooms in and out with mousewheel + Persist + 1 + Type + Boolean + Value + 1 + + CameraAngle + + Comment + Camera field of view angle (Radians) + Persist + 1 + Type + F32 + Value + 1.047197551 + + CameraOffset + + Comment + Render with camera offset from view frustum (rendering debug) + Persist + 1 + Type + Boolean + Value + 0 + + CameraOffsetBuild + + Comment + Default camera position relative to focus point when entering build mode + Persist + 1 + Type + Vector3 + Value + + -6.0 + 0.0 + 6.0 + + + CameraOffsetDefault + + Comment + Default camera offset from avatar + Persist + 1 + Type + Vector3 + Value + + -3.0 + 0.0 + 0.75 + + + CameraOffsetScale + + Comment + Scales the default offset + Persist + 1 + Type + F32 + Value + 1.0 + + CameraPosOnLogout + + Comment + Camera position when last logged out (global coordinates) + Persist + 1 + Type + Vector3D + Value + + 0.0 + 0.0 + 0.0 + + + CameraPositionSmoothing + + Comment + Smooths camera position over time + Persist + 1 + Type + F32 + Value + 1.0 + + ChatBarStealsFocus + + Comment + Whenever keyboard focus is removed from the UI, and the chat bar is visible, the chat bar takes focus + Persist + 1 + Type + Boolean + Value + 1 + + ChatBubbleOpacity + + Comment + Opacity of chat bubble background (0.0 = completely transparent, 1.0 = completely opaque) + Persist + 1 + Type + F32 + Value + 0.5 + + ChatFontSize + + Comment + Size of chat text in chat console (0 = small, 1 = big) + Persist + 1 + Type + S32 + Value + 1 + + ChatFullWidth + + Comment + Chat console takes up full width of SL window + Persist + 1 + Type + Boolean + Value + 1 + + ChatHistoryTornOff + + Comment + Show chat history window separately from Communicate window. + Persist + 1 + Type + Boolean + Value + 0 + + ChatOnlineNotification + + Comment + Provide notifications for when friend log on and off of SL + Persist + 1 + Type + Boolean + Value + 1 + + HideNotificationsInChat + + Comment + Do not echo/log notifications in chat + Persist + 1 + Type + Boolean + Value + 0 + + ChatPersistTime + + Comment + Time for which chat stays visible in console (seconds) + Persist + 1 + Type + F32 + Value + 20.0 + + ChatShowTimestamps + + Comment + Show timestamps in chat + Persist + 1 + Type + Boolean + Value + 1 + + ChatSpacing + + Comment + Add extra vertical spacing between local chat lines + Persist + 1 + Type + S32 + Value + 0 + + ChatVisible + + Comment + Chat bar is visible + Persist + 1 + Type + Boolean + Value + 1 + + ChatterboxRect + + Comment + Rectangle for chatterbox window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 350 + 0 + + + CheesyBeacon + + Comment + Enable cheesy beacon effects + Persist + 1 + Type + Boolean + Value + 0 + + ClientSettingsFile + + Comment + Persisted client settings file name (per install). + Persist + 0 + Type + String + Value + + + CloseChatOnReturn + + Comment + Close chat after hitting return + Persist + 1 + Type + Boolean + Value + 0 + + CloseSnapshotOnKeep + + Comment + Close snapshot window after saving snapshot + Persist + 1 + Type + Boolean + Value + 1 + + CmdLineDisableVoice + + Comment + Disable Voice. + Persist + 0 + Type + Boolean + Value + 0 + + CmdLineAgentURI + + Comment + URL of agent host to connect to in Agent Domain. + Persist + 0 + Type + String + Value + + + CmdLineGridChoice + + Comment + The user's grid choice or ip address. + Persist + 0 + Type + String + Value + + + CmdLineHelperURI + + Comment + Command line specified helper web CGI prefix to use. + Persist + 0 + Type + String + Value + + + CmdLineLoginURI + + Comment + Command line specified login server and CGI prefix to use. + Persist + 0 + Type + LLSD + Value + + + + + CmdLineRegionURI + + Comment + URL of region to connect to through Agent Domain. + Persist + 0 + Type + String + Value + + + ColorPaletteEntry01 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.0 + 0.0 + 1.0 + + + ColorPaletteEntry02 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 0.5 + 0.5 + 1.0 + + + ColorPaletteEntry03 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 0.0 + 0.0 + 1.0 + + + ColorPaletteEntry04 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 0.5 + 0.0 + 1.0 + + + ColorPaletteEntry05 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.5 + 0.0 + 1.0 + + + ColorPaletteEntry06 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.5 + 0.5 + 1.0 + + + ColorPaletteEntry07 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.0 + 0.5 + 1.0 + + + ColorPaletteEntry08 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 0.0 + 0.5 + 1.0 + + + ColorPaletteEntry09 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 0.5 + 0.0 + 1.0 + + + ColorPaletteEntry10 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.25 + 0.25 + 1.0 + + + ColorPaletteEntry11 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.5 + 1.0 + 1.0 + + + ColorPaletteEntry12 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.25 + 0.5 + 1.0 + + + ColorPaletteEntry13 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 0.0 + 1.0 + 1.0 + + + ColorPaletteEntry14 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 0.25 + 0.0 + 1.0 + + + ColorPaletteEntry15 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + + ColorPaletteEntry16 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + + ColorPaletteEntry17 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + + ColorPaletteEntry18 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.75 + 0.75 + 0.75 + 1.0 + + + ColorPaletteEntry19 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 0.0 + 0.0 + 1.0 + + + ColorPaletteEntry20 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 0.0 + 1.0 + + + ColorPaletteEntry21 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 1.0 + 0.0 + 1.0 + + + ColorPaletteEntry22 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 1.0 + 1.0 + 1.0 + + + ColorPaletteEntry23 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.0 + 1.0 + 1.0 + + + ColorPaletteEntry24 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 0.0 + 1.0 + 1.0 + + + ColorPaletteEntry25 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 0.5 + 1.0 + + + ColorPaletteEntry26 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.0 + 1.0 + 0.5 + 1.0 + + + ColorPaletteEntry27 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 1.0 + 1.0 + 1.0 + + + ColorPaletteEntry28 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 0.5 + 0.5 + 1.0 + 1.0 + + + ColorPaletteEntry29 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 0.0 + 0.5 + 1.0 + + + ColorPaletteEntry30 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 0.5 + 0.0 + 1.0 + + + ColorPaletteEntry31 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + + ColorPaletteEntry32 + + Comment + Color picker palette entry + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + + ColumnHeaderDropDownDelay + + Comment + Time in seconds of mouse click before column header shows sort options list + Persist + 1 + Type + F32 + Value + 0.300000011921 + + CompileOutputRect + + Comment + Rectangle for script Recompile Everything output window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 300 + 0 + + + ConnectAsGod + + Comment + Log in a god if you have god access. + Persist + 1 + Type + Boolean + Value + 0 + + ConnectionPort + + Comment + Custom connection port number + Persist + 1 + Type + U32 + Value + 13000 + + ConnectionPortEnabled + + Comment + Use the custom connection port? + Persist + 1 + Type + Boolean + Value + 0 + + ConsoleBackgroundOpacity + + Comment + Opacity of chat console (0.0 = completely transparent, 1.0 = completely opaque) + Persist + 1 + Type + F32 + Value + 0.700 + + ConsoleBufferSize + + Comment + Size of chat console history (lines of chat) + Persist + 1 + Type + S32 + Value + 40 + + ConsoleMaxLines + + Comment + Max number of lines of chat text visible in console. + Persist + 1 + Type + S32 + Value + 40 + + ContactsTornOff + + Comment + Show contacts window separately from Communicate window. + Persist + 1 + Type + Boolean + Value + 0 + + CookiesEnabled + + Comment + Accept cookies from Web sites? + Persist + 1 + Type + Boolean + Value + 1 + + CreateToolCopyCenters + + Comment + + Persist + 0 + Type + Boolean + Value + 1 + + CreateToolCopyRotates + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + CreateToolCopySelection + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + CreateToolKeepSelected + + Comment + After using create tool, keep the create tool active + Persist + 1 + Type + Boolean + Value + 0 + + Cursor3D + + Comment + Tread Joystick values as absolute positions (not deltas). + Persist + 1 + Type + Boolean + Value + 1 + + CustomServer + + Comment + Specifies IP address or hostname of grid to which you connect + Persist + 1 + Type + String + Value + + + DebugBeaconLineWidth + + Comment + Size of lines for Debug Beacons + Persist + 1 + Type + S32 + Value + 1 + + DebugInventoryFilters + + Comment + Turn on debugging display for inventory filtering + Persist + 1 + Type + Boolean + Value + 0 + + DebugPermissions + + Comment + Log permissions for selected inventory items + Persist + 1 + Type + Boolean + Value + 0 + + DebugPluginDisableTimeout + + Comment + Disable the code which watches for plugins that are crashed or hung + Persist + 1 + Type + Boolean + Value + 0 + + DebugShowColor + + Comment + Show color under cursor + Persist + 1 + Type + Boolean + Value + 0 + + DebugShowRenderInfo + + Comment + Show depth buffer contents + Persist + 1 + Type + Boolean + Value + 0 + + DebugShowRenderMatrices + + Comment + Display values of current view and projection matrices. + Persist + 1 + Type + Boolean + Value + 0 + + DebugShowTime + + Comment + Show depth buffer contents + Persist + 1 + Type + Boolean + Value + 0 + + DebugStatModeFPS + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeBandwidth + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModePacketLoss + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatMode + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeKTrisDrawnFr + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeKTrisDrawnSec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeTotalObjs + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeNewObjs + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeTextureCount + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeRawCount + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeGLMem + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeFormattedMem + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeRawMem + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeBoundMem + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModePacketsIn + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModePacketsOut + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeObjects + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeTexture + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeAsset + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeLayers + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeActualIn + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeActualOut + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeVFSPendingOps + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeTimeDialation + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimFPS + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModePhysicsFPS + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModePinnedObjects + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeLowLODObjects + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeMemoryAllocated + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeAgentUpdatesSec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeMainAgents + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeChildAgents + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimObjects + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimActiveObjects + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimActiveScripts + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimScriptEvents + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimInPPS + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimOutPPS + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimPendingDownloads + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + SimPendingUploads + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimTotalUnackedBytes + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimFrameMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimNetMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimSimPhysicsMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimSimOtherMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimAgentMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimImagesMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimScriptMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimSpareMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimSimPhysicsStepMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimSimPhysicsShapeUpdateMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimSimPhysicsOtherMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimSleepMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugStatModeSimPumpIOMsec + + Comment + Mode of stat in Statistics floater + Persist + 1 + Type + S32 + Value + -1 + + DebugViews + + Comment + Display debugging info for views. + Persist + 1 + Type + Boolean + Value + 0 + + DebugWindowProc + + Comment + Log windows messages + Persist + 1 + Type + Boolean + Value + 0 + + DefaultObjectTexture + + Comment + Texture used as 'Default' in texture picker. (UUID texture reference) + Persist + 1 + Type + String + Value + 89556747-24cb-43ed-920b-47caed15465f + + DisableCameraConstraints + + Comment + Disable the normal bounds put on the camera by avatar position + Persist + 1 + Type + Boolean + Value + 0 + + DisableRendering + + Comment + Disable GL rendering and GUI (load testing) + Persist + 1 + Type + Boolean + Value + 0 + + DisableVerticalSync + + Comment + Update frames as fast as possible (FALSE = update frames between display scans) + Persist + 1 + Type + Boolean + Value + 1 + + DisplayAvatarAgentTarget + + Comment + Show avatar positioning locators (animation debug) + Persist + 1 + Type + Boolean + Value + 0 + + DisplayChat + + Comment + Display Latest Chat message on LCD + Persist + 1 + Type + Boolean + Value + 1 + + DisplayDebug + + Comment + Display Network Information on LCD + Persist + 1 + Type + Boolean + Value + 1 + + DisplayDebugConsole + + Comment + Display Console Debug Information on LCD + Persist + 1 + Type + Boolean + Value + 1 + + DisplayIM + + Comment + Display Latest IM message on LCD + Persist + 1 + Type + Boolean + Value + 1 + + DisplayLinden + + Comment + Display Account Information on LCD + Persist + 1 + Type + Boolean + Value + 1 + + DisplayRegion + + Comment + Display Location information on LCD + Persist + 1 + Type + Boolean + Value + 1 + + DisplayTimecode + + Comment + Display timecode on screen + Persist + 1 + Type + Boolean + Value + 0 + + Disregard128DefaultDrawDistance + + Comment + Whether to use the auto default to 128 draw distance + Persist + 1 + Type + Boolean + Value + 1 + + Disregard96DefaultDrawDistance + + Comment + Whether to use the auto default to 96 draw distance + Persist + 1 + Type + Boolean + Value + 1 + + DoubleClickAutoPilot + + Comment + Enable double-click auto pilot + Persist + 1 + Type + Boolean + Value + 0 + + DoubleClickTeleport + + Comment + Enable double-click to teleport where allowed + Persist + 1 + Type + Boolean + Value + 0 + + DoubleClickTeleportMiniMap + + Comment + Enable double-click-teleport for the mini-map + Persist + 1 + Type + Boolean + Value + 0 + + DragAndDropToolTipDelay + + Comment + Seconds before displaying tooltip when performing drag and drop operation + Persist + 1 + Type + F32 + Value + 0.10000000149 + + DropShadowButton + + Comment + Drop shadow width for buttons (pixels) + Persist + 1 + Type + S32 + Value + 2 + + DropShadowFloater + + Comment + Drop shadow width for floaters (pixels) + Persist + 1 + Type + S32 + Value + 5 + + DropShadowSlider + + Comment + Drop shadow width for sliders (pixels) + Persist + 1 + Type + S32 + Value + 3 + + DropShadowTooltip + + Comment + Drop shadow width for tooltips (pixels) + Persist + 1 + Type + S32 + Value + 4 + + DynamicCameraStrength + + Comment + Amount camera lags behind avatar motion (0 = none, 30 = avatar velocity) + Persist + 1 + Type + F32 + Value + 2.0 + + EditCameraMovement + + Comment + When entering build mode, camera moves up above avatar + Persist + 1 + Type + Boolean + Value + 0 + + EditLinkedParts + + Comment + Select individual parts of linked objects + Persist + 0 + Type + Boolean + Value + 0 + + DecimalsForTools + + Comment + Number of decimals for the edit tool position, size and rotation settings (0 to 5) + Persist + 1 + Type + U32 + Value + 5 + + EffectScriptChatParticles + + Comment + 1 = normal behavior, 0 = disable display of swirling lights when scripts communicate + Persist + 1 + Type + Boolean + Value + 1 + + EnableRippleWater + + Comment + Whether to use ripple water shader or not + Persist + 1 + Type + Boolean + Value + 1 + + EnableVoiceChat + + Comment + Enable talking to other residents with a microphone + Persist + 1 + Type + Boolean + Value + 0 + + EnergyFromTop + + Comment + + Persist + 0 + Type + S32 + Value + 20 + + EnergyHeight + + Comment + + Persist + 0 + Type + S32 + Value + 40 + + EnergyWidth + + Comment + + Persist + 0 + Type + S32 + Value + 175 + + EveryoneCopy + + Comment + Everyone can copy the newly created objects + Persist + 1 + Type + Boolean + Value + 0 + + FPSLogFrequency + + Comment + Seconds between display of FPS in log (0 for never) + Persist + 1 + Type + F32 + Value + 60.0 + + FPSLogFrequency + + Comment + Seconds between display of FPS in log (0 for never) + Persist + 1 + Type + F32 + Value + 10.0 + + FilterItemsPerFrame + + Comment + Maximum number of inventory items to match against search filter every frame (lower to increase framerate while searching, higher to improve search speed) + Persist + 1 + Type + S32 + Value + 500 + + FindLandArea + + Comment + Enables filtering of land search results by area + Persist + 1 + Type + Boolean + Value + 0 + + FindLandPrice + + Comment + Enables filtering of land search results by price + Persist + 1 + Type + Boolean + Value + 1 + + FindLandType + + Comment + Controls which type of land you are searching for in Find Land interface ("All", "Auction", "For Sale") + Persist + 1 + Type + String + Value + All + + FindPeopleOnline + + Comment + Limits people search to only users who are logged on + Persist + 1 + Type + Boolean + Value + 1 + + FindPlacesPictures + + Comment + Display only results of find places that have pictures + Persist + 1 + Type + Boolean + Value + 1 + + FirstLoginThisInstall + + Comment + Specifies that you have not successfully logged in since you installed the latest update + Persist + 1 + Type + Boolean + Value + 1 + + FirstName + + Comment + Login first name + Persist + 1 + Type + String + Value + + + FirstPersonAvatarVisible + + Comment + Display avatar and attachments below neck while in mouselook + Persist + 1 + Type + Boolean + Value + 0 + + FirstPersonBtnState + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + FirstRunThisInstall + + Comment + Specifies that you have not run the viewer since you installed the latest update + Persist + 1 + Type + Boolean + Value + 1 + + FixedWeather + + Comment + Weather effects do not change over time + Persist + 1 + Type + Boolean + Value + 0 + + LongDateFormat + + Comment + Long date format to use + Persist + 1 + Type + String + Value + %A %d %B %Y + + ShortDateFormat + + Comment + Short date format to use + Persist + 1 + Type + String + Value + %Y-%m-%d + + ShortTimeFormat + + Comment + Short time format (hours and minutes) to use + Persist + 1 + Type + String + Value + %H:%M + + LongTimeFormat + + Comment + Long time format (hours, minutes and seconds) to use + Persist + 1 + Type + String + Value + %H:%M:%S + + TimestampFormat + + Comment + Timestamp format to use + Persist + 1 + Type + String + Value + %a %d %b %Y %H:%M:%S + + SecondsInChatAndIMs + + Comment + TRUE to add seconds to timestamps for IM and chat + Persist + 1 + Type + Boolean + Value + 0 + + FloaterAboutRect + + Comment + Rectangle for About window + Persist + 1 + Type + Rect + Value + + 0 + 440 + 470 + 0 + + + FloaterActiveSpeakersRect + + Comment + Rectangle for active speakers window + Persist + 1 + Type + Rect + Value + + 0 + 300 + 250 + 0 + + + FloaterActiveSpeakersSortAscending + + Comment + Whether to sort up or down + Persist + 1 + Type + Boolean + Value + 1 + + FloaterActiveSpeakersSortColumn + + Comment + Column name to sort on + Persist + 1 + Type + String + Value + speaking_status + + FloaterAreaSearchRect + + Comment + Rectangle for the area search floater + Persist + 1 + Type + Rect + Value + + 0 + 400 + 200 + 0 + + + FloaterAdvancedSkyRect + + Comment + Rectangle for Advanced Sky Editor + Persist + 1 + Type + Rect + Value + + 0 + 220 + 700 + 0 + + + FloaterAdvancedWaterRect + + Comment + Rectangle for Advanced Water Editor + Persist + 1 + Type + Rect + Value + + 0 + 240 + 700 + 0 + + + FloaterAudioVolumeRect + + Comment + Rectangle for Audio Volume window + Persist + 1 + Type + Rect + Value + + 0 + 440 + 470 + 0 + + + FloaterBeaconsRect + + Comment + Rectangle for beacon and highlight controls + Persist + 1 + Type + Rect + Value + + 200 + 250 + 250 + 200 + + + FloaterBuildOptionsRect + + Comment + Rectangle for build options window. + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + FloaterVFSRect + + Comment + Rectangle for local assets window. + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + FloaterBumpRect + + Comment + Rectangle for Bumps/Hits window + Persist + 1 + Type + Rect + Value + + 0 + 180 + 400 + 0 + + + FloaterBuyContentsRect + + Comment + Rectangle for Buy Contents window + Persist + 1 + Type + Rect + Value + + 0 + 250 + 300 + 0 + + + FloaterBuyRect + + Comment + Rectangle for buy window + Persist + 1 + Type + Rect + Value + + 0 + 250 + 300 + 0 + + + FloaterCameraRect3 + + Comment + Rectangle for camera control window + Persist + 1 + Type + Rect + Value + + 0 + 64 + 176 + 0 + + + FloaterChatRect + + Comment + Rectangle for chat history + Persist + 1 + Type + Rect + Value + + 0 + 172 + 500 + 0 + + + FloaterClothingRect + + Comment + Rectangle for clothing window + Persist + 1 + Type + Rect + Value + + 0 + 480 + 320 + 0 + + + FloaterContactsRect + + Comment + Rectangle for chat history + Persist + 1 + Type + Rect + Value + + 0 + 390 + 395 + 0 + + + FloaterCustomizeAppearanceRect + + Comment + Rectangle for avatar customization window + Persist + 1 + Type + Rect + Value + + 0 + 540 + 494 + 0 + + + FloaterDayCycleRect + + Comment + Rectangle for Day Cycle Editor + Persist + 1 + Type + Rect + Value + + 0 + 646 + 275 + 0 + + + FloaterEnvRect + + Comment + Rectangle for Environment Editor + Persist + 1 + Type + Rect + Value + + 0 + 150 + 600 + 0 + + + FloaterFindRect2 + + Comment + Rectangle for Find window + Persist + 1 + Type + Rect + Value + + 0 + 570 + 780 + 0 + + + FloaterFriendsRect + + Comment + Rectangle for friends window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 250 + 0 + + + FloaterGestureRect2 + + Comment + Rectangle for gestures window + Persist + 1 + Type + Rect + Value + + 0 + 465 + 350 + 0 + + + FloaterHUDRect2 + + Comment + Rectangle for HUD Floater window + Persist + 1 + Type + Rect + Value + + + 0 + 292 + 362 + 0 + + + FloaterHtmlRect + + Comment + Rectangle for HTML window + Persist + 1 + Type + Rect + Value + + 100 + 460 + 370 + 100 + + + FloaterIMRect + + Comment + Rectangle for IM window + Persist + 1 + Type + Rect + Value + + 0 + 160 + 500 + 0 + + + FloaterInspectRect + + Comment + Rectangle for Object Inspect window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 400 + 0 + + + FloaterInventoryRect + + Comment + Rectangle for inventory window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 300 + 0 + + + FloaterJoystickRect + + Comment + Rectangle for joystick controls window. + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + FloaterLagMeter + + Comment + Rectangle for lag meter + Persist + 1 + Type + Rect + Value + + 0 + 142 + 350 + 0 + + + ShowRadar + + Comment + Show the radar floater + Persist + 1 + Type + Boolean + Value + 0 + + FloaterRadarRect + + Comment + Rectangle for Radar + Persist + 1 + Type + Rect + Value + + 0 + 400 + 200 + 0 + + + RadarKeepOpen + + Comment + Keeps radar updates running in background + Persist + 1 + Type + Boolean + Value + 0 + + RadarUpdateRate + + Comment + Radar update rate (0 = high, 1 = medium, 2 = low) + Persist + 1 + Type + U32 + Value + 1 + + RadarAlertSim + + Comment + Whether the radar emits chat alerts for avatars entering/exiting sim + Persist + 1 + Type + Boolean + Value + 0 + + RadarAlertDraw + + Comment + Whether the radar emits chat alerts for avatars entering/exiting draw distance + Persist + 1 + Type + Boolean + Value + 0 + + RadarAlertShoutRange + + Comment + Whether the radar emits chat alerts for avatars entering/exiting shout range + Persist + 1 + Type + Boolean + Value + 0 + + RadarAlertChatRange + + Comment + Whether the radar emits chat alerts for avatars entering/exiting chat range + Persist + 1 + Type + Boolean + Value + 1 + + RadarChatAlerts + + Comment + Whether the radar emits chat alerts regarding the status of avatars it displays + Persist + 1 + Type + Boolean + Value + 0 + + RadarChatKeys + + Comment + Enable private chat alerts for avatars entering the region + Persist + 1 + Type + Boolean + Value + 0 + + FloaterLandRect5 + + Comment + Rectangle for About Land window + Persist + 1 + Type + Rect + Value + + 0 + 370 + 460 + 0 + + + FloaterLandmarkRect + + Comment + Rectangle for landmark picker + Persist + 1 + Type + Rect + Value + + 0 + 290 + 310 + 0 + + + FloaterMediaRect + + Comment + Rectangle for media browser window + Persist + 1 + Type + Rect + Value + + 16 + 650 + 600 + 128 + + + FloaterMiniMapRect + + Comment + Rectangle for world map + Persist + 1 + Type + Rect + Value + + 0 + 225 + 200 + 0 + + + FloaterMoveRect2 + + Comment + Rectangle for avatar control window + Persist + 1 + Type + Rect + Value + + 0 + 58 + 135 + 0 + + + FloaterMuteRect3 + + Comment + Rectangle for mute window + Persist + 1 + Type + Rect + Value + + 0 + 300 + 300 + 0 + + + FloaterObjectIMInfo + + Comment + Rectangle for floater object im info windows + Persist + 1 + Type + Rect + Value + + 0 + 300 + 300 + 0 + + + FloaterOpenObjectRect + + Comment + Rectangle for Open Object window + Persist + 1 + Type + Rect + Value + + 0 + 350 + 300 + 0 + + + FloaterPayRectB + + Comment + Rectangle for pay window + Persist + 1 + Type + Rect + Value + + 0 + 150 + 400 + 0 + + + FloaterPermPrefsRect + + Comment + Rectangle for initial permissions preferences + Persist + 1 + Type + Rect + Value + + 200 + 250 + 250 + 200 + + + FloaterRegionInfo + + Comment + Rectangle for region info window + Persist + 1 + Type + Rect + Value + + 0 + 512 + 480 + 0 + + + FloaterScriptDebugRect + + Comment + Rectangle for Script Error/Debug window + Persist + 1 + Type + Rect + Value + + 0 + 130 + 450 + 0 + + + FloaterSnapshotRect + + Comment + Rectangle for snapshot window + Persist + 1 + Type + Rect + Value + + 0 + 200 + 200 + 400 + + + FloaterSoundsRect + + Comment + Rectangle for sounds log floater. + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + FloaterSoundsLogAvatars + + Comment + Show SoundTriggers/gestures played by agents in the log. Also includes collision sounds if enabled + Persist + 1 + Type + Boolean + Value + 1 + + FloaterSoundsLogObjects + + Comment + Show sounds played by objects in the log. Also includes collision sounds if enabled + Persist + 1 + Type + Boolean + Value + 1 + + FloaterSoundsLogCollisions + + Comment + Don't filter out default collision sounds in the log + Persist + 1 + Type + Boolean + Value + 1 + + FloaterSoundsLogRepeats + + Comment + Only show one entry for each unique asset ID in the log + Persist + 1 + Type + Boolean + Value + 1 + + FloaterStatisticsRect + + Comment + Rectangle for chat history + Persist + 1 + Type + Rect + Value + + 0 + 400 + 250 + 0 + + + FloaterTeleportHistoryRect + + Comment + Rectangle for teleport history window + Persist + 1 + Type + Rect + Value + + 20 + 20 + 470 + 200 + + + FloaterViewBottom + + Comment + [DO NOT MODIFY] Controls layout of floating windows within SL window + Persist + 1 + Type + S32 + Value + -1 + + FloaterWorldMapRect2 + + Comment + Rectangle for world map window + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + FloaterAORect + + Comment + Rectangle for AO editor. + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + FloaterAvatarsRect + + Comment + Rectangle for avatar radar. + Persist + 1 + Type + Rect + Value + + 200 + 905 + 396 + 734 + + + FloaterInterceptorRect + + Comment + Rectangle for interceptor floater. + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + FloaterKeyToolRect + + Comment + Rectangle for KeyTool floater. + Persist + 1 + Type + Rect + Value + + 439 + 759 + 593 + 443 + + + KeyToolAutomaticOpen + + Comment + Automatically open KeyTool results + Persist + 1 + Type + Boolean + Value + 1 + + KeyToolAutomaticClose + + Comment + Automatically close KeyTool floater when a result is found + Persist + 1 + Type + Boolean + Value + 1 + + FloaterSoundsRect + + Comment + Rectangle for sounds log floater. + Persist + 1 + Type + Rect + Value + + 0 + 0 + 0 + 0 + + + FloaterSoundsLogAvatars + + Comment + Show SoundTriggers/gestures played by agents in the log. Also includes collision sounds if enabled + Persist + 1 + Type + Boolean + Value + 1 + + FloaterSoundsLogObjects + + Comment + Show sounds played by objects in the log. Also includes collision sounds if enabled + Persist + 1 + Type + Boolean + Value + 1 + + FloaterSoundsLogCollisions + + Comment + Don't filter out default collision sounds in the log + Persist + 1 + Type + Boolean + Value + 1 + + FloaterSoundsLogRepeats + + Comment + Only show one entry for each unique asset ID in the log + Persist + 1 + Type + Boolean + Value + 1 + + FlyBtnState + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + AlwaysAllowFly + + Comment + Ignore parcel/region setting that blocks flying + Persist + 1 + Type + Boolean + Value + 1 + + FlycamAbsolute + + Comment + Treat Flycam values as absolute positions (not deltas). + Persist + 1 + Type + Boolean + Value + 0 + + FlycamAxisDeadZone0 + + Comment + Flycam axis 0 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + FlycamAxisDeadZone1 + + Comment + Flycam axis 1 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + FlycamAxisDeadZone2 + + Comment + Flycam axis 2 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + FlycamAxisDeadZone3 + + Comment + Flycam axis 3 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + FlycamAxisDeadZone4 + + Comment + Flycam axis 4 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + FlycamAxisDeadZone5 + + Comment + Flycam axis 5 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + FlycamAxisDeadZone6 + + Comment + Flycam axis 6 dead zone. + Persist + 1 + Type + F32 + Value + 0.1 + + FlycamAxisScale0 + + Comment + Flycam axis 0 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + FlycamAxisScale1 + + Comment + Flycam axis 1 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + FlycamAxisScale2 + + Comment + Flycam axis 2 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + FlycamAxisScale3 + + Comment + Flycam axis 3 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + FlycamAxisScale4 + + Comment + Flycam axis 4 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + FlycamAxisScale5 + + Comment + Flycam axis 5 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + FlycamAxisScale6 + + Comment + Flycam axis 6 scaler. + Persist + 1 + Type + F32 + Value + 1.0 + + FlycamFeathering + + Comment + Flycam feathering (less is softer) + Persist + 1 + Type + F32 + Value + 16.0 + + FlycamZoomDirect + + Comment + Map flycam zoom axis directly to camera zoom. + Persist + 1 + Type + Boolean + Value + 0 + + FlyingAtExit + + Comment + Was flying when last logged out, so fly when logging in + Persist + 1 + Type + Boolean + Value + 0 + + FocusOffsetDefault + + Comment + Default focus point offset relative to avatar (x-axis is forward) + Persist + 1 + Type + Vector3 + Value + + 1.0 + 0.0 + 1.0 + + + FocusPosOnLogout + + Comment + Camera focus point when last logged out (global coordinates) + Persist + 1 + Type + Vector3D + Value + + 0.0 + 0.0 + 0.0 + + + FolderAutoOpenDelay + + Comment + Seconds before automatically expanding the folder under the mouse when performing inventory drag and drop + Persist + 1 + Type + F32 + Value + 0.75 + + FolderLoadingMessageWaitTime + + Comment + Seconds to wait before showing the LOADING... text in folder views + Persist + 1 + Type + F32 + Value + 0.5 + + FontMonospace + + Comment + Name of monospace font that definitely exists (Truetype file name) + Persist + 0 + Type + String + Value + DejaVuSansMono.ttf + + FontSansSerif + + Comment + Name of primary sans-serif font that definitely exists (Truetype file name) + Persist + 0 + Type + String + Value + DroidSans.ttf + + FontSansSerifBundledFallback + + Comment + Name of secondary sans-serif font that definitely exists (Truetype file name) + Persist + 0 + Type + String + Value + DejaVuSansCondensed.ttf + + FontSansSerifBold + + Comment + Name of bold font (Truetype file name) + Persist + 0 + Type + String + Value + DroidSans-Bold.ttf + + FontSansSerifFallback + + Comment + Name of sans-serif font (Truetype file name) + Persist + 0 + Type + String + Value + + + FontSansSerifFallbackScale + + Comment + Scale of fallback font relative to huge font (fraction of huge font size) + Persist + 1 + Type + F32 + Value + 1.00 + + FontScreenDPI + + Comment + Font resolution, higher is bigger (pixels per inch) + Persist + 1 + Type + F32 + Value + 96.0 + + FontSizeHuge + + Comment + Size of huge font (points, or 1/72 of an inch) + Persist + 1 + Type + F32 + Value + 14.0 + + FontSizeLarge + + Comment + Size of large font (points, or 1/72 of an inch) + Persist + 1 + Type + F32 + Value + 11.0 + + FontSizeMedium + + Comment + Size of medium font (points, or 1/72 of an inch) + Persist + 1 + Type + F32 + Value + 9.5 + + FontSizeMonospace + + Comment + Size of monospaced font (points, or 1/72 of an inch) + Persist + 1 + Type + F32 + Value + 9.0 + + FontSizeSmall + + Comment + Size of small font (points, or 1/72 of an inch) + Persist + 1 + Type + F32 + Value + 8.5 + + ForceNotecardDragCargoPermissive + + Comment + For testing what does and does not work when using HTTPS upload + Persist + 1 + Type + Boolean + Value + 0 + + ForceNotecardDragCargoAcceptance + + Comment + For testing what does and does not work when using HTTPS upload + Persist + 1 + Type + Boolean + Value + 0 + + ForceShowGrid + + Comment + Always show grid dropdown on login screen + Persist + 1 + Type + Boolean + Value + 0 + + ForceMandatoryUpdate + + Comment + For QA: On next startup, forces the auto-updater to run + Persist + 1 + Type + Boolean + Value + 0 + + ForwardBtnRect + + Comment + + Persist + 0 + Type + Rect + Value + + 45 + 54 + 66 + 29 + + + FreezeTime + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + FullScreen + + Comment + Run SL in fullscreen mode + Persist + 1 + Type + Boolean + Value + 0 + + FullScreenAspectRatio + + Comment + Aspect ratio of fullscreen display (width / height) + Persist + 1 + Type + F32 + Value + 1.33329999447 + + FullScreenAutoDetectAspectRatio + + Comment + Automatically detect proper aspect ratio for fullscreen display + Persist + 1 + Type + Boolean + Value + 1 + + FullScreenHeight + + Comment + Fullscreen resolution in height + Persist + 1 + Type + S32 + Value + 768 + + FullScreenWidth + + Comment + Fullscreen resolution in width + Persist + 1 + Type + S32 + Value + 1024 + + GridCrossSections + + Comment + Highlight cross sections of prims with grid manipulation plane. + Persist + 1 + Type + Boolean + Value + 0 + + GridDrawSize + + Comment + Visible extent of 2D snap grid (meters) + Persist + 1 + Type + F32 + Value + 12.0 + + GridMode + + Comment + Snap grid reference frame (0 = world, 1 = local, 2 = reference object) + Persist + 1 + Type + S32 + Value + 0 + + GridOpacity + + Comment + Grid line opacity (0.0 = completely transparent, 1.0 = completely opaque) + Persist + 1 + Type + F32 + Value + 0.699999988079 + + GridResolution + + Comment + Size of single grid step (meters) + Persist + 1 + Type + F32 + Value + 0.5 + + GridSubUnit + + Comment + Display fractional grid steps, relative to grid size + Persist + 1 + Type + Boolean + Value + 0 + + GridSubdivision + + Comment + Maximum number of times to divide single snap grid unit when GridSubUnit is true + Persist + 1 + Type + S32 + Value + 32 + + GroupNotifyBoxHeight + + Comment + Height of group notice messages + Persist + 1 + Type + S32 + Value + 260 + + GroupNotifyBoxWidth + + Comment + Width of group notice messages + Persist + 1 + Type + S32 + Value + 400 + + HTMLLinkColor + + Comment + Color of hyperlinks + Persist + 1 + Type + Color4 + Value + + 0.600000023842 + 0.600000023842 + 1.0 + 1.0 + + + HelpHomeURL + + Comment + URL of initial help page + Persist + 1 + Type + String + Value + help/index.html + + HelpLastVisitedURL + + Comment + URL of last help page, will be shown next time help is accessed + Persist + 1 + Type + String + Value + help/index.html + + HighResSnapshot + + Comment + Double resolution of snapshot from current window resolution + Persist + 1 + Type + Boolean + Value + 0 + + HtmlFindRect + + Comment + Rectangle for HTML find window + Persist + 1 + Type + Rect + Value + + 16 + 650 + 600 + 128 + + + HtmlHelpLastPage + + Comment + Last URL visited via help system + Persist + 1 + Type + String + Value + + + HtmlHelpRect + + Comment + Rectangle for HTML help window + Persist + 1 + Type + Rect + Value + + 16 + 650 + 600 + 128 + + + HtmlReleaseMessage + + Comment + Rectangle for HTML Release Message Floater window + Persist + 1 + Type + Rect + Value + + 46 + 520 + 400 + 128 + + + IMInChatConsole + + Comment + Copy IM into chat console + Persist + 1 + Type + Boolean + Value + 1 + + IMInChatHistory + + Comment + Copy IM into chat history + Persist + 1 + Type + Boolean + Value + 0 + + IMShowTimestamps + + Comment + Show timestamps in IM + Persist + 1 + Type + Boolean + Value + 1 + + IgnorePixelDepth + + Comment + Ignore pixel depth settings. + Persist + 1 + Type + Boolean + Value + 0 + + ImagePipelineUseHTTP + + Comment + If TRUE use HTTP GET to fetch textures from the server + Persist + 1 + Type + Boolean + Value + 1 + + InBandwidth + + Comment + Incoming bandwidth throttle (bps) + Persist + 1 + Type + F32 + Value + 0.0 + + InstallLanguage + + Comment + Language passed from installer (for UI) + Persist + 1 + Type + String + Value + en-us + + FetchInventoryOnLogin + + Comment + Automatically fetch the inventory in the background after login + Persist + 1 + Type + Boolean + Value + 1 + + InventoryAutoOpenDelay + + Comment + Seconds before automatically opening inventory when mouse is over inventory button when performing inventory drag and drop + Persist + 1 + Type + F32 + Value + 1.0 + + InventorySortOrder + + Comment + Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) + Persist + 1 + Type + U32 + Value + 7 + + InvertMouse + + Comment + When in mouselook, moving mouse up looks down and vice verse (FALSE = moving up looks up) + Persist + 1 + Type + Boolean + Value + 0 + + JoystickAvatarEnabled + + Comment + Enables the Joystick to control Avatar movement. + Persist + 1 + Type + Boolean + Value + 1 + + JoystickAxis0 + + Comment + Flycam hardware axis mapping for internal axis 0 ([0, 5]). + Persist + 1 + Type + S32 + Value + 1 + + JoystickAxis1 + + Comment + Flycam hardware axis mapping for internal axis 1 ([0, 5]). + Persist + 1 + Type + S32 + Value + 0 + + JoystickAxis2 + + Comment + Flycam hardware axis mapping for internal axis 2 ([0, 5]). + Persist + 1 + Type + S32 + Value + 2 + + JoystickAxis3 + + Comment + Flycam hardware axis mapping for internal axis 3 ([0, 5]). + Persist + 1 + Type + S32 + Value + 4 + + JoystickAxis4 + + Comment + Flycam hardware axis mapping for internal axis 4 ([0, 5]). + Persist + 1 + Type + S32 + Value + 3 + + JoystickAxis5 + + Comment + Flycam hardware axis mapping for internal axis 5 ([0, 5]). + Persist + 1 + Type + S32 + Value + 5 + + JoystickAxis6 + + Comment + Flycam hardware axis mapping for internal axis 6 ([0, 5]). + Persist + 1 + Type + S32 + Value + -1 + + JoystickBuildEnabled + + Comment + Enables the Joystick to move edited objects. + Persist + 1 + Type + Boolean + Value + 0 + + JoystickEnabled + + Comment + Enables Joystick Input. + Persist + 1 + Type + Boolean + Value + 0 + + JoystickFlycamEnabled + + Comment + Enables the Joystick to control the flycam. + Persist + 0 + Type + Boolean + Value + 1 + + JoystickInitialized + + Comment + Whether or not a joystick has been detected and initiailized. + Persist + 1 + Type + String + Value + + + JoystickRunThreshold + + Comment + Input threshold to initiate running + Persist + 1 + Type + F32 + Value + 0.25 + + KeepAspectForSnapshot + + Comment + Use full window when taking snapshot, regardless of requested image size + Persist + 1 + Type + Boolean + Value + 1 + + LandBrushSize + + Comment + Size of affected region when using teraform tool + Persist + 1 + Type + F32 + Value + 2.0 + + LCDDestination + + Comment + Which LCD to use + Persist + 1 + Type + S32 + Value + 0 + + LSLFindCaseInsensitivity + + Comment + Use case insensitivity when searching in LSL editor + Persist + 1 + Type + Boolean + Value + 0 + + LSLHelpRect + + Comment + Rectangle for LSL help window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 400 + 0 + + + LSLHelpURL + + Comment + URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword + Persist + 1 + Type + String + Value + http://wiki.secondlife.com/wiki/[LSL_STRING] + + LagMeterShrunk + + Comment + Last large/small state for lag meter + Persist + 1 + Type + Boolean + Value + 0 + + Language + + Comment + Language specifier (for UI) + Persist + 1 + Type + String + Value + default + + LanguageIsPublic + + Comment + Let other residents see our language information + Persist + 1 + Type + Boolean + Value + 1 + + TranslateLanguage + + Comment + Translate Language specifier + Persist + 1 + Type + String + Value + default + + TranslateChat + + Comment + Translate incoming chat messages + Persist + 1 + Type + Boolean + Value + 0 + + LastFeatureVersion + + Comment + [DO NOT MODIFY] Version number for tracking hardware changes + Persist + 1 + Type + S32 + Value + 0 + + LastFindPanel + + Comment + Controls which find operation appears by default when clicking "Find" button + Persist + 1 + Type + String + Value + find_all_panel + + LastName + + Comment + Login last name + Persist + 1 + Type + String + Value + + + LastPrefTab + + Comment + Last selected tab in preferences window + Persist + 1 + Type + S32 + Value + 0 + + LastRunVersion + + Comment + Version number of last instance of the viewer that you ran + Persist + 1 + Type + String + Value + 0.0.0 + + LastSnapshotToEmailHeight + + Comment + The height of the last email snapshot, in px + Persist + 1 + Type + S32 + Value + 768 + + LastSnapshotToEmailWidth + + Comment + The width of the last email snapshot, in px + Persist + 1 + Type + S32 + Value + 1024 + + LastSnapshotToDiskHeight + + Comment + The height of the last disk snapshot, in px + Persist + 1 + Type + S32 + Value + 768 + + LastSnapshotToDiskWidth + + Comment + The width of the last disk snapshot, in px + Persist + 1 + Type + S32 + Value + 1024 + + LastSnapshotToInventoryHeight + + Comment + The height of the last texture snapshot, in px + Persist + 1 + Type + S32 + Value + 512 + + LastSnapshotToInventoryWidth + + Comment + The width of the last texture snapshot, in px + Persist + 1 + Type + S32 + Value + 512 + + LastSnapshotType + + Comment + Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image) + Persist + 1 + Type + S32 + Value + 0 + + LeftClickShowMenu + + Comment + Left click opens pie menu (FALSE = left click touches or grabs object) + Persist + 1 + Type + Boolean + Value + 0 + + LegacyMultiAttachmentSupport + + Comment + Converts legacy "secondary attachment points" to multi-attachments for other avatars + Persist + 1 + Type + Boolean + Value + 1 + + LimitDragDistance + + Comment + Limit translation of object via translate tool + Persist + 1 + Type + Boolean + Value + 1 + + LimitSelectDistance + + Comment + Disallow selection of objects beyond max select distance + Persist + 1 + Type + Boolean + Value + 0 + + LipSyncAah + + Comment + Aah (jaw opening) babble loop + Persist + 1 + Type + String + Value + 257998776531013446642343 + + LipSyncAahPowerTransfer + + Comment + Transfer curve for Voice Interface power to aah lip sync amplitude + Persist + 1 + Type + String + Value + 0000123456789 + + LipSyncEnabled + + Comment + 0 disable lip-sync, 1 enable babble loop + Persist + 1 + Type + Boolean + Value + 1 + + LipSyncOoh + + Comment + Ooh (mouth width) babble loop + Persist + 1 + Type + String + Value + 1247898743223344444443200000 + + LipSyncOohAahRate + + Comment + Rate to babble Ooh and Aah (/sec) + Persist + 1 + Type + F32 + Value + 24.0 + + LipSyncOohPowerTransfer + + Comment + Transfer curve for Voice Interface power to ooh lip sync amplitude + Persist + 1 + Type + String + Value + 0012345566778899 + + LocalCacheVersion + + Comment + Version number of cache + Persist + 1 + Type + S32 + Value + 0 + + LogMessages + + Comment + Log network traffic + Persist + 1 + Type + Boolean + Value + 0 + + LoginAsGod + + Comment + Attempt to login with god powers (Linden accounts only) + Persist + 1 + Type + Boolean + Value + 0 + + LoginLastLocation + + Comment + Login at same location you last logged out + Persist + 1 + Type + Boolean + Value + 1 + + LoginPage + + Comment + Login authentication page. + Persist + 1 + Type + String + Value + + + LosslessJ2CUpload + + Comment + Use lossless compression for small image uploads + Persist + 1 + Type + Boolean + Value + 0 + + MainloopTimeoutDefault + + Comment + Timeout duration for mainloop lock detection, in seconds. + Persist + 1 + Type + F32 + Value + 20.0 + + MapServerURL + + Comment + World map URL template for locating map tiles + Persist + 0 + Type + String + Value + http://map.secondlife.com.s3.amazonaws.com/ + + UseWebMapTiles + + Comment + Use web map tiles whenever possible + Persist + 1 + Type + Boolean + Value + 1 + + MapOverlayIndex + + Comment + Currently selected world map type + Persist + 1 + Type + S32 + Value + 0 + + MapScale + + Comment + World map zoom level (pixels per region) + Persist + 1 + Type + F32 + Value + 128.0 + + MapShowAgentCount + + Comment + Show number of agents next to region names on world map + Persist + 1 + Type + Boolean + Value + 1 + + MapShowPGEvents + + Comment + Show PG events on world map + Persist + 1 + Type + Boolean + Value + 1 + + MapShowMatureEvents + + Comment + Show mature events on world map + Persist + 1 + Type + Boolean + Value + 0 + + MapShowAdultEvents + + Comment + Show adult events on world map + Persist + 1 + Type + Boolean + Value + 0 + + MapShowInfohubs + + Comment + Show infohubs on the world map + Persist + 1 + Type + Boolean + Value + 1 + + MapShowLandForSale + + Comment + Show land for sale on world map + Persist + 1 + Type + Boolean + Value + 0 + + MapShowPeople + + Comment + Show other users on world map + Persist + 1 + Type + Boolean + Value + 1 + + MapShowTelehubs + + Comment + Show telehubs on world map + Persist + 1 + Type + Boolean + Value + 1 + + Marker + + Comment + [NOT USED] + Persist + 1 + Type + String + Value + + + MaxDragDistance + + Comment + Maximum allowed translation distance in a single operation of translate tool (meters from start point) + Persist + 1 + Type + F32 + Value + 48.0 + + MaxSelectDistance + + Comment + Maximum allowed selection distance (meters from avatar) + Persist + 1 + Type + F32 + Value + 64.0 + + MeanCollisionBump + + Comment + You have experienced an abuse of being bumped by an object or avatar + Persist + 1 + Type + Boolean + Value + 0 + + MeanCollisionPhysical + + Comment + You have experienced an abuse from a physical object + Persist + 1 + Type + Boolean + Value + 0 + + MeanCollisionPushObject + + Comment + You have experienced an abuse of being pushed by a scripted object + Persist + 1 + Type + Boolean + Value + 0 + + MeanCollisionScripted + + Comment + You have experienced an abuse from a scripted object + Persist + 1 + Type + Boolean + Value + 0 + + MeanCollisionSelected + + Comment + You have experienced an abuse of being pushed via a selected object + Persist + 1 + Type + Boolean + Value + 0 + + MediaControlFadeTime + + Comment + Amount of time (in seconds) that the media control fades + Persist + 1 + Type + F32 + Value + 1.5 + + MediaControlTimeout + + Comment + Amount of time (in seconds) for media controls to fade with no mouse activity + Persist + 1 + Type + F32 + Value + 3.0 + + MediaOnAPrimUI + + Comment + Whether or not to show the "link sharing" UI + Persist + 1 + Type + Boolean + Value + 0 + + MemoryLogFrequency + + Comment + Seconds between display of Memory in log (0 for never) + Persist + 1 + Type + F32 + Value + 600.0 + + MenuAccessKeyTime + + Comment + Time (seconds) in which the menu key must be tapped to move focus to the menu bar + Persist + 1 + Type + F32 + Value + 0.25 + + MenuBarHeight + + Comment + + Persist + 0 + Type + S32 + Value + 18 + + MenuBarWidth + + Comment + + Persist + 0 + Type + S32 + Value + 410 + + MigrateCacheDirectory + + Comment + Check for old version of disk cache to migrate to current location + Persist + 1 + Type + Boolean + Value + 1 + + MiniMapPrimMaxRadius + + Comment + Radius of the largest prim to show on the MiniMap. Increasing beyond 256 may cause client lag. + Persist + 1 + Type + F32 + Value + 256.0 + + MiniMapCenter + + Comment + Sets the focal point of the minimap. (0=None, 1=Camera) + Persist + 1 + Type + S32 + Value + 1 + + MiniMapRotate + + Comment + Rotate miniature world map to avatar direction + Persist + 1 + Type + Boolean + Value + 1 + + MiniMapScale + + Comment + Miniature world map zoom level (pixels per region) + Persist + 1 + Type + F32 + Value + 128.0 + + MouseSensitivity + + Comment + Controls responsiveness of mouse when in mouselook mode (fraction or multiple of default mouse sensitivity) + Persist + 1 + Type + F32 + Value + 3.0 + + MouseSmooth + + Comment + Smooths out motion of mouse when in mouselook mode. + Persist + 1 + Type + Boolean + Value + 0 + + MouseSun + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + MouselookBtnState + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + MoveDownBtnRect + + Comment + + Persist + 0 + Type + Rect + Value + + 91 + 29 + 116 + 4 + + + MoveUpBtnRect + + Comment + + Persist + 0 + Type + Rect + Value + + 91 + 54 + 116 + 29 + + + DisableWindAudio + + Comment + Disable the wind audio effect + Persist + 1 + Type + Boolean + Value + 0 + + MuteAmbient + + Comment + Ambient sound effects, such as wind noise, play at 0 volume + Persist + 1 + Type + Boolean + Value + 0 + + MuteAudio + + Comment + All audio plays at 0 volume (streaming audio still takes up bandwidth, for example) + Persist + 1 + Type + Boolean + Value + 0 + + MuteMedia + + Comment + Media plays at 0 volume (streaming audio still takes up bandwidth) + Persist + 1 + Type + Boolean + Value + 0 + + MuteMusic + + Comment + Music plays at 0 volume (streaming audio still takes up bandwidth) + Persist + 1 + Type + Boolean + Value + 0 + + MuteSounds + + Comment + Sound effects play at 0 volume + Persist + 1 + Type + Boolean + Value + 0 + + MuteUI + + Comment + UI sound effects play at 0 volume + Persist + 1 + Type + Boolean + Value + 0 + + MuteVoice + + Comment + Voice plays at 0 volume (streaming audio still takes up bandwidth) + Persist + 1 + Type + Boolean + Value + 0 + + MuteWhenMinimized + + Comment + Mute audio when SL window is minimized + Persist + 1 + Type + Boolean + Value + 1 + + NearMeRange + + Comment + Search radius for nearby avatars + Persist + 1 + Type + F32 + Value + 20 + + NextOwnerCopy + + Comment + Newly created objects can be copied by next owner + Persist + 1 + Type + Boolean + Value + 0 + + NextOwnerModify + + Comment + Newly created objects can be modified by next owner + Persist + 1 + Type + Boolean + Value + 0 + + NextOwnerTransfer + + Comment + Newly created objects can be resold or given away by next owner + Persist + 1 + Type + Boolean + Value + 1 + + NewCacheLocation + + Comment + Change the location of the local disk cache to this + Persist + 1 + Type + String + Value + + + NextLoginLocation + + Comment + Location to log into by default. + Persist + 1 + Type + String + Value + + + Nimble + + Comment + Disables landing and jumping delays. + Persist + 1 + Type + Boolean + Value + 0 + + NoAudio + + Comment + Disable audio playback. + Persist + 1 + Type + Boolean + Value + 0 + + NoHardwareProbe + + Comment + Disable hardware probe. + Persist + 1 + Type + Boolean + Value + 0 + + NoInventoryLibrary + + Comment + Do not request inventory library. + Persist + 1 + Type + Boolean + Value + 0 + + NoPreload + + Comment + Disable sound and image preload. + Persist + 1 + Type + Boolean + Value + 0 + + NoVerifySSLCert + + Comment + Do not verify SSL peers. + Persist + 1 + Type + Boolean + Value + 0 + + NotecardEditorRect + + Comment + Rectangle for notecard editor + Persist + 1 + Type + Rect + Value + + 0 + 400 + 400 + 0 + + + NotifyBoxHeight + + Comment + Height of notification messages + Persist + 1 + Type + S32 + Value + 200 + + NotifyBoxWidth + + Comment + Width of notification messages + Persist + 1 + Type + S32 + Value + 350 + + NotifyMoneyChange + + Comment + Pop up notifications for all L$ transactions + Persist + 1 + Type + Boolean + Value + 1 + + NotifyTipDuration + + Comment + Length of time that notification tips stay on screen (seconds) + Persist + 1 + Type + F32 + Value + 4.0 + + NumSessions + + Comment + Number of successful logins to Second Life + Persist + 1 + Type + S32 + Value + 0 + + NumpadControl + + Comment + How numpad keys control your avatar. 0 = Like the normal arrow keys, 1 = Numpad moves avatar when numlock is off, 2 = Numpad moves avatar regardless of numlock (use this if you have no numlock) + Persist + 1 + Type + S32 + Value + 0 + + OpenDebugStatAdvanced + + Comment + Expand advanced performance stats display + Persist + 1 + Type + Boolean + Value + 0 + + OpenDebugStatBasic + + Comment + Expand basic performance stats display + Persist + 1 + Type + Boolean + Value + 1 + + OpenDebugStatNet + + Comment + Expand network stats display + Persist + 1 + Type + Boolean + Value + 1 + + OpenDebugStatRender + + Comment + Expand render stats display + Persist + 1 + Type + Boolean + Value + 1 + + OpenDebugStatSim + + Comment + Expand simulator performance stats display + Persist + 1 + Type + Boolean + Value + 1 + + OpenDebugStatTexture + + Comment + Expand Texture performance stats display + Persist + 1 + Type + Boolean + Value + 0 + + OpenDebugStatPhysicsDetails + + Comment + Expand Physics Details performance stats display + Persist + 1 + Type + Boolean + Value + 0 + + OpenDebugStatSimTime + + Comment + Expand Simulator Time performance stats display + Persist + 1 + Type + Boolean + Value + 0 + + OpenDebugStatSimTimeDetails + + Comment + Expand Simulator Time Details performance stats display + Persist + 1 + Type + Boolean + Value + 0 + + OutBandwidth + + Comment + Outgoing bandwidth throttle (bps) + Persist + 1 + Type + F32 + Value + 0.0 + + OverdrivenColor + + Comment + Color of various indicators when resident is speaking too loud. + Persist + 1 + Type + Color4 + Value + + 1.0 + 0.0 + 0.0 + 1.0 + + + OverlayTitle + + Comment + Controls watermark text message displayed on screen when "ShowOverlayTitle" is enabled (one word, underscores become spaces) + Persist + 1 + Type + String + Value + Set_via_OverlayTitle_in_settings.xml + + PTTCurrentlyEnabled + + Comment + Use Push to Talk mode + Persist + 0 + Type + Boolean + Value + 1 + + PacketDropPercentage + + Comment + Percentage of packets dropped by the client. + Persist + 1 + Type + F32 + Value + 0.0 + + ParcelMediaAutoPlayEnable + + Comment + Auto play parcel media when available + Persist + 1 + Type + Boolean + Value + 0 + + PerAccountSettingsFile + + Comment + Persisted client settings file name (per user). + Persist + 0 + Type + String + Value + + + PermissionsCautionEnabled + + Comment + When enabled, changes the handling of script permission requests to help avoid accidental granting of certain permissions, such as the debit permission + Persist + 0 + Type + Boolean + Value + 1 + + PermissionsCautionNotifyBoxHeight + + Comment + Height of caution-style notification messages + Persist + 0 + Type + S32 + Value + 344 + + RevokePermsOnStandUp + + Comment + When enabled, revokes any permission granted to an object you don't own and from which your avatar is standing up + Persist + 1 + Type + Boolean + Value + 0 + + PermissionsManagerRect + + Comment + Rectangle for permissions manager window + Persist + 1 + Type + Rect + Value + + 0 + 85 + 300 + 0 + + + PickerContextOpacity + + Comment + Controls overall opacity of context frustrum connecting color and texture pickers with their swatches + Persist + 1 + Type + F32 + Value + 0.34999999404 + + PicksPerSecondMouseMoving + + Comment + How often to perform hover picks while the mouse is moving (picks per second) + Persist + 1 + Type + F32 + Value + 5.0 + + PicksPerSecondMouseStationary + + Comment + How often to perform hover picks while the mouse is stationary (picks per second) + Persist + 1 + Type + F32 + Value + 0.0 + + PieMenuLineWidth + + Comment + Width of lines in pie menu display (pixels) + Persist + 1 + Type + F32 + Value + 2.5 + + PinTalkViewOpen + + Comment + Stay in IM after hitting return + Persist + 1 + Type + Boolean + Value + 1 + + PingInterpolate + + Comment + Extrapolate object position along velocity vector based on ping delay + Persist + 1 + Type + Boolean + Value + 0 + + PitchFromMousePosition + + Comment + Vertical range over which avatar head tracks mouse position (degrees of head rotation from top of window to bottom) + Persist + 1 + Type + F32 + Value + 90.0 + + PlayTypingAnim + + Comment + Your avatar plays the typing animation whenever you type in the chat bar + Persist + 1 + Type + Boolean + Value + 1 + + PlayTypingSound + + Comment + TRUE to play and hear the typing sound whenever you or another avatar types in the chat bar + Persist + 1 + Type + Boolean + Value + 1 + + PrecachingDelay + + Comment + Delay when logging in to load world before showing it (seconds) + Persist + 1 + Type + F32 + Value + 6.0 + + PreferredMaturity + + Comment + Setting for the user's preferred maturity level. + Persist + 1 + Type + U32 + Value + 13 + + PreviewAnimRect + + Comment + Rectangle for animation preview window + Persist + 1 + Type + Rect + Value + + 0 + 85 + 300 + 0 + + + PreviewClassifiedRect + + Comment + Rectangle for URL preview window + Persist + 1 + Type + Rect + Value + + 0 + 530 + 420 + 0 + + + PreviewEventRect + + Comment + Rectangle for Event preview window + Persist + 1 + Type + Rect + Value + + 0 + 530 + 420 + 0 + + + PreviewLandmarkRect + + Comment + Rectangle for landmark preview window + Persist + 1 + Type + Rect + Value + + 0 + 90 + 300 + 0 + + + PreviewObjectRect + + Comment + Rectangle for object preview window + Persist + 1 + Type + Rect + Value + + 0 + 85 + 300 + 0 + + + PreviewScriptRect + + Comment + Rectangle for script preview window + Persist + 1 + Type + Rect + Value + + 0 + 586 + 576 + 0 + + + SaveScriptsAsMono + + Comment + When set to TRUE, save scripts in inventory as Mono scripts instead of LSL2 + Persist + 1 + Type + Boolean + Value + 1 + + PreviewSoundRect + + Comment + Rectangle for sound preview window + Persist + 1 + Type + Rect + Value + + 0 + 85 + 300 + 0 + + + PreviewTextureRect + + Comment + Rectangle for texture preview window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 400 + 0 + + + PreviewURLRect + + Comment + Rectangle for URL preview window + Persist + 1 + Type + Rect + Value + + 0 + 90 + 300 + 0 + + + PreviewWearableRect + + Comment + Rectangle for wearable preview window + Persist + 1 + Type + Rect + Value + + 0 + 85 + 300 + 0 + + + ProbeHardwareOnStartup + + Comment + Query current hardware configuration on application startup + Persist + 1 + Type + Boolean + Value + 1 + + PropertiesRect + + Comment + Rectangle for inventory item properties window + Persist + 1 + Type + Rect + Value + + 0 + 320 + 350 + 0 + + + PurgeCacheOnNextStartup + + Comment + Clear local file cache next time viewer is run + Persist + 1 + Type + Boolean + Value + 0 + + PurgeCacheOnStartup + + Comment + Clear local file cache every time viewer is run + Persist + 1 + Type + Boolean + Value + 0 + + PushToTalkButton + + Comment + Which button or keyboard key is used for push-to-talk + Persist + 1 + Type + String + Value + MiddleMouse + + PushToTalkToggle + + Comment + Should the push-to-talk button behave as a toggle + Persist + 1 + Type + Boolean + Value + 0 + + QAMode + + Comment + Enable Testing Features. + Persist + 1 + Type + Boolean + Value + 0 + + QuietSnapshotsToDisk + + Comment + Take snapshots to disk without playing animation or sound + Persist + 1 + Type + Boolean + Value + 0 + + QuitAfterSeconds + + Comment + The duration allowed before quitting. + Persist + 1 + Type + F32 + Value + 0.0 + + RadioLandBrushAction + + Comment + Last selected land modification operation (0 = flatten, 1 = raise, 2 = lower, 3 = smooth, 4 = roughen, 5 = revert) + Persist + 1 + Type + S32 + Value + 0 + + RadioLandBrushSize + + Comment + Size of land modification brush (0 = small, 1 = medium, 2 = large) + Persist + 1 + Type + S32 + Value + 0 + + LandBrushForce + + Comment + Multiplier for land modification brush force. + Persist + 1 + Type + F32 + Value + 1.0 + + RecentItemsSortOrder + + Comment + Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) + Persist + 1 + Type + U32 + Value + 1 + + RectangleSelectInclusive + + Comment + Select objects that have at least one vertex inside selection rectangle + Persist + 1 + Type + Boolean + Value + 1 + + RegionTextureSize + + Comment + Terrain texture dimensions (power of 2) + Persist + 1 + Type + U32 + Value + 256 + + RememberPassword + + Comment + Keep password (in encrypted form) for next login + Persist + 1 + Type + Boolean + Value + 1 + + RenderAnisotropic + + Comment + Render textures using anisotropic filtering + Persist + 1 + Type + Boolean + Value + 0 + + RenderAppleUseMultGL + + Comment + Whether we want to use multi-threaded OpenGL on Apple hardware (requires restart of SL). + Persist + 1 + Type + Boolean + Value + 0 + + RenderAttachedLights + + Comment + Render lighted prims that are attached to avatars + Persist + 1 + Type + Boolean + Value + 1 + + RenderAttachedParticles + + Comment + Render particle systems that are attached to avatars + Persist + 1 + Type + Boolean + Value + 1 + + RenderAvatarCloth + + Comment + Controls if avatars use wavy cloth + Persist + 1 + Type + Boolean + Value + 1 + + RenderAvatarLODFactor + + Comment + Controls level of detail of avatars (multiplier for current screen area when calculated level of detail) + Persist + 1 + Type + F32 + Value + 0.5 + + RenderAvatarMaxVisible + + Comment + Maximum number of avatars to display at any one time + Persist + 1 + Type + S32 + Value + 35 + + RenderAvatarPhysicsLODFactor + + Comment + Controls level of detail of avatar physics (such as breast physics). + Persist + 1 + Type + F32 + Value + 1.0 + + RenderAvatarInvisible + + Comment + Set your avatar as Invisible + Persist + 0 + Type + Boolean + Value + 0 + + RenderAvatarVP + + Comment + Use vertex programs to perform hardware skinning of avatar + Persist + 1 + Type + Boolean + Value + 1 + + RenderShadowGaussian + + Comment + Gaussian coefficients for the two shadow/SSAO blurring passes (z component unused). + Persist + 1 + Type + Vector3 + Value + + 2.0 + 2.0 + 0.0 + + + RenderShadowNearDist + + Comment + Near clip plane of shadow camera (affects precision of depth shadows). + Persist + 1 + Type + Vector3 + Value + + 256 + 256 + 256 + + + RenderShadowClipPlanes + + Comment + Near clip plane split distances for shadow map frusta. + Persist + 1 + Type + Vector3 + Value + + 4.0 + 8.0 + 24.0 + + + RenderSSAOScale + + Comment + Scaling factor for the area to sample for occluders (pixels at 1 meter away, inversely varying with distance) + Persist + 1 + Type + F32 + Value + 500.0 + + RenderSSAOMaxScale + + Comment + Maximum screen radius for sampling (pixels) + Persist + 1 + Type + U32 + Value + 60 + + RenderSSAOFactor + + Comment + Occlusion sensitivity factor for ambient occlusion (larger is more) + Persist + 1 + Type + F32 + Value + 0.30 + + RenderSSAOEffect + + Comment + Multiplier for (1) value and (2) saturation (HSV definition), for areas which are totally occluded. Blends with original color for partly-occluded areas. (Third component is unused.) + Persist + 1 + Type + Vector3 + Value + + 0.40 + 1.00 + 0.00 + + + RenderBumpmapMinDistanceSquared + + Comment + Maximum distance at which to render bumpmapped primitives (distance in meters, squared) + Persist + 1 + Type + F32 + Value + 100.0 + + RenderNormalMapScale + + Comment + Scaler applied to height map when generating normal maps + Persist + 1 + Type + F32 + Value + 128 + + RenderCubeMap + + Comment + Whether we can render the cube map or not + Persist + 1 + Type + Boolean + Value + 1 + + RenderCustomSettings + + Comment + Do you want to set the graphics settings yourself + Persist + 1 + Type + Boolean + Value + 0 + + RenderDebugGL + + Comment + Enable strict GL debugging. + Persist + 1 + Type + Boolean + Value + 0 + + RenderDebugPipeline + + Comment + Enable strict pipeline debugging. + Persist + 1 + Type + Boolean + Value + 0 + + RenderDebugTextureBind + + Comment + Enable texture bind performance test. + Persist + 1 + Type + Boolean + Value + 0 + + RenderDelayCreation + + Comment + Throttle creation of drawables. + Persist + 1 + Type + Boolean + Value + 0 + + RenderAnimateRes + + Comment + Animate rezing prims. + Persist + 1 + Type + Boolean + Value + 0 + + RenderAnimateTrees + + Comment + Use GL matrix ops to animate tree branches. + Persist + 1 + Type + Boolean + Value + 0 + + RenderDeferredAlphaSoften + + Comment + Scalar for softening alpha surfaces (for soft particles). + Persist + 1 + Type + F32 + Value + 0.75 + + RenderDeferredNoise + + Comment + Noise scalar to hide banding in deferred render. + Persist + 1 + Type + F32 + Value + 4 + + RenderDeferred + + Comment + Use deferred rendering pipeline. + Persist + 1 + Type + Boolean + Value + 0 + + RenderDeferredSunShadow + + Comment + Generate shadows from the sun. + Persist + 1 + Type + Boolean + Value + 1 + + RenderDeferredSunWash + + Comment + Amount local lights are washed out by sun. + Persist + 1 + Type + F32 + Value + 0.5 + + RenderShadowNoise + + Comment + Magnitude of noise on shadow samples. + Persist + 1 + Type + F32 + Value + -0.0001 + + RenderShadowBlurSize + + Comment + Scale of shadow softening kernel. + Persist + 1 + Type + F32 + Value + 0.7 + + RenderShadowBlurSamples + + Comment + Number of samples to take for each pass of shadow blur (value range 1-16). Actual number of samples is value * 2 - 1. + Persist + 1 + Type + U32 + Value + 5 + + RenderDynamicLOD + + Comment + Dynamically adjust level of detail. + Persist + 1 + Type + Boolean + Value + 1 + + RenderFSAASamples + + Comment + Number of samples to use for FSAA (0 = no AA). + Persist + 1 + Type + U32 + Value + 0 + + RenderFarClip + + Comment + Distance of far clip plane from camera (meters) + Persist + 1 + Type + F32 + Value + 256.0 + + SavedRenderFarClip + + Comment + Saved draw distance (used in case of logout during speed rezzing) + Persist + 1 + Type + F32 + Value + 0.0 + + SpeedRez + + Comment + Set to TRUE to increase rezzing speed via draw distance stepping + Persist + 1 + Type + Boolean + Value + 0 + + SpeedRezInterval + + Comment + Interval in seconds between each draw distance increment + Persist + 1 + Type + U32 + Value + 20 + + RenderFastAlpha + + Comment + Use lossy alpha rendering optimization (opaque/nonexistent small alpha faces). + Persist + 1 + Type + Boolean + Value + 0 + + RenderFastUI + + Comment + [NOT USED] + Persist + 1 + Type + Boolean + Value + 0 + + RenderFlexTimeFactor + + Comment + Controls level of detail of flexible objects (multiplier for amount of time spent processing flex objects) + Persist + 1 + Type + F32 + Value + 1.0 + + RenderFogRatio + + Comment + Distance from camera where fog reaches maximum density (fraction or multiple of far clip distance) + Persist + 1 + Type + F32 + Value + 4.0 + + RenderGamma + + Comment + Sets gamma exponent for renderer + Persist + 1 + Type + F32 + Value + 0.0 + + RenderGammaFull + + Comment + Use fully controllable gamma correction, instead of faster, hard-coded gamma correction of 2. + Persist + 1 + Type + Boolean + Value + 1.0 + + RenderGlow + + Comment + Render bloom post effect. + Persist + 1 + Type + Boolean + Value + 1 + + RenderGlowIterations + + Comment + Number of times to iterate the glow (higher = wider and smoother but slower) + Persist + 1 + Type + S32 + Value + 2 + + RenderGlowLumWeights + + Comment + Weights for each color channel to be used in calculating luminance (should add up to 1.0) + Persist + 1 + Type + Vector3 + Value + + 0.299 + 0.587 + 0.114 + + + RenderGlowMaxExtractAlpha + + Comment + Max glow alpha value for brightness extraction to auto-glow. + Persist + 1 + Type + F32 + Value + 0.065 + + RenderGlowMinLuminance + + Comment + Min luminance intensity necessary to consider an object bright enough to automatically glow. + Persist + 1 + Type + F32 + Value + 2.5 + + RenderGlowResolutionPow + + Comment + Glow map resolution power of two. + Persist + 1 + Type + S32 + Value + 9 + + RenderGlowStrength + + Comment + Additive strength of glow. + Persist + 1 + Type + F32 + Value + 0.35 + + RenderGlowWarmthAmount + + Comment + Amount of warmth extraction to use (versus luminance extraction). 0 = lum, 1.0 = warmth + Persist + 1 + Type + F32 + Value + 0.0 + + RenderGlowWarmthWeights + + Comment + Weight of each color channel used before finding the max warmth + Persist + 1 + Type + Vector3 + Value + + 1.0 + 0.5 + 0.7 + + + RenderGlowWidth + + Comment + Glow sample size (higher = wider and softer but eventually more pixelated) + Persist + 1 + Type + F32 + Value + 1.3 + + RenderGround + + Comment + Determines whether we can render the ground pool or not + Persist + 1 + Type + Boolean + Value + 1 + + RenderHUDInSnapshot + + Comment + Display HUD attachments in snapshot + Persist + 1 + Type + Boolean + Value + 0 + + RenderHUDParticles + + Comment + Display particle systems in HUD attachments (experimental) + Persist + 1 + Type + Boolean + Value + 0 + + RenderHighlightSelections + + Comment + Show selection outlines on objects + Persist + 0 + Type + Boolean + Value + 1 + + RenderHiddenSelections + + Comment + Show selection lines on objects that are behind other objects + Persist + 1 + Type + Boolean + Value + 1 + + RenderHideGroupTitle + + Comment + Don't show my group title in my name label + Persist + 1 + Type + Boolean + Value + 0 + + RenderHideGroupTitleAll + + Comment + Show group titles in name labels + Persist + 1 + Type + Boolean + Value + 0 + + RenderInitError + + Comment + Error occured while initializing GL + Persist + 1 + Type + Boolean + Value + 0 + + RenderLightRadius + + Comment + Render the radius of selected lights + Persist + 1 + Type + Boolean + Value + 0 + + RenderLightingDetail + + Comment + Amount of detail for lighting objects/avatars/terrain (0=sun/moon only, 1=enable local lights) + Persist + 1 + Type + S32 + Value + 1 + + RenderMaxPartCount + + Comment + Maximum number of particles to display on screen + Persist + 1 + Type + S32 + Value + 4096 + + RenderMaxNodeSize + + Comment + Maximum size of a single node's vertex data (in KB). + Persist + 1 + Type + S32 + Value + 8192 + + RenderMaxVBOSize + + Comment + Maximum size of a vertex buffer (in KB). + Persist + 1 + Type + S32 + Value + 512 + + RenderName + + Comment + Controls display of names above avatars (0 = never, 1 = fade, 2 = always) + Persist + 1 + Type + S32 + Value + 2 + + RenderNameFadeDuration + + Comment + Time interval over which to fade avatar names (seconds) + Persist + 1 + Type + F32 + Value + 1.0 + + RenderNameHideSelf + + Comment + Don't display own name above avatar + Persist + 1 + Type + Boolean + Value + 0 + + RenderNameShowTime + + Comment + Fade avatar names after specified time (seconds) + Persist + 1 + Type + F32 + Value + 10.0 + + RenderObjectBump + + Comment + Show bumpmapping on primitives + Persist + 1 + Type + Boolean + Value + 1 + + ReSit + + Comment + Sit again if unsat + Persist + 0 + Type + Boolean + Value + 0 + + SpecifiedChannel + + Comment + What the viewer identifies itself as + Persist + 1 + Type + String + Value + AscentViewer + + SpecifiedVersionMaj + + Comment + Client's Major Version + Persist + 1 + Type + U32 + Value + 1 + + SpecifiedVersionMin + + Comment + Client's Minor Version + Persist + 1 + Type + U32 + Value + 4 + + SpecifiedVersionPatch + + Comment + Client's Patch Version + Persist + 1 + Type + U32 + Value + 0 + + SpecifiedVersionBuild + + Comment + Client's Build Version + Persist + 1 + Type + U32 + Value + 100000 + + RenderQualityPerformance + + Comment + Which graphics settings you've chosen + Persist + 1 + Type + U32 + Value + 1 + + RenderReflectionDetail + + Comment + Detail of reflection render pass. + Persist + 1 + Type + S32 + Value + 2 + + RenderReflectionRes + + Comment + Reflection map resolution. + Persist + 1 + Type + S32 + Value + 64 + + RenderResolutionDivisor + + Comment + Divisor for rendering 3D scene at reduced resolution. + Persist + 1 + Type + U32 + Value + 1 + + RenderShaderLightingMaxLevel + + Comment + Max lighting level to use in the shader (class 3 is default, 2 is less lights, 1 is sun/moon only. Works around shader compiler bugs on certain platforms.) + Persist + 1 + Type + S32 + Value + 3 + + RenderShaderLODThreshold + + Comment + Fraction of draw distance defining the switch to a different shader LOD + Persist + 1 + Type + F32 + Value + 1.0 + + RenderShaderParticleThreshold + + Comment + Fraction of draw distance to not use shader on particles + Persist + 1 + Type + F32 + Value + 0.25 + + RenderSunDynamicRange + + Comment + Defines what percent brighter the sun is than local point lights (1.0 = 100% brighter. Value should not be less than 0. ). + Persist + 1 + Type + F32 + Value + 1.0 + + RenderTerrainDetail + + Comment + Detail applied to terrain texturing (0 = none, 1 or 2 = full) + Persist + 1 + Type + S32 + Value + 2 + + RenderTerrainLODFactor + + Comment + Controls level of detail of terrain (multiplier for current screen area when calculated level of detail) + Persist + 1 + Type + F32 + Value + 1.0 + + RenderTerrainScale + + Comment + Terrain detail texture scale + Persist + 1 + Type + F32 + Value + 12.0 + + RenderTextureMemoryMultiple + + Comment + Multiple of texture memory value to use (should fit: 0 < value <= 1.0) + Persist + 1 + Type + F32 + Value + 1.0 + + RenderTreeLODFactor + + Comment + Controls level of detail of vegetation (multiplier for current screen area when calculated level of detail) + Persist + 1 + Type + F32 + Value + 0.5 + + RenderUIInSnapshot + + Comment + Display user interface in snapshot + Persist + 1 + Type + Boolean + Value + 0 + + RenderUnloadedAvatar + + Comment + Show avatars which haven't finished loading + Persist + 1 + Type + Boolean + Value + 0 + + RenderUseFBO + + Comment + Whether we want to use GL_EXT_framebuffer_objects. + Persist + 1 + Type + Boolean + Value + 0 + + RenderUseFarClip + + Comment + If false, frustum culling will ignore far clip plane. + Persist + 1 + Type + Boolean + Value + 1 + + RenderUseImpostors + + Comment + Whether we want to use impostors for far away avatars. + Persist + 1 + Type + Boolean + Value + 1 + + RenderUseShaderLOD + + Comment + Whether we want to have different shaders for LOD + Persist + 1 + Type + Boolean + Value + 1 + + RenderUseShaderNearParticles + + Comment + Whether we want to use shaders on near particles + Persist + 1 + Type + Boolean + Value + 0 + + RenderVBOEnable + + Comment + Use GL Vertex Buffer Objects + Persist + 1 + Type + Boolean + Value + 1 + + RenderVBOMappingDisable + + Comment + Disable VBO glMapBufferARB + Persist + 1 + Type + Boolean + Value + 1 + + RenderVolumeLODFactor + + Comment + Controls level of detail of primitives (multiplier for current screen area when calculated level of detail) + Persist + 1 + Type + F32 + Value + 1.0 + + RenderWater + + Comment + Display water + Persist + 1 + Type + Boolean + Value + 1 + + RenderWaterMipNormal + + Comment + Use mip maps for water normal map. + Persist + 1 + Type + Boolean + Value + 1 + + RenderWaterRefResolution + + Comment + Water planar reflection resolution. + Persist + 1 + Type + S32 + Value + 512 + + RenderWaterReflections + + Comment + Reflect the environment in the water. + Persist + 1 + Type + Boolean + Value + 0 + + RenderWaterVoidCulling + + Comment + Cull void water objects when off-screen. + Persist + 1 + Type + Boolean + Value + 1 + + RotateRight + + Comment + Make the agent rotate to its right. + Persist + 1 + Type + Boolean + Value + 0 + + RotationStep + + Comment + All rotations via rotation tool are constrained to multiples of this unit (degrees) + Persist + 1 + Type + F32 + Value + 1.0 + + RunBtnState + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + RunMultipleThreads + + Comment + If TRUE keep background threads active during render + Persist + 1 + Type + Boolean + Value + 1 + + SafeMode + + Comment + Reset preferences, run in safe mode. + Persist + 1 + Type + Boolean + Value + 0 + + SaveInventoryScriptsAsMono + + Comment + When editing and saving a script in inventory, configure it to compile as mono when dragged into a task + Persist + 1 + Type + Boolean + Value + 0 + + SaveMinidump + + Comment + Save minidump for developer debugging on crash + Persist + 1 + Type + Boolean + Value + 1 + + ShowMapDestinationInChat + + Comment + Show llMapDestination as slurl in chat + Persist + 1 + Type + Boolean + Value + 0 + + DisableScriptTeleportRequest + + Comment + Don't allow scripts to pop the map + Persist + 1 + Type + Boolean + Value + 0 + + DisableClickSit + + Comment + Never sit by clicking a prim + Persist + 1 + Type + Boolean + Value + 0 + + PlayIMSound + + Comment + Play sound when receiving an IM + Persist + 1 + Type + Boolean + Value + 1 + + IMSoundID + + Comment + UUID of sound to play if PlayIMSound enabled + Persist + 1 + Type + String + Value + 4c366008-65da-2e84-9b74-f58a392b94c6 + + OpenIMOnTyping + + Comment + Open IM tab when typing message received + Persist + 1 + Type + Boolean + Value + 1 + + EnableGestures + + Comment + Enables gestures + Persist + 1 + Type + Boolean + Value + 1 + + DisableAgentUpdates + + Comment + Stops regular agent updates + Persist + 0 + Type + Boolean + Value + 0 + + ScaleShowAxes + + Comment + Show indicator of selected scale axis when scaling + Persist + 1 + Type + Boolean + Value + 0 + + RectangleSelectOverlap + + Comment + Selection box works as long as it remotely touches or something + Persist + 0 + Type + Boolean + Value + 0 + + InterceptorAffectYours + + Comment + Controls whether the interceptor stops your own objects too + Persist + 1 + Type + Boolean + Value + 0 + + InterceptorRange + + Comment + Controls the range of the interceptor effect + Persist + 1 + Type + F32 + Value + 10.0 + + ScaleStretchTextures + + Comment + Stretch textures along with object when scaling + Persist + 1 + Type + Boolean + Value + 1 + + ScaleUniform + + Comment + Scale selected objects evenly about center of selection + Persist + 1 + Type + Boolean + Value + 0 + + ScriptErrorColor + + Comment + Color of script error messages + Persist + 1 + Type + Color4 + Value + + 0.8235294117 + 0.2745098039 + 0.2745098039 + 1.0 + + + ScriptErrorsAsChat + + Comment + Display script errors and warning in chat history + Persist + 1 + Type + Boolean + Value + 0 + + ScriptHelpFollowsCursor + + Comment + Scripting help window updates contents based on script editor contents under text cursor + Persist + 1 + Type + Boolean + Value + 0 + + SearchURLDefault + + Comment + URL to load for empty searches + Persist + 1 + HideFromEditor + 1 + Type + String + Value + http://search.secondlife.com/client_search.php? + + SearchURLDefaultOpenSim + + Comment + URL to load for empty OpenSim searches + Persist + 1 + HideFromEditor + 0 + Type + String + Value + http://webi.metaverseink.com/opensim/results.jsp? + + SearchURLQuery + + Comment + URL to use for searches + Persist + 1 + HideFromEditor + 1 + Type + String + Value + http://search.secondlife.com/client_search.php?q=[QUERY]&s=[COLLECTION]& + + SearchURLSuffix2 + + Comment + Parameters added to end of search queries + Persist + 1 + HideFromEditor + 1 + Type + String + Value + lang=[LANG]&mat=[MATURITY]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION] + + SelectMovableOnly + + Comment + Select only objects you can move + Persist + 1 + Type + Boolean + Value + 0 + + SelectOwnedOnly + + Comment + Select only objects you own + Persist + 1 + Type + Boolean + Value + 0 + + SelectionHighlightAlpha + + Comment + Opacity of selection highlight (0.0 = completely transparent, 1.0 = completely opaque) + Persist + 1 + Type + F32 + Value + 0.40000000596 + + SelectionHighlightAlphaTest + + Comment + Alpha value below which pixels are displayed on selection highlight line (0.0 = show all pixels, 1.0 = show now pixels) + Persist + 1 + Type + F32 + Value + 0.1 + + SelectionHighlightThickness + + Comment + Thickness of selection highlight line (fraction of view distance) + Persist + 1 + Type + F32 + Value + 0.00999999977648 + + SelectionHighlightUAnim + + Comment + Rate at which texture animates along U direction in selection highlight line (fraction of texture per second) + Persist + 1 + Type + F32 + Value + 0.0 + + SelectionHighlightUScale + + Comment + Scale of texture display on selection highlight line (fraction of texture size) + Persist + 1 + Type + F32 + Value + 0.1 + + SelectionHighlightVAnim + + Comment + Rate at which texture animates along V direction in selection highlight line (fraction of texture per second) + Persist + 1 + Type + F32 + Value + 0.5 + + SelectionHighlightVScale + + Comment + Scale of texture display on selection highlight line (fraction of texture size) + Persist + 1 + Type + F32 + Value + 1.0 + + ServerChoice + + Comment + [DO NOT MODIFY] Controls which grid you connect to + Persist + 1 + Type + S32 + Value + 0 + + ShareWithGroup + + Comment + Newly created objects are shared with the currently active group + Persist + 1 + Type + Boolean + Value + 0 + + ShowActiveSpeakers + + Comment + Display active speakers list on login + Persist + 1 + Type + Boolean + Value + 0 + + ShowAllObjectHoverTip + + Comment + Show descriptive tooltip when mouse hovers over non-interactive and interactive objects. + Persist + 1 + Type + Boolean + Value + 0 + + ShowAxes + + Comment + Render coordinate frame at your position + Persist + 1 + Type + Boolean + Value + 0 + + ShowBanLines + + Comment + Show in-world ban/access borders + Persist + 1 + Type + Boolean + Value + 1 + + ShowCameraControls + + Comment + Display camera controls on login + Persist + 1 + Type + Boolean + Value + 0 + + ShowChatHistory + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowCommunicate + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowConsoleWindow + + Comment + Show log in separate OS window + Persist + 1 + Type + Boolean + Value + 0 + + ShowCrosshairs + + Comment + Display crosshairs when in mouselook mode + Persist + 1 + Type + Boolean + Value + 1 + + ShowDebugConsole + + Comment + Show log in SL window + Persist + 1 + Type + Boolean + Value + 0 + + ShowDebugStats + + Comment + Show performance stats display + Persist + 1 + Type + Boolean + Value + 0 + + ShowDirectory + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowEmptyFoldersWhenSearching + + Comment + Shows folders that do not have any visible contents when applying a filter to inventory + Persist + 1 + Type + Boolean + Value + 0 + + ShowHoverTips + + Comment + Show descriptive tooltip when mouse hovers over items in world + Persist + 1 + Type + Boolean + Value + 1 + + ShowInventory + + Comment + Open inventory window on login + Persist + 1 + Type + Boolean + Value + 0 + + ShowLandHoverTip + + Comment + Show descriptive tooltip when mouse hovers over land + Persist + 1 + Type + Boolean + Value + 0 + + ShowLeaders + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowPGSearchAll + + Comment + Display results of search All that are flagged as PG + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 1 + + ShowMatureSearchAll + + Comment + Display results of search All that are flagged as mature + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowAdultSearchAll + + Comment + Display results of search All that are flagged as adult + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowPGGroups + + Comment + Display results of find groups that are flagged as PG + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 1 + + ShowMatureGroups + + Comment + Display results of find groups that are flagged as mature + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowAdultGroups + + Comment + Display results of find groups that are flagged as adult + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowPGClassifieds + + Comment + Display results of find classifieds that are flagged as PG + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 1 + + ShowMatureClassifieds + + Comment + Display results of find classifieds that are flagged as mature + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowAdultClassifieds + + Comment + Display results of find classifieds that are flagged as adult + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowPGEvents + + Comment + Display results of find events that are flagged as PG + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 1 + + ShowMatureEvents + + Comment + Display results of find events that are flagged as mature + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowAdultEvents + + Comment + Display results of find events that are flagged as adult + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowPGLand + + Comment + Display results of find land sales that are flagged as PG + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 1 + + ShowMatureLand + + Comment + Display results of find land sales that are flagged as mature + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowAdultLand + + Comment + Display results of find land sales that are flagged as adult + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowPGSims + + Comment + Display results of find places or find popular that are in PG sims + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 1 + + ShowMatureSims + + Comment + Display results of find places or find popular that are in mature sims + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowAdultSims + + Comment + Display results of find places or find popular that are in adult sims + Persist + 1 + HideFromEditor + 1 + Type + Boolean + Value + 0 + + ShowMiniMap + + Comment + Display mini map on login + Persist + 1 + Type + Boolean + Value + 1 + + ShowMovementControls + + Comment + Display movement controls on login + Persist + 1 + Type + Boolean + Value + 0 + + ShowNearClip + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowNewInventory + + Comment + Automatically views new notecards/textures/landmarks + Persist + 1 + Type + Boolean + Value + 1 + + ShowInInventory + + Comment + Automatically opens inventory to show accepted objects + Persist + 1 + Type + Boolean + Value + 1 + + ShowObjectUpdates + + Comment + Show when update messages are received for individual objects + Persist + 0 + Type + Boolean + Value + 0 + + ShowOverlayTitle + + Comment + Prints watermark text message on screen + Persist + 1 + Type + Boolean + Value + 0 + + ShowParcelOwners + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowPermissions + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowPropertyLines + + Comment + Show line overlay demarking property boundaries + Persist + 1 + Type + Boolean + Value + 0 + + ShowSearchBar + + Comment + Show the Search Bar in the Status Overlay + Persist + 1 + Type + Boolean + Value + 0 + + ShowStartLocation + + Comment + Display starting location menu on login screen + Persist + 1 + Type + Boolean + Value + 1 + + ShowTangentBasis + + Comment + Render normal and binormal (debugging bump mapping) + Persist + 1 + Type + Boolean + Value + 0 + + ShowToolBar + + Comment + Show toolbar at bottom of screen + Persist + 1 + Type + Boolean + Value + 1 + + ShowTools + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowTutorial + + Comment + Show tutorial window on login + Persist + 1 + Type + Boolean + Value + 0 + + ShowVoiceChannelPopup + + Comment + Controls visibility of the current voice channel popup above the voice tab + Persist + 1 + Type + Boolean + Value + 0 + + ShowVolumeSettingsPopup + + Comment + Show individual volume slider for voice, sound effects, etc + Persist + 1 + Type + Boolean + Value + 0 + + ShowWorldMap + + Comment + Display world map on login + Persist + 1 + Type + Boolean + Value + 0 + + ShowXUINames + + Comment + Display XUI Names as Tooltips + Persist + 0 + Type + Boolean + Value + 0 + + SitBtnState + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + SkyAmbientScale + + Comment + Controls strength of ambient, or non-directional light from the sun and moon (fraction or multiple of default ambient level) + Persist + 1 + Type + F32 + Value + 0.300000011921 + + SkyEditPresets + + Comment + Whether to be able to edit the sky defaults or not + Persist + 1 + Type + Boolean + Value + 0 + + SkyNightColorShift + + Comment + Controls moonlight color (base color applied to moon as light source) + Persist + 1 + Type + Color3 + Value + + 0.699999988079 + 0.699999988079 + 1.0 + + + SkyOverrideSimSunPosition + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + SkySunDefaultPosition + + Comment + Default position of sun in sky (direction in world coordinates) + Persist + 1 + Type + Vector3 + Value + + 1.0 + 0.0 + 0.1 + + + SkyUseClassicClouds + + Comment + Whether to use the old Second Life particle clouds or not + Persist + 1 + Type + Boolean + Value + 1 + + SlideLeftBtnRect + + Comment + + Persist + 0 + Type + Rect + Value + + 20 + 54 + 45 + 29 + + + SlideRightBtnRect + + Comment + + Persist + 0 + Type + Rect + Value + + 66 + 54 + 91 + 29 + + + SmallAvatarNames + + Comment + Display avatar name text in smaller font + Persist + 1 + Type + Boolean + Value + 1 + + SnapEnabled + + Comment + Enable snapping to grid + Persist + 1 + Type + Boolean + Value + 1 + + SnapMargin + + Comment + Controls maximum distance between windows before they auto-snap together (pixels) + Persist + 1 + Type + S32 + Value + 10 + + SnapToMouseCursor + + Comment + When snapping to grid, center object on nearest grid point to mouse cursor + Persist + 1 + Type + Boolean + Value + 0 + + SnapshotFormat + + Comment + Save snapshots in this format (0 = PNG, 1 = JPEG, 2 = BMP) + Persist + 1 + Type + S32 + Value + 0 + + SnapshotLocalLastResolution + + Comment + Take next local snapshot at this resolution + Persist + 1 + Type + S32 + Value + 0 + + SnapshotPostcardLastResolution + + Comment + Take next postcard snapshot at this resolution + Persist + 1 + Type + S32 + Value + 0 + + SnapshotQuality + + Comment + Quality setting of postcard JPEGs (0 = worst, 100 = best) + Persist + 1 + Type + S32 + Value + 75 + + SnapshotTextureLastResolution + + Comment + Take next texture snapshot at this resolution + Persist + 1 + Type + S32 + Value + 0 + + SpeakingColor + + Comment + Color of various indicators when resident is speaking on a voice channel. + Persist + 1 + Type + Color4 + Value + + 0.0 + 1.0 + 0.0 + 1.0 + + + SpeedTest + + Comment + Performance testing mode, no network + Persist + 1 + Type + Boolean + Value + 0 + + StatsAutoRun + + Comment + Play back autopilot + Persist + 1 + Type + Boolean + Value + 0 + + StatsFile + + Comment + Filename for stats logging output + Persist + 1 + Type + String + Value + fs.txt + + StatsNumRuns + + Comment + Loop autopilot playback this number of times + Persist + 1 + Type + S32 + Value + -1 + + StatsPilotFile + + Comment + Filename for stats logging autopilot path + Persist + 1 + Type + String + Value + pilot.txt + + StatsQuitAfterRuns + + Comment + Quit application after this number of autopilot playback runs + Persist + 1 + Type + Boolean + Value + 0 + + StatsSessionTrackFrameStats + + Comment + Track rendering and network statistics + Persist + 1 + Type + Boolean + Value + 0 + + StatsSummaryFile + + Comment + Filename for stats logging summary + Persist + 1 + Type + String + Value + fss.txt + + StatusBarHeight + + Comment + Height of menu/status bar at top of screen (pixels) + Persist + 1 + Type + S32 + Value + 26 + + StatusBarPad + + Comment + Spacing between popup buttons at bottom of screen (Stand up, Release Controls) + Persist + 1 + Type + S32 + Value + 10 + + SystemLanguage + + Comment + Language indicated by system settings (for UI) + Persist + 1 + Type + String + Value + en-us + + TabToTextFieldsOnly + + Comment + TAB key takes you to next text entry field, instead of next widget + Persist + 1 + Type + Boolean + Value + 0 + + TemporaryUpload + + Comment + Whether or not a upload is temporary + Persist + 0 + Type + Boolean + Value + 0 + + TerrainColorHeightRange + + Comment + Altitude range over which a given terrain texture has effect (meters) + Persist + 1 + Type + F32 + Value + 60.0 + + TerrainColorStartHeight + + Comment + Starting altitude for terrain texturing (meters) + Persist + 1 + Type + F32 + Value + 20.0 + + TextureMemory + + Comment + Amount of memory to use for textures in MB (0 = autodetect) + Persist + 1 + Type + S32 + Value + 0 + + TexturePickerRect + + Comment + Rectangle for texture picker + Persist + 1 + Type + Rect + Value + + 0 + 290 + 350 + 0 + + + TexturePickerShowFolders + + Comment + Show folders with no texures in texture picker + Persist + 1 + Type + Boolean + Value + 1 + + TexturePickerSortOrder + + Comment + Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) + Persist + 1 + Type + U32 + Value + 2 + + ThirdPersonBtnState + + Comment + + Persist + 0 + Type + Boolean + Value + 1 + + ThrottleBandwidthKBPS + + Comment + Maximum allowable downstream bandwidth (kilo bits per second) + Persist + 1 + Type + F32 + Value + 2000.0 + + ToolHelpRect + + Comment + + Persist + 0 + Type + Rect + Value + + 8 + 178 + 75 + 162 + + + ToolTipDelay + + Comment + Seconds before displaying tooltip when mouse stops over UI element + Persist + 1 + Type + F32 + Value + 0.699999988079 + + ToolboxAutoMove + + Comment + [NOT USED] + Persist + 1 + Type + Boolean + Value + 0 + + ToolboxRect + + Comment + Rectangle for tools window + Persist + 1 + Type + Rect + Value + + 0 + 100 + 100 + 100 + + + TrackFocusObject + + Comment + Camera tracks last object zoomed on + Persist + 1 + Type + Boolean + Value + 1 + + TurnLeftBtnRect + + Comment + + Persist + 0 + Type + Rect + Value + + 20 + 29 + 45 + 4 + + + TurnRightBtnRect + + Comment + + Persist + 0 + Type + Rect + Value + + 66 + 29 + 91 + 4 + + + TutorialURL + + Comment + URL for tutorial menu item, set automatically during login + Persist + 0 + Type + String + Value + + + TypeAheadTimeout + + Comment + Time delay before clearing type-ahead buffer in lists (seconds) + Persist + 1 + Type + F32 + Value + 1.5 + + UIAutoScale + + Comment + Keep UI scale consistent across different resolutions + Persist + 1 + Type + Boolean + Value + 1 + + UIFloaterTestBool + + Comment + Example saved setting for the test floater + Persist + 1 + Type + Boolean + Value + 0 + + UIImgBtnCloseActiveUUID + + Comment + + Persist + 0 + Type + String + Value + 47a8c844-cd2a-4b1a-be01-df8b1612fe5d + + UIImgBtnCloseInactiveUUID + + Comment + + Persist + 0 + Type + String + Value + 779e4fa3-9b13-f74a-fba9-3886fe9c86ba + + UIImgBtnClosePressedUUID + + Comment + + Persist + 0 + Type + String + Value + e5821134-23c0-4bd0-af06-7fa95b9fb01a + + UIImgBtnForwardInUUID + + Comment + + Persist + 0 + Type + String + Value + 54197a61-f5d1-4c29-95d2-c071d08849cb + + UIImgBtnForwardOutUUID + + Comment + + Persist + 0 + Type + String + Value + a0eb4021-1b20-4a53-892d-8faa9265a6f5 + + UIImgBtnJumpLeftInUUID + + Comment + + Persist + 0 + Type + String + Value + 9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1 + + UIImgBtnJumpLeftOutUUID + + Comment + + Persist + 0 + Type + String + Value + 3c18c87e-5f50-14e2-e744-f44734aa365f + + UIImgBtnJumpRightInUUID + + Comment + + Persist + 0 + Type + String + Value + 7dabc040-ec13-2309-ddf7-4f161f6de2f4 + + UIImgBtnJumpRightOutUUID + + Comment + + Persist + 0 + Type + String + Value + ff9a71eb-7414-4cf8-866e-a701deb7c3cf + + UIImgBtnLeftInUUID + + Comment + + Persist + 0 + Type + String + Value + 95463c78-aaa6-464d-892d-3a805b6bb7bf + + UIImgBtnLeftOutUUID + + Comment + + Persist + 0 + Type + String + Value + 13a93910-6b44-45eb-ad3a-4d1324c59bac + + UIImgBtnMinimizeActiveUUID + + Comment + + Persist + 0 + Type + String + Value + 34c9398d-bb78-4643-9633-46a2fa3e9637 + + UIImgBtnMinimizeInactiveUUID + + Comment + + Persist + 0 + Type + String + Value + 6e72abba-1378-437f-bf7a-f0c15f3e99a3 + + UIImgBtnMinimizePressedUUID + + Comment + + Persist + 0 + Type + String + Value + 39801651-26cb-4926-af57-7af9352c273c + + UIImgBtnMoveDownInUUID + + Comment + + Persist + 0 + Type + String + Value + b92a70b9-c841-4c94-b4b3-cee9eb460d48 + + UIImgBtnMoveDownOutUUID + + Comment + + Persist + 0 + Type + String + Value + b5abc9fa-9e62-4e03-bc33-82c4c1b6b689 + + UIImgBtnMoveUpInUUID + + Comment + + Persist + 0 + Type + String + Value + 49b4b357-e430-4b56-b9e0-05b8759c3c82 + + UIImgBtnMoveUpOutUUID + + Comment + + Persist + 0 + Type + String + Value + f887146d-829f-4e39-9211-cf872b78f97c + + UIImgBtnPanDownInUUID + + Comment + + Persist + 0 + Type + String + Value + e5821134-23c0-4bd0-af06-7fa95b9fb01a + + UIImgBtnPanDownOutUUID + + Comment + + Persist + 0 + Type + String + Value + 47a8c844-cd2a-4b1a-be01-df8b1612fe5d + + UIImgBtnPanLeftInUUID + + Comment + + Persist + 0 + Type + String + Value + e5821134-23c0-4bd0-af06-7fa95b9fb01a + + UIImgBtnPanLeftOutUUID + + Comment + + Persist + 0 + Type + String + Value + 47a8c844-cd2a-4b1a-be01-df8b1612fe5d + + UIImgBtnPanRightInUUID + + Comment + + Persist + 0 + Type + String + Value + e5821134-23c0-4bd0-af06-7fa95b9fb01a + + UIImgBtnPanRightOutUUID + + Comment + + Persist + 0 + Type + String + Value + 47a8c844-cd2a-4b1a-be01-df8b1612fe5d + + UIImgBtnPanUpInUUID + + Comment + + Persist + 0 + Type + String + Value + e5821134-23c0-4bd0-af06-7fa95b9fb01a + + UIImgBtnPanUpOutUUID + + Comment + + Persist + 0 + Type + String + Value + 47a8c844-cd2a-4b1a-be01-df8b1612fe5d + + UIImgBtnRestoreActiveUUID + + Comment + + Persist + 0 + Type + String + Value + 111b39de-8928-4690-b7b2-e17d5c960277 + + UIImgBtnRestoreInactiveUUID + + Comment + + Persist + 0 + Type + String + Value + 0eafa471-70af-4882-b8c1-40a310929744 + + UIImgBtnRestorePressedUUID + + Comment + + Persist + 0 + Type + String + Value + 90a0ed5c-2e7b-4845-9958-a64a1b30f312 + + UIImgBtnRightInUUID + + Comment + + Persist + 0 + Type + String + Value + 5e616d0d-4335-476f-9977-560bccd009da + + UIImgBtnRightOutUUID + + Comment + + Persist + 0 + Type + String + Value + 5a44fd04-f52b-4c30-8b00-4a31e27614bd + + UIImgBtnScrollDownInUUID + + Comment + + Persist + 0 + Type + String + Value + d2421bab-2eaf-4863-b8f6-5e4c52519247 + + UIImgBtnScrollDownOutUUID + + Comment + + Persist + 0 + Type + String + Value + b4ecdecf-5c8d-44e7-b882-17a77e88ed55 + + UIImgBtnScrollLeftInUUID + + Comment + + Persist + 0 + Type + String + Value + ea137a32-6718-4d05-9c22-7d570d27b2cd + + UIImgBtnScrollLeftOutUUID + + Comment + + Persist + 0 + Type + String + Value + 43773e8d-49aa-48e0-80f3-a04715f4677a + + UIImgBtnScrollRightInUUID + + Comment + + Persist + 0 + Type + String + Value + b749de64-e903-4c3c-ac0b-25fb6fa39cb5 + + UIImgBtnScrollRightOutUUID + + Comment + + Persist + 0 + Type + String + Value + 3d700d19-e708-465d-87f2-46c8c0ee7938 + + UIImgBtnScrollUpInUUID + + Comment + + Persist + 0 + Type + String + Value + a93abdf3-27b5-4e22-a8fa-c48216cd2e3a + + UIImgBtnScrollUpOutUUID + + Comment + + Persist + 0 + Type + String + Value + dad084d7-9a46-452a-b0ff-4b9f1cefdde9 + + UIImgBtnSlideLeftInUUID + + Comment + + Persist + 0 + Type + String + Value + 724996f5-b956-46f6-9844-4fcfce1d5e83 + + UIImgBtnSlideLeftOutUUID + + Comment + + Persist + 0 + Type + String + Value + 82476321-0374-4c26-9567-521535ab4cd7 + + UIImgBtnSlideRightInUUID + + Comment + + Persist + 0 + Type + String + Value + 7eeb57d2-3f37-454d-a729-8b217b8be443 + + UIImgBtnSlideRightOutUUID + + Comment + + Persist + 0 + Type + String + Value + 1fbe4e60-0607-44d1-a50a-032eff56ae75 + + UIImgBtnSpinDownInUUID + + Comment + + Persist + 0 + Type + String + Value + a985ac71-052f-48e6-9c33-d931c813ac92 + + UIImgBtnSpinDownOutUUID + + Comment + + Persist + 0 + Type + String + Value + b6d240dd-5602-426f-b606-bbb49a30726d + + UIImgBtnSpinUpInUUID + + Comment + + Persist + 0 + Type + String + Value + c8450082-96a0-4319-8090-d3ff900b4954 + + UIImgBtnSpinUpOutUUID + + Comment + + Persist + 0 + Type + String + Value + 56576e6e-6710-4e66-89f9-471b59122794 + + UIImgBtnTabBottomInUUID + + Comment + + Persist + 0 + Type + String + Value + c001d8fd-a869-4b6f-86a1-fdcb106df9c7 + + UIImgBtnTabBottomOutUUID + + Comment + + Persist + 0 + Type + String + Value + bf0a8779-689b-48c3-bb9a-6af546366ef4 + + UIImgBtnTabBottomPartialInUUID + + Comment + + Persist + 0 + Type + String + Value + eb0b0904-8c91-4f24-b500-1180b91140de + + UIImgBtnTabBottomPartialOutUUID + + Comment + + Persist + 0 + Type + String + Value + 8dca716c-b29c-403a-9886-91c028357d6e + + UIImgBtnTabTopInUUID + + Comment + + Persist + 0 + Type + String + Value + 16d032e8-817b-4368-8a4e-b7b947ae3889 + + UIImgBtnTabTopOutUUID + + Comment + + Persist + 0 + Type + String + Value + 1ed83f57-41cf-4052-a3b4-2e8bb78d8191 + + UIImgBtnTabTopPartialInUUID + + Comment + + Persist + 0 + Type + String + Value + 7c6c6c26-0e25-4438-89bd-30d8b8e9d704 + + UIImgBtnTabTopPartialOutUUID + + Comment + + Persist + 0 + Type + String + Value + 932ad585-0e45-4a57-aa23-4cf81beeb7b0 + + UIImgBtnTearOffActiveUUID + + Comment + + Persist + 0 + Type + String + Value + 74e1a96f-4833-a24d-a1bb-1bce1468b0e7 + + UIImgBtnTearOffInactiveUUID + + Comment + + Persist + 0 + Type + String + Value + 74e1a96f-4833-a24d-a1bb-1bce1468b0e7 + + UIImgBtnTearOffPressedUUID + + Comment + + Persist + 0 + Type + String + Value + d2524c13-4ba6-af7c-e305-8ac6cc18d86a + + UIImgCheckboxActiveSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + cf4a2ed7-1533-4686-9dde-df9a37ddca55 + + UIImgCheckboxActiveUUID + + Comment + + Persist + 0 + Type + String + Value + 05bb64ee-96fd-4243-b74e-f40a41bc53ba + + UIImgCheckboxInactiveSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + c817c642-9abd-4236-9287-ae0513fe7d2b + + UIImgCheckboxInactiveUUID + + Comment + + Persist + 0 + Type + String + Value + 7d94cb59-32a2-49bf-a516-9e5a2045f9d9 + + UIImgCreateSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + 0098b015-3daf-4cfe-a72f-915369ea97c2 + + UIImgCreateUUID + + Comment + + Persist + 0 + Type + String + Value + 7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b + + UIImgCrosshairsUUID + + Comment + Image to use for crosshair display (UUID texture reference) + Persist + 1 + Type + String + Value + 6e1a3980-bf2d-4274-8970-91e60d85fb52 + + UIImgDefaultEyesUUID + + Comment + + Persist + 0 + Type + String + Value + 6522e74d-1660-4e7f-b601-6f48c1659a77 + + UIImgDefaultGlovesUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultHairUUID + + Comment + + Persist + 0 + Type + String + Value + 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b + + UIImgDefaultJacketUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultPantsUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultShirtUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultShoesUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultSkirtUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultSocksUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultAlphaUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultAlphaUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultAlphaUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDefaultUnderwearUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgDirectionArrowUUID + + Comment + + Persist + 0 + Type + String + Value + 586383e8-4d9b-4fba-9196-2b5938e79c2c + + UIImgFaceSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + b4870163-6208-42a9-9801-93133bf9a6cd + + UIImgFaceUUID + + Comment + + Persist + 0 + Type + String + Value + ce15fd63-b0b6-463c-a37d-ea6393208b3e + + UIImgFocusSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + ab6a730e-ddfd-4982-9a32-c6de3de6d31d + + UIImgFocusUUID + + Comment + + Persist + 0 + Type + String + Value + 57bc39d1-288c-4519-aea6-6d1786a5c274 + + UIImgGrabSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + c1e21504-f136-451d-b8e9-929037812f1d + + UIImgGrabUUID + + Comment + + Persist + 0 + Type + String + Value + c63f124c-6340-4fbf-b59e-0869a44adb64 + + UIImgMoveSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + 46f17c7b-8381-48c3-b628-6a406e060dd6 + + UIImgMoveUUID + + Comment + + Persist + 0 + Type + String + Value + 2fa5dc06-bcdd-4e09-a426-f9f262d4fa65 + + UIImgRadioActiveSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + 52f09e07-5816-4052-953c-94c6c10479b7 + + UIImgRadioActiveUUID + + Comment + + Persist + 0 + Type + String + Value + 7a1ba9b8-1047-4d1e-9cfc-bc478c80b63f + + UIImgRadioInactiveSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + 1975db39-aa29-4251-aea0-409ac09d414d + + UIImgRadioInactiveUUID + + Comment + + Persist + 0 + Type + String + Value + 90688481-67ff-4af0-be69-4aa084bcad1e + + UIImgResizeBottomRightUUID + + Comment + + Persist + 0 + Type + String + Value + e3690e25-9690-4f6c-a745-e7dcd885285a + + UIImgRotateSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + cdfb7fde-0d13-418a-9d89-2bd91019fc95 + + UIImgRotateUUID + + Comment + + Persist + 0 + Type + String + Value + c34b1eaa-aae3-4351-b082-e26c0b636779 + + UIImgScaleSelectedUUID + + Comment + + Persist + 0 + Type + String + Value + 55aa57ef-508a-47f7-8867-85d21c5a810d + + UIImgScaleUUID + + Comment + + Persist + 0 + Type + String + Value + 88a90fef-b448-4883-9344-ecf378a60433 + + UIImgWhiteUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + + UIImgInvisibleUUID + + Comment + + Persist + 0 + Type + String + Value + 38b86f85-2575-52a9-a531-23108d8da837 + + UIScaleFactor + + Comment + Size of UI relative to default layout on 1024x768 screen + Persist + 1 + Type + F32 + Value + 1.0 + + UploadBakedTexOld + + Comment + Forces the baked texture pipeline to upload using the old method. + Persist + 1 + Type + Boolean + Value + 0 + + UseAltKeyForMenus + + Comment + Access menus via keyboard by tapping Alt + Persist + 1 + Type + Boolean + Value + 0 + + UseChatBubbles + + Comment + Show chat above avatars head in chat bubbles + Persist + 1 + Type + Boolean + Value + 0 + + UseDebugMenus + + Comment + Turns on "Debug" menu + Persist + 1 + Type + Boolean + Value + 1 + + UseDefaultColorPicker + + Comment + Use color picker supplied by operating system + Persist + 1 + Type + Boolean + Value + 0 + + UseEnergy + + Comment + + Persist + 0 + Type + Boolean + Value + 1 + + UseExternalBrowser + + Comment + Use default browser when opening web pages instead of in-world browser. + Persist + 1 + Type + Boolean + Value + 0 + + UseFreezeFrame + + Comment + Freeze time when taking snapshots. + Persist + 1 + Type + Boolean + Value + 0 + + UseInventoryLinks + + Comment + When making a new outfit, use links for no-copy items + Persist + 1 + Type + Boolean + Value + 1 + + UseOcclusion + + Comment + Enable object culling based on occlusion (coverage) by other objects + Persist + 1 + Type + Boolean + Value + 1 + + SkipReflectOcclusionUpdates + + Comment + Enable optimization that prevents occlusion updates for refelction pass + Persist + 1 + Type + Boolean + Value + 1 + + UseOutfitFolders + + Comment + When making a new outfit, use Viewer 2 outfit folders + Persist + 1 + Type + Boolean + Value + 1 + + RenderDelayVBUpdate + + Comment + Delay vertex buffer updates until just before rendering + Persist + 1 + Type + Boolean + Value + 1 + + UseNewWalkRun + + Comment + Replace standard walk/run animations with new ones. + Persist + 1 + Type + Boolean + Value + 1 + + UseCrossWalkRun + + Comment + Use opposite gender walk/run animations. + Persist + 1 + Type + Boolean + Value + 0 + + UseStartScreen + + Comment + Whether to load a start screen image or not. + Persist + 1 + Type + Boolean + Value + 1 + + UseWebPagesOnPrims + + Comment + [NOT USED] + Persist + 1 + Type + Boolean + Value + 0 + + UserConnectionPort + + Comment + Port that this client transmits on. + Persist + 1 + Type + U32 + Value + 0 + + UserLogFile + + Comment + User specified log file name. + Persist + 1 + Type + String + Value + + + UserLoginInfo + + Comment + Users loging data. + Persist + 1 + Type + LLSD + Value + + + + VFSOldSize + + Comment + [DO NOT MODIFY] Controls resizing of local file cache + Persist + 1 + Type + U32 + Value + 0 + + VFSSalt + + Comment + [DO NOT MODIFY] Controls local file caching behavior + Persist + 1 + Type + U32 + Value + 1 + + VectorizeEnable + + Comment + Enable general vector operations and data alignment. + Persist + 1 + Type + Boolean + Value + 1 + + VectorizePerfTest + + Comment + Test SSE/vectorization performance and choose fastest version. + Persist + 1 + Type + Boolean + Value + 1 + + VectorizeProcessor + + Comment + 0=Compiler Default, 1=SSE, 2=SSE2, autodetected + Persist + 0 + Type + U32 + Value + 0 + + VectorizeSkin + + Comment + Enable vector operations for avatar skinning. + Persist + 1 + Type + Boolean + Value + 1 + + VelocityInterpolate + + Comment + Extrapolate object motion from last packet based on received velocity + Persist + 1 + Type + Boolean + Value + 1 + + VerboseLogs + + Comment + Display source file and line number for each log item for debugging purposes + Persist + 1 + Type + Boolean + Value + 0 + + VersionChannelName + + Comment + Versioning Channel Name. + Persist + 1 + Type + String + Value + Ascent Viewer Release + + VertexShaderEnable + + Comment + Enable/disable all GLSL shaders (debug) + Persist + 1 + Type + Boolean + Value + 0 + + VivoxAutoPostCrashDumps + + Comment + If true, SLVoice will automatically send crash dumps directly to Vivox. + Persist + 1 + Type + Boolean + Value + 0 + + VivoxDebugLevel + + Comment + Logging level to use when launching the vivox daemon + Persist + 1 + Type + String + Value + -1 + + VivoxDebugSIPURIHostName + + Comment + Hostname portion of vivox SIP URIs (empty string for the default). + Persist + 1 + Type + String + Value + + + VivoxDebugVoiceAccountServerURI + + Comment + URI to the vivox account management server (empty string for the default). + Persist + 1 + Type + String + Value + + + VoiceCallsFriendsOnly + + Comment + Only accept voice calls from residents on your friends list + Persist + 1 + Type + Boolean + Value + 0 + + AutoDisengageMic + + Comment + Automatically turn off the microphone when ending IM calls. + Persist + 1 + Type + Boolean + Value + 1 + + VoiceEarLocation + + Comment + Location of the virtual ear for voice + Persist + 1 + Type + S32 + Value + 0 + + VoiceHost + + Comment + Client SLVoice host to connect to + Persist + 1 + Type + String + Value + 127.0.0.1 + + VoiceImageLevel0 + + Comment + Texture UUID for voice image level 0 + Persist + 1 + Type + String + Value + 041ee5a0-cb6a-9ac5-6e49-41e9320507d5 + + VoiceImageLevel1 + + Comment + Texture UUID for voice image level 1 + Persist + 1 + Type + String + Value + 29de489d-0491-fb00-7dab-f9e686d31e83 + + VoiceImageLevel2 + + Comment + Texture UUID for voice image level 2 + Persist + 1 + Type + String + Value + 29de489d-0491-fb00-7dab-f9e686d31e83 + + VoiceImageLevel3 + + Comment + Texture UUID for voice image level 3 + Persist + 1 + Type + String + Value + 29de489d-0491-fb00-7dab-f9e686d31e83 + + VoiceImageLevel4 + + Comment + Texture UUID for voice image level 4 + Persist + 1 + Type + String + Value + 29de489d-0491-fb00-7dab-f9e686d31e83 + + VoiceImageLevel5 + + Comment + Texture UUID for voice image level 5 + Persist + 1 + Type + String + Value + 29de489d-0491-fb00-7dab-f9e686d31e83 + + VoiceImageLevel6 + + Comment + Texture UUID for voice image level 6 + Persist + 1 + Type + String + Value + 29de489d-0491-fb00-7dab-f9e686d31e83 + + VoiceInputAudioDevice + + Comment + Audio input device to use for voice + Persist + 1 + Type + String + Value + Default + + VoiceOutputAudioDevice + + Comment + Audio output device to use for voice + Persist + 1 + Type + String + Value + Default + + VoicePort + + Comment + Client SLVoice port to connect to + Persist + 1 + Type + U32 + Value + 44125 + + WLSkyDetail + + Comment + Controls vertex detail on the WindLight sky. Lower numbers will give better performance and uglier skies. + Persist + 1 + Type + U32 + Value + 64 + + WarnAboutBadPCI + + Comment + Enables AboutBadPCI warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnAboutDirectX9 + + Comment + Enables AboutDirectX9 warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnAboutOldGraphicsDriver + + Comment + Enables AboutOldGraphicsDriver warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnAboutPCIGraphics + + Comment + Enables AboutPCIGraphics warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnBrowserLaunch + + Comment + Enables BrowserLaunch warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnDeedObject + + Comment + Enables DeedObject warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstAO + + Comment + Enables FirstAO warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstAppearance + + Comment + Enables FirstAppearance warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstAttach + + Comment + Enables FirstAttach warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstBalanceDecrease + + Comment + Enables FirstBalanceDecrease warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstBalanceIncrease + + Comment + Enables FirstBalanceIncrease warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstBuild + + Comment + Enables FirstBuild warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstDebugMenus + + Comment + Enables FirstDebugMenus warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstFlexible + + Comment + Enables FirstFlexible warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstGoTo + + Comment + Enables FirstGoTo warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstInventory + + Comment + Enables FirstInventory warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstLeftClickNoHit + + Comment + Enables FirstLeftClickNoHit warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstMap + + Comment + Enables FirstMap warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstMedia + + Comment + Enables FirstMedia warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstOverrideKeys + + Comment + Enables FirstOverrideKeys warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstSandbox + + Comment + Enables FirstSandbox warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstSculptedPrim + + Comment + Enables FirstSculptedPrim warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstSit + + Comment + Enables FirstSit warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstStreamingMusic + + Comment + Enables FirstStreamingMusic warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstStreamingVideo + + Comment + Enables FirstStreamingVideo warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstTeleport + + Comment + Enables FirstTeleport warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstVoice + + Comment + Enables FirstVoice warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnNewClassified + + Comment + Enables NewClassified warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnQuickTimeInstalled + + Comment + Enables QuickTimeInstalled warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnReturnToOwner + + Comment + Enables ReturnToOwner warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnFirstPhysicsWearable + + Comment + Enables Physics Wearable warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + WatchdogEnabled + + Comment + Controls whether the thread watchdog timer is activated. + Persist + 0 + Type + Boolean + Value + 0 + + WaterEditPresets + + Comment + Whether to be able to edit the water defaults or not + Persist + 1 + Type + Boolean + Value + 0 + + WaterGLFogDensityScale + + Comment + Maps shader water fog density to gl fog density + Persist + 1 + Type + F32 + Value + 0.02 + + WaterGLFogDepthFloor + + Comment + Controls how dark water gl fog can get + Persist + 1 + Type + F32 + Value + 0.25 + + WaterGLFogDepthScale + + Comment + Controls how quickly gl fog gets dark under water + Persist + 1 + Type + F32 + Value + 50.0 + + WindLightUseAtmosShaders + + Comment + Whether to enable or disable WindLight atmospheric shaders. + Persist + 1 + Type + Boolean + Value + 1 + + WindowHeight + + Comment + SL viewer window height + Persist + 1 + Type + S32 + Value + 700 + + WindowMaximized + + Comment + SL viewer window maximized on login + Persist + 1 + Type + Boolean + Value + 0 + + WindowWidth + + Comment + SL viewer window width + Persist + 1 + Type + S32 + Value + 1000 + + WindowX + + Comment + X coordinate of lower left corner of SL viewer window, relative to primary display (pixels) + Persist + 1 + Type + S32 + Value + 10 + + WindowY + + Comment + Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels) + Persist + 1 + Type + S32 + Value + 10 + + WornItemsSortOrder + + Comment + Specifies sort key for worn inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top) + Persist + 1 + Type + U32 + Value + 7 + + XferThrottle + + Comment + Maximum allowable downstream bandwidth for asset transfers (bits per second) + Persist + 1 + Type + F32 + Value + 150000.0 + + YawFromMousePosition + + Comment + Horizontal range over which avatar head tracks mouse position (degrees of head rotation from left of window to right) + Persist + 1 + Type + F32 + Value + 90.0 + + YieldTime + + Comment + Yield some time to the local host. + Persist + 1 + Type + S32 + Value + -1 + + ZoomDirect + + Comment + Map Joystick zoom axis directly to camera zoom. + Persist + 1 + Type + Boolean + Value + 0 + + ZoomTime + + Comment + Time of transition between different camera modes (seconds) + Persist + 1 + Type + F32 + Value + 0.40000000596 + + particlesbeacon + + Comment + Beacon / Highlight particle generators + Persist + 1 + Type + Boolean + Value + 0 + + physicalbeacon + + Comment + Beacon / Highlight physical objects + Persist + 1 + Type + Boolean + Value + 1 + + renderbeacons + + Comment + Beacon / Highlight particle generators + Persist + 1 + Type + Boolean + Value + 0 + + renderhighlights + + Comment + Beacon / Highlight scripted objects with touch function + Persist + 1 + Type + Boolean + Value + 1 + + renderattachment + + Comment + Render beacons for / Highlight attached objects as well + Persist + 1 + Type + Boolean + Value + 0 + + renderbyowner + + Comment + Render beacons/highlights for objects owned by anyone (0), you (1) or others (2) + Persist + 1 + Type + U32 + Value + 0 + + invisiblesoundsbeacon + + Comment + Beacon / Highlight invisible (non-object) sound generators + Persist + 1 + Type + Boolean + Value + 0 + + scriptsbeacon + + Comment + Beacon / Highlight scripted objects + Persist + 1 + Type + Boolean + Value + 0 + + scripttouchbeacon + + Comment + Beacon / Highlight scripted objects with touch function + Persist + 1 + Type + Boolean + Value + 1 + + soundsbeacon + + Comment + Beacon / Highlight sound generators + Persist + 1 + Type + Boolean + Value + 0 + + LogTextureDownloadsToViewerLog + + Comment + Send texture download details to the viewer log + Persist + 1 + Type + Boolean + Value + 0 + + LogTextureDownloadsToSimulator + + Comment + Send a digest of texture info to the sim + Persist + 1 + Type + Boolean + Value + 0 + + TextureLoggingThreshold + + Comment + Specifies the byte threshold at which texture download data should be sent to the sim. + Persist + 1 + Type + U32 + Value + 1 + + FloaterUploadRect + + Comment + Rectangle for Uploader + Persist + 1 + Type + Rect + Value + + 500 + 450 + 850 + 400 + + + FloaterContactRect + + Comment + Rectangle for Contact Group Manager + Persist + 1 + Type + Rect + Value + + 500 + 450 + 850 + 400 + + + ContactListCollapsed + + Comment + Hide extended friend information in contact list + Persist + 1 + Type + Boolean + Value + 0 + + FloaterHexRect + + Comment + Rectangle for hex editor floater. + Persist + 1 + Type + Rect + Value + + 343 + 687 + 981 + 473 + + + HexEditorColumns + + Comment + Number of columns shown in hex editor + Persist + 1 + Type + U32 + Value + 16 + + FloaterAssetTextEditorRect + + Comment + Rectangle for asset text editor floater. + Persist + 1 + Type + Rect + Value + + 343 + 687 + 981 + 473 + + + RadarListBtnState + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + WindEnabled + + Comment + Enable the use of wind (affects trees and flexis, among other things) + Persist + 1 + Type + Boolean + Value + 1 + + CloudsEnabled + + Comment + Render Clouds + Persist + 1 + Type + Boolean + Value + 1 + + + diff --git a/indra/newview/app_settings/settings_ascent.xml b/indra/newview/app_settings/settings_ascent.xml index fa6f2731c..86811ae6d 100644 --- a/indra/newview/app_settings/settings_ascent.xml +++ b/indra/newview/app_settings/settings_ascent.xml @@ -1,769 +1,769 @@ - - - - - - SianaRenderOmitBlankVBO - - Comment - Optimization: omit prefilling VBOs with zeroes. Default: OFF - Persist - 1 - Type - Boolean - Value - 0 - - SianaUnsitOnCamReset - - Comment - Make avatar stand up when camera is reset to 3rd Person View - Persist - 1 - Type - Boolean - Value - 0 - - PhoenixNameSystem - - Comment - Use Display Names instead of Legacy Names. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only - Persist - 2 - Type - S32 - Value - 1 - - AscentPowerfulWizard - - Comment - User is a bad enough dude. - Persist - 1 - Type - Boolean - Value - 0 - - AscentUpdateTagsOnLoad - - Comment - Allowed client to update client definitions file. - Persist - 1 - Type - Boolean - Value - 0 - - AscentUploadSettings - - Comment - Settings for upload browser - Type - LLSD - Value - - ActivePath - None - - - AscentActiveDayCycle - - Comment - Day cycle currently in use - Persist - 1 - Type - String - Value - Default - - AscentAutoCloseOOC - - Comment - Auto-close OOC chat (i.e. add \"))\" if not found and \"((\" was used) - Persist - 1 - Type - Boolean - Value - 0 - - AscentAllowMUpose - - Comment - Allow MU* pose style in chat and IM (with ':' as a synonymous to '/me ') - Persist - 1 - Type - Boolean - Value - 0 - - AscentStoreSettingsPerAccount - - Comment - Toggles whether to save certain settings per-account, rather than per-install. - Persist - 0 - Type - Boolean - Value - 0 - - AscentDataSeparator - - Comment - This separates data bits from each other - May be used in multiple locations - Persist - 1 - Type - String - Value - :: - - AscentHideTypingNotification - - Comment - Keep those jerks guessing by hiding your "____ is typing..." message. - Persist - 0 - Type - Boolean - Value - 1 - - AscentShowSelfTag - - Comment - Show your own tag - Persist - 1 - Type - Boolean - Value - 1 - - AscentShowSelfTagColor - - Comment - Show your own tag - Persist - 1 - Type - Boolean - Value - 1 - - AscentAlwaysRezInGroup - - Comment - Always rez under the owned land group - Persist - 1 - Type - Boolean - Value - 1 - - AscentDisableLogoutScreens - - Comment - Disable logout screen progress bar - Persist - 1 - Type - Boolean - Value - 0 - - AscentDisableTeleportScreens - - Comment - Disable teleport screens - Persist - 1 - Type - Boolean - Value - 0 - - AscentShowLookAt - - Comment - Show Others' Lookat points - Persist - 1 - Type - Boolean - Value - 0 - - AscentUseStatusColors - - Comment - Show special colors for statuses like Friend, Linden, so on - Persist - 1 - Type - Boolean - Value - 0 - - AscentAvatarXModifier - - Comment - Avatar position modifier (X) - Persist - 1 - Type - F32 - Value - 0.0 - - AscentAvatarYModifier - - Comment - Avatar position modifier (Y) - Persist - 1 - Type - F32 - Value - 0.0 - - AscentAvatarZModifier - - Comment - Avatar position modifier (Z) - Persist - 1 - Type - F32 - Value - 0.0 - - AscentUseSystemFolder - - Comment - Enables the System folder for setting and non-permanent asset storage. - Persist - 1 - Type - Boolean - Value - 0 - - AscentSystemTemporary - - Comment - When enabled, temporary uploads are put in the System Asset folder (if System Folder exists). - Persist - 1 - Type - Boolean - Value - 0 - - AscentShowFriendsTag - - Comment - Show friends client tags as (Friend), and colorize them specially. - Persist - 1 - Type - Boolean - Value - 1 - - AscentUseTag - - Comment - Broadcast client tag - Persist - 1 - Type - Boolean - Value - 1 - - AscentShowIdleTime - - Comment - Show client tags for others. - Persist - 1 - Type - Boolean - Value - 1 - - AscentShowOthersTag - - Comment - Show client tags for others. - Persist - 1 - Type - Boolean - Value - 1 - - AscentShowOthersTagColor - - Comment - Show avatar names in the color of their client. - Persist - 1 - Type - Boolean - Value - 1 - - AscentBuildAlwaysEnabled - - Comment - Show build option regardless of whether you can (May not mean you can actually build there) - Persist - 1 - Type - Boolean - Value - 1 - - AscentDisableMinZoomDist - - Comment - Allows much closer camera zooming. - Persist - 1 - Type - Boolean - Value - 1 - - AscentFlyAlwaysEnabled - - Comment - Always allow fly (Does actually always allow flight) - Persist - 1 - Type - Boolean - Value - 0 - - AscentDisplayTotalScriptJumps - - Comment - Shows large changes to the sim script count in chat. - Persist - 1 - Type - Boolean - Value - 0 - - Ascentnumscriptdiff - - Comment - The delta to spam you the script jump difference - Persist - 1 - Type - F32 - Value - 100 - - Ascentnumscripts - - Comment - temp.. - Persist - 0 - Type - F32 - Value - 0.0 - - AscentBuildPrefs_ActualRoot - - Comment - Center selection on parent prim's center. - Persist - 1 - Type - Boolean - Value - 1 - - AscentBuildPrefs_PivotIsPercent - - Comment - Would you like the chatbar to be able to be used for command line functions? - Persist - 1 - Type - Boolean - Value - 1 - - AscentBuildPrefs_PivotX - - Comment - idfk - Persist - 1 - Type - F32 - Value - 50.0 - - AscentBuildPrefs_PivotY - - Comment - idfk - Persist - 1 - Type - F32 - Value - 50.0 - - AscentBuildPrefs_PivotZ - - Comment - idfk - Persist - 1 - Type - F32 - Value - 50.0 - - AscentCmdLine - - Comment - Would you like the chatbar to be able to be used for command line functions? - Persist - 1 - Type - Boolean - Value - 1 - - AscentCmdLineClearChat - - Comment - Clear chat history to stop lag from chat spam - Persist - 1 - Type - String - Value - clrchat - - AscentCmdLineHeight - - Comment - Teleport to height function command - Persist - 1 - Type - String - Value - gth - - AscentCmdLinePos - - Comment - Teleport to position function command - Persist - 1 - Type - String - Value - gtp - - AscentCmdLineGround - - Comment - Teleport to ground function command - Persist - 1 - Type - String - Value - flr - - AscentCmdLineTeleportHome - - Comment - Teleport to home function command - Persist - 1 - Type - String - Value - tph - - AscentCmdLineRezPlatform - - Comment - Rez a platform underneath you - Persist - 1 - Type - String - Value - rezplat - - AscentPlatformSize - - Comment - How wide the rezzed platform will appear to be. - Persist - 1 - Type - F32 - Value - 30 - - AscentCmdLineMapTo - - Comment - Teleport to a region by name rapidly - Persist - 1 - Type - String - Value - mapto - - AscentMapToKeepPos - - Comment - Attempt to arrive in the same location you were at. - Persist - 1 - Type - Boolean - Value - 0 - - AscentCmdLineDrawDistance - - Comment - Change draw distance quickly - Persist - 1 - Type - String - Value - dd - - AscentCmdTeleportToCam - - Comment - Teleport to your camera - Persist - 1 - Type - String - Value - tp2cam - - AscentCmdLineKeyToName - - Comment - Use a fast key to name querry - Persist - 1 - Type - String - Value - key2name - - AscentCmdLineOfferTp - - Comment - Offer a teleport to target avatar - Persist - 1 - Type - String - Value - offertp - - AscentCmdLineCalc - - Comment - Calculates an expression - Persist - 1 - Type - String - Value - calc - - AscentCmdLineTP2 - - Comment - Teleport to a person by name, partials work. - Persist - 1 - Type - String - Value - tp2 - - AscentInstantMessageAnnounceIncoming - - Comment - Start IM window as soon as the person starts typing - Persist - 1 - Type - Boolean - Value - 1 - - AscentShowLookAt - - Comment - Show Others' Lookat points - Persist - 1 - Type - Boolean - Value - 0 - - AscentUseStatusColors - - Comment - Show special colors for statuses like Friend, Linden, so on - Persist - 1 - Type - Boolean - Value - 0 - - AscentAvatarXModifier - - Comment - Avatar position modifier (X) - Persist - 1 - Type - F32 - Value - 0.0 - - AscentAvatarYModifier - - Comment - Avatar position modifier (Y) - Persist - 1 - Type - F32 - Value - 0.0 - - AscentAvatarZModifier - - Comment - Avatar position modifier (Z) - Persist - 1 - Type - F32 - Value - 0.0 - - AscentUseSystemFolder - - Comment - Enables the System folder for setting and non-permanent asset storage. - Persist - 1 - Type - Boolean - Value - 0 - - AscentSystemTemporary - - Comment - When enabled, temporary uploads are put in the System Asset folder (if System Folder exists). - Persist - 1 - Type - Boolean - Value - 0 - - AscentShowFriendsTag - - Comment - Show friends client tags as (Friend), and colorize them specially. - Persist - 1 - Type - Boolean - Value - 1 - - AscentUseTag - - Comment - Broadcast client tag - Persist - 1 - Type - Boolean - Value - 1 - - AscentShowIdleTime - - Comment - Show client tags for others. - Persist - 1 - Type - Boolean - Value - 1 - - AscentShowOthersTag - - Comment - Show client tags for others. - Persist - 1 - Type - Boolean - Value - 1 - - AscentShowOthersTagColor - - Comment - Show avatar names in the color of their client. - Persist - 1 - Type - Boolean - Value - 1 - - - - - + + + + + + SianaRenderOmitBlankVBO + + Comment + Optimization: omit prefilling VBOs with zeroes. Default: OFF + Persist + 1 + Type + Boolean + Value + 0 + + SianaUnsitOnCamReset + + Comment + Make avatar stand up when camera is reset to 3rd Person View + Persist + 1 + Type + Boolean + Value + 0 + + PhoenixNameSystem + + Comment + Use Display Names instead of Legacy Names. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only + Persist + 2 + Type + S32 + Value + 1 + + AscentPowerfulWizard + + Comment + User is a bad enough dude. + Persist + 1 + Type + Boolean + Value + 0 + + AscentUpdateTagsOnLoad + + Comment + Allowed client to update client definitions file. + Persist + 1 + Type + Boolean + Value + 0 + + AscentUploadSettings + + Comment + Settings for upload browser + Type + LLSD + Value + + ActivePath + None + + + AscentActiveDayCycle + + Comment + Day cycle currently in use + Persist + 1 + Type + String + Value + Default + + AscentAutoCloseOOC + + Comment + Auto-close OOC chat (i.e. add \"))\" if not found and \"((\" was used) + Persist + 1 + Type + Boolean + Value + 0 + + AscentAllowMUpose + + Comment + Allow MU* pose style in chat and IM (with ':' as a synonymous to '/me ') + Persist + 1 + Type + Boolean + Value + 0 + + AscentStoreSettingsPerAccount + + Comment + Toggles whether to save certain settings per-account, rather than per-install. + Persist + 0 + Type + Boolean + Value + 0 + + AscentDataSeparator + + Comment + This separates data bits from each other - May be used in multiple locations + Persist + 1 + Type + String + Value + :: + + AscentHideTypingNotification + + Comment + Keep those jerks guessing by hiding your "____ is typing..." message. + Persist + 0 + Type + Boolean + Value + 1 + + AscentShowSelfTag + + Comment + Show your own tag + Persist + 1 + Type + Boolean + Value + 1 + + AscentShowSelfTagColor + + Comment + Show your own tag + Persist + 1 + Type + Boolean + Value + 1 + + AscentAlwaysRezInGroup + + Comment + Always rez under the owned land group + Persist + 1 + Type + Boolean + Value + 1 + + AscentDisableLogoutScreens + + Comment + Disable logout screen progress bar + Persist + 1 + Type + Boolean + Value + 0 + + AscentDisableTeleportScreens + + Comment + Disable teleport screens + Persist + 1 + Type + Boolean + Value + 0 + + AscentShowLookAt + + Comment + Show Others' Lookat points + Persist + 1 + Type + Boolean + Value + 0 + + AscentUseStatusColors + + Comment + Show special colors for statuses like Friend, Linden, so on + Persist + 1 + Type + Boolean + Value + 0 + + AscentAvatarXModifier + + Comment + Avatar position modifier (X) + Persist + 1 + Type + F32 + Value + 0.0 + + AscentAvatarYModifier + + Comment + Avatar position modifier (Y) + Persist + 1 + Type + F32 + Value + 0.0 + + AscentAvatarZModifier + + Comment + Avatar position modifier (Z) + Persist + 1 + Type + F32 + Value + 0.0 + + AscentUseSystemFolder + + Comment + Enables the System folder for setting and non-permanent asset storage. + Persist + 1 + Type + Boolean + Value + 0 + + AscentSystemTemporary + + Comment + When enabled, temporary uploads are put in the System Asset folder (if System Folder exists). + Persist + 1 + Type + Boolean + Value + 0 + + AscentShowFriendsTag + + Comment + Show friends client tags as (Friend), and colorize them specially. + Persist + 1 + Type + Boolean + Value + 1 + + AscentUseTag + + Comment + Broadcast client tag + Persist + 1 + Type + Boolean + Value + 1 + + AscentShowIdleTime + + Comment + Show client tags for others. + Persist + 1 + Type + Boolean + Value + 1 + + AscentShowOthersTag + + Comment + Show client tags for others. + Persist + 1 + Type + Boolean + Value + 1 + + AscentShowOthersTagColor + + Comment + Show avatar names in the color of their client. + Persist + 1 + Type + Boolean + Value + 1 + + AscentBuildAlwaysEnabled + + Comment + Show build option regardless of whether you can (May not mean you can actually build there) + Persist + 1 + Type + Boolean + Value + 1 + + AscentDisableMinZoomDist + + Comment + Allows much closer camera zooming. + Persist + 1 + Type + Boolean + Value + 1 + + AscentFlyAlwaysEnabled + + Comment + Always allow fly (Does actually always allow flight) + Persist + 1 + Type + Boolean + Value + 0 + + AscentDisplayTotalScriptJumps + + Comment + Shows large changes to the sim script count in chat. + Persist + 1 + Type + Boolean + Value + 0 + + Ascentnumscriptdiff + + Comment + The delta to spam you the script jump difference + Persist + 1 + Type + F32 + Value + 100 + + Ascentnumscripts + + Comment + temp.. + Persist + 0 + Type + F32 + Value + 0.0 + + AscentBuildPrefs_ActualRoot + + Comment + Center selection on parent prim's center. + Persist + 1 + Type + Boolean + Value + 1 + + AscentBuildPrefs_PivotIsPercent + + Comment + Would you like the chatbar to be able to be used for command line functions? + Persist + 1 + Type + Boolean + Value + 1 + + AscentBuildPrefs_PivotX + + Comment + idfk + Persist + 1 + Type + F32 + Value + 50.0 + + AscentBuildPrefs_PivotY + + Comment + idfk + Persist + 1 + Type + F32 + Value + 50.0 + + AscentBuildPrefs_PivotZ + + Comment + idfk + Persist + 1 + Type + F32 + Value + 50.0 + + AscentCmdLine + + Comment + Would you like the chatbar to be able to be used for command line functions? + Persist + 1 + Type + Boolean + Value + 1 + + AscentCmdLineClearChat + + Comment + Clear chat history to stop lag from chat spam + Persist + 1 + Type + String + Value + clrchat + + AscentCmdLineHeight + + Comment + Teleport to height function command + Persist + 1 + Type + String + Value + gth + + AscentCmdLinePos + + Comment + Teleport to position function command + Persist + 1 + Type + String + Value + gtp + + AscentCmdLineGround + + Comment + Teleport to ground function command + Persist + 1 + Type + String + Value + flr + + AscentCmdLineTeleportHome + + Comment + Teleport to home function command + Persist + 1 + Type + String + Value + tph + + AscentCmdLineRezPlatform + + Comment + Rez a platform underneath you + Persist + 1 + Type + String + Value + rezplat + + AscentPlatformSize + + Comment + How wide the rezzed platform will appear to be. + Persist + 1 + Type + F32 + Value + 30 + + AscentCmdLineMapTo + + Comment + Teleport to a region by name rapidly + Persist + 1 + Type + String + Value + mapto + + AscentMapToKeepPos + + Comment + Attempt to arrive in the same location you were at. + Persist + 1 + Type + Boolean + Value + 0 + + AscentCmdLineDrawDistance + + Comment + Change draw distance quickly + Persist + 1 + Type + String + Value + dd + + AscentCmdTeleportToCam + + Comment + Teleport to your camera + Persist + 1 + Type + String + Value + tp2cam + + AscentCmdLineKeyToName + + Comment + Use a fast key to name querry + Persist + 1 + Type + String + Value + key2name + + AscentCmdLineOfferTp + + Comment + Offer a teleport to target avatar + Persist + 1 + Type + String + Value + offertp + + AscentCmdLineCalc + + Comment + Calculates an expression + Persist + 1 + Type + String + Value + calc + + AscentCmdLineTP2 + + Comment + Teleport to a person by name, partials work. + Persist + 1 + Type + String + Value + tp2 + + AscentInstantMessageAnnounceIncoming + + Comment + Start IM window as soon as the person starts typing + Persist + 1 + Type + Boolean + Value + 1 + + AscentShowLookAt + + Comment + Show Others' Lookat points + Persist + 1 + Type + Boolean + Value + 0 + + AscentUseStatusColors + + Comment + Show special colors for statuses like Friend, Linden, so on + Persist + 1 + Type + Boolean + Value + 0 + + AscentAvatarXModifier + + Comment + Avatar position modifier (X) + Persist + 1 + Type + F32 + Value + 0.0 + + AscentAvatarYModifier + + Comment + Avatar position modifier (Y) + Persist + 1 + Type + F32 + Value + 0.0 + + AscentAvatarZModifier + + Comment + Avatar position modifier (Z) + Persist + 1 + Type + F32 + Value + 0.0 + + AscentUseSystemFolder + + Comment + Enables the System folder for setting and non-permanent asset storage. + Persist + 1 + Type + Boolean + Value + 0 + + AscentSystemTemporary + + Comment + When enabled, temporary uploads are put in the System Asset folder (if System Folder exists). + Persist + 1 + Type + Boolean + Value + 0 + + AscentShowFriendsTag + + Comment + Show friends client tags as (Friend), and colorize them specially. + Persist + 1 + Type + Boolean + Value + 1 + + AscentUseTag + + Comment + Broadcast client tag + Persist + 1 + Type + Boolean + Value + 1 + + AscentShowIdleTime + + Comment + Show client tags for others. + Persist + 1 + Type + Boolean + Value + 1 + + AscentShowOthersTag + + Comment + Show client tags for others. + Persist + 1 + Type + Boolean + Value + 1 + + AscentShowOthersTagColor + + Comment + Show avatar names in the color of their client. + Persist + 1 + Type + Boolean + Value + 1 + + + + + diff --git a/indra/newview/app_settings/settings_ascent_coa.xml b/indra/newview/app_settings/settings_ascent_coa.xml index cf681b8ee..660c18d14 100644 --- a/indra/newview/app_settings/settings_ascent_coa.xml +++ b/indra/newview/app_settings/settings_ascent_coa.xml @@ -1,180 +1,180 @@ - - - - - MoyMiniMapCustomColor - - Comment - Custom minimap color you wish to have. - Persist - 1 - Type - Color4 - Value - - 0.375 - 1.0 - 1.0 - 1.0 - - IsCOA - 1 - - AscentInstantMessageAnnounceIncoming - - Comment - Start IM window as soon as the person starts typing - Persist - 1 - Type - Boolean - Value - 1 - IsCOA - 1 - - AscentCustomTagLabel - - Comment - Label for the custom local tag - Persist - 1 - Type - String - Value - Custom - IsCOA - 1 - - AscentCustomTagColor - - Comment - Color of custom tag. - Persist - 1 - Type - Color4 - Value - - 0.5 - 1.0 - 0.25 - 1.0 - - IsCOA - 1 - - AscentUseCustomTag - - Comment - Show a custom tag. - Persist - 1 - Type - Boolean - Value - 0 - IsCOA - 1 - - AscentReportClientIndex - - Comment - Show your own tag - Persist - 1 - Type - U32 - Value - 1 - IsCOA - 1 - - AscentFriendColor - - Comment - Color of chat messages from other residents - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 0.0 - 1.0 - - IsCOA - 1 - - AscentLindenColor - - Comment - Color of chat messages from other residents - Persist - 1 - Type - Color4 - Value - - 0.0 - 0.0 - 1.0 - 1.0 - - IsCOA - 1 - - AscentMutedColor - - Comment - Color of chat messages from other residents - Persist - 1 - Type - Color4 - Value - - 0.7 - 0.7 - 0.7 - 1.0 - - IsCOA - 1 - - AscentEstateOwnerColor - - Comment - Color of chat messages from other residents - Persist - 1 - Type - Color4 - Value - - 1.0 - 0.6 - 1.0 - 1.0 - - IsCOA - 1 - - AscentReportClientUUID - - Comment - Broadcasted Client Key - Persist - 1 - Type - String - Value - f25263b7-6167-4f34-a4ef-af65213b2e39 - IsCOA - 1 - - - - + + + + + MoyMiniMapCustomColor + + Comment + Custom minimap color you wish to have. + Persist + 1 + Type + Color4 + Value + + 0.375 + 1.0 + 1.0 + 1.0 + + IsCOA + 1 + + AscentInstantMessageAnnounceIncoming + + Comment + Start IM window as soon as the person starts typing + Persist + 1 + Type + Boolean + Value + 1 + IsCOA + 1 + + AscentCustomTagLabel + + Comment + Label for the custom local tag + Persist + 1 + Type + String + Value + Custom + IsCOA + 1 + + AscentCustomTagColor + + Comment + Color of custom tag. + Persist + 1 + Type + Color4 + Value + + 0.5 + 1.0 + 0.25 + 1.0 + + IsCOA + 1 + + AscentUseCustomTag + + Comment + Show a custom tag. + Persist + 1 + Type + Boolean + Value + 0 + IsCOA + 1 + + AscentReportClientIndex + + Comment + Show your own tag + Persist + 1 + Type + U32 + Value + 1 + IsCOA + 1 + + AscentFriendColor + + Comment + Color of chat messages from other residents + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 0.0 + 1.0 + + IsCOA + 1 + + AscentLindenColor + + Comment + Color of chat messages from other residents + Persist + 1 + Type + Color4 + Value + + 0.0 + 0.0 + 1.0 + 1.0 + + IsCOA + 1 + + AscentMutedColor + + Comment + Color of chat messages from other residents + Persist + 1 + Type + Color4 + Value + + 0.7 + 0.7 + 0.7 + 1.0 + + IsCOA + 1 + + AscentEstateOwnerColor + + Comment + Color of chat messages from other residents + Persist + 1 + Type + Color4 + Value + + 1.0 + 0.6 + 1.0 + 1.0 + + IsCOA + 1 + + AscentReportClientUUID + + Comment + Broadcasted Client Key + Persist + 1 + Type + String + Value + f25263b7-6167-4f34-a4ef-af65213b2e39 + IsCOA + 1 + + + + diff --git a/indra/newview/app_settings/settings_crash_behavior.xml b/indra/newview/app_settings/settings_crash_behavior.xml index 6676395c4..f588db5cb 100644 --- a/indra/newview/app_settings/settings_crash_behavior.xml +++ b/indra/newview/app_settings/settings_crash_behavior.xml @@ -1,15 +1,15 @@ - - - CrashSubmitBehavior - - Comment - Controls behavior when viewer crashes (0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report) - Persist - 2 - Type - S32 - Value - 2 - - - + + + CrashSubmitBehavior + + Comment + Controls behavior when viewer crashes (0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report) + Persist + 2 + Type + S32 + Value + 2 + + + diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 25fce02fa..cab1429ca 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -663,7 +663,7 @@ 1 LogFileNamewithDate - + Comment Add Date Stamp to chat and IM Logs with format chat-YYYY-MM-DD and 'IM file name'-YYYY-MM. To view old logs goto ..\Second Life\[login name] Persist @@ -672,6 +672,6 @@ Boolean Value 0 - + diff --git a/indra/newview/app_settings/settings_rlv.xml b/indra/newview/app_settings/settings_rlv.xml index b89d4c3f2..598f05fe8 100644 --- a/indra/newview/app_settings/settings_rlv.xml +++ b/indra/newview/app_settings/settings_rlv.xml @@ -1,183 +1,183 @@ - - - - - RestrainedLove - - Comment - Toggles the RestrainedLove features (BDSM lockable toys support). Needs a restart of the viewer. - Persist - 1 - Type - Boolean - Value - 1 - - RestrainedLoveDebug - - Comment - Toggles the RestrainedLove debug mode (displays the commands when in debug mode). - Persist - 1 - Type - Boolean - Value - 0 - - RestrainedLoveNoSetEnv - - Comment - When TRUE, forbids to set the environment (time of day and Windlight settings) via RestrainedLove. Needs a restart of the viewer. - Persist - 1 - Type - Boolean - Value - 0 - - RestrainedLoveOffsetAvatarZ - - Comment - Offset the avatar. - Persist - 1 - Type - F32 - Value - 0.0 - - RestrainedLoveReplaceWhenFolderBeginsWith - - Comment - If a folder name begins with this string, its attach behavior will always be "replace", never "stack". Default is blank (disabled). - Persist - 1 - Type - String - Value - - - RestrainedLoveStackWhenFolderBeginsWith - - Comment - If a folder name begins with this string, its attach behavior will always be "stack", never "replace". Default is "+". - Persist - 1 - Type - String - Value - + - - RLVaDebugHideUnsetDuplicate - - Comment - Suppresses reporting "unset" or "duplicate" command restrictions when RestrainedLoveDebug is TRUE - Persist - 1 - Type - Boolean - Value - 0 - - RestrainedLoveForbidGiveToRLV - - Comment - When FALSE, allows to give sub-folders to the #RLV RestrainedLove folder. - Persist - 1 - Type - Boolean - Value - 1 - - RLVaEnableCompositeFolders - - Comment - Enables composite folders for shared inventory - Persist - 1 - Type - Boolean - Value - 0 - - RLVaEnableLegacyNaming - - Comment - Enables legacy naming convention for folders - Persist - 1 - Type - Boolean - Value - 1 - - RLVaEnableSharedWear - - Comment - Attachments in the shared #RLV folder can be force-attached without needing to specify an attachment point - Persist - 1 - Type - Boolean - Value - 0 - - RLVaHideLockedLayers - - Comment - Hides "remove outfit" restricted worn clothing layers from @getoufit - Persist - 1 - Type - Boolean - Value - 0 - - RLVaHideLockedAttachments - - Comment - Hides non-detachable worn attachments from @getattach - Persist - 1 - Type - Boolean - Value - 0 - - RLVaSharedInvAutoRename - - Comment - Automatically renames shared inventory items when worn - Persist - 1 - Type - Boolean - Value - 1 - - RLVaShowNameTags - - Comment - Display of names above avatars is subject to the general "Show Names" setting when @shownames=n restricted - Persist - 1 - Type - Boolean - Value - 0 - - WarnFirstRLVGiveToRLV - - Comment - Enables FirstRLVGiveToRLV warning dialog - Persist - 1 - Type - Boolean - Value - 1 - - - - + + + + + RestrainedLove + + Comment + Toggles the RestrainedLove features (BDSM lockable toys support). Needs a restart of the viewer. + Persist + 1 + Type + Boolean + Value + 1 + + RestrainedLoveDebug + + Comment + Toggles the RestrainedLove debug mode (displays the commands when in debug mode). + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLoveNoSetEnv + + Comment + When TRUE, forbids to set the environment (time of day and Windlight settings) via RestrainedLove. Needs a restart of the viewer. + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLoveOffsetAvatarZ + + Comment + Offset the avatar. + Persist + 1 + Type + F32 + Value + 0.0 + + RestrainedLoveReplaceWhenFolderBeginsWith + + Comment + If a folder name begins with this string, its attach behavior will always be "replace", never "stack". Default is blank (disabled). + Persist + 1 + Type + String + Value + + + RestrainedLoveStackWhenFolderBeginsWith + + Comment + If a folder name begins with this string, its attach behavior will always be "stack", never "replace". Default is "+". + Persist + 1 + Type + String + Value + + + + RLVaDebugHideUnsetDuplicate + + Comment + Suppresses reporting "unset" or "duplicate" command restrictions when RestrainedLoveDebug is TRUE + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLoveForbidGiveToRLV + + Comment + When FALSE, allows to give sub-folders to the #RLV RestrainedLove folder. + Persist + 1 + Type + Boolean + Value + 1 + + RLVaEnableCompositeFolders + + Comment + Enables composite folders for shared inventory + Persist + 1 + Type + Boolean + Value + 0 + + RLVaEnableLegacyNaming + + Comment + Enables legacy naming convention for folders + Persist + 1 + Type + Boolean + Value + 1 + + RLVaEnableSharedWear + + Comment + Attachments in the shared #RLV folder can be force-attached without needing to specify an attachment point + Persist + 1 + Type + Boolean + Value + 0 + + RLVaHideLockedLayers + + Comment + Hides "remove outfit" restricted worn clothing layers from @getoufit + Persist + 1 + Type + Boolean + Value + 0 + + RLVaHideLockedAttachments + + Comment + Hides non-detachable worn attachments from @getattach + Persist + 1 + Type + Boolean + Value + 0 + + RLVaSharedInvAutoRename + + Comment + Automatically renames shared inventory items when worn + Persist + 1 + Type + Boolean + Value + 1 + + RLVaShowNameTags + + Comment + Display of names above avatars is subject to the general "Show Names" setting when @shownames=n restricted + Persist + 1 + Type + Boolean + Value + 0 + + WarnFirstRLVGiveToRLV + + Comment + Enables FirstRLVGiveToRLV warning dialog + Persist + 1 + Type + Boolean + Value + 1 + + + + diff --git a/indra/newview/app_settings/settings_sh.xml b/indra/newview/app_settings/settings_sh.xml index 14e2a78be..6165c069d 100644 --- a/indra/newview/app_settings/settings_sh.xml +++ b/indra/newview/app_settings/settings_sh.xml @@ -1,95 +1,172 @@ - - - - - SHAllowScriptCommands - - Comment - Allow script to client intercommunication - Persist - 1 - Type - Boolean - Value - 0 - - SHScriptCommandPrefix - - Comment - Prefix that script commands must be prepended with. - Persist - 1 - Type - String - Value - #@#@! - - SHChatCommandPrefix - - Comment - Prefix that chat commands must be prepended with - Persist - 1 - Type - String - Value - >> - - SHScriptCommandSeparator - - Comment - Separator to use when tokenizing script command arguments - Persist - 1 - Type - String - Value - | - - SHChatCommandSeparator - - Comment - Separator to use when tokenizing chat command arguments - Persist - 1 - Type - String - Value - - - SHHighResSnapshotScale - - Comment - High-resolution snapshot scale. - Persist - 1 - Type - F32 - Value - 2.0 - - SHHighResSnapshotForceTile - - Comment - Force tiling of snapshots (enables AA and supersampling) - Persist - 1 - Type - Boolean - Value - 0 - - SHHighResSnapshotSuperSample - - Comment - Set the supersampling scale in tiled screenshots. - Persist - 1 - Type - F32 - Value - 1.0 - - - - + + + + + SHAllowScriptCommands + + Comment + Allow script to client intercommunication + Persist + 1 + Type + Boolean + Value + 0 + + SHScriptCommandPrefix + + Comment + Prefix that script commands must be prepended with. + Persist + 1 + Type + String + Value + #@#@! + + SHChatCommandPrefix + + Comment + Prefix that chat commands must be prepended with + Persist + 1 + Type + String + Value + >> + + SHScriptCommandSeparator + + Comment + Separator to use when tokenizing script command arguments + Persist + 1 + Type + String + Value + | + + SHChatCommandSeparator + + Comment + Separator to use when tokenizing chat command arguments + Persist + 1 + Type + String + Value + + + SHHighResSnapshotScale + + Comment + High-resolution snapshot scale. + Persist + 1 + Type + F32 + Value + 2.0 + + SHHighResSnapshotSuperSample + + Comment + Set the supersampling scale in tiled screenshots. + Persist + 1 + Type + F32 + Value + 1.0 + + + SGBlockGeneralSpam + + Comment + Enable automatic general spam blocking + Persist + 1 + Type + Boolean + Value + 0 + + SGBlockCardSpam + + Comment + Enable automatic calling card spam blocking + Persist + 1 + Type + Boolean + Value + 1 + + SGBlockChatSpam + + Comment + Enable automatic chat spam blocking + Persist + 1 + Type + Boolean + Value + 1 + + SGBlockDialogSpam + + Comment + Enable automatic dialog spam blocking + Persist + 1 + Type + Boolean + Value + 1 + + SGSpamTime + + Comment + Time of Evalulating spam. (Default: 1.000) + Persist + 1 + Type + F32 + Value + 1.0 + + SGSpamCount + + Comment + Number of items spammed per time period in SGSpamTime. (Default: 4) + Persist + 1 + Type + U32 + Value + 4 + + SGChatSpamTime + + Comment + Time of Evalulating spam. (Default: 1.000) + Persist + 1 + Type + F32 + Value + 1.0 + + SGChatSpamCount + + Comment + Number of items spammed per time set in SGSpamTime. (Default: 10) + Persist + 1 + Type + U32 + Value + 10.0 + + + diff --git a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl index f81867be6..817d6c1c5 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl @@ -5,6 +5,8 @@ * $License$ */ +#version 120 + uniform sampler2D diffuseMap; uniform float glowStrength; diff --git a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl index 7db969ef0..7edfebab2 100644 --- a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl @@ -5,6 +5,8 @@ * $License$ */ +#extension GL_ARB_texture_rectangle : enable + uniform sampler2DRect RenderTexture; uniform float bloomStrength; diff --git a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl index 4d5bf2538..729949a17 100644 --- a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl @@ -5,6 +5,8 @@ * $License$ */ +#extension GL_ARB_texture_rectangle : enable + uniform sampler2DRect RenderTexture; uniform float brightness; uniform float contrast; diff --git a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl index a1583b13e..f9eee5b89 100644 --- a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl @@ -5,6 +5,8 @@ * $License$ */ +#extension GL_ARB_texture_rectangle : enable + uniform sampler2DRect RenderTexture; uniform float extractLow; uniform float extractHigh; diff --git a/indra/newview/app_settings/shaders/class2/effects/gaussBlurF.glsl b/indra/newview/app_settings/shaders/class2/effects/gaussBlurF.glsl index 47c9f875b..f58622ab6 100644 --- a/indra/newview/app_settings/shaders/class2/effects/gaussBlurF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/gaussBlurF.glsl @@ -1,3 +1,6 @@ + +#extension GL_ARB_texture_rectangle : enable + uniform sampler2DRect RenderTexture; uniform int horizontalPass; diff --git a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl index 271d5cf8d..833ef7d30 100644 --- a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl @@ -4,6 +4,8 @@ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. * $License$ */ + +#extension GL_ARB_texture_rectangle : enable uniform sampler2DRect RenderTexture; uniform sampler2D NoiseTexture; diff --git a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl index e55d278b8..3a236846c 100644 --- a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl @@ -5,6 +5,8 @@ * $License$ */ +#extension GL_ARB_texture_rectangle : enable + uniform sampler2DRect RenderTexture; void main(void) diff --git a/indra/newview/app_settings/windlight/postprocesseffects.xml b/indra/newview/app_settings/windlight/postprocesseffects.xml index 2ce7d7c44..9261f3287 100644 --- a/indra/newview/app_settings/windlight/postprocesseffects.xml +++ b/indra/newview/app_settings/windlight/postprocesseffects.xml @@ -1,191 +1,191 @@ - - - - Asi Weird - - bloom_strength - 4.5799999237060547 - bloom_width - 12.539999961853027 - brightness - 0.89999997615814209 - brightness_multiplier - 3 - contrast - 0.22999998927116394 - contrast_base - - 1 - 1 - 1 - 0.5 - - enable_bloom - 1 - enable_color_filter - 1 - enable_night_vision - 0 - extract_high - 1 - extract_low - 0.47999998927116394 - noise_size - 25 - noise_strength - 0.40000000000000002 - saturation - -1 - - NegativeSaturation - - bloom_strength - 1.5 - bloom_width - 2.25 - brightness - 1 - brightness_multiplier - 3 - contrast - 1 - contrast_base - - 1 - 1 - 1 - 0.5 - - enable_bloom - 0 - enable_color_filter - 1 - enable_night_vision - 0 - extract_high - 1 - extract_low - 0.94999999999999996 - noise_size - 25 - noise_strength - 0.40000000000000002 - saturation - -1 - - NightVision - - bloom_strength - 1.5 - bloom_width - 2.25 - brightness - 1 - brightness_multiplier - 3 - contrast - 1 - contrast_base - - 1 - 1 - 1 - 0.5 - - enable_bloom - 0 - enable_color_filter - 0 - enable_night_vision - 1 - extract_high - 1 - extract_low - 0.94999999999999996 - noise_size - 25 - noise_strength - 0.40000000000000002 - saturation - 1 - - WGhost - - bloom_strength - 2.0399999618530273 - bloom_width - 2.25 - brightness - 1 - brightness_multiplier - 3 - contrast - 1 - contrast_base - - 1 - 1 - 1 - 0.5 - - enable_bloom - 1 - enable_color_filter - 0 - enable_night_vision - 0 - extract_high - 1 - extract_low - 0.22999998927116394 - noise_size - 25 - noise_strength - 0.40000000000000002 - saturation - 1 - - default - - bloom_strength - 1.5 - bloom_width - 2.25 - gamma - 1.0 - brightness - 1 - brightness_multiplier - 3 - contrast - 1 - contrast_base - - 1 - 1 - 1 - 0.5 - - enable_bloom - 0 - enable_color_filter - 0 - enable_night_vision - 0 - enable_gauss_blur - 0 - gauss_blur_passes - 2 - extract_high - 1 - extract_low - 0.94999999999999996 - noise_size - 25 - noise_strength - 0.40000000000000002 - saturation - 1 - - + + + + Asi Weird + + bloom_strength + 4.5799999237060547 + bloom_width + 12.539999961853027 + brightness + 0.89999997615814209 + brightness_multiplier + 3 + contrast + 0.22999998927116394 + contrast_base + + 1 + 1 + 1 + 0.5 + + enable_bloom + 1 + enable_color_filter + 1 + enable_night_vision + 0 + extract_high + 1 + extract_low + 0.47999998927116394 + noise_size + 25 + noise_strength + 0.40000000000000002 + saturation + -1 + + NegativeSaturation + + bloom_strength + 1.5 + bloom_width + 2.25 + brightness + 1 + brightness_multiplier + 3 + contrast + 1 + contrast_base + + 1 + 1 + 1 + 0.5 + + enable_bloom + 0 + enable_color_filter + 1 + enable_night_vision + 0 + extract_high + 1 + extract_low + 0.94999999999999996 + noise_size + 25 + noise_strength + 0.40000000000000002 + saturation + -1 + + NightVision + + bloom_strength + 1.5 + bloom_width + 2.25 + brightness + 1 + brightness_multiplier + 3 + contrast + 1 + contrast_base + + 1 + 1 + 1 + 0.5 + + enable_bloom + 0 + enable_color_filter + 0 + enable_night_vision + 1 + extract_high + 1 + extract_low + 0.94999999999999996 + noise_size + 25 + noise_strength + 0.40000000000000002 + saturation + 1 + + WGhost + + bloom_strength + 2.0399999618530273 + bloom_width + 2.25 + brightness + 1 + brightness_multiplier + 3 + contrast + 1 + contrast_base + + 1 + 1 + 1 + 0.5 + + enable_bloom + 1 + enable_color_filter + 0 + enable_night_vision + 0 + extract_high + 1 + extract_low + 0.22999998927116394 + noise_size + 25 + noise_strength + 0.40000000000000002 + saturation + 1 + + default + + bloom_strength + 1.5 + bloom_width + 2.25 + gamma + 1.0 + brightness + 1 + brightness_multiplier + 3 + contrast + 1 + contrast_base + + 1 + 1 + 1 + 0.5 + + enable_bloom + 0 + enable_color_filter + 0 + enable_night_vision + 0 + enable_gauss_blur + 0 + gauss_blur_passes + 2 + extract_high + 1 + extract_low + 0.94999999999999996 + noise_size + 25 + noise_strength + 0.40000000000000002 + saturation + 1 + + \ No newline at end of file diff --git a/indra/newview/app_settings/windlight/skies/A%2D12AM.xml b/indra/newview/app_settings/windlight/skies/A%2D12AM.xml index aa42de779..0aba31214 100644 --- a/indra/newview/app_settings/windlight/skies/A%2D12AM.xml +++ b/indra/newview/app_settings/windlight/skies/A%2D12AM.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.20405027270317078 - 0.24246673285961151 - 0.32999998331069946 - 0.10999999940395355 - - blue_density - - 0.44999998807907104 - 0.44999998807907104 - 0.44999998807907104 - 1 - - blue_horizon - - 0.23999999463558197 - 0.23999999463558197 - 0.23999999463558197 - 1 - - cloud_color - - 0.22615399956703186 - 0.22615399956703186 - 0.22615399956703186 - 1 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 0.87999999523162842 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940013885498 - 10.01099967956543 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.00030000001424923539 - 0 - 0 - 1 - - distance_multiplier - - 0 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 4 - 0 - 0 - 1 - - haze_horizon - - 0 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 1 - -4.8876205482883961e-007 - 1 - - max_y - - 906.20001220703125 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 2 - sun_angle - 4.7123894691467285 - sunlight_color - - 0.34876692295074463 - 0.35574248433113098 - 0.65999996662139893 - 0.2199999988079071 - - - + + + ambient + + 0.20405027270317078 + 0.24246673285961151 + 0.32999998331069946 + 0.10999999940395355 + + blue_density + + 0.44999998807907104 + 0.44999998807907104 + 0.44999998807907104 + 1 + + blue_horizon + + 0.23999999463558197 + 0.23999999463558197 + 0.23999999463558197 + 1 + + cloud_color + + 0.22615399956703186 + 0.22615399956703186 + 0.22615399956703186 + 1 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 0.87999999523162842 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940013885498 + 10.01099967956543 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.00030000001424923539 + 0 + 0 + 1 + + distance_multiplier + + 0 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 4 + 0 + 0 + 1 + + haze_horizon + + 0 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 1 + -4.8876205482883961e-007 + 1 + + max_y + + 906.20001220703125 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 2 + sun_angle + 4.7123894691467285 + sunlight_color + + 0.34876692295074463 + 0.35574248433113098 + 0.65999996662139893 + 0.2199999988079071 + + + diff --git a/indra/newview/app_settings/windlight/skies/A%2D12PM.xml b/indra/newview/app_settings/windlight/skies/A%2D12PM.xml index 81291b101..119b3e141 100644 --- a/indra/newview/app_settings/windlight/skies/A%2D12PM.xml +++ b/indra/newview/app_settings/windlight/skies/A%2D12PM.xml @@ -1,141 +1,141 @@ - - - ambient - - 1.0499999523162842 - 1.0499999523162842 - 1.0499999523162842 - 0.34999999403953552 - - blue_density - - 0.24475815892219543 - 0.44872328639030457 - 0.75999999046325684 - 0.37999999523162842 - - blue_horizon - - 0.49548381567001343 - 0.49548381567001343 - 0.63999998569488525 - 0.31999999284744263 - - cloud_color - - 0.40999999642372131 - 0.40999999642372131 - 0.40999999642372131 - 0.40999999642372131 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 1 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.199999809265137 - 10.01099967956543 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.00017999998817685992 - 0 - 0 - 1 - - distance_multiplier - - 0.80000001192092896 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.18999999761581421 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 1 - -4.3711388286737929e-008 - 0 - - max_y - - 1605 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 0 - sun_angle - 1.5707963705062866 - sunlight_color - - 0.7342105507850647 - 0.78157895803451538 - 0.89999997615814209 - 0.29999998211860657 - - - + + + ambient + + 1.0499999523162842 + 1.0499999523162842 + 1.0499999523162842 + 0.34999999403953552 + + blue_density + + 0.24475815892219543 + 0.44872328639030457 + 0.75999999046325684 + 0.37999999523162842 + + blue_horizon + + 0.49548381567001343 + 0.49548381567001343 + 0.63999998569488525 + 0.31999999284744263 + + cloud_color + + 0.40999999642372131 + 0.40999999642372131 + 0.40999999642372131 + 0.40999999642372131 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 1 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.199999809265137 + 10.01099967956543 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.00017999998817685992 + 0 + 0 + 1 + + distance_multiplier + + 0.80000001192092896 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.18999999761581421 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 1 + -4.3711388286737929e-008 + 0 + + max_y + + 1605 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 0 + sun_angle + 1.5707963705062866 + sunlight_color + + 0.7342105507850647 + 0.78157895803451538 + 0.89999997615814209 + 0.29999998211860657 + + + diff --git a/indra/newview/app_settings/windlight/skies/A%2D3AM.xml b/indra/newview/app_settings/windlight/skies/A%2D3AM.xml index 29490cb40..f790d3d96 100644 --- a/indra/newview/app_settings/windlight/skies/A%2D3AM.xml +++ b/indra/newview/app_settings/windlight/skies/A%2D3AM.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.22259476780891418 - 0.26450252532958984 - 0.35999998450279236 - 0.11999999731779099 - - blue_density - - 0.44999116536295314 - 0.44999854555993368 - 0.45001013284446073 - 1 - - blue_horizon - - 0.23999616268583132 - 0.239999227803052 - 0.24000028550619668 - 1 - - cloud_color - - 0.22615400241566114 - 0.22615400241566114 - 0.22615400241566114 - 1 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 0.88000000953681223 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.499400354105791 - 10.011000104419489 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.0003000046529240592 - 0 - 0 - 1 - - distance_multiplier - - 7.8213197608078763e-005 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5.0000000000023022 - 0.0010000000214220922 - -0.47999999165507345 - 1 - - haze_density - - 3.9999044060931555 - 0 - 0 - 1 - - haze_horizon - - 4.6348559691012062e-006 - 0.19915600437461423 - 0.19915600437461423 - 1 - - lightnorm - - 0 - 0.70710653066635132 - -0.70710700750350952 - 1 - - max_y - - 906.19008370909478 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 1.9999420642852783 - sun_angle - 5.4977874755859375 - sunlight_color - - 0.60242295265197754 - 0.61447036266326904 - 1.1399999856948853 - 0.37999999523162842 - - - + + + ambient + + 0.22259476780891418 + 0.26450252532958984 + 0.35999998450279236 + 0.11999999731779099 + + blue_density + + 0.44999116536295314 + 0.44999854555993368 + 0.45001013284446073 + 1 + + blue_horizon + + 0.23999616268583132 + 0.239999227803052 + 0.24000028550619668 + 1 + + cloud_color + + 0.22615400241566114 + 0.22615400241566114 + 0.22615400241566114 + 1 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 0.88000000953681223 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.499400354105791 + 10.011000104419489 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.0003000046529240592 + 0 + 0 + 1 + + distance_multiplier + + 7.8213197608078763e-005 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5.0000000000023022 + 0.0010000000214220922 + -0.47999999165507345 + 1 + + haze_density + + 3.9999044060931555 + 0 + 0 + 1 + + haze_horizon + + 4.6348559691012062e-006 + 0.19915600437461423 + 0.19915600437461423 + 1 + + lightnorm + + 0 + 0.70710653066635132 + -0.70710700750350952 + 1 + + max_y + + 906.19008370909478 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 1.9999420642852783 + sun_angle + 5.4977874755859375 + sunlight_color + + 0.60242295265197754 + 0.61447036266326904 + 1.1399999856948853 + 0.37999999523162842 + + + diff --git a/indra/newview/app_settings/windlight/skies/A%2D3PM.xml b/indra/newview/app_settings/windlight/skies/A%2D3PM.xml index 61ff9ebf4..ec9706773 100644 --- a/indra/newview/app_settings/windlight/skies/A%2D3PM.xml +++ b/indra/newview/app_settings/windlight/skies/A%2D3PM.xml @@ -1,141 +1,141 @@ - - - ambient - - 1.0499999523162842 - 1.0499999523162842 - 1.0499999523162842 - 0.34999999403953552 - - blue_density - - 0.2447581488182351 - 0.44872328639030457 - 0.75999999046325684 - 0.38000004053115788 - - blue_horizon - - 0.49548382097675159 - 0.49548381382419748 - 0.63999999284744291 - 0.31999999642372146 - - cloud_color - - 0.40999999165535073 - 0.40999999165535073 - 0.40999999165535073 - 0.40999999165535073 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 0.99999999999999289 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.4199999868869746 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.199999809265137 - 10.01099967956543 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.00017999998817685818 - 0 - 0 - 1 - - distance_multiplier - - 0.80000001192093606 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.18999999761581243 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.70710659027099609 - -0.70710694789886475 - 0 - - max_y - - 1605 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 0 - sun_angle - 2.3561947345733643 - sunlight_color - - 0.73421055078505759 - 0.78157895803450828 - 0.89999997615813498 - 0.29999998211860301 - - - + + + ambient + + 1.0499999523162842 + 1.0499999523162842 + 1.0499999523162842 + 0.34999999403953552 + + blue_density + + 0.2447581488182351 + 0.44872328639030457 + 0.75999999046325684 + 0.38000004053115788 + + blue_horizon + + 0.49548382097675159 + 0.49548381382419748 + 0.63999999284744291 + 0.31999999642372146 + + cloud_color + + 0.40999999165535073 + 0.40999999165535073 + 0.40999999165535073 + 0.40999999165535073 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 0.99999999999999289 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.4199999868869746 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.199999809265137 + 10.01099967956543 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.00017999998817685818 + 0 + 0 + 1 + + distance_multiplier + + 0.80000001192093606 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.18999999761581243 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.70710659027099609 + -0.70710694789886475 + 0 + + max_y + + 1605 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 0 + sun_angle + 2.3561947345733643 + sunlight_color + + 0.73421055078505759 + 0.78157895803450828 + 0.89999997615813498 + 0.29999998211860301 + + + diff --git a/indra/newview/app_settings/windlight/skies/A%2D6AM.xml b/indra/newview/app_settings/windlight/skies/A%2D6AM.xml index 3a7b6196c..bbc7aeec5 100644 --- a/indra/newview/app_settings/windlight/skies/A%2D6AM.xml +++ b/indra/newview/app_settings/windlight/skies/A%2D6AM.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.80999994277954102 - 0.46289783716201782 - 0.62999993562698364 - 0.26999998092651367 - - blue_density - - 0.15793180465698242 - 0.43499568104743958 - 0.87000000476837158 - 0.87000000476837158 - - blue_horizon - - 0.20673196017742157 - 0.40988314151763916 - 0.47999998927116394 - 0.47999998927116394 - - cloud_color - - 0.22616604226328718 - 0.22616604226328718 - 0.22616604226328718 - 0.99997219085526012 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 0.88000025272481253 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940013883861 - 10.010999679576344 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.00062000000616535544 - 0 - 0 - 1 - - distance_multiplier - - 2.6999279499073054 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5.0009990693069994 - 0.0010000000474963411 - -0.48000101923815919 - 1 - - haze_density - - 0.53999996185302734 - 0 - 0 - 1 - - haze_horizon - - 0.15999999642372131 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.094108223915100098 - 0.99556195735931396 - 0 - - max_y - - 563 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 0 - sun_angle - 0.094247691333293915 - sunlight_color - - 2.369999885559082 - 2.369999885559082 - 2.369999885559082 - 0.78999996185302734 - - - + + + ambient + + 0.80999994277954102 + 0.46289783716201782 + 0.62999993562698364 + 0.26999998092651367 + + blue_density + + 0.15793180465698242 + 0.43499568104743958 + 0.87000000476837158 + 0.87000000476837158 + + blue_horizon + + 0.20673196017742157 + 0.40988314151763916 + 0.47999998927116394 + 0.47999998927116394 + + cloud_color + + 0.22616604226328718 + 0.22616604226328718 + 0.22616604226328718 + 0.99997219085526012 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 0.88000025272481253 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940013883861 + 10.010999679576344 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.00062000000616535544 + 0 + 0 + 1 + + distance_multiplier + + 2.6999279499073054 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5.0009990693069994 + 0.0010000000474963411 + -0.48000101923815919 + 1 + + haze_density + + 0.53999996185302734 + 0 + 0 + 1 + + haze_horizon + + 0.15999999642372131 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.094108223915100098 + 0.99556195735931396 + 0 + + max_y + + 563 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 0 + sun_angle + 0.094247691333293915 + sunlight_color + + 2.369999885559082 + 2.369999885559082 + 2.369999885559082 + 0.78999996185302734 + + + diff --git a/indra/newview/app_settings/windlight/skies/A%2D6PM.xml b/indra/newview/app_settings/windlight/skies/A%2D6PM.xml index 796c6e127..ebf08e1a3 100644 --- a/indra/newview/app_settings/windlight/skies/A%2D6PM.xml +++ b/indra/newview/app_settings/windlight/skies/A%2D6PM.xml @@ -1,142 +1,142 @@ - - - ambient - - 1.0199999809265137 - 0.80999994277954102 - 0.80999994277954102 - 1.0199999809265137 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.10767599940299988 - 0.21348699927330017 - 0.25 - 1 - - cloud_color - - 0.22615399956703186 - 0.22615399956703186 - 0.22615399956703186 - 1 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 0.87999999523162842 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940013885498 - 10.01099967956543 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.00046000001020729542 - 0 - 0 - 1 - - distance_multiplier - - 1 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.15999999642372131 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.07532646507024765 - -0.99715894460678101 - 0 - - max_y - - 562.5 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 0 - sun_angle - 3.0661947727203369 - sunlight_color - - 2.8385701179504395 - 2.8385701179504395 - 2.8385701179504395 - 1 - - - - + + + ambient + + 1.0199999809265137 + 0.80999994277954102 + 0.80999994277954102 + 1.0199999809265137 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.10767599940299988 + 0.21348699927330017 + 0.25 + 1 + + cloud_color + + 0.22615399956703186 + 0.22615399956703186 + 0.22615399956703186 + 1 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 0.87999999523162842 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940013885498 + 10.01099967956543 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.00046000001020729542 + 0 + 0 + 1 + + distance_multiplier + + 1 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.15999999642372131 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.07532646507024765 + -0.99715894460678101 + 0 + + max_y + + 562.5 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 0 + sun_angle + 3.0661947727203369 + sunlight_color + + 2.8385701179504395 + 2.8385701179504395 + 2.8385701179504395 + 1 + + + + diff --git a/indra/newview/app_settings/windlight/skies/A%2D9AM.xml b/indra/newview/app_settings/windlight/skies/A%2D9AM.xml index 84b61ac29..413e3a27d 100644 --- a/indra/newview/app_settings/windlight/skies/A%2D9AM.xml +++ b/indra/newview/app_settings/windlight/skies/A%2D9AM.xml @@ -1,141 +1,141 @@ - - - ambient - - 1.0499999949065426 - 1.0499999988079054 - 1.0499999988079054 - 0.3500000095367426 - - blue_density - - 0.15999999642372131 - 0.44872328639030457 - 0.75999999046325684 - 0.75999999046325684 - - blue_horizon - - 0.53999996185302734 - 0.47999998927116394 - 0.69999998807907104 - 0.34999999403953552 - - cloud_color - - 0.37000000476837158 - 0.37000000476837158 - 0.37000000476837158 - 0.37000000476837158 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 0.99999998569455784 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999997615814166 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.199999844956437 - 10.01099967956543 - - cloud_shadow - - 0.27333331108093262 - 0 - 0 - 1 - - density_multiplier - - 0.00017999998102430359 - 0 - 0 - 1 - - distance_multiplier - - 0.80000008344649842 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 4.9999999284740397 - 0.0010000000474974513 - -0.47999999046327346 - 1 - - haze_density - - 0.70000003576435432 - 0 - 0 - 1 - - haze_horizon - - 0.18999999284767277 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.70710676908493042 - 0.70710676908493042 - 0 - - max_y - - 1605 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 0 - sun_angle - 0.78539818525314331 - sunlight_color - - 0.73421054104441197 - 0.7815789463510896 - 0.89999995470046912 - 0.29999997496605069 - - - + + + ambient + + 1.0499999949065426 + 1.0499999988079054 + 1.0499999988079054 + 0.3500000095367426 + + blue_density + + 0.15999999642372131 + 0.44872328639030457 + 0.75999999046325684 + 0.75999999046325684 + + blue_horizon + + 0.53999996185302734 + 0.47999998927116394 + 0.69999998807907104 + 0.34999999403953552 + + cloud_color + + 0.37000000476837158 + 0.37000000476837158 + 0.37000000476837158 + 0.37000000476837158 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 0.99999998569455784 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999997615814166 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.199999844956437 + 10.01099967956543 + + cloud_shadow + + 0.27333331108093262 + 0 + 0 + 1 + + density_multiplier + + 0.00017999998102430359 + 0 + 0 + 1 + + distance_multiplier + + 0.80000008344649842 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 4.9999999284740397 + 0.0010000000474974513 + -0.47999999046327346 + 1 + + haze_density + + 0.70000003576435432 + 0 + 0 + 1 + + haze_horizon + + 0.18999999284767277 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.70710676908493042 + 0.70710676908493042 + 0 + + max_y + + 1605 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 0 + sun_angle + 0.78539818525314331 + sunlight_color + + 0.73421054104441197 + 0.7815789463510896 + 0.89999995470046912 + 0.29999997496605069 + + + diff --git a/indra/newview/app_settings/windlight/skies/A%2D9PM.xml b/indra/newview/app_settings/windlight/skies/A%2D9PM.xml index 6a509d107..292f6713b 100644 --- a/indra/newview/app_settings/windlight/skies/A%2D9PM.xml +++ b/indra/newview/app_settings/windlight/skies/A%2D9PM.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.20404692765200849 - 0.24246276689169122 - 0.33000383615406292 - 0.1100123608103587 - - blue_density - - 0.44999116536295314 - 0.44999854555993368 - 0.45001013284446073 - 1 - - blue_horizon - - 0.23999616268583132 - 0.239999227803052 - 0.24000028550619668 - 1 - - cloud_color - - 0.22615400241566114 - 0.22615400241566114 - 0.22615400241566114 - 1 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 0.88000000953681223 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.499400354105791 - 10.011000104419489 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.0003000046529240592 - 0 - 0 - 1 - - distance_multiplier - - 7.8213197608078763e-005 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5.0000000000023022 - 0.0010000000214220922 - -0.47999999165507345 - 1 - - haze_density - - 3.9999044060931555 - 0 - 0 - 1 - - haze_horizon - - 4.6348559691012062e-006 - 0.19915600437461423 - 0.19915600437461423 - 1 - - lightnorm - - 0 - 0.70710688829421997 - 0.70710664987564087 - 1 - - max_y - - 906.19008370909478 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 1.9999420642852783 - sun_angle - 3.9269909858703613 - sunlight_color - - 0.34878980098432066 - 0.35576509414380553 - 0.66003586768772493 - 0.22001197576412324 - - - + + + ambient + + 0.20404692765200849 + 0.24246276689169122 + 0.33000383615406292 + 0.1100123608103587 + + blue_density + + 0.44999116536295314 + 0.44999854555993368 + 0.45001013284446073 + 1 + + blue_horizon + + 0.23999616268583132 + 0.239999227803052 + 0.24000028550619668 + 1 + + cloud_color + + 0.22615400241566114 + 0.22615400241566114 + 0.22615400241566114 + 1 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 0.88000000953681223 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.499400354105791 + 10.011000104419489 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.0003000046529240592 + 0 + 0 + 1 + + distance_multiplier + + 7.8213197608078763e-005 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5.0000000000023022 + 0.0010000000214220922 + -0.47999999165507345 + 1 + + haze_density + + 3.9999044060931555 + 0 + 0 + 1 + + haze_horizon + + 4.6348559691012062e-006 + 0.19915600437461423 + 0.19915600437461423 + 1 + + lightnorm + + 0 + 0.70710688829421997 + 0.70710664987564087 + 1 + + max_y + + 906.19008370909478 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 1.9999420642852783 + sun_angle + 3.9269909858703613 + sunlight_color + + 0.34878980098432066 + 0.35576509414380553 + 0.66003586768772493 + 0.22001197576412324 + + + diff --git a/indra/newview/app_settings/windlight/skies/Barcelona.xml b/indra/newview/app_settings/windlight/skies/Barcelona.xml index 7b09fe2bb..ea9cab8fb 100644 --- a/indra/newview/app_settings/windlight/skies/Barcelona.xml +++ b/indra/newview/app_settings/windlight/skies/Barcelona.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.22260047495365143 - 0.26450866460800171 - 0.35999998450279236 - 0.11999999731779099 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.15130999684333801 - 0.30000001192092896 - 0.35131001472473145 - 1 - - cloud_color - - 0.50999999046325684 - 0.50999999046325684 - 0.50999999046325684 - 1 - - cloud_pos_density1 - - 0.5 - 0.5 - 1 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940013885498 - 10.01099967956543 - - cloud_shadow - - 0.30000001192092896 - 0 - 0 - 1 - - density_multiplier - - 0.0003499999875202775 - 0 - 0 - 1 - - distance_multiplier - - 6 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.33000001311302185 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.19915600121021271 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.062790460884571075 - -0.99802672863006592 - 0 - - max_y - - 600 - 0 - 0 - 1 - - preset_num - 21 - star_brightness - 0 - sun_angle - 3.0787608623504639 - sunlight_color - - 1.1699999570846558 - 1.1699999570846558 - 1.1699999570846558 - 0.38999998569488525 - - - + + + ambient + + 0.22260047495365143 + 0.26450866460800171 + 0.35999998450279236 + 0.11999999731779099 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.15130999684333801 + 0.30000001192092896 + 0.35131001472473145 + 1 + + cloud_color + + 0.50999999046325684 + 0.50999999046325684 + 0.50999999046325684 + 1 + + cloud_pos_density1 + + 0.5 + 0.5 + 1 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940013885498 + 10.01099967956543 + + cloud_shadow + + 0.30000001192092896 + 0 + 0 + 1 + + density_multiplier + + 0.0003499999875202775 + 0 + 0 + 1 + + distance_multiplier + + 6 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.33000001311302185 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.19915600121021271 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.062790460884571075 + -0.99802672863006592 + 0 + + max_y + + 600 + 0 + 0 + 1 + + preset_num + 21 + star_brightness + 0 + sun_angle + 3.0787608623504639 + sunlight_color + + 1.1699999570846558 + 1.1699999570846558 + 1.1699999570846558 + 0.38999998569488525 + + + diff --git a/indra/newview/app_settings/windlight/skies/Blizzard.xml b/indra/newview/app_settings/windlight/skies/Blizzard.xml index a4110a1a6..d17d2790a 100644 --- a/indra/newview/app_settings/windlight/skies/Blizzard.xml +++ b/indra/newview/app_settings/windlight/skies/Blizzard.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.4823022186756134 - 0.57310229539871216 - 0.77999997138977051 - 0.25999999046325684 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.15130999684333801 - 0.30000001192092896 - 0.35131001472473145 - 1 - - cloud_color - - 0.12862999737262726 - 0.12862999737262726 - 0.12862999737262726 - 1 - - cloud_pos_density1 - - 0.88419097661972046 - 0.53047597408294678 - 0.4270470142364502 - 1 - - cloud_pos_density2 - - 0.38419300317764282 - 0.5 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10 - 10 - - cloud_shadow - - 0.61711597442626953 - 0 - 0 - 1 - - density_multiplier - - 0.0001250890054507181 - 0 - 0 - 1 - - distance_multiplier - - 11.40000057220459 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 6.4079799652099609 - 0.0012815999798476696 - -0.42292699217796326 - 1 - - haze_density - - 4 - 0 - 0 - 1 - - haze_horizon - - 0.21744099259376526 - 0.21744099259376526 - 0.21744099259376526 - 1 - - lightnorm - - 0 - 0.15643447637557983 - 0.98768836259841919 - 0 - - max_y - - 4000 - 0 - 0 - 1 - - preset_num - 2 - star_brightness - 0 - sun_angle - 0.15707963705062866 - sunlight_color - - 3 - 3 - 3 - 1 - - - + + + ambient + + 0.4823022186756134 + 0.57310229539871216 + 0.77999997138977051 + 0.25999999046325684 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.15130999684333801 + 0.30000001192092896 + 0.35131001472473145 + 1 + + cloud_color + + 0.12862999737262726 + 0.12862999737262726 + 0.12862999737262726 + 1 + + cloud_pos_density1 + + 0.88419097661972046 + 0.53047597408294678 + 0.4270470142364502 + 1 + + cloud_pos_density2 + + 0.38419300317764282 + 0.5 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10 + 10 + + cloud_shadow + + 0.61711597442626953 + 0 + 0 + 1 + + density_multiplier + + 0.0001250890054507181 + 0 + 0 + 1 + + distance_multiplier + + 11.40000057220459 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 6.4079799652099609 + 0.0012815999798476696 + -0.42292699217796326 + 1 + + haze_density + + 4 + 0 + 0 + 1 + + haze_horizon + + 0.21744099259376526 + 0.21744099259376526 + 0.21744099259376526 + 1 + + lightnorm + + 0 + 0.15643447637557983 + 0.98768836259841919 + 0 + + max_y + + 4000 + 0 + 0 + 1 + + preset_num + 2 + star_brightness + 0 + sun_angle + 0.15707963705062866 + sunlight_color + + 3 + 3 + 3 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Blue%20Midday.xml b/indra/newview/app_settings/windlight/skies/Blue%20Midday.xml index e7fdbe1d5..570f05996 100644 --- a/indra/newview/app_settings/windlight/skies/Blue%20Midday.xml +++ b/indra/newview/app_settings/windlight/skies/Blue%20Midday.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.14999999105930328 - 0.14999999105930328 - 0.14999999105930328 - 0.049999997019767761 - - blue_density - - 0.18153078854084015 - 0.49999505281448364 - 1 - 1 - - blue_horizon - - 0.43070217967033386 - 0.85394656658172607 - 1 - 1 - - cloud_color - - 0.53962135314941406 - 0.53962135314941406 - 0.53962135314941406 - 1 - - cloud_pos_density1 - - 0.5 - 0.5 - 0.69569224119186401 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.125 - 1 - - cloud_scale - - 0.10999999195337296 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940013885498 - 10.01099967956543 - - cloud_shadow - - 0.3765256404876709 - 0 - 0 - 1 - - density_multiplier - - 0.0003499999875202775 - 0 - 0 - 1 - - distance_multiplier - - 2.9846153259277344 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 4.2061538696289062 - 0.0010000000474974513 - -0.44246155023574829 - 1 - - haze_density - - 2.8830769062042236 - 0 - 0 - 1 - - haze_horizon - - 0.49740666151046753 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.86074197292327881 - -0.50904154777526855 - 0 - - max_y - - 600 - 0 - 0 - 1 - - preset_num - 10 - star_brightness - 0 - sun_angle - 2.1048672199249268 - sunlight_color - - 0.88526362180709839 - 1.2300000190734863 - 1.2300000190734863 - 0.40999999642372131 - - - + + + ambient + + 0.14999999105930328 + 0.14999999105930328 + 0.14999999105930328 + 0.049999997019767761 + + blue_density + + 0.18153078854084015 + 0.49999505281448364 + 1 + 1 + + blue_horizon + + 0.43070217967033386 + 0.85394656658172607 + 1 + 1 + + cloud_color + + 0.53962135314941406 + 0.53962135314941406 + 0.53962135314941406 + 1 + + cloud_pos_density1 + + 0.5 + 0.5 + 0.69569224119186401 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.125 + 1 + + cloud_scale + + 0.10999999195337296 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940013885498 + 10.01099967956543 + + cloud_shadow + + 0.3765256404876709 + 0 + 0 + 1 + + density_multiplier + + 0.0003499999875202775 + 0 + 0 + 1 + + distance_multiplier + + 2.9846153259277344 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 4.2061538696289062 + 0.0010000000474974513 + -0.44246155023574829 + 1 + + haze_density + + 2.8830769062042236 + 0 + 0 + 1 + + haze_horizon + + 0.49740666151046753 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.86074197292327881 + -0.50904154777526855 + 0 + + max_y + + 600 + 0 + 0 + 1 + + preset_num + 10 + star_brightness + 0 + sun_angle + 2.1048672199249268 + sunlight_color + + 0.88526362180709839 + 1.2300000190734863 + 1.2300000190734863 + 0.40999999642372131 + + + diff --git a/indra/newview/app_settings/windlight/skies/Coastal%20Afternoon.xml b/indra/newview/app_settings/windlight/skies/Coastal%20Afternoon.xml index 1036e6954..4925b29ee 100644 --- a/indra/newview/app_settings/windlight/skies/Coastal%20Afternoon.xml +++ b/indra/newview/app_settings/windlight/skies/Coastal%20Afternoon.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.89040267467498779 - 1.0580335855484009 - 1.4399999380111694 - 0.47999998927116394 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.15130999684333801 - 0.30000001192092896 - 0.35131001472473145 - 1 - - cloud_color - - 0.21396400034427643 - 0.21396400034427643 - 0.21396400034427643 - 1 - - cloud_pos_density1 - - 0.16495099663734436 - 0.09771379828453064 - 1 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.079754598438739777 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 9.644780158996582 - 10.423800468444824 - - cloud_shadow - - 0.30061298608779907 - 0 - 0 - 1 - - density_multiplier - - 0.00015800200344529003 - 0 - 0 - 1 - - distance_multiplier - - 1 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.33000001311302185 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.13210900127887726 - 0.13210900127887726 - 0.13210900127887726 - 1 - - lightnorm - - 0 - 0.031410444527864456 - -0.99950659275054932 - 0 - - max_y - - 600 - 0 - 0 - 1 - - preset_num - 3 - star_brightness - 0 - sun_angle - 3.1101770401000977 - sunlight_color - - 3 - 3 - 3 - 1 - - - + + + ambient + + 0.89040267467498779 + 1.0580335855484009 + 1.4399999380111694 + 0.47999998927116394 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.15130999684333801 + 0.30000001192092896 + 0.35131001472473145 + 1 + + cloud_color + + 0.21396400034427643 + 0.21396400034427643 + 0.21396400034427643 + 1 + + cloud_pos_density1 + + 0.16495099663734436 + 0.09771379828453064 + 1 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.079754598438739777 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 9.644780158996582 + 10.423800468444824 + + cloud_shadow + + 0.30061298608779907 + 0 + 0 + 1 + + density_multiplier + + 0.00015800200344529003 + 0 + 0 + 1 + + distance_multiplier + + 1 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.33000001311302185 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.13210900127887726 + 0.13210900127887726 + 0.13210900127887726 + 1 + + lightnorm + + 0 + 0.031410444527864456 + -0.99950659275054932 + 0 + + max_y + + 600 + 0 + 0 + 1 + + preset_num + 3 + star_brightness + 0 + sun_angle + 3.1101770401000977 + sunlight_color + + 3 + 3 + 3 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Coastal%20Sunset.xml b/indra/newview/app_settings/windlight/skies/Coastal%20Sunset.xml index 41f6aafee..f4736cf4c 100644 --- a/indra/newview/app_settings/windlight/skies/Coastal%20Sunset.xml +++ b/indra/newview/app_settings/windlight/skies/Coastal%20Sunset.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.31535112857818604 - 0.37471914291381836 - 0.50999999046325684 - 0.17000000178813934 - - blue_density - - 0.11645399779081345 - 0.32075101137161255 - 0.64150899648666382 - 1 - - blue_horizon - - 0.054176401346921921 - 0.10741499811410904 - 0.12578600645065308 - 1 - - cloud_color - - 0.21396400034427643 - 0.21396400034427643 - 0.21396400034427643 - 1 - - cloud_pos_density1 - - 0.27044001221656799 - 1 - 1 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.10062900185585022 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 9.644780158996582 - 10.423800468444824 - - cloud_shadow - - 0.32704401016235352 - 0 - 0 - 1 - - density_multiplier - - 0.00015849100600462407 - 0 - 0 - 1 - - distance_multiplier - - 3.4000000953674316 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 6.867919921875 - 0.0013735899701714516 - -0.45328301191329956 - 1 - - haze_density - - 0.6792449951171875 - 0 - 0 - 1 - - haze_horizon - - 0.13210900127887726 - 0.13210900127887726 - 0.13210900127887726 - 1 - - lightnorm - - 0 - 0.031410444527864456 - -0.99950659275054932 - 0 - - max_y - - 1308.1800537109375 - 0 - 0 - 1 - - preset_num - 5 - star_brightness - 0 - sun_angle - 3.1101770401000977 - sunlight_color - - 3 - 3 - 3 - 1 - - - + + + ambient + + 0.31535112857818604 + 0.37471914291381836 + 0.50999999046325684 + 0.17000000178813934 + + blue_density + + 0.11645399779081345 + 0.32075101137161255 + 0.64150899648666382 + 1 + + blue_horizon + + 0.054176401346921921 + 0.10741499811410904 + 0.12578600645065308 + 1 + + cloud_color + + 0.21396400034427643 + 0.21396400034427643 + 0.21396400034427643 + 1 + + cloud_pos_density1 + + 0.27044001221656799 + 1 + 1 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.10062900185585022 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 9.644780158996582 + 10.423800468444824 + + cloud_shadow + + 0.32704401016235352 + 0 + 0 + 1 + + density_multiplier + + 0.00015849100600462407 + 0 + 0 + 1 + + distance_multiplier + + 3.4000000953674316 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 6.867919921875 + 0.0013735899701714516 + -0.45328301191329956 + 1 + + haze_density + + 0.6792449951171875 + 0 + 0 + 1 + + haze_horizon + + 0.13210900127887726 + 0.13210900127887726 + 0.13210900127887726 + 1 + + lightnorm + + 0 + 0.031410444527864456 + -0.99950659275054932 + 0 + + max_y + + 1308.1800537109375 + 0 + 0 + 1 + + preset_num + 5 + star_brightness + 0 + sun_angle + 3.1101770401000977 + sunlight_color + + 3 + 3 + 3 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Default.xml b/indra/newview/app_settings/windlight/skies/Default.xml index d2d62e65b..13a2c7504 100644 --- a/indra/newview/app_settings/windlight/skies/Default.xml +++ b/indra/newview/app_settings/windlight/skies/Default.xml @@ -1,141 +1,141 @@ - - - ambient - - 1.0499999523162842 - 1.0499999523162842 - 1.0499999523162842 - 0.34999999403953552 - - blue_density - - 0.24475815892219543 - 0.44872328639030457 - 0.75999999046325684 - 0.37999999523162842 - - blue_horizon - - 0.49548381567001343 - 0.49548381567001343 - 0.63999998569488525 - 0.31999999284744263 - - cloud_color - - 0.40999999642372131 - 0.40999999642372131 - 0.40999999642372131 - 0.40999999642372131 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 1 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.199999809265137 - 10.01099967956543 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.00017999998817685992 - 0 - 0 - 1 - - distance_multiplier - - 0.80000001192092896 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.18999999761581421 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.91269159317016602 - -0.40864911675453186 - 0 - - max_y - - 1605 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 0 - sun_angle - 1.9917697906494141 - sunlight_color - - 0.7342105507850647 - 0.78157895803451538 - 0.89999997615814209 - 0.29999998211860657 - - - + + + ambient + + 1.0499999523162842 + 1.0499999523162842 + 1.0499999523162842 + 0.34999999403953552 + + blue_density + + 0.24475815892219543 + 0.44872328639030457 + 0.75999999046325684 + 0.37999999523162842 + + blue_horizon + + 0.49548381567001343 + 0.49548381567001343 + 0.63999998569488525 + 0.31999999284744263 + + cloud_color + + 0.40999999642372131 + 0.40999999642372131 + 0.40999999642372131 + 0.40999999642372131 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 1 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.199999809265137 + 10.01099967956543 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.00017999998817685992 + 0 + 0 + 1 + + distance_multiplier + + 0.80000001192092896 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.18999999761581421 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.91269159317016602 + -0.40864911675453186 + 0 + + max_y + + 1605 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 0 + sun_angle + 1.9917697906494141 + sunlight_color + + 0.7342105507850647 + 0.78157895803451538 + 0.89999997615814209 + 0.29999998211860657 + + + diff --git a/indra/newview/app_settings/windlight/skies/Desert%20Sunset.xml b/indra/newview/app_settings/windlight/skies/Desert%20Sunset.xml index 89f8c36cb..b2a611163 100644 --- a/indra/newview/app_settings/windlight/skies/Desert%20Sunset.xml +++ b/indra/newview/app_settings/windlight/skies/Desert%20Sunset.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.07420019805431366 - 0.088169597089290619 - 0.11999999731779099 - 1 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.10767599940299988 - 0.21348699927330017 - 0.25 - 1 - - cloud_color - - 0.22615399956703186 - 0.22615399956703186 - 0.22615399956703186 - 1 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 1 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.199999809265137 - 10.01099967956543 - - cloud_shadow - - 0.37999999523162842 - 0 - 0 - 1 - - density_multiplier - - 0.00046000001020729542 - 0 - 0 - 1 - - distance_multiplier - - 2 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.6100000143051147 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.15999999642372131 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.062790460884571075 - -0.99802672863006592 - 0 - - max_y - - 562.5 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 0 - sun_angle - 3.0787608623504639 - sunlight_color - - 2.8385701179504395 - 2.8385701179504395 - 2.8385701179504395 - 1 - - - + + + ambient + + 0.07420019805431366 + 0.088169597089290619 + 0.11999999731779099 + 1 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.10767599940299988 + 0.21348699927330017 + 0.25 + 1 + + cloud_color + + 0.22615399956703186 + 0.22615399956703186 + 0.22615399956703186 + 1 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 1 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.199999809265137 + 10.01099967956543 + + cloud_shadow + + 0.37999999523162842 + 0 + 0 + 1 + + density_multiplier + + 0.00046000001020729542 + 0 + 0 + 1 + + distance_multiplier + + 2 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.6100000143051147 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.15999999642372131 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.062790460884571075 + -0.99802672863006592 + 0 + + max_y + + 562.5 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 0 + sun_angle + 3.0787608623504639 + sunlight_color + + 2.8385701179504395 + 2.8385701179504395 + 2.8385701179504395 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Fine%20Day.xml b/indra/newview/app_settings/windlight/skies/Fine%20Day.xml index 0d6d1db39..e053815be 100644 --- a/indra/newview/app_settings/windlight/skies/Fine%20Day.xml +++ b/indra/newview/app_settings/windlight/skies/Fine%20Day.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.21194984018802643 - 0.25700280070304871 - 0.25999999046325684 - 0.25999999046325684 - - blue_density - - 0.10031381994485855 - 0.2849995493888855 - 0.56999999284744263 - 0.56999999284744263 - - blue_horizon - - 0.15806557238101959 - 0.31211116909980774 - 0.52999997138977051 - 0.52999997138977051 - - cloud_color - - 0.62000000476837158 - 0.72737622261047363 - 0.73626559972763062 - 1 - - cloud_pos_density1 - - 0.89999997615814209 - 0.93999999761581421 - 0.74000000953674316 - 1 - - cloud_pos_density2 - - 0.11999999731779099 - 0.20999999344348907 - 0.029999999329447746 - 1 - - cloud_scale - - 0.25999999046325684 - 0 - 0 - 1 - - cloud_scroll_rate - - 9.993240904292179 - 10.010000228881836 - - cloud_shadow - - 0.29999998211860657 - 0 - 0 - 1 - - density_multiplier - - 0.00013000000035390258 - 0 - 0 - 1 - - distance_multiplier - - 10.100000381469727 - 0 - 0 - 1 - - east_angle - 3.8955750465393066 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.4699999094009399 - 0 - 0 - 1 - - glow - - 11.200000762939453 - 0.0010000000474974513 - -0.64999997615814209 - 1 - - haze_density - - 0.35999998450279236 - 0 - 0 - 1 - - haze_horizon - - 0.11999999731779099 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0.66304093599319458 - 0.24868990480899811 - -0.70606660842895508 - 0 - - max_y - - 789 - 0 - 0 - 1 - - preset_num - 24 - star_brightness - 0.18999999761581421 - sun_angle - 0.25132742524147034 - sunlight_color - - 2.25 - 1.2599999904632568 - 0.59999996423721313 - 2.25 - - - + + + ambient + + 0.21194984018802643 + 0.25700280070304871 + 0.25999999046325684 + 0.25999999046325684 + + blue_density + + 0.10031381994485855 + 0.2849995493888855 + 0.56999999284744263 + 0.56999999284744263 + + blue_horizon + + 0.15806557238101959 + 0.31211116909980774 + 0.52999997138977051 + 0.52999997138977051 + + cloud_color + + 0.62000000476837158 + 0.72737622261047363 + 0.73626559972763062 + 1 + + cloud_pos_density1 + + 0.89999997615814209 + 0.93999999761581421 + 0.74000000953674316 + 1 + + cloud_pos_density2 + + 0.11999999731779099 + 0.20999999344348907 + 0.029999999329447746 + 1 + + cloud_scale + + 0.25999999046325684 + 0 + 0 + 1 + + cloud_scroll_rate + + 9.993240904292179 + 10.010000228881836 + + cloud_shadow + + 0.29999998211860657 + 0 + 0 + 1 + + density_multiplier + + 0.00013000000035390258 + 0 + 0 + 1 + + distance_multiplier + + 10.100000381469727 + 0 + 0 + 1 + + east_angle + 3.8955750465393066 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.4699999094009399 + 0 + 0 + 1 + + glow + + 11.200000762939453 + 0.0010000000474974513 + -0.64999997615814209 + 1 + + haze_density + + 0.35999998450279236 + 0 + 0 + 1 + + haze_horizon + + 0.11999999731779099 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0.66304093599319458 + 0.24868990480899811 + -0.70606660842895508 + 0 + + max_y + + 789 + 0 + 0 + 1 + + preset_num + 24 + star_brightness + 0.18999999761581421 + sun_angle + 0.25132742524147034 + sunlight_color + + 2.25 + 1.2599999904632568 + 0.59999996423721313 + 2.25 + + + diff --git a/indra/newview/app_settings/windlight/skies/Fluffy%20Big%20Clouds.xml b/indra/newview/app_settings/windlight/skies/Fluffy%20Big%20Clouds.xml index 9b5ad5a92..8576ec125 100644 --- a/indra/newview/app_settings/windlight/skies/Fluffy%20Big%20Clouds.xml +++ b/indra/newview/app_settings/windlight/skies/Fluffy%20Big%20Clouds.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.029999999329447746 - 0 - 0 - 0.029999999329447746 - - blue_density - - 0.097999997437000275 - 0.2800000011920929 - 1 - 1 - - blue_horizon - - 0.11999999731779099 - 0.35094299912452698 - 1 - 1 - - cloud_color - - 0.48999997973442078 - 0.79000002145767212 - 0.80000001192092896 - 1 - - cloud_pos_density1 - - 0.53999996185302734 - 0.5 - 0.75999999046325684 - 1 - - cloud_pos_density2 - - 0.38999998569488525 - 0.5 - 0.039999999105930328 - 1 - - cloud_scale - - 0.43999999761581421 - 0 - 0 - 1 - - cloud_scroll_rate - - 11.809999465942383 - 12.799999237060547 - - cloud_shadow - - 0.32999998331069946 - 0 - 0 - 1 - - density_multiplier - - 0.00021999998716637492 - 0 - 0 - 1 - - distance_multiplier - - 4 - 0 - 0 - 1 - - east_angle - 3.2044246196746826 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.5399999618530273 - 0 - 0 - 1 - - glow - - 3.8000010331979865 - 0.001000000059761974 - -0.49999996688498527 - 1 - - haze_density - - 0.20999999344348907 - 0 - 0 - 1 - - haze_horizon - - 0.049999997019767761 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0.056814663112163544 - 0.42577928304672241 - -0.90304160118103027 - 0 - - max_y - - 676.10003662109375 - 0 - 0 - 1 - - preset_num - 18 - star_brightness - 0.44999998807907104 - sun_angle - 0.4398229718208313 - sunlight_color - - 1.7999999523162842 - 1.4099999666213989 - 1.0199999809265137 - 1.7999999523162842 - - - + + + ambient + + 0.029999999329447746 + 0 + 0 + 0.029999999329447746 + + blue_density + + 0.097999997437000275 + 0.2800000011920929 + 1 + 1 + + blue_horizon + + 0.11999999731779099 + 0.35094299912452698 + 1 + 1 + + cloud_color + + 0.48999997973442078 + 0.79000002145767212 + 0.80000001192092896 + 1 + + cloud_pos_density1 + + 0.53999996185302734 + 0.5 + 0.75999999046325684 + 1 + + cloud_pos_density2 + + 0.38999998569488525 + 0.5 + 0.039999999105930328 + 1 + + cloud_scale + + 0.43999999761581421 + 0 + 0 + 1 + + cloud_scroll_rate + + 11.809999465942383 + 12.799999237060547 + + cloud_shadow + + 0.32999998331069946 + 0 + 0 + 1 + + density_multiplier + + 0.00021999998716637492 + 0 + 0 + 1 + + distance_multiplier + + 4 + 0 + 0 + 1 + + east_angle + 3.2044246196746826 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.5399999618530273 + 0 + 0 + 1 + + glow + + 3.8000010331979865 + 0.001000000059761974 + -0.49999996688498527 + 1 + + haze_density + + 0.20999999344348907 + 0 + 0 + 1 + + haze_horizon + + 0.049999997019767761 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0.056814663112163544 + 0.42577928304672241 + -0.90304160118103027 + 0 + + max_y + + 676.10003662109375 + 0 + 0 + 1 + + preset_num + 18 + star_brightness + 0.44999998807907104 + sun_angle + 0.4398229718208313 + sunlight_color + + 1.7999999523162842 + 1.4099999666213989 + 1.0199999809265137 + 1.7999999523162842 + + + diff --git a/indra/newview/app_settings/windlight/skies/Foggy.xml b/indra/newview/app_settings/windlight/skies/Foggy.xml index 88f55f612..cb7395d58 100644 --- a/indra/newview/app_settings/windlight/skies/Foggy.xml +++ b/indra/newview/app_settings/windlight/skies/Foggy.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.32999998331069946 - 0.32999998331069946 - 0.32999998331069946 - 0.10999999940395355 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.43070214986801147 - 0.85394668579101563 - 1 - 1 - - cloud_color - - 0.69999998807907104 - 0.69999998807907104 - 0.69999998807907104 - 0.69999998807907104 - - cloud_pos_density1 - - 0.5 - 0.5 - 0.53999996185302734 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.125 - 1 - - cloud_scale - - 0.29999998211860657 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940013885498 - 10.01099967956543 - - cloud_shadow - - 0.39999997615814209 - 0 - 0 - 1 - - density_multiplier - - 0.0003499999875202775 - 0 - 0 - 1 - - distance_multiplier - - 4 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 3.7999999523162842 - 0.0010000000474974513 - -0.5 - 1 - - haze_density - - 4 - 0 - 0 - 1 - - haze_horizon - - 0.64999997615814209 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 1 - -4.3711388286737929e-008 - 0 - - max_y - - 600 - 0 - 0 - 1 - - preset_num - 18 - star_brightness - 0 - sun_angle - 1.5707963705062866 - sunlight_color - - 0.53999996185302734 - 0.53999996185302734 - 0.53999996185302734 - 0.17999999225139618 - - - + + + ambient + + 0.32999998331069946 + 0.32999998331069946 + 0.32999998331069946 + 0.10999999940395355 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.43070214986801147 + 0.85394668579101563 + 1 + 1 + + cloud_color + + 0.69999998807907104 + 0.69999998807907104 + 0.69999998807907104 + 0.69999998807907104 + + cloud_pos_density1 + + 0.5 + 0.5 + 0.53999996185302734 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.125 + 1 + + cloud_scale + + 0.29999998211860657 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940013885498 + 10.01099967956543 + + cloud_shadow + + 0.39999997615814209 + 0 + 0 + 1 + + density_multiplier + + 0.0003499999875202775 + 0 + 0 + 1 + + distance_multiplier + + 4 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 3.7999999523162842 + 0.0010000000474974513 + -0.5 + 1 + + haze_density + + 4 + 0 + 0 + 1 + + haze_horizon + + 0.64999997615814209 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 1 + -4.3711388286737929e-008 + 0 + + max_y + + 600 + 0 + 0 + 1 + + preset_num + 18 + star_brightness + 0 + sun_angle + 1.5707963705062866 + sunlight_color + + 0.53999996185302734 + 0.53999996185302734 + 0.53999996185302734 + 0.17999999225139618 + + + diff --git a/indra/newview/app_settings/windlight/skies/Funky%20Funky%20Funky.xml b/indra/newview/app_settings/windlight/skies/Funky%20Funky%20Funky.xml index aad702b2d..32be0d25e 100644 --- a/indra/newview/app_settings/windlight/skies/Funky%20Funky%20Funky.xml +++ b/indra/newview/app_settings/windlight/skies/Funky%20Funky%20Funky.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.29999998211860657 - 0.23511900007724762 - 0.31999999284744263 - 1 - - blue_density - - 0.13977900147438049 - 0.38499599695205688 - 0.76999998092651367 - 1 - - blue_horizon - - 0.18999999761581421 - 0.18999999761581421 - 0.18999999761581421 - 1 - - cloud_color - - 0.22615399956703186 - 0.22615399956703186 - 0.22615399956703186 - 1 - - cloud_pos_density1 - - 5.3780298233032227 - 1.9675600528717041 - 1 - 1 - - cloud_pos_density2 - - 5.3780298233032227 - 1.9675600528717041 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.739999771118164 - 10.600000381469727 - - cloud_shadow - - 0.31000000238418579 - 0 - 0 - 1 - - density_multiplier - - 0.00052000000141561031 - 0 - 0 - 1 - - distance_multiplier - - 3.4000000953674316 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 0.77999997138977051 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 1.1000000238418579 - 0 - 0 - 1 - - haze_horizon - - 0.12999999523162842 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.53582650423049927 - -0.84432810544967651 - 0 - - max_y - - 656.20001220703125 - 0 - 0 - 1 - - preset_num - 28 - star_brightness - 0 - sun_angle - 2.5761063098907471 - sunlight_color - - 2.1299998760223389 - 1.5299999713897705 - 2.8385701179504395 - 1 - - - + + + ambient + + 0.29999998211860657 + 0.23511900007724762 + 0.31999999284744263 + 1 + + blue_density + + 0.13977900147438049 + 0.38499599695205688 + 0.76999998092651367 + 1 + + blue_horizon + + 0.18999999761581421 + 0.18999999761581421 + 0.18999999761581421 + 1 + + cloud_color + + 0.22615399956703186 + 0.22615399956703186 + 0.22615399956703186 + 1 + + cloud_pos_density1 + + 5.3780298233032227 + 1.9675600528717041 + 1 + 1 + + cloud_pos_density2 + + 5.3780298233032227 + 1.9675600528717041 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.739999771118164 + 10.600000381469727 + + cloud_shadow + + 0.31000000238418579 + 0 + 0 + 1 + + density_multiplier + + 0.00052000000141561031 + 0 + 0 + 1 + + distance_multiplier + + 3.4000000953674316 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 0.77999997138977051 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 1.1000000238418579 + 0 + 0 + 1 + + haze_horizon + + 0.12999999523162842 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.53582650423049927 + -0.84432810544967651 + 0 + + max_y + + 656.20001220703125 + 0 + 0 + 1 + + preset_num + 28 + star_brightness + 0 + sun_angle + 2.5761063098907471 + sunlight_color + + 2.1299998760223389 + 1.5299999713897705 + 2.8385701179504395 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Funky%20Funky.xml b/indra/newview/app_settings/windlight/skies/Funky%20Funky.xml index 7b3c31251..ae16b2d13 100644 --- a/indra/newview/app_settings/windlight/skies/Funky%20Funky.xml +++ b/indra/newview/app_settings/windlight/skies/Funky%20Funky.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.32999998331069946 - 0.32999998331069946 - 0.32999998331069946 - 0.10999999940395355 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.15130999684333801 - 0.30000001192092896 - 0.35131001472473145 - 1 - - cloud_color - - 0.22615399956703186 - 0.22615399956703186 - 0.22615399956703186 - 1 - - cloud_pos_density1 - - 0.65280699729919434 - 0.50335597991943359 - 1 - 1 - - cloud_pos_density2 - - 0.65280699729919434 - 0.50335597991943359 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940013885498 - 10.01099967956543 - - cloud_shadow - - 0.33064401149749756 - 0 - 0 - 1 - - density_multiplier - - 0.0003499999875202775 - 0 - 0 - 1 - - distance_multiplier - - 1 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.33000001311302185 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.19915600121021271 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.062790460884571075 - -0.99802672863006592 - 0 - - max_y - - 600 - 0 - 0 - 1 - - preset_num - 11 - star_brightness - 0 - sun_angle - 3.0787608623504639 - sunlight_color - - 0.86811381578445435 - 2.2200000286102295 - 2.2200000286102295 - 0.74000000953674316 - - - + + + ambient + + 0.32999998331069946 + 0.32999998331069946 + 0.32999998331069946 + 0.10999999940395355 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.15130999684333801 + 0.30000001192092896 + 0.35131001472473145 + 1 + + cloud_color + + 0.22615399956703186 + 0.22615399956703186 + 0.22615399956703186 + 1 + + cloud_pos_density1 + + 0.65280699729919434 + 0.50335597991943359 + 1 + 1 + + cloud_pos_density2 + + 0.65280699729919434 + 0.50335597991943359 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940013885498 + 10.01099967956543 + + cloud_shadow + + 0.33064401149749756 + 0 + 0 + 1 + + density_multiplier + + 0.0003499999875202775 + 0 + 0 + 1 + + distance_multiplier + + 1 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.33000001311302185 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.19915600121021271 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.062790460884571075 + -0.99802672863006592 + 0 + + max_y + + 600 + 0 + 0 + 1 + + preset_num + 11 + star_brightness + 0 + sun_angle + 3.0787608623504639 + sunlight_color + + 0.86811381578445435 + 2.2200000286102295 + 2.2200000286102295 + 0.74000000953674316 + + + diff --git a/indra/newview/app_settings/windlight/skies/Gelatto.xml b/indra/newview/app_settings/windlight/skies/Gelatto.xml index 92b4fd682..66b3d317b 100644 --- a/indra/newview/app_settings/windlight/skies/Gelatto.xml +++ b/indra/newview/app_settings/windlight/skies/Gelatto.xml @@ -1,141 +1,141 @@ - - - ambient - - 0 - 0.15999999642372131 - 0 - 0.15999999642372131 - - blue_density - - 0.019999999552965164 - 0.22999770939350128 - 0.45999997854232788 - 0.55000001192092896 - - blue_horizon - - 0 - 0.6319204568862915 - 0.74000000953674316 - 0.84999996423721313 - - cloud_color - - 1 - 0 - 0 - 1 - - cloud_pos_density1 - - 0.53999996185302734 - 0.50999999046325684 - 0.23999999463558197 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.059999998658895493 - 1 - - cloud_scale - - 0.2800000011920929 - 0 - 0 - 1 - - cloud_scroll_rate - - 20 - 20 - - cloud_shadow - - 0.32999998331069946 - 0 - 0 - 1 - - density_multiplier - - 0.00016999999934341758 - 0 - 0 - 1 - - distance_multiplier - - 8.1000003814697266 - 0 - 0 - 1 - - east_angle - 3.7699110507965088 - enable_cloud_scroll - - 0 - 0 - - gamma - - 1.5399999618530273 - 0 - 0 - 1 - - glow - - 0.39999961853027344 - 0.0010000000474974513 - -0.49999997019767761 - 1 - - haze_density - - 3.2599999904632568 - 0 - 0 - 1 - - haze_horizon - - 0.4699999988079071 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0.58749508857727051 - -0.031410761177539825 - -0.80861783027648926 - 0 - - max_y - - 1267.5999755859375 - 0 - 0 - 1 - - preset_num - 18 - star_brightness - 0 - sun_angle - -0.031415928155183792 - sunlight_color - - 0.75 - 0.71999996900558472 - 0.37800011038780212 - 0.80999994277954102 - - - + + + ambient + + 0 + 0.15999999642372131 + 0 + 0.15999999642372131 + + blue_density + + 0.019999999552965164 + 0.22999770939350128 + 0.45999997854232788 + 0.55000001192092896 + + blue_horizon + + 0 + 0.6319204568862915 + 0.74000000953674316 + 0.84999996423721313 + + cloud_color + + 1 + 0 + 0 + 1 + + cloud_pos_density1 + + 0.53999996185302734 + 0.50999999046325684 + 0.23999999463558197 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.059999998658895493 + 1 + + cloud_scale + + 0.2800000011920929 + 0 + 0 + 1 + + cloud_scroll_rate + + 20 + 20 + + cloud_shadow + + 0.32999998331069946 + 0 + 0 + 1 + + density_multiplier + + 0.00016999999934341758 + 0 + 0 + 1 + + distance_multiplier + + 8.1000003814697266 + 0 + 0 + 1 + + east_angle + 3.7699110507965088 + enable_cloud_scroll + + 0 + 0 + + gamma + + 1.5399999618530273 + 0 + 0 + 1 + + glow + + 0.39999961853027344 + 0.0010000000474974513 + -0.49999997019767761 + 1 + + haze_density + + 3.2599999904632568 + 0 + 0 + 1 + + haze_horizon + + 0.4699999988079071 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0.58749508857727051 + -0.031410761177539825 + -0.80861783027648926 + 0 + + max_y + + 1267.5999755859375 + 0 + 0 + 1 + + preset_num + 18 + star_brightness + 0 + sun_angle + -0.031415928155183792 + sunlight_color + + 0.75 + 0.71999996900558472 + 0.37800011038780212 + 0.80999994277954102 + + + diff --git a/indra/newview/app_settings/windlight/skies/Ghost.xml b/indra/newview/app_settings/windlight/skies/Ghost.xml index 065b9e5d5..447202ed5 100644 --- a/indra/newview/app_settings/windlight/skies/Ghost.xml +++ b/indra/newview/app_settings/windlight/skies/Ghost.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.23999999463558197 - 0.23999999463558197 - 0.23999999463558197 - 0.079999998211860657 - - blue_density - - 0.16700799763202667 - 0.45999500155448914 - 0.92000001668930054 - 1 - - blue_horizon - - 0.18089599907398224 - 0.35865798592567444 - 0.41999998688697815 - 1 - - cloud_color - - 0.40999999642372131 - 0.40999999642372131 - 0.40999999642372131 - 1 - - cloud_pos_density1 - - 0.5 - 0.5 - 1 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 11.539999961853027 - 10.01099967956543 - - cloud_shadow - - 0.36000001430511475 - 0 - 0 - 1 - - density_multiplier - - 0.00042999998549930751 - 0 - 0 - 1 - - distance_multiplier - - 8.1000003814697266 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.51999998092651367 - 1 - - haze_density - - 0.75 - 0 - 0 - 1 - - haze_horizon - - 0.18000000715255737 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.89100658893585205 - 0.45399042963981628 - 0 - - max_y - - 718.70001220703125 - 0 - 0 - 1 - - preset_num - 23 - star_brightness - 2 - sun_angle - 1.0995575189590454 - sunlight_color - - 0.33000001311302185 - 0.33000001311302185 - 0.33000001311302185 - 1 - - - + + + ambient + + 0.23999999463558197 + 0.23999999463558197 + 0.23999999463558197 + 0.079999998211860657 + + blue_density + + 0.16700799763202667 + 0.45999500155448914 + 0.92000001668930054 + 1 + + blue_horizon + + 0.18089599907398224 + 0.35865798592567444 + 0.41999998688697815 + 1 + + cloud_color + + 0.40999999642372131 + 0.40999999642372131 + 0.40999999642372131 + 1 + + cloud_pos_density1 + + 0.5 + 0.5 + 1 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 11.539999961853027 + 10.01099967956543 + + cloud_shadow + + 0.36000001430511475 + 0 + 0 + 1 + + density_multiplier + + 0.00042999998549930751 + 0 + 0 + 1 + + distance_multiplier + + 8.1000003814697266 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.51999998092651367 + 1 + + haze_density + + 0.75 + 0 + 0 + 1 + + haze_horizon + + 0.18000000715255737 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.89100658893585205 + 0.45399042963981628 + 0 + + max_y + + 718.70001220703125 + 0 + 0 + 1 + + preset_num + 23 + star_brightness + 2 + sun_angle + 1.0995575189590454 + sunlight_color + + 0.33000001311302185 + 0.33000001311302185 + 0.33000001311302185 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Incongruent%20Truths.xml b/indra/newview/app_settings/windlight/skies/Incongruent%20Truths.xml index 191f6f48a..098844e16 100644 --- a/indra/newview/app_settings/windlight/skies/Incongruent%20Truths.xml +++ b/indra/newview/app_settings/windlight/skies/Incongruent%20Truths.xml @@ -1,141 +1,141 @@ - - - ambient - - 0 - 0 - 0.44999998807907104 - 0.44999998807907104 - - blue_density - - 0.13997539444089213 - 0.38665792478461469 - 0.77332294252195766 - 0.95108884837904384 - - blue_horizon - - 0 - 0.22876684367656708 - 0.290018230676651 - 0.31999999284744263 - - cloud_color - - 0.25999999046325684 - 0.28883209824562073 - 0.28994369506835938 - 0.28999999165534973 - - cloud_pos_density1 - - 0.17999999225139618 - 0.50999999046325684 - 0.91999995708465576 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.079999998211860657 - 1 - - cloud_scale - - 0.25 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.436104517528292 - 10 - - cloud_shadow - - 0.34000000357627869 - 0 - 0 - 1 - - density_multiplier - - 0.0002899999963119626 - 0 - 0 - 1 - - distance_multiplier - - 1.3000000715255737 - 0 - 0 - 1 - - east_angle - 2.2619466781616211 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.5399999618530273 - 0 - 0 - 1 - - glow - - 4.0000009536743164 - 0.0010000000474974513 - -0.74999994039535522 - 1 - - haze_density - - 0.12999999523162842 - 0 - 0 - 1 - - haze_horizon - - 0.14999999105930328 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - -0.74630612134933472 - 0.24868990480899811 - -0.61739814281463623 - 0 - - max_y - - 394.39999389648437 - 0 - 0 - 1 - - preset_num - 18 - star_brightness - 0.44999998807907104 - sun_angle - 0.25132742524147034 - sunlight_color - - 2.25 - 1.957500696182251 - 1.170000433921814 - 0.75 - - - + + + ambient + + 0 + 0 + 0.44999998807907104 + 0.44999998807907104 + + blue_density + + 0.13997539444089213 + 0.38665792478461469 + 0.77332294252195766 + 0.95108884837904384 + + blue_horizon + + 0 + 0.22876684367656708 + 0.290018230676651 + 0.31999999284744263 + + cloud_color + + 0.25999999046325684 + 0.28883209824562073 + 0.28994369506835938 + 0.28999999165534973 + + cloud_pos_density1 + + 0.17999999225139618 + 0.50999999046325684 + 0.91999995708465576 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.079999998211860657 + 1 + + cloud_scale + + 0.25 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.436104517528292 + 10 + + cloud_shadow + + 0.34000000357627869 + 0 + 0 + 1 + + density_multiplier + + 0.0002899999963119626 + 0 + 0 + 1 + + distance_multiplier + + 1.3000000715255737 + 0 + 0 + 1 + + east_angle + 2.2619466781616211 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.5399999618530273 + 0 + 0 + 1 + + glow + + 4.0000009536743164 + 0.0010000000474974513 + -0.74999994039535522 + 1 + + haze_density + + 0.12999999523162842 + 0 + 0 + 1 + + haze_horizon + + 0.14999999105930328 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + -0.74630612134933472 + 0.24868990480899811 + -0.61739814281463623 + 0 + + max_y + + 394.39999389648437 + 0 + 0 + 1 + + preset_num + 18 + star_brightness + 0.44999998807907104 + sun_angle + 0.25132742524147034 + sunlight_color + + 2.25 + 1.957500696182251 + 1.170000433921814 + 0.75 + + + diff --git a/indra/newview/app_settings/windlight/skies/Midday%201.xml b/indra/newview/app_settings/windlight/skies/Midday%201.xml index d2d62e65b..13a2c7504 100644 --- a/indra/newview/app_settings/windlight/skies/Midday%201.xml +++ b/indra/newview/app_settings/windlight/skies/Midday%201.xml @@ -1,141 +1,141 @@ - - - ambient - - 1.0499999523162842 - 1.0499999523162842 - 1.0499999523162842 - 0.34999999403953552 - - blue_density - - 0.24475815892219543 - 0.44872328639030457 - 0.75999999046325684 - 0.37999999523162842 - - blue_horizon - - 0.49548381567001343 - 0.49548381567001343 - 0.63999998569488525 - 0.31999999284744263 - - cloud_color - - 0.40999999642372131 - 0.40999999642372131 - 0.40999999642372131 - 0.40999999642372131 - - cloud_pos_density1 - - 1.6884100437164307 - 0.52609699964523315 - 1 - 1 - - cloud_pos_density2 - - 1.6884100437164307 - 0.52609699964523315 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.199999809265137 - 10.01099967956543 - - cloud_shadow - - 0.26999998092651367 - 0 - 0 - 1 - - density_multiplier - - 0.00017999998817685992 - 0 - 0 - 1 - - distance_multiplier - - 0.80000001192092896 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.18999999761581421 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.91269159317016602 - -0.40864911675453186 - 0 - - max_y - - 1605 - 0 - 0 - 1 - - preset_num - 22 - star_brightness - 0 - sun_angle - 1.9917697906494141 - sunlight_color - - 0.7342105507850647 - 0.78157895803451538 - 0.89999997615814209 - 0.29999998211860657 - - - + + + ambient + + 1.0499999523162842 + 1.0499999523162842 + 1.0499999523162842 + 0.34999999403953552 + + blue_density + + 0.24475815892219543 + 0.44872328639030457 + 0.75999999046325684 + 0.37999999523162842 + + blue_horizon + + 0.49548381567001343 + 0.49548381567001343 + 0.63999998569488525 + 0.31999999284744263 + + cloud_color + + 0.40999999642372131 + 0.40999999642372131 + 0.40999999642372131 + 0.40999999642372131 + + cloud_pos_density1 + + 1.6884100437164307 + 0.52609699964523315 + 1 + 1 + + cloud_pos_density2 + + 1.6884100437164307 + 0.52609699964523315 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.199999809265137 + 10.01099967956543 + + cloud_shadow + + 0.26999998092651367 + 0 + 0 + 1 + + density_multiplier + + 0.00017999998817685992 + 0 + 0 + 1 + + distance_multiplier + + 0.80000001192092896 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.18999999761581421 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.91269159317016602 + -0.40864911675453186 + 0 + + max_y + + 1605 + 0 + 0 + 1 + + preset_num + 22 + star_brightness + 0 + sun_angle + 1.9917697906494141 + sunlight_color + + 0.7342105507850647 + 0.78157895803451538 + 0.89999997615814209 + 0.29999998211860657 + + + diff --git a/indra/newview/app_settings/windlight/skies/Midday%202.xml b/indra/newview/app_settings/windlight/skies/Midday%202.xml index 3fb21f2e4..04f2ba85e 100644 --- a/indra/newview/app_settings/windlight/skies/Midday%202.xml +++ b/indra/newview/app_settings/windlight/skies/Midday%202.xml @@ -1,141 +1,141 @@ - - - ambient - - 0 - 0 - 0 - 0 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.43070214986801147 - 0.85394668579101563 - 1 - 1 - - cloud_color - - 0.69999998807907104 - 0.69999998807907104 - 0.69999998807907104 - 1 - - cloud_pos_density1 - - 0.5 - 0.5 - 0.53999996185302734 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.125 - 1 - - cloud_scale - - 0.29999998211860657 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.199999809265137 - 10.069999694824219 - - cloud_shadow - - 0.22999998927116394 - 0 - 0 - 1 - - density_multiplier - - 0.0003499999875202775 - 0 - 0 - 1 - - distance_multiplier - - 0 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.6100000143051147 - 0 - 0 - 1 - - glow - - 3.7999999523162842 - 0.0010000000474974513 - -0.5 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.41999998688697815 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 1 - -4.3711388286737929e-008 - 0 - - max_y - - 600 - 0 - 0 - 1 - - preset_num - -1163005939 - star_brightness - 0 - sun_angle - 1.5707963705062866 - sunlight_color - - 0.80999994277954102 - 0.80999994277954102 - 0.80999994277954102 - 0.26999998092651367 - - - + + + ambient + + 0 + 0 + 0 + 0 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.43070214986801147 + 0.85394668579101563 + 1 + 1 + + cloud_color + + 0.69999998807907104 + 0.69999998807907104 + 0.69999998807907104 + 1 + + cloud_pos_density1 + + 0.5 + 0.5 + 0.53999996185302734 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.125 + 1 + + cloud_scale + + 0.29999998211860657 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.199999809265137 + 10.069999694824219 + + cloud_shadow + + 0.22999998927116394 + 0 + 0 + 1 + + density_multiplier + + 0.0003499999875202775 + 0 + 0 + 1 + + distance_multiplier + + 0 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.6100000143051147 + 0 + 0 + 1 + + glow + + 3.7999999523162842 + 0.0010000000474974513 + -0.5 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.41999998688697815 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 1 + -4.3711388286737929e-008 + 0 + + max_y + + 600 + 0 + 0 + 1 + + preset_num + -1163005939 + star_brightness + 0 + sun_angle + 1.5707963705062866 + sunlight_color + + 0.80999994277954102 + 0.80999994277954102 + 0.80999994277954102 + 0.26999998092651367 + + + diff --git a/indra/newview/app_settings/windlight/skies/Midday%203.xml b/indra/newview/app_settings/windlight/skies/Midday%203.xml index c1dfa5505..a23dcab60 100644 --- a/indra/newview/app_settings/windlight/skies/Midday%203.xml +++ b/indra/newview/app_settings/windlight/skies/Midday%203.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.33000001311302185 - 0.33000001311302185 - 0.33000001311302185 - 1 - - blue_density - - 0.16449999809265137 - 0.4699999988079071 - 0.93999999761581421 - 1 - - blue_horizon - - 0.17547200620174408 - 0.35094299912452698 - 0.62000000476837158 - 1 - - cloud_color - - 0.5899999737739563 - 0.79000002145767212 - 0.80000001192092896 - 1 - - cloud_pos_density1 - - 2.8148899078369141 - 5.6909198760986328 - 1 - 1 - - cloud_pos_density2 - - 5.9584097862243652 - 6.9909601211547852 - 0.070000000298023224 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 9.9300003051757813 - 10.199999809265137 - - cloud_shadow - - 0.25999999046325684 - 0 - 0 - 1 - - density_multiplier - - 0.00039000000106170774 - 0 - 0 - 1 - - distance_multiplier - - 0.69999998807907104 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.6100000143051147 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -1.1599999666213989 - 1 - - haze_density - - 0.20999999344348907 - 0 - 0 - 1 - - haze_horizon - - 0.11999999731779099 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 1 - -4.3711388286737929e-008 - 0 - - max_y - - 2250 - 0 - 0 - 1 - - preset_num - 24 - star_brightness - 0 - sun_angle - 1.5707963705062866 - sunlight_color - - 1.2599999904632568 - 1.2599999904632568 - 1.2599999904632568 - 1 - - - + + + ambient + + 0.33000001311302185 + 0.33000001311302185 + 0.33000001311302185 + 1 + + blue_density + + 0.16449999809265137 + 0.4699999988079071 + 0.93999999761581421 + 1 + + blue_horizon + + 0.17547200620174408 + 0.35094299912452698 + 0.62000000476837158 + 1 + + cloud_color + + 0.5899999737739563 + 0.79000002145767212 + 0.80000001192092896 + 1 + + cloud_pos_density1 + + 2.8148899078369141 + 5.6909198760986328 + 1 + 1 + + cloud_pos_density2 + + 5.9584097862243652 + 6.9909601211547852 + 0.070000000298023224 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 9.9300003051757813 + 10.199999809265137 + + cloud_shadow + + 0.25999999046325684 + 0 + 0 + 1 + + density_multiplier + + 0.00039000000106170774 + 0 + 0 + 1 + + distance_multiplier + + 0.69999998807907104 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.6100000143051147 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -1.1599999666213989 + 1 + + haze_density + + 0.20999999344348907 + 0 + 0 + 1 + + haze_horizon + + 0.11999999731779099 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 1 + -4.3711388286737929e-008 + 0 + + max_y + + 2250 + 0 + 0 + 1 + + preset_num + 24 + star_brightness + 0 + sun_angle + 1.5707963705062866 + sunlight_color + + 1.2599999904632568 + 1.2599999904632568 + 1.2599999904632568 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Midday%204.xml b/indra/newview/app_settings/windlight/skies/Midday%204.xml index d0b1425c2..255e314e0 100644 --- a/indra/newview/app_settings/windlight/skies/Midday%204.xml +++ b/indra/newview/app_settings/windlight/skies/Midday%204.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.33000001311302185 - 0.33000001311302185 - 0.33000001311302185 - 1 - - blue_density - - 0.097999997437000275 - 0.2800000011920929 - 0.56000000238418579 - 0.56000000238418579 - - blue_horizon - - 0.17547200620174408 - 0.35094299912452698 - 0.61000001430511475 - 0.61000001430511475 - - cloud_color - - 0.5899999737739563 - 0.79000002145767212 - 0.80000001192092896 - 1 - - cloud_pos_density1 - - 2.8148899078369141 - 5.6909198760986328 - 1 - 1 - - cloud_pos_density2 - - 5.9584097862243652 - 6.9909601211547852 - 0.070000000298023224 - 1 - - cloud_scale - - 0.32999998331069946 - 0 - 0 - 1 - - cloud_scroll_rate - - 9.9300003051757813 - 10.199999809265137 - - cloud_shadow - - 0.22999998927116394 - 0 - 0 - 1 - - density_multiplier - - 0.00039000000106170774 - 0 - 0 - 1 - - distance_multiplier - - 0.69999998807907104 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.6100000143051147 - 0 - 0 - 1 - - glow - - 3.8000011444091797 - 0.0010000000474974513 - -0.49999997019767761 - 1 - - haze_density - - 0.20999999344348907 - 0 - 0 - 1 - - haze_horizon - - 0.19999998807907104 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 1 - -4.3711388286737929e-008 - 0 - - max_y - - 1802.800048828125 - 0 - 0 - 1 - - preset_num - 24 - star_brightness - 0 - sun_angle - 1.5707963705062866 - sunlight_color - - 1.2599999904632568 - 1.2599999904632568 - 1.2599999904632568 - 0.41999998688697815 - - - + + + ambient + + 0.33000001311302185 + 0.33000001311302185 + 0.33000001311302185 + 1 + + blue_density + + 0.097999997437000275 + 0.2800000011920929 + 0.56000000238418579 + 0.56000000238418579 + + blue_horizon + + 0.17547200620174408 + 0.35094299912452698 + 0.61000001430511475 + 0.61000001430511475 + + cloud_color + + 0.5899999737739563 + 0.79000002145767212 + 0.80000001192092896 + 1 + + cloud_pos_density1 + + 2.8148899078369141 + 5.6909198760986328 + 1 + 1 + + cloud_pos_density2 + + 5.9584097862243652 + 6.9909601211547852 + 0.070000000298023224 + 1 + + cloud_scale + + 0.32999998331069946 + 0 + 0 + 1 + + cloud_scroll_rate + + 9.9300003051757813 + 10.199999809265137 + + cloud_shadow + + 0.22999998927116394 + 0 + 0 + 1 + + density_multiplier + + 0.00039000000106170774 + 0 + 0 + 1 + + distance_multiplier + + 0.69999998807907104 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.6100000143051147 + 0 + 0 + 1 + + glow + + 3.8000011444091797 + 0.0010000000474974513 + -0.49999997019767761 + 1 + + haze_density + + 0.20999999344348907 + 0 + 0 + 1 + + haze_horizon + + 0.19999998807907104 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 1 + -4.3711388286737929e-008 + 0 + + max_y + + 1802.800048828125 + 0 + 0 + 1 + + preset_num + 24 + star_brightness + 0 + sun_angle + 1.5707963705062866 + sunlight_color + + 1.2599999904632568 + 1.2599999904632568 + 1.2599999904632568 + 0.41999998688697815 + + + diff --git a/indra/newview/app_settings/windlight/skies/Night.xml b/indra/newview/app_settings/windlight/skies/Night.xml index 319a06f72..c4938949c 100644 --- a/indra/newview/app_settings/windlight/skies/Night.xml +++ b/indra/newview/app_settings/windlight/skies/Night.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.20405027105862608 - 0.24246673976617727 - 0.32999997392212316 - 0.11000000166951449 - - blue_density - - 0.44999999369830818 - 0.44999999398335949 - 0.4499999944309046 - 1 - - blue_horizon - - 0.23999999567946317 - 0.23999999579784967 - 0.23999999583870221 - 1 - - cloud_color - - 0.22615400241575034 - 0.22615400241575034 - 0.22615400241575034 - 1 - - cloud_pos_density1 - - 0.5 - 0.5 - 0.88000000953711155 - 1 - - cloud_pos_density2 - - 0.5 - 0.5 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940035411295 - 10.011000104431371 - - cloud_shadow - - 0.36000001430511475 - 0 - 0 - 1 - - density_multiplier - - 0.00030000001824737163 - 0 - 0 - 1 - - distance_multiplier - - 3.0208916693946743e-009 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000214212465 - -0.47999999165502744 - 1 - - haze_density - - 3.9999999963077992 - 0 - 0 - 1 - - haze_horizon - - 1.7901579546794781e-010 - 0.19915600437467304 - 0.19915600437467304 - 1 - - lightnorm - - 0 - 1 - 3.0028815672267228e-005 - 1 - - max_y - - 906.20003957594895 - 0 - 0 - 1 - - preset_num - 26 - star_brightness - 2 - sun_angle - 4.7123589515686035 - sunlight_color - - 0.34876692389196384 - 0.3557424864638451 - 0.65999994893325931 - 0.22000000284673543 - - - + + + ambient + + 0.20405027105862608 + 0.24246673976617727 + 0.32999997392212316 + 0.11000000166951449 + + blue_density + + 0.44999999369830818 + 0.44999999398335949 + 0.4499999944309046 + 1 + + blue_horizon + + 0.23999999567946317 + 0.23999999579784967 + 0.23999999583870221 + 1 + + cloud_color + + 0.22615400241575034 + 0.22615400241575034 + 0.22615400241575034 + 1 + + cloud_pos_density1 + + 0.5 + 0.5 + 0.88000000953711155 + 1 + + cloud_pos_density2 + + 0.5 + 0.5 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940035411295 + 10.011000104431371 + + cloud_shadow + + 0.36000001430511475 + 0 + 0 + 1 + + density_multiplier + + 0.00030000001824737163 + 0 + 0 + 1 + + distance_multiplier + + 3.0208916693946743e-009 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000214212465 + -0.47999999165502744 + 1 + + haze_density + + 3.9999999963077992 + 0 + 0 + 1 + + haze_horizon + + 1.7901579546794781e-010 + 0.19915600437467304 + 0.19915600437467304 + 1 + + lightnorm + + 0 + 1 + 3.0028815672267228e-005 + 1 + + max_y + + 906.20003957594895 + 0 + 0 + 1 + + preset_num + 26 + star_brightness + 2 + sun_angle + 4.7123589515686035 + sunlight_color + + 0.34876692389196384 + 0.3557424864638451 + 0.65999994893325931 + 0.22000000284673543 + + + diff --git a/indra/newview/app_settings/windlight/skies/Pirate.xml b/indra/newview/app_settings/windlight/skies/Pirate.xml index dc61fc6be..dcb9c27ba 100644 --- a/indra/newview/app_settings/windlight/skies/Pirate.xml +++ b/indra/newview/app_settings/windlight/skies/Pirate.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.27825063467025757 - 0.33063584566116333 - 0.44999998807907104 - 0.14999999105930328 - - blue_density - - 0.14522500336170197 - 0.39999699592590332 - 0.80000197887420654 - 1 - - blue_horizon - - 0.15130999684333801 - 0.30000001192092896 - 0.35131001472473145 - 1 - - cloud_color - - 0.22615399956703186 - 0.22615399956703186 - 0.22615399956703186 - 1 - - cloud_pos_density1 - - 1.2046600580215454 - 0.51547497510910034 - 1 - 1 - - cloud_pos_density2 - - 1.2046600580215454 - 0.51547497510910034 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.49940013885498 - 10.01099967956543 - - cloud_shadow - - 0.33064401149749756 - 0 - 0 - 1 - - density_multiplier - - 0.0003499999875202775 - 0 - 0 - 1 - - distance_multiplier - - 3.4000000953674316 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.36000001430511475 - 1 - - haze_density - - 0.69999998807907104 - 0 - 0 - 1 - - haze_horizon - - 0.19915600121021271 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.062790460884571075 - -0.99802672863006592 - 0 - - max_y - - 600 - 0 - 0 - 1 - - preset_num - 27 - star_brightness - 0 - sun_angle - 3.0787608623504639 - sunlight_color - - 2.8385701179504395 - 2.8385701179504395 - 2.8385701179504395 - 1 - - - + + + ambient + + 0.27825063467025757 + 0.33063584566116333 + 0.44999998807907104 + 0.14999999105930328 + + blue_density + + 0.14522500336170197 + 0.39999699592590332 + 0.80000197887420654 + 1 + + blue_horizon + + 0.15130999684333801 + 0.30000001192092896 + 0.35131001472473145 + 1 + + cloud_color + + 0.22615399956703186 + 0.22615399956703186 + 0.22615399956703186 + 1 + + cloud_pos_density1 + + 1.2046600580215454 + 0.51547497510910034 + 1 + 1 + + cloud_pos_density2 + + 1.2046600580215454 + 0.51547497510910034 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.49940013885498 + 10.01099967956543 + + cloud_shadow + + 0.33064401149749756 + 0 + 0 + 1 + + density_multiplier + + 0.0003499999875202775 + 0 + 0 + 1 + + distance_multiplier + + 3.4000000953674316 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.36000001430511475 + 1 + + haze_density + + 0.69999998807907104 + 0 + 0 + 1 + + haze_horizon + + 0.19915600121021271 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.062790460884571075 + -0.99802672863006592 + 0 + + max_y + + 600 + 0 + 0 + 1 + + preset_num + 27 + star_brightness + 0 + sun_angle + 3.0787608623504639 + sunlight_color + + 2.8385701179504395 + 2.8385701179504395 + 2.8385701179504395 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Purple.xml b/indra/newview/app_settings/windlight/skies/Purple.xml index ffa294915..0e9ac3f36 100644 --- a/indra/newview/app_settings/windlight/skies/Purple.xml +++ b/indra/newview/app_settings/windlight/skies/Purple.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.1978670060634613 - 0.23511900007724762 - 0.31999999284744263 - 1 - - blue_density - - 0.13977900147438049 - 0.38499599695205688 - 0.76999998092651367 - 1 - - blue_horizon - - 0.18999999761581421 - 0.18999999761581421 - 0.18999999761581421 - 1 - - cloud_color - - 0.22615399956703186 - 0.22615399956703186 - 0.22615399956703186 - 1 - - cloud_pos_density1 - - 5.3780298233032227 - 1.9675600528717041 - 1 - 1 - - cloud_pos_density2 - - 5.3780298233032227 - 1.9675600528717041 - 0.125 - 1 - - cloud_scale - - 0.41999998688697815 - 0 - 0 - 1 - - cloud_scroll_rate - - 10.739999771118164 - 10.600000381469727 - - cloud_shadow - - 0.31000000238418579 - 0 - 0 - 1 - - density_multiplier - - 0.00052000000141561031 - 0 - 0 - 1 - - distance_multiplier - - 3.4000000953674316 - 0 - 0 - 1 - - east_angle - 0 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1 - 0 - 0 - 1 - - glow - - 5 - 0.0010000000474974513 - -0.47999998927116394 - 1 - - haze_density - - 1.1000000238418579 - 0 - 0 - 1 - - haze_horizon - - 0.12999999523162842 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0 - 0.094108030200004578 - -0.99556201696395874 - 0 - - max_y - - 656.20001220703125 - 0 - 0 - 1 - - preset_num - 28 - star_brightness - 0 - sun_angle - 3.0473451614379883 - sunlight_color - - 1.5 - 1.5299999713897705 - 2.8385701179504395 - 1 - - - + + + ambient + + 0.1978670060634613 + 0.23511900007724762 + 0.31999999284744263 + 1 + + blue_density + + 0.13977900147438049 + 0.38499599695205688 + 0.76999998092651367 + 1 + + blue_horizon + + 0.18999999761581421 + 0.18999999761581421 + 0.18999999761581421 + 1 + + cloud_color + + 0.22615399956703186 + 0.22615399956703186 + 0.22615399956703186 + 1 + + cloud_pos_density1 + + 5.3780298233032227 + 1.9675600528717041 + 1 + 1 + + cloud_pos_density2 + + 5.3780298233032227 + 1.9675600528717041 + 0.125 + 1 + + cloud_scale + + 0.41999998688697815 + 0 + 0 + 1 + + cloud_scroll_rate + + 10.739999771118164 + 10.600000381469727 + + cloud_shadow + + 0.31000000238418579 + 0 + 0 + 1 + + density_multiplier + + 0.00052000000141561031 + 0 + 0 + 1 + + distance_multiplier + + 3.4000000953674316 + 0 + 0 + 1 + + east_angle + 0 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1 + 0 + 0 + 1 + + glow + + 5 + 0.0010000000474974513 + -0.47999998927116394 + 1 + + haze_density + + 1.1000000238418579 + 0 + 0 + 1 + + haze_horizon + + 0.12999999523162842 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0 + 0.094108030200004578 + -0.99556201696395874 + 0 + + max_y + + 656.20001220703125 + 0 + 0 + 1 + + preset_num + 28 + star_brightness + 0 + sun_angle + 3.0473451614379883 + sunlight_color + + 1.5 + 1.5299999713897705 + 2.8385701179504395 + 1 + + + diff --git a/indra/newview/app_settings/windlight/skies/Sailor%27s%20Delight.xml b/indra/newview/app_settings/windlight/skies/Sailor%27s%20Delight.xml index 9b4c441ab..70df6b0e6 100644 --- a/indra/newview/app_settings/windlight/skies/Sailor%27s%20Delight.xml +++ b/indra/newview/app_settings/windlight/skies/Sailor%27s%20Delight.xml @@ -1,141 +1,141 @@ - - - ambient - - 0.8399999737739563 - 0.090738050639629364 - 0.1234893873333931 - 0.8399999737739563 - - blue_density - - 0.93999999761581421 - 0.69999998807907104 - 0.25 - 0.93999999761581421 - - blue_horizon - - 1 - 0.59999996423721313 - 0.25001853704452515 - 1 - - cloud_color - - 0.65999996662139893 - 0.38999998569488525 - 0.22618354856967926 - 0.65999996662139893 - - cloud_pos_density1 - - 0.76999998092651367 - 0.50999999046325684 - 1 - 1 - - cloud_pos_density2 - - 0.5 - 0.5899999737739563 - 0.019999999552965164 - 1 - - cloud_scale - - 0.26999998092651367 - 0 - 0 - 1 - - cloud_scroll_rate - - 9.4499998092651367 - 9.4399995803833008 - - cloud_shadow - - 0.5 - 0 - 0 - 1 - - density_multiplier - - 0.00019999999494757503 - 0 - 0 - 1 - - distance_multiplier - - 6.7000002861022949 - 0 - 0 - 1 - - east_angle - 3.7070791721343994 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.4800000190734863 - 0 - 0 - 1 - - glow - - 0.79999923706054688 - 0.0010000000474974513 - -0.94999998807907104 - 1 - - haze_density - - 0.89999997615814209 - 0 - 0 - 1 - - haze_horizon - - 0.29999998211860657 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - 0.53160154819488525 - 0.12533323466777802 - -0.83767020702362061 - 0 - - max_y - - 281.70001220703125 - 0 - 0 - 1 - - preset_num - 18 - star_brightness - 1.3799999952316284 - sun_angle - 0.12566371262073517 - sunlight_color - - 0.75 - 1.6800000667572021 - 1.0777359008789062 - 0.56000000238418579 - - - + + + ambient + + 0.8399999737739563 + 0.090738050639629364 + 0.1234893873333931 + 0.8399999737739563 + + blue_density + + 0.93999999761581421 + 0.69999998807907104 + 0.25 + 0.93999999761581421 + + blue_horizon + + 1 + 0.59999996423721313 + 0.25001853704452515 + 1 + + cloud_color + + 0.65999996662139893 + 0.38999998569488525 + 0.22618354856967926 + 0.65999996662139893 + + cloud_pos_density1 + + 0.76999998092651367 + 0.50999999046325684 + 1 + 1 + + cloud_pos_density2 + + 0.5 + 0.5899999737739563 + 0.019999999552965164 + 1 + + cloud_scale + + 0.26999998092651367 + 0 + 0 + 1 + + cloud_scroll_rate + + 9.4499998092651367 + 9.4399995803833008 + + cloud_shadow + + 0.5 + 0 + 0 + 1 + + density_multiplier + + 0.00019999999494757503 + 0 + 0 + 1 + + distance_multiplier + + 6.7000002861022949 + 0 + 0 + 1 + + east_angle + 3.7070791721343994 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.4800000190734863 + 0 + 0 + 1 + + glow + + 0.79999923706054688 + 0.0010000000474974513 + -0.94999998807907104 + 1 + + haze_density + + 0.89999997615814209 + 0 + 0 + 1 + + haze_horizon + + 0.29999998211860657 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + 0.53160154819488525 + 0.12533323466777802 + -0.83767020702362061 + 0 + + max_y + + 281.70001220703125 + 0 + 0 + 1 + + preset_num + 18 + star_brightness + 1.3799999952316284 + sun_angle + 0.12566371262073517 + sunlight_color + + 0.75 + 1.6800000667572021 + 1.0777359008789062 + 0.56000000238418579 + + + diff --git a/indra/newview/app_settings/windlight/skies/Sheer%20Surreality.xml b/indra/newview/app_settings/windlight/skies/Sheer%20Surreality.xml index a36024c79..4c44a1bdb 100644 --- a/indra/newview/app_settings/windlight/skies/Sheer%20Surreality.xml +++ b/indra/newview/app_settings/windlight/skies/Sheer%20Surreality.xml @@ -1,141 +1,141 @@ - - - ambient - - 0 - 0.059999998658895493 - 0 - 0.059999998658895493 - - blue_density - - 0 - 0.099999994039535522 - 0.32999998331069946 - 0.32999998331069946 - - blue_horizon - - 0.029999999329447746 - 0 - 1 - 1 - - cloud_color - - 0.81999999284744263 - 0.18999999761581421 - 0.039999999105930328 - 0.81999999284744263 - - cloud_pos_density1 - - 0.74000000953674316 - 0.93999999761581421 - 0.20999999344348907 - 1 - - cloud_pos_density2 - - 0.65999996662139893 - 0.52999997138977051 - 0.0099999997764825821 - 1 - - cloud_scale - - 0.14000000059604645 - 0 - 0 - 1 - - cloud_scroll_rate - - 18 - 20 - - cloud_shadow - - 0.37999999523162842 - 0 - 0 - 1 - - density_multiplier - - 0.00018000000272877514 - 0 - 0 - 1 - - distance_multiplier - - 6.7000002861022949 - 0 - 0 - 1 - - east_angle - 2.3247785568237305 - enable_cloud_scroll - - 1 - 1 - - gamma - - 1.9499999284744263 - 0 - 0 - 1 - - glow - - 17.399999618530273 - 0.0010000000474974513 - -0.64999997615814209 - 1 - - haze_density - - 0.40999999642372131 - 0 - 0 - 1 - - haze_horizon - - 0.17000000178813934 - 0.19915600121021271 - 0.19915600121021271 - 1 - - lightnorm - - -0.72322052717208862 - 0.12533323466777802 - -0.67914927005767822 - 0 - - max_y - - 263 - 0 - 0 - 1 - - preset_num - 24 - star_brightness - 1.0399999618530273 - sun_angle - 0.12566371262073517 - sunlight_color - - 1.5899999141693115 - 1.5299999713897705 - 0.53999996185302734 - 1.5899999141693115 - - - + + + ambient + + 0 + 0.059999998658895493 + 0 + 0.059999998658895493 + + blue_density + + 0 + 0.099999994039535522 + 0.32999998331069946 + 0.32999998331069946 + + blue_horizon + + 0.029999999329447746 + 0 + 1 + 1 + + cloud_color + + 0.81999999284744263 + 0.18999999761581421 + 0.039999999105930328 + 0.81999999284744263 + + cloud_pos_density1 + + 0.74000000953674316 + 0.93999999761581421 + 0.20999999344348907 + 1 + + cloud_pos_density2 + + 0.65999996662139893 + 0.52999997138977051 + 0.0099999997764825821 + 1 + + cloud_scale + + 0.14000000059604645 + 0 + 0 + 1 + + cloud_scroll_rate + + 18 + 20 + + cloud_shadow + + 0.37999999523162842 + 0 + 0 + 1 + + density_multiplier + + 0.00018000000272877514 + 0 + 0 + 1 + + distance_multiplier + + 6.7000002861022949 + 0 + 0 + 1 + + east_angle + 2.3247785568237305 + enable_cloud_scroll + + 1 + 1 + + gamma + + 1.9499999284744263 + 0 + 0 + 1 + + glow + + 17.399999618530273 + 0.0010000000474974513 + -0.64999997615814209 + 1 + + haze_density + + 0.40999999642372131 + 0 + 0 + 1 + + haze_horizon + + 0.17000000178813934 + 0.19915600121021271 + 0.19915600121021271 + 1 + + lightnorm + + -0.72322052717208862 + 0.12533323466777802 + -0.67914927005767822 + 0 + + max_y + + 263 + 0 + 0 + 1 + + preset_num + 24 + star_brightness + 1.0399999618530273 + sun_angle + 0.12566371262073517 + sunlight_color + + 1.5899999141693115 + 1.5299999713897705 + 0.53999996185302734 + 1.5899999141693115 + + + diff --git a/indra/newview/app_settings/windlight/water/Default.xml b/indra/newview/app_settings/windlight/water/Default.xml index 182675378..dce4148c7 100644 --- a/indra/newview/app_settings/windlight/water/Default.xml +++ b/indra/newview/app_settings/windlight/water/Default.xml @@ -1,43 +1,43 @@ - - - blurMultiplier - 0.040000002831220627 - fresnelOffset - 0.5 - fresnelScale - 0.39999997615814209 - normScale - - 2 - 2 - 2 - - normalMap - 822ded49-9a6c-f61c-cb89-6df54f42cdf4 - scaleAbove - 0.029999999329447746 - scaleBelow - 0.20000000298023224 - underWaterFogMod - 0.25 - waterFogColor - - 0.015686275437474251 - 0.14901961386203766 - 0.25098040699958801 - 1 - - waterFogDensity - 16 - wave1Dir - - 1.0499997138977051 - -0.42000007629394531 - - wave2Dir - - 1.1099996566772461 - -1.1600000858306885 - - - + + + blurMultiplier + 0.040000002831220627 + fresnelOffset + 0.5 + fresnelScale + 0.39999997615814209 + normScale + + 2 + 2 + 2 + + normalMap + 822ded49-9a6c-f61c-cb89-6df54f42cdf4 + scaleAbove + 0.029999999329447746 + scaleBelow + 0.20000000298023224 + underWaterFogMod + 0.25 + waterFogColor + + 0.015686275437474251 + 0.14901961386203766 + 0.25098040699958801 + 1 + + waterFogDensity + 16 + wave1Dir + + 1.0499997138977051 + -0.42000007629394531 + + wave2Dir + + 1.1099996566772461 + -1.1600000858306885 + + + diff --git a/indra/newview/app_settings/windlight/water/Glassy.xml b/indra/newview/app_settings/windlight/water/Glassy.xml index 754e6def2..01183e468 100644 --- a/indra/newview/app_settings/windlight/water/Glassy.xml +++ b/indra/newview/app_settings/windlight/water/Glassy.xml @@ -1,43 +1,43 @@ - - - blurMultiplier - 0.003000000026077032089233398 - fresnelOffset - 0.579999983310699462890625 - fresnelScale - 0.0999999940395355224609375 - normScale - - 2 - 2 - 2 - - normalMap - 822ded49-9a6c-f61c-cb89-6df54f42cdf4 - scaleAbove - 0.07999999821186065673828125 - scaleBelow - 0.2000000029802322387695312 - underWaterFogMod - 0.25 - waterFogColor - - 0.04999999701976776123046875 - 0.37999999523162841796875 - 0.5299999713897705078125 - 0.5299999713897705078125 - - waterFogDensity - 1 - wave1Dir - - 0.5 - -0.1700000017881393432617188 - - wave2Dir - - 0.579999983310699462890625 - -0.670000016689300537109375 - - - + + + blurMultiplier + 0.003000000026077032089233398 + fresnelOffset + 0.579999983310699462890625 + fresnelScale + 0.0999999940395355224609375 + normScale + + 2 + 2 + 2 + + normalMap + 822ded49-9a6c-f61c-cb89-6df54f42cdf4 + scaleAbove + 0.07999999821186065673828125 + scaleBelow + 0.2000000029802322387695312 + underWaterFogMod + 0.25 + waterFogColor + + 0.04999999701976776123046875 + 0.37999999523162841796875 + 0.5299999713897705078125 + 0.5299999713897705078125 + + waterFogDensity + 1 + wave1Dir + + 0.5 + -0.1700000017881393432617188 + + wave2Dir + + 0.579999983310699462890625 + -0.670000016689300537109375 + + + diff --git a/indra/newview/app_settings/windlight/water/Murky.xml b/indra/newview/app_settings/windlight/water/Murky.xml index 65418fa54..1d9e02242 100644 --- a/indra/newview/app_settings/windlight/water/Murky.xml +++ b/indra/newview/app_settings/windlight/water/Murky.xml @@ -1,43 +1,43 @@ - - - blurMultiplier - 0.0030000000260770321 - fresnelOffset - 0.39999997615814209 - fresnelScale - 0.5 - normScale - - 2 - 2 - 2 - - normalMap - 822ded49-9a6c-f61c-cb89-6df54f42cdf4 - scaleAbove - 0.079999998211860657 - scaleBelow - 0.20000000298023224 - underWaterFogMod - 0.76999998092651367 - waterFogColor - - 0.08999999612569809 - 0.17000000178813934 - 0.20999999344348907 - 0.20999999344348907 - - waterFogDensity - 16 - wave1Dir - - 0.5 - -0.17000000178813934 - - wave2Dir - - 0.57999998331069946 - -0.67000001668930054 - - - + + + blurMultiplier + 0.0030000000260770321 + fresnelOffset + 0.39999997615814209 + fresnelScale + 0.5 + normScale + + 2 + 2 + 2 + + normalMap + 822ded49-9a6c-f61c-cb89-6df54f42cdf4 + scaleAbove + 0.079999998211860657 + scaleBelow + 0.20000000298023224 + underWaterFogMod + 0.76999998092651367 + waterFogColor + + 0.08999999612569809 + 0.17000000178813934 + 0.20999999344348907 + 0.20999999344348907 + + waterFogDensity + 16 + wave1Dir + + 0.5 + -0.17000000178813934 + + wave2Dir + + 0.57999998331069946 + -0.67000001668930054 + + + diff --git a/indra/newview/app_settings/windlight/water/Pond.xml b/indra/newview/app_settings/windlight/water/Pond.xml index 8a4d2c2e0..59e3c441e 100644 --- a/indra/newview/app_settings/windlight/water/Pond.xml +++ b/indra/newview/app_settings/windlight/water/Pond.xml @@ -1,43 +1,43 @@ - - - blurMultiplier - 0.0030000000260770321 - fresnelOffset - 0.50999999046325684 - fresnelScale - 0.099999994039535522 - normScale - - 2 - 2 - 2 - - normalMap - 822ded49-9a6c-f61c-cb89-6df54f42cdf4 - scaleAbove - 0.079999998211860657 - scaleBelow - 0.20000000298023224 - underWaterFogMod - 0.25 - waterFogColor - - 0.059999998658895493 - 0.37999999523162842 - 0.52999997138977051 - 0.52999997138977051 - - waterFogDensity - 2.1000001430511475 - wave1Dir - - 0.5 - -0.17000000178813934 - - wave2Dir - - 0.57999998331069946 - -0.67000001668930054 - - - + + + blurMultiplier + 0.0030000000260770321 + fresnelOffset + 0.50999999046325684 + fresnelScale + 0.099999994039535522 + normScale + + 2 + 2 + 2 + + normalMap + 822ded49-9a6c-f61c-cb89-6df54f42cdf4 + scaleAbove + 0.079999998211860657 + scaleBelow + 0.20000000298023224 + underWaterFogMod + 0.25 + waterFogColor + + 0.059999998658895493 + 0.37999999523162842 + 0.52999997138977051 + 0.52999997138977051 + + waterFogDensity + 2.1000001430511475 + wave1Dir + + 0.5 + -0.17000000178813934 + + wave2Dir + + 0.57999998331069946 + -0.67000001668930054 + + + diff --git a/indra/newview/app_settings/windlight/water/SNAKE%21%21%21.xml b/indra/newview/app_settings/windlight/water/SNAKE%21%21%21.xml index 77984a0bb..6dbc4e871 100644 --- a/indra/newview/app_settings/windlight/water/SNAKE%21%21%21.xml +++ b/indra/newview/app_settings/windlight/water/SNAKE%21%21%21.xml @@ -1,43 +1,43 @@ - - - blurMultiplier - 0.0030000000260770321 - fresnelOffset - 0.57999998331069946 - fresnelScale - 0.099999994039535522 - normScale - - 10 - 10 - 10 - - normalMap - 470626e3-ac38-8554-d49b-90311c0176a9 - scaleAbove - 0.91999995708465576 - scaleBelow - 0.93999999761581421 - underWaterFogMod - 0.25 - waterFogColor - - 0.049999997019767761 - 0.37999999523162842 - 0.52999997138977051 - 0.52999997138977051 - - waterFogDensity - 3.2000000476837158 - wave1Dir - - 0.5 - -0.17000000178813934 - - wave2Dir - - 0.57999998331069946 - -0.67000001668930054 - - - + + + blurMultiplier + 0.0030000000260770321 + fresnelOffset + 0.57999998331069946 + fresnelScale + 0.099999994039535522 + normScale + + 10 + 10 + 10 + + normalMap + 470626e3-ac38-8554-d49b-90311c0176a9 + scaleAbove + 0.91999995708465576 + scaleBelow + 0.93999999761581421 + underWaterFogMod + 0.25 + waterFogColor + + 0.049999997019767761 + 0.37999999523162842 + 0.52999997138977051 + 0.52999997138977051 + + waterFogDensity + 3.2000000476837158 + wave1Dir + + 0.5 + -0.17000000178813934 + + wave2Dir + + 0.57999998331069946 + -0.67000001668930054 + + + diff --git a/indra/newview/app_settings/windlight/water/Second%20Plague.xml b/indra/newview/app_settings/windlight/water/Second%20Plague.xml index 7db679dce..137483ab6 100644 --- a/indra/newview/app_settings/windlight/water/Second%20Plague.xml +++ b/indra/newview/app_settings/windlight/water/Second%20Plague.xml @@ -1,43 +1,43 @@ - - - blurMultiplier - 0.017000000923871994 - fresnelOffset - 0.37000000476837158 - fresnelScale - 0 - normScale - - 2 - 2 - 2 - - normalMap - 822ded49-9a6c-f61c-cb89-6df54f42cdf4 - scaleAbove - 0.079999998211860657 - scaleBelow - 0.20000000298023224 - underWaterFogMod - 0.85999995470046997 - waterFogColor - - 0.48999997973442078 - 0 - 0 - 0.48999997973442078 - - waterFogDensity - 20 - wave1Dir - - 0.5 - -0.17000000178813934 - - wave2Dir - - 0.57999998331069946 - -0.67000001668930054 - - - + + + blurMultiplier + 0.017000000923871994 + fresnelOffset + 0.37000000476837158 + fresnelScale + 0 + normScale + + 2 + 2 + 2 + + normalMap + 822ded49-9a6c-f61c-cb89-6df54f42cdf4 + scaleAbove + 0.079999998211860657 + scaleBelow + 0.20000000298023224 + underWaterFogMod + 0.85999995470046997 + waterFogColor + + 0.48999997973442078 + 0 + 0 + 0.48999997973442078 + + waterFogDensity + 20 + wave1Dir + + 0.5 + -0.17000000178813934 + + wave2Dir + + 0.57999998331069946 + -0.67000001668930054 + + + diff --git a/indra/newview/app_settings/windlight/water/Valdez.xml b/indra/newview/app_settings/windlight/water/Valdez.xml index bde298bb4..eb70a142e 100644 --- a/indra/newview/app_settings/windlight/water/Valdez.xml +++ b/indra/newview/app_settings/windlight/water/Valdez.xml @@ -1,43 +1,43 @@ - - - blurMultiplier - 0.0020000000949949026 - fresnelOffset - 0.28999999165534973 - fresnelScale - 0 - normScale - - 2 - 2 - 2 - - normalMap - 822ded49-9a6c-f61c-cb89-6df54f42cdf4 - scaleAbove - 0.079999998211860657 - scaleBelow - 0.20000000298023224 - underWaterFogMod - 1 - waterFogColor - - 0 - 0 - 0 - 0 - - waterFogDensity - 1024 - wave1Dir - - 0.5 - -0.17000000178813934 - - wave2Dir - - 0.57999998331069946 - -0.67000001668930054 - - - + + + blurMultiplier + 0.0020000000949949026 + fresnelOffset + 0.28999999165534973 + fresnelScale + 0 + normScale + + 2 + 2 + 2 + + normalMap + 822ded49-9a6c-f61c-cb89-6df54f42cdf4 + scaleAbove + 0.079999998211860657 + scaleBelow + 0.20000000298023224 + underWaterFogMod + 1 + waterFogColor + + 0 + 0 + 0 + 0 + + waterFogDensity + 1024 + wave1Dir + + 0.5 + -0.17000000178813934 + + wave2Dir + + 0.57999998331069946 + -0.67000001668930054 + + + diff --git a/indra/newview/ascentdaycyclemanager.cpp b/indra/newview/ascentdaycyclemanager.cpp index b83168f64..43f243f08 100644 --- a/indra/newview/ascentdaycyclemanager.cpp +++ b/indra/newview/ascentdaycyclemanager.cpp @@ -134,10 +134,7 @@ void AscentDayCycleManager::loadPreset(const std::string & name,bool propagate) { // bugfix for SL-46920: preventing filenames that break stuff. - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_filename(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_filename = LLWeb::curlEscape(name); escaped_filename += ".xml"; @@ -186,10 +183,7 @@ void AscentDayCycleManager::loadPreset(const std::string & name,bool propagate) void AscentDayCycleManager::savePreset(const std::string & name) { // bugfix for SL-46920: preventing filenames that break stuff. - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_filename(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_filename = LLWeb::curlEscape(name); escaped_filename += ".xml"; @@ -340,10 +334,7 @@ bool AscentDayCycleManager::removeParamSet(const std::string& name, bool delete_ std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", "")); // use full curl escaped name - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_name(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_name = LLWeb::curlEscape(name); gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml"); } diff --git a/indra/newview/ascentfloatercontactgroups.cpp b/indra/newview/ascentfloatercontactgroups.cpp index 80f8a2204..d4097493d 100644 --- a/indra/newview/ascentfloatercontactgroups.cpp +++ b/indra/newview/ascentfloatercontactgroups.cpp @@ -238,4 +238,4 @@ void ASFloaterContactGroups::populateGroupList() } } } -} \ No newline at end of file +} diff --git a/indra/newview/ascentfloatercontactgroups.h b/indra/newview/ascentfloatercontactgroups.h index ed9fa44f1..809dce781 100644 --- a/indra/newview/ascentfloatercontactgroups.h +++ b/indra/newview/ascentfloatercontactgroups.h @@ -92,4 +92,4 @@ email for me right now, also in all cap. my father not very understand of free softwares and he make a fun of RMS. -*/ \ No newline at end of file +*/ diff --git a/indra/newview/ascentprefssys.cpp b/indra/newview/ascentprefssys.cpp index 5840e9de4..677280b1f 100644 --- a/indra/newview/ascentprefssys.cpp +++ b/indra/newview/ascentprefssys.cpp @@ -48,67 +48,11 @@ #include "llwind.h" #include "llviewernetwork.h" #include "pipeline.h" - -//System page ------------------------------------------------------------------------------ -HgB -class LLPrefsAscentSysImpl : public LLPanel -{ -public: - LLPrefsAscentSysImpl(); - /*virtual*/ ~LLPrefsAscentSysImpl() { }; - - virtual void refresh(); - - void apply(); - void cancel(); - -private: - static void onCommitCheckBox(LLUICtrl* ctrl, void* user_data); - void refreshValues(); - //General ----------------------------------------------------------------------------- - BOOL mDoubleClickTeleport; - BOOL mResetCameraAfterTP; - BOOL mOffsetTPByUserHeight; - BOOL mPreviewAnimInWorld; - BOOL mSaveScriptsAsMono; - BOOL mAlwaysRezInGroup; - //Disable Teleport Progress - //Disable Logout progress - //always show Build - BOOL mAlwaysShowFly; - //Disable camera minimum distance - BOOL mPowerUser; - BOOL mUseSystemFolder; - BOOL mUploadToSystem; - //Chat/IM ----------------------------------------------------------------------------- - BOOL mHideNotificationsInChat; - BOOL mPlayTypingSound; - BOOL mHideTypingNotification; - BOOL mEnableMUPose; - BOOL mEnableOOCAutoClose; - U32 mLinksForChattingObjects; - U32 mTimeFormat; - U32 mDateFormat; - BOOL mSecondsInChatAndIMs; - //Performance ------------------------------------------------------------------------- - BOOL mFetchInventoryOnLogin; - BOOL mEnableLLWind; - BOOL mEnableClouds; - BOOL mEnableClassicClouds; - BOOL mSpeedRez; - U32 mSpeedRezInterval; - //Command Line ------------------------------------------------------------------------ - //Privacy ----------------------------------------------------------------------------- - BOOL mBroadcastViewerEffects; - BOOL mDisablePointAtAndBeam; - BOOL mPrivateLookAt; - BOOL mShowLookAt; - BOOL mRevokePermsOnStandUp; - BOOL mDisableClickSit; -}; +#include "lgghunspell_wrapper.h" -LLPrefsAscentSysImpl::LLPrefsAscentSysImpl() - : LLPanel(std::string("Ascent")) + +LLPrefsAscentSys::LLPrefsAscentSys() { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_ascent_system.xml"); childSetCommitCallback("speed_rez_check", onCommitCheckBox, this); @@ -117,18 +61,28 @@ LLPrefsAscentSysImpl::LLPrefsAscentSysImpl() childSetCommitCallback("show_look_at_check", onCommitCheckBox, this); childSetCommitCallback("enable_clouds", onCommitCheckBox, this); + childSetCommitCallback("SpellBase", onSpellBaseComboBoxCommit, this); + childSetAction("EmSpell_EditCustom", onSpellEditCustom, this); + childSetAction("EmSpell_GetMore", onSpellGetMore, this); + childSetAction("EmSpell_Add", onSpellAdd, this); + childSetAction("EmSpell_Remove", onSpellRemove, this); + refreshValues(); refresh(); } -//static -void LLPrefsAscentSysImpl::onCommitCheckBox(LLUICtrl* ctrl, void* user_data) +LLPrefsAscentSys::~LLPrefsAscentSys() { - LLPrefsAscentSysImpl* self = (LLPrefsAscentSysImpl*)user_data; +} + +//static +void LLPrefsAscentSys::onCommitCheckBox(LLUICtrl* ctrl, void* user_data) +{ + LLPrefsAscentSys* self = (LLPrefsAscentSys*)user_data; llinfos << "Change to " << ctrl->getControlName() << " aka " << ctrl->getName() << llendl; - if (ctrl->getControlName() == "SpeedRez") + if (ctrl->getName() == "speed_rez_check") // Why is this one getControlName() and the rest are getName()? { bool enabled = self->childGetValue("speed_rez_check").asBoolean(); self->childSetEnabled("speed_rez_interval", enabled); @@ -158,7 +112,51 @@ void LLPrefsAscentSysImpl::onCommitCheckBox(LLUICtrl* ctrl, void* user_data) } } -void LLPrefsAscentSysImpl::refreshValues() +void LLPrefsAscentSys::onSpellAdd(void* data) +{ + LLPrefsAscentSys* self = (LLPrefsAscentSys*)data; + + if(self) + { + glggHunSpell->addButton(self->childGetValue("EmSpell_Avail").asString()); + } + + self->refresh(); +} + +void LLPrefsAscentSys::onSpellRemove(void* data) +{ + LLPrefsAscentSys* self = (LLPrefsAscentSys*)data; + + if(self) + { + glggHunSpell->removeButton(self->childGetValue("EmSpell_Installed").asString()); + } + + self->refresh(); +} + +void LLPrefsAscentSys::onSpellGetMore(void* data) +{ + glggHunSpell->getMoreButton(data); +} + +void LLPrefsAscentSys::onSpellEditCustom(void* data) +{ + glggHunSpell->editCustomButton(); +} + +void LLPrefsAscentSys::onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata) +{ + LLComboBox* box = (LLComboBox*)ctrl; + + if (box) + { + glggHunSpell->newDictSelection(box->getValue().asString()); + } +} + +void LLPrefsAscentSys::refreshValues() { //General ----------------------------------------------------------------------------- mDoubleClickTeleport = gSavedSettings.getBOOL("DoubleClickTeleport"); @@ -204,9 +202,11 @@ void LLPrefsAscentSysImpl::refreshValues() mShowLookAt = LLHUDEffectLookAt::sDebugLookAt; mRevokePermsOnStandUp = gSavedSettings.getBOOL("RevokePermsOnStandUp"); mDisableClickSit = gSavedSettings.getBOOL("DisableClickSit"); + //Text Options ------------------------------------------------------------------------ + mSpellDisplay = gSavedSettings.getBOOL("SpellDisplay"); } -void LLPrefsAscentSysImpl::refresh() +void LLPrefsAscentSys::refresh() { //General ----------------------------------------------------------------------------- childSetValue("double_click_teleport_check", mDoubleClickTeleport); @@ -309,9 +309,59 @@ void LLPrefsAscentSysImpl::refresh() childSetValue("show_look_at_check", mShowLookAt); childSetValue("revoke_perms_on_stand_up_check", mRevokePermsOnStandUp); childSetValue("disable_click_sit_check", mDisableClickSit); + + //Text Options ------------------------------------------------------------------------ + combo = getChild("SpellBase"); + + if (combo != NULL) + { + combo->removeall(); + std::vector names = glggHunSpell->getDicts(); + + for (int i = 0; i < (int)names.size(); i++) + { + combo->add(names[i]); + } + + combo->setSimple(gSavedSettings.getString("SpellBase")); + } + + combo = getChild("EmSpell_Avail"); + + if (combo != NULL) + { + combo->removeall(); + + combo->add(""); + std::vector names = glggHunSpell->getAvailDicts(); + + for (int i = 0; i < (int)names.size(); i++) + { + combo->add(names[i]); + } + + combo->setSimple(std::string("")); + } + + combo = getChild("EmSpell_Installed"); + + if (combo != NULL) + { + combo->removeall(); + + combo->add(""); + std::vector names = glggHunSpell->getInstalledDicts(); + + for (int i = 0; i < (int)names.size(); i++) + { + combo->add(names[i]); + } + + combo->setSimple(std::string("")); + } } -void LLPrefsAscentSysImpl::cancel() +void LLPrefsAscentSys::cancel() { //General ----------------------------------------------------------------------------- childSetValue("double_click_teleport_check", mDoubleClickTeleport); @@ -359,9 +409,12 @@ void LLPrefsAscentSysImpl::cancel() childSetValue("enable_classic_clouds", mEnableClassicClouds); gLLWindEnabled = mEnableLLWind; + + //Text Options ------------------------------------------------------------------------ + childSetValue("SpellDisplay", mSpellDisplay); } -void LLPrefsAscentSysImpl::apply() +void LLPrefsAscentSys::apply() { std::string short_date, long_date, short_time, long_time, timestamp; @@ -500,30 +553,3 @@ void LLPrefsAscentSysImpl::apply() refreshValues(); refresh(); } - -//--------------------------------------------------------------------------- - -LLPrefsAscentSys::LLPrefsAscentSys() -: impl(* new LLPrefsAscentSysImpl()) -{ -} - -LLPrefsAscentSys::~LLPrefsAscentSys() -{ - delete &impl; -} - -void LLPrefsAscentSys::apply() -{ - impl.apply(); -} - -void LLPrefsAscentSys::cancel() -{ - impl.cancel(); -} - -LLPanel* LLPrefsAscentSys::getPanel() -{ - return &impl; -} diff --git a/indra/newview/ascentprefssys.h b/indra/newview/ascentprefssys.h index e09377129..d62c9bdf1 100644 --- a/indra/newview/ascentprefssys.h +++ b/indra/newview/ascentprefssys.h @@ -32,10 +32,11 @@ #ifndef ASCENTPREFSSYS_H #define ASCENTPREFSSYS_H -class LLPanel; -class LLPrefsAscentSysImpl; -class LLPrefsAscentSys +#include "llpanel.h" + + +class LLPrefsAscentSys : public LLPanel { public: LLPrefsAscentSys(); @@ -43,11 +44,60 @@ public: void apply(); void cancel(); + void refresh(); LLPanel* getPanel(); protected: - LLPrefsAscentSysImpl& impl; + static void onCommitCheckBox(LLUICtrl* ctrl, void* user_data); + static void onSpellAdd(void* data); + static void onSpellRemove(void* data); + static void onSpellGetMore(void* data); + static void onSpellEditCustom(void* data); + static void onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata); + void refreshValues(); + //General ----------------------------------------------------------------------------- + BOOL mDoubleClickTeleport; + BOOL mResetCameraAfterTP; + BOOL mOffsetTPByUserHeight; + BOOL mPreviewAnimInWorld; + BOOL mSaveScriptsAsMono; + BOOL mAlwaysRezInGroup; + //Disable Teleport Progress + //Disable Logout progress + //always show Build + BOOL mAlwaysShowFly; + //Disable camera minimum distance + BOOL mPowerUser; + BOOL mUseSystemFolder; + BOOL mUploadToSystem; + //Chat/IM ----------------------------------------------------------------------------- + BOOL mHideNotificationsInChat; + BOOL mPlayTypingSound; + BOOL mHideTypingNotification; + BOOL mEnableMUPose; + BOOL mEnableOOCAutoClose; + U32 mLinksForChattingObjects; + U32 mTimeFormat; + U32 mDateFormat; + BOOL mSecondsInChatAndIMs; + //Performance ------------------------------------------------------------------------- + BOOL mFetchInventoryOnLogin; + BOOL mEnableLLWind; + BOOL mEnableClouds; + BOOL mEnableClassicClouds; + BOOL mSpeedRez; + U32 mSpeedRezInterval; + //Command Line ------------------------------------------------------------------------ + //Privacy ----------------------------------------------------------------------------- + BOOL mBroadcastViewerEffects; + BOOL mDisablePointAtAndBeam; + BOOL mPrivateLookAt; + BOOL mShowLookAt; + BOOL mRevokePermsOnStandUp; + BOOL mDisableClickSit; + //Text Options ------------------------------------------------------------------------ + BOOL mSpellDisplay; }; -#endif \ No newline at end of file +#endif diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 7c320eceb..47433ae01 100755 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -2923,6 +2923,8 @@ id="40" group="1" name="Male_Head" + wearable="shape" + edit_group="driven" value_min="0" value_max="1"> @@ -3508,6 +3510,8 @@ id="104" group="1" name="Big_Belly_Torso" + wearable="shape" + edit_group="driven" value_min="0" value_max="1"> @@ -3824,6 +3828,8 @@ id="855" group="1" name="Love_Handles" + wearable="shape" + edit_group="driven" value_default="0" value_min="-1" value_max="2"> @@ -3879,6 +3885,8 @@ id="100" group="1" name="Male_Torso" + wearable="shape" + edit_group="driven" label_min="Male_Torso" value_min="0" value_max="1"> @@ -4047,9 +4055,66 @@ - + + + + + + + + + + + + + + + + + + + @@ -4537,15 +4607,62 @@ id="153" group="1" name="Male_Legs" + wearable="shape" + edit_group="driven" value_min="0" value_max="1"> - - + + + + + + + + + + + + + + + + + @@ -4828,6 +4946,8 @@ id="852" group="1" name="skirt_bigbutt" + wearable="skirt" + edit_group="driven" label="bigbutt skirt" label_min="less" label_max="more" @@ -4840,6 +4960,8 @@ id="849" group="1" name="skirt_belly" + wearable="skirt" + edit_group="driven" label="big belly skirt" value_min="0" value_max="1"> @@ -4849,6 +4971,8 @@ @@ -4859,6 +4983,8 @@ id="851" group="1" name="skirt_chubby" + wearable="skirt" + edit_group="driven" label_min="less" label_max="more" value_min="0" @@ -4871,6 +4997,8 @@ id="856" group="1" name="skirt_lovehandles" + wearable="skirt" + edit_group="driven" label_min="less" label_max="more" value_min="-1" @@ -4888,11 +5016,32 @@ id="857" group="1" name="skirt_male" + wearable="skirt" + edit_group="driven" value_min="0" value_max="1"> - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/dbghelp.dll b/indra/newview/dbghelp.dll deleted file mode 100644 index a5a71ca0f..000000000 Binary files a/indra/newview/dbghelp.dll and /dev/null differ diff --git a/indra/newview/dofloaterhex.cpp b/indra/newview/dofloaterhex.cpp index 3da718bba..501b285a8 100644 --- a/indra/newview/dofloaterhex.cpp +++ b/indra/newview/dofloaterhex.cpp @@ -141,7 +141,7 @@ BOOL DOFloaterHex::postBuild(void) // static void DOFloaterHex::imageCallback(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, @@ -179,7 +179,7 @@ void DOFloaterHex::imageCallback(BOOL success, } else { - src_vi->setBoostLevel(LLViewerImageBoostLevel::BOOST_UI); + src_vi->setBoostLevel(LLViewerTexture::BOOST_UI); } } diff --git a/indra/newview/dofloaterhex.h b/indra/newview/dofloaterhex.h index 996f08c2a..62ef709d8 100644 --- a/indra/newview/dofloaterhex.h +++ b/indra/newview/dofloaterhex.h @@ -7,7 +7,7 @@ #include "llfloater.h" #include "dohexeditor.h" #include "llinventory.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llassettype.h" class DOFloaterHex @@ -19,7 +19,7 @@ public: BOOL postBuild(void); void close(bool app_quitting); static void imageCallback(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, diff --git a/indra/newview/dsaparam.cpp b/indra/newview/dsaparam.cpp index e4c89d40e..c7720e61e 100644 --- a/indra/newview/dsaparam.cpp +++ b/indra/newview/dsaparam.cpp @@ -66,4 +66,4 @@ DSA *get_dsa2048() if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL)) { DSA_free(dsa); return(NULL); } return(dsa); - } \ No newline at end of file + } diff --git a/indra/newview/emerald.cpp b/indra/newview/emerald.cpp index 1d89381cf..c2a31a65f 100644 --- a/indra/newview/emerald.cpp +++ b/indra/newview/emerald.cpp @@ -590,4 +590,4 @@ EDSA::~EDSA() { delete mDSAImpl; mDSAImpl = NULL; -} \ No newline at end of file +} diff --git a/indra/newview/emeraldboobutils.cpp b/indra/newview/emeraldboobutils.cpp index 12b784a7e..6d1238976 100644 --- a/indra/newview/emeraldboobutils.cpp +++ b/indra/newview/emeraldboobutils.cpp @@ -186,4 +186,4 @@ EmeraldBoobState EmeraldBoobUtils::idleUpdate(const EmeraldGlobalBoobConfig &con newState.boobGrav = llclamp(newState.boobGrav, -1.5f, 2.0f); return newState; -} \ No newline at end of file +} diff --git a/indra/newview/floaterlocalassetbrowse.cpp b/indra/newview/floaterlocalassetbrowse.cpp index 7b707deff..76fa162b1 100644 --- a/indra/newview/floaterlocalassetbrowse.cpp +++ b/indra/newview/floaterlocalassetbrowse.cpp @@ -53,7 +53,7 @@ this feature is still a work in progress. /* misc headers */ #include #include -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobjectlist.h" #include "llfilepicker.h" #include "llviewermenufile.h" @@ -129,16 +129,16 @@ LocalBitmap::LocalBitmap(std::string fullpath) LLImageRaw* raw_image = new LLImageRaw(); if ( this->decodeSelf(raw_image) ) { - /* creating a shell LLViewerImage and fusing raw image into it */ - LLViewerImage* viewer_image = new LLViewerImage( "file://"+this->filename, this->id, LOCAL_USE_MIPMAPS ); + /* creating a shell LLViewerTexture and fusing raw image into it */ + LLViewerFetchedTexture* viewer_image = new LLViewerFetchedTexture( "file://"+this->filename, this->id, LOCAL_USE_MIPMAPS ); viewer_image->createGLTexture( LOCAL_DISCARD_LEVEL, raw_image ); - viewer_image->mCachedRawImage = raw_image; + viewer_image->setCachedRawImage(-1,raw_image); - /* making damn sure gImageList will not delete it prematurely */ + /* making damn sure gTextureList will not delete it prematurely */ viewer_image->ref(); - /* finalizing by adding LLViewerImage instance into gImageList */ - gImageList.addImage(viewer_image); + /* finalizing by adding LLViewerTexture instance into gTextureList */ + gTextureList.addImage(viewer_image); /* filename is valid, bitmap is decoded and valid, i can haz liftoff! */ this->valid = true; @@ -172,12 +172,12 @@ void LocalBitmap::updateSelf() if ( !decodeSelf(new_imgraw) ) { this->linkstatus = LINK_UPDATING; return; } else { this->linkstatus = LINK_ON; } - LLViewerImage* image = gImageList.hasImage(this->id); + LLViewerFetchedTexture* image = gTextureList.findImage(this->id); - if (!image->mForSculpt) + if (!image->forSculpt()) { image->createGLTexture( LOCAL_DISCARD_LEVEL, new_imgraw ); } else - { image->mCachedRawImage = new_imgraw; } + { image->setCachedRawImage(-1,new_imgraw); } /* finalizing by updating lastmod to current */ this->last_modified = new_last_modified; @@ -222,7 +222,7 @@ bool LocalBitmap::decodeSelf(LLImageRaw* rawimg) if ( !bmp_image->load(filename) ) { break; } if ( !bmp_image->decode(rawimg, 0.0f) ) { break; } - rawimg->biasedScaleToPowerOfTwo( LLViewerImage::MAX_IMAGE_SIZE_DEFAULT ); + rawimg->biasedScaleToPowerOfTwo( LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT ); return true; } @@ -235,7 +235,7 @@ bool LocalBitmap::decodeSelf(LLImageRaw* rawimg) if( ( tga_image->getComponents() != 3) && ( tga_image->getComponents() != 4) ) { break; } - rawimg->biasedScaleToPowerOfTwo( LLViewerImage::MAX_IMAGE_SIZE_DEFAULT ); + rawimg->biasedScaleToPowerOfTwo( LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT ); return true; } @@ -245,7 +245,7 @@ bool LocalBitmap::decodeSelf(LLImageRaw* rawimg) if ( !jpeg_image->load(filename) ) { break; } if ( !jpeg_image->decode(rawimg, 0.0f) ) { break; } - rawimg->biasedScaleToPowerOfTwo( LLViewerImage::MAX_IMAGE_SIZE_DEFAULT ); + rawimg->biasedScaleToPowerOfTwo( LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT ); return true; } @@ -255,7 +255,7 @@ bool LocalBitmap::decodeSelf(LLImageRaw* rawimg) if ( !png_image->load(filename) ) { break; } if ( !png_image->decode(rawimg, 0.0f) ) { break; } - rawimg->biasedScaleToPowerOfTwo( LLViewerImage::MAX_IMAGE_SIZE_DEFAULT ); + rawimg->biasedScaleToPowerOfTwo( LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT ); return true; } @@ -493,8 +493,8 @@ void LocalAssetBrowser::DelBitmap( std::vector delete_vector, if ( unit->getID() == id ) { - LLViewerImage* image = gImageList.hasImage(id); - gImageList.deleteImage( image ); + LLViewerFetchedTexture* image = gTextureList.findImage(id); + gTextureList.deleteImage( image ); image->unref(); iter = loaded_bitmaps.erase(iter); @@ -685,7 +685,7 @@ void LocalAssetBrowser::PerformSculptUpdates(LocalBitmap* unit) // update code [begin] if ( unit->volume_dirty ) { - LLImageRaw* rawimage = gImageList.hasImage( unit->getID() )->getCachedRawImage(); + LLImageRaw* rawimage = gTextureList.findImage( unit->getID() )->getCachedRawImage(); aobj.object->getVolume()->sculpt(rawimage->getWidth(), rawimage->getHeight(), rawimage->getComponents(), rawimage->getData(), 0); diff --git a/indra/newview/floatersculptpreview.cpp b/indra/newview/floatersculptpreview.cpp index a420d8135..da8d33331 100644 --- a/indra/newview/floatersculptpreview.cpp +++ b/indra/newview/floatersculptpreview.cpp @@ -55,7 +55,7 @@ #include "llvoavatar.h" #include "pipeline.h" #include "lluictrlfactory.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llstring.h" #include "llviewercontrol.h" @@ -157,8 +157,8 @@ LLFloaterSculptPreview::~LLFloaterSculptPreview() clearAllPreviewTextures(); mRawImagep = NULL; - delete mAvatarPreview; - delete mSculptedPreview; + mAvatarPreview = NULL; + mSculptedPreview = NULL; mImagep = NULL ; } @@ -267,10 +267,9 @@ void LLFloaterSculptPreview::draw() } else { - mImagep = new LLImageGL(mRawImagep, FALSE) ; + mImagep = LLViewerTextureManager::getLocalTexture(mRawImagep.get(), FALSE) ; - gGL.getTexUnit(0)->unbind(mImagep->getTarget()) ; - gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mImagep->getTexName()); + gGL.getTexUnit(0)->bind(mImagep); stop_glerror(); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); @@ -309,11 +308,11 @@ void LLFloaterSculptPreview::draw() if (selected == 9) { - gGL.getTexUnit(0)->bind(mSculptedPreview->getTexture()); + gGL.getTexUnit(0)->bind(mSculptedPreview); } else { - gGL.getTexUnit(0)->bind(mAvatarPreview->getTexture()); + gGL.getTexUnit(0)->bind(mAvatarPreview); } gGL.begin( LLRender::QUADS ); @@ -513,7 +512,7 @@ void LLFloaterSculptPreview::onMouseCaptureLostImagePreview(LLMouseHandler* hand //----------------------------------------------------------------------------- // LLPreviewAvatar //----------------------------------------------------------------------------- -LLPreviewAvatar::LLPreviewAvatar(S32 width, S32 height) : LLDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) +LLPreviewAvatar::LLPreviewAvatar(S32 width, S32 height) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) { mNeedsUpdate = TRUE; mTargetJoint = NULL; @@ -603,7 +602,7 @@ BOOL LLPreviewAvatar::render() glMatrixMode(GL_PROJECTION); gGL.pushMatrix(); glLoadIdentity(); - glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f); + glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); gGL.pushMatrix(); @@ -612,7 +611,7 @@ BOOL LLPreviewAvatar::render() LLGLSUIDefault def; gGL.color4f(0.15f, 0.2f, 0.3f, 1.f); - gl_rect_2d_simple( mWidth, mHeight ); + gl_rect_2d_simple( mFullWidth, mFullHeight ); glMatrixMode(GL_PROJECTION); gGL.popMatrix(); @@ -634,9 +633,9 @@ BOOL LLPreviewAvatar::render() stop_glerror(); - LLViewerCamera::getInstance()->setAspect((F32)mWidth / mHeight); + LLViewerCamera::getInstance()->setAspect((F32)mFullWidth / mFullHeight); LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom); - LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE); + LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); LLVertexBuffer::unbind(); avatarp->updateLOD(); @@ -694,7 +693,7 @@ void LLPreviewAvatar::pan(F32 right, F32 up) // LLPreviewSculpted //----------------------------------------------------------------------------- -LLPreviewSculpted::LLPreviewSculpted(S32 width, S32 height) : LLDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) +LLPreviewSculpted::LLPreviewSculpted(S32 width, S32 height) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) { mNeedsUpdate = TRUE; mCameraDistance = 0.f; @@ -777,7 +776,7 @@ BOOL LLPreviewSculpted::render() glMatrixMode(GL_PROJECTION); gGL.pushMatrix(); glLoadIdentity(); - glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f); + glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); gGL.pushMatrix(); @@ -785,7 +784,7 @@ BOOL LLPreviewSculpted::render() gGL.color4f(1.f, 1.f, 1.f, 1.f); - gl_rect_2d_simple( mWidth, mHeight ); + gl_rect_2d_simple( mFullWidth, mFullHeight ); glMatrixMode(GL_PROJECTION); gGL.popMatrix(); @@ -808,9 +807,9 @@ BOOL LLPreviewSculpted::render() stop_glerror(); - LLViewerCamera::getInstance()->setAspect((F32) mWidth / mHeight); + LLViewerCamera::getInstance()->setAspect((F32) mFullWidth / mFullHeight); LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom); - LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE); + LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); const LLVolumeFace &vf = mVolume->getVolumeFace(0); U32 num_indices = vf.mIndices.size(); diff --git a/indra/newview/floatersculptpreview.h b/indra/newview/floatersculptpreview.h index 42b72de58..775b84889 100644 --- a/indra/newview/floatersculptpreview.h +++ b/indra/newview/floatersculptpreview.h @@ -46,7 +46,7 @@ class LLVOAvatar; class LLTextBox; class LLVertexBuffer; -class LLPreviewSculpted : public LLDynamicTexture +class LLPreviewSculpted : public LLViewerDynamicTexture { public: LLPreviewSculpted(S32 width, S32 height); @@ -75,7 +75,7 @@ class LLPreviewSculpted : public LLDynamicTexture }; -class LLPreviewAvatar : public LLDynamicTexture +class LLPreviewAvatar : public LLViewerDynamicTexture { public: LLPreviewAvatar(S32 width, S32 height); @@ -129,13 +129,13 @@ protected: bool loadImage(LLImageRaw* src); LLPointer mRawImagep; - LLPreviewAvatar* mAvatarPreview; - LLPreviewSculpted* mSculptedPreview; + LLPointer mAvatarPreview; + LLPointer mSculptedPreview; S32 mLastMouseX; S32 mLastMouseY; LLRect mPreviewRect; LLRectf mPreviewImageRect; - LLPointer mImagep ; + LLPointer mImagep ; LLViewerObject* tmpvolume; static S32 sUploadAmount; diff --git a/indra/newview/hgfloatertexteditor.cpp b/indra/newview/hgfloatertexteditor.cpp index 6c558296e..5faf7f0d1 100644 --- a/indra/newview/hgfloatertexteditor.cpp +++ b/indra/newview/hgfloatertexteditor.cpp @@ -102,7 +102,7 @@ BOOL HGFloaterTextEditor::postBuild(void) // static void HGFloaterTextEditor::imageCallback(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, @@ -141,7 +141,7 @@ void HGFloaterTextEditor::imageCallback(BOOL success, } else { - src_vi->setBoostLevel(LLViewerImageBoostLevel::BOOST_UI); + src_vi->setBoostLevel(LLViewerTexture::BOOST_UI); } } diff --git a/indra/newview/hgfloatertexteditor.h b/indra/newview/hgfloatertexteditor.h index 285821d52..fe6d36709 100644 --- a/indra/newview/hgfloatertexteditor.h +++ b/indra/newview/hgfloatertexteditor.h @@ -14,7 +14,7 @@ #include "llfloater.h" #include "lltexteditor.h" #include "llinventory.h" -#include "llviewerimage.h" +#include "llviewertexture.h" class HGFloaterTextEditor : public LLFloater @@ -25,7 +25,7 @@ public: BOOL postBuild(void); void close(bool app_quitting); static void imageCallback(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, diff --git a/indra/newview/hippofloaterxml.cpp b/indra/newview/hippofloaterxml.cpp old mode 100755 new mode 100644 diff --git a/indra/newview/hippofloaterxml.h b/indra/newview/hippofloaterxml.h old mode 100755 new mode 100644 diff --git a/indra/newview/hippogridmanager.cpp b/indra/newview/hippogridmanager.cpp index c2a9bb6c0..504b941d0 100644 --- a/indra/newview/hippogridmanager.cpp +++ b/indra/newview/hippogridmanager.cpp @@ -981,6 +981,6 @@ void HippoGridManager::saveFile() } else { - llerrs << "Unable to open grid info file: " << fileName << llendl; + llwarns << "Unable to open grid info file for save: " << fileName << llendl; } } diff --git a/indra/newview/lggdicdownload.cpp b/indra/newview/lggdicdownload.cpp new file mode 100644 index 000000000..734a42814 --- /dev/null +++ b/indra/newview/lggdicdownload.cpp @@ -0,0 +1,195 @@ +/* Copyright (c) 2009 +* +* Greg Hendrickson (LordGregGreg Back). All rights reserved. +* +* Redistribution and use in source and binary forms, with or +* without modification, are permitted provided that the following +* conditions are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* 3. Neither the name Modular Systems nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS +* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +* THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "llviewerprecompiledheaders.h" + +#include "lggdicdownload.h" + +#include "llagentdata.h" +#include "llcommandhandler.h" +#include "llfloater.h" +#include "lluictrlfactory.h" +#include "llagent.h" +#include "llpanel.h" +#include "llbutton.h" +#include "llcolorswatch.h" +#include "llcombobox.h" +#include "llview.h" +#include "ascentprefssys.h" +#include "llviewercontrol.h" +#include "llhttpclient.h" +#include "llbufferstream.h" + +class lggDicDownloadFloater; + +class EmeraldDicDownloader : public LLHTTPClient::Responder +{ +public: + EmeraldDicDownloader(lggDicDownloadFloater* spanel, std::string sname); + ~EmeraldDicDownloader() { } + void completedRaw( + U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer); +private: + lggDicDownloadFloater* panel; + std::string name; +}; + + +class lggDicDownloadFloater : public LLFloater, public LLFloaterSingleton +{ +public: + lggDicDownloadFloater(const LLSD& seed); + virtual ~lggDicDownloadFloater(); + BOOL postBuild(void); + void setData(std::vector shortNames, std::vector longNames, void * data); + static void onClickDownload(void* data); + std::vector sNames; + std::vector lNames; + LLPrefsAscentSys * empanel; +}; + +lggDicDownloadFloater::~lggDicDownloadFloater() +{ +} + +lggDicDownloadFloater::lggDicDownloadFloater(const LLSD& seed) +{ + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_dictionaries.xml"); + + if (getRect().mLeft == 0 + && getRect().mBottom == 0) + { + center(); + } +} + +BOOL lggDicDownloadFloater::postBuild(void) +{ + childSetAction("Emerald_dic_download", onClickDownload, this); + return true; +} + +void lggDicDownloadFloater::setData(std::vector shortNames, std::vector longNames, void* data) +{ + sNames = shortNames; + lNames = longNames; + empanel = (LLPrefsAscentSys*)data; + + LLComboBox* comboBox = getChild("Emerald_combo_dics"); + if (comboBox != NULL) + { + comboBox->removeall(); + for (int i = 0; i < (int)lNames.size(); i++) + { + comboBox->add(lNames[i], ADD_BOTTOM); + } + comboBox->setCurrentByIndex(0); + comboBox->add("", ADD_BOTTOM); + } +} + +void lggDicDownloadFloater::onClickDownload(void* data) +{ + lggDicDownloadFloater* self = (lggDicDownloadFloater*)data; + if (self) + { + //std::string selection = self->childGetValue("Emerald_combo_dics").asString(); + LLComboBox* comboBox = self->getChild("Emerald_combo_dics"); + if (comboBox != NULL) + { + if (!comboBox->getSelectedItemLabel().empty()) + { + std::string newDict(self->sNames[comboBox->getCurrentIndex()]); + LLHTTPClient::get(gSavedSettings.getString("SpellDownloadURL")+newDict+".aff", new EmeraldDicDownloader(self,newDict+".aff")); + LLHTTPClient::get(gSavedSettings.getString("SpellDownloadURL")+newDict+".dic", new EmeraldDicDownloader(NULL,newDict+".dic")); + + LLButton* button = self->getChild("Emerald_dic_download"); + if (button) + { + // TODO: move this to xml + button->setLabel(LLStringExplicit("Downloading... Please Wait")); + button->setEnabled(FALSE); + } + } + } + } +} + +void LggDicDownload::show(BOOL showin, std::vector shortNames, std::vector longNames, void * data) +{ + if (showin) + { + lggDicDownloadFloater* dic_floater = lggDicDownloadFloater::showInstance(); + dic_floater->setData(shortNames,longNames,data); + } +} + +EmeraldDicDownloader::EmeraldDicDownloader(lggDicDownloadFloater* spanel, std::string sname) + : + panel(spanel), + name(sname) +{ +} + + +void EmeraldDicDownloader::completedRaw(U32 status, const std::string& reason, const LLChannelDescriptors& channels, const LLIOPipe::buffer_ptr_t& buffer) +{ + if (status < 200 || status >= 300) + { + return; + } + LLBufferStream istr(channels, buffer.get()); + std::string dicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", name.c_str())); + + llofstream ostr(dicpath, std::ios::binary); + + while (istr.good() && ostr.good()) + { + ostr << istr.rdbuf(); + } + ostr.close(); + if (panel) + { + if (panel->empanel) + { + panel->empanel->refresh(); + } + else + { + llinfos << "completedRaw(): No empanel to refresh()!" << llendl; + } + + panel->close(); + } +} diff --git a/indra/newview/lggdicdownload.h b/indra/newview/lggdicdownload.h new file mode 100644 index 000000000..75f3053e9 --- /dev/null +++ b/indra/newview/lggdicdownload.h @@ -0,0 +1,37 @@ +/* Copyright (c) 2009 +* +* Greg Hendrickson (LordGregGreg Back). All rights reserved. +* +* Redistribution and use in source and binary forms, with or +* without modification, are permitted provided that the following +* conditions are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* 3. Neither the name Modular Systems nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS +* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +* THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class LggDicDownload +{ + public: + static void show( BOOL showw , std::vector shortNames, std::vector longNames, void * data); +}; + diff --git a/indra/newview/lgghunspell_wrapper.cpp b/indra/newview/lgghunspell_wrapper.cpp new file mode 100644 index 000000000..b8748ff2c --- /dev/null +++ b/indra/newview/lgghunspell_wrapper.cpp @@ -0,0 +1,974 @@ +/* Copyright (C) 2009 LordGregGreg Back + + This is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of + the License, or (at your option) any later version. + + This 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 General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the viewer; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#include "llviewerprecompiledheaders.h" +#include "lgghunspell_wrapper.h" +#include +#include "llweb.h" +#include "llviewercontrol.h" +#include "llviewerwindow.h" +#include "llfile.h" +#include "llhttpclient.h" +#include "lggdicdownload.h" + +lggHunSpell_Wrapper *glggHunSpell = 0; +Hunspell* lggHunSpell_Wrapper::myHunspell = 0; +// do not insert empty lines after this line until the size calculation +#define COUNTRY_CODES_RAW_START_LINE (__LINE__ + 2) +static char * countryCodesraw[] = { + (char*)"SL",(char*)"SecondLife", + (char*)"AD",(char*)"Andorra", + (char*)"AE",(char*)"United Arab Emirates", + (char*)"AF",(char*)"Afghanistan", + (char*)"AG",(char*)"Antigua & Barbuda", + (char*)"AI",(char*)"Anguilla", + (char*)"AL",(char*)"Albania", + (char*)"AM",(char*)"Armenia", + (char*)"AN",(char*)"Netherlands Antilles", + (char*)"AO",(char*)"Angola", + (char*)"AQ",(char*)"Antarctica", + (char*)"AR",(char*)"Argentina", + (char*)"AS",(char*)"American Samoa", + (char*)"AT",(char*)"Austria", + (char*)"AU",(char*)"Australia", + (char*)"AW",(char*)"Aruba", + (char*)"AZ",(char*)"Azerbaijan", + (char*)"BA",(char*)"Bosnia and Herzegovina", + (char*)"BB",(char*)"Barbados", + (char*)"BD",(char*)"Bangladesh", + (char*)"BE",(char*)"Belgium", + (char*)"BF",(char*)"Burkina Faso", + (char*)"BG",(char*)"Bulgaria", + (char*)"BH",(char*)"Bahrain", + (char*)"BI",(char*)"Burundi", + (char*)"BJ",(char*)"Benin", + (char*)"BM",(char*)"Bermuda", + (char*)"BN",(char*)"Brunei Darussalam", + (char*)"BO",(char*)"Bolivia", + (char*)"BR",(char*)"Brazil", + (char*)"BS",(char*)"Bahama", + (char*)"BT",(char*)"Bhutan", + (char*)"BU",(char*)"Burma", + (char*)"BV",(char*)"Bouvet Island", + (char*)"BW",(char*)"Botswana", + (char*)"BY",(char*)"Belarus", + (char*)"BZ",(char*)"Belize", + (char*)"CA",(char*)"Canada", + (char*)"CC",(char*)"Cocos (Keeling) Islands", + (char*)"CF",(char*)"Central African Republic", + (char*)"CG",(char*)"Congo", + (char*)"CH",(char*)"Switzerland", + (char*)"CI",(char*)"CĂ´te D'ivoire (Ivory Coast)", + (char*)"CK",(char*)"Cook Iislands", + (char*)"CL",(char*)"Chile", + (char*)"CM",(char*)"Cameroon", + (char*)"CN",(char*)"China", + (char*)"CO",(char*)"Colombia", + (char*)"CR",(char*)"Costa Rica", + (char*)"CS",(char*)"Czechoslovakia", + (char*)"CU",(char*)"Cuba", + (char*)"CV",(char*)"Cape Verde", + (char*)"CX",(char*)"Christmas Island", + (char*)"CY",(char*)"Cyprus", + (char*)"CZ",(char*)"Czech Republic", + (char*)"DD",(char*)"German Democratic Republic", + (char*)"DE",(char*)"Germany", + (char*)"DJ",(char*)"Djibouti", + (char*)"DK",(char*)"Denmark", + (char*)"DM",(char*)"Dominica", + (char*)"DO",(char*)"Dominican Republic", + (char*)"DZ",(char*)"Algeria", + (char*)"EC",(char*)"Ecuador", + (char*)"EE",(char*)"Estonia", + (char*)"EG",(char*)"Egypt", + (char*)"EH",(char*)"Western Sahara", + (char*)"ER",(char*)"Eritrea", + (char*)"ES",(char*)"Spain", + (char*)"ET",(char*)"Ethiopia", + (char*)"FI",(char*)"Finland", + (char*)"FJ",(char*)"Fiji", + (char*)"FK",(char*)"Falkland Islands (Malvinas)", + (char*)"FM",(char*)"Micronesia", + (char*)"FO",(char*)"Faroe Islands", + (char*)"FR",(char*)"France", + (char*)"FX",(char*)"France, Metropolitan", + (char*)"GA",(char*)"Gabon", + (char*)"GB",(char*)"United Kingdom (Great Britain)", + (char*)"GD",(char*)"Grenada", + (char*)"GE",(char*)"Georgia", + (char*)"GF",(char*)"French Guiana", + (char*)"GH",(char*)"Ghana", + (char*)"GI",(char*)"Gibraltar", + (char*)"GL",(char*)"Greenland", + (char*)"GM",(char*)"Gambia", + (char*)"GN",(char*)"Guinea", + (char*)"GP",(char*)"Guadeloupe", + (char*)"GQ",(char*)"Equatorial Guinea", + (char*)"GR",(char*)"Greece", + (char*)"GS",(char*)"South Georgia and the South Sandwich Islands", + (char*)"GT",(char*)"Guatemala", + (char*)"GU",(char*)"Guam", + (char*)"GW",(char*)"Guinea-Bissau", + (char*)"GY",(char*)"Guyana", + (char*)"HK",(char*)"Hong Kong", + (char*)"HM",(char*)"Heard & McDonald Islands", + (char*)"HN",(char*)"Honduras", + (char*)"HR",(char*)"Croatia", + (char*)"HT",(char*)"Haiti", + (char*)"HU",(char*)"Hungary", + (char*)"ID",(char*)"Indonesia", + (char*)"IE",(char*)"Ireland", + (char*)"IL",(char*)"Israel", + (char*)"IN",(char*)"India", + (char*)"IO",(char*)"British Indian Ocean Territory", + (char*)"IQ",(char*)"Iraq", + (char*)"IR",(char*)"Islamic Republic of Iran", + (char*)"IS",(char*)"Iceland", + (char*)"IT",(char*)"Italy", + (char*)"JM",(char*)"Jamaica", + (char*)"JO",(char*)"Jordan", + (char*)"JP",(char*)"Japan", + (char*)"KE",(char*)"Kenya", + (char*)"KG",(char*)"Kyrgyzstan", + (char*)"KH",(char*)"Cambodia", + (char*)"KI",(char*)"Kiribati", + (char*)"KM",(char*)"Comoros", + (char*)"KN",(char*)"St. Kitts and Nevis", + (char*)"KP",(char*)"Korea, Democratic People's Republic of", + (char*)"KR",(char*)"Korea, Republic of", + (char*)"KW",(char*)"Kuwait", + (char*)"KY",(char*)"Cayman Islands", + (char*)"KZ",(char*)"Kazakhstan", + (char*)"LA",(char*)"Lao People's Democratic Republic", + (char*)"LB",(char*)"Lebanon", + (char*)"LC",(char*)"Saint Lucia", + (char*)"LI",(char*)"Liechtenstein", + (char*)"LK",(char*)"Sri Lanka", + (char*)"LR",(char*)"Liberia", + (char*)"LS",(char*)"Lesotho", + (char*)"LT",(char*)"Lithuania", + (char*)"LU",(char*)"Luxembourg", + (char*)"LV",(char*)"Latvia", + (char*)"LY",(char*)"Libyan Arab Jamahiriya", + (char*)"MA",(char*)"Morocco", + (char*)"MC",(char*)"Monaco", + (char*)"MD",(char*)"Moldova, Republic of", + (char*)"MG",(char*)"Madagascar", + (char*)"MH",(char*)"Marshall Islands", + (char*)"ML",(char*)"Mali", + (char*)"MN",(char*)"Mongolia", + (char*)"MM",(char*)"Myanmar", + (char*)"MO",(char*)"Macau", + (char*)"MP",(char*)"Northern Mariana Islands", + (char*)"MQ",(char*)"Martinique", + (char*)"MR",(char*)"Mauritania", + (char*)"MS",(char*)"Monserrat", + (char*)"MT",(char*)"Malta", + (char*)"MU",(char*)"Mauritius", + (char*)"MV",(char*)"Maldives", + (char*)"MW",(char*)"Malawi", + (char*)"MX",(char*)"Mexico", + (char*)"MY",(char*)"Malaysia", + (char*)"MZ",(char*)"Mozambique", + (char*)"NA",(char*)"Namibia", + (char*)"NC",(char*)"New Caledonia", + (char*)"NE",(char*)"Niger", + (char*)"NF",(char*)"Norfolk Island", + (char*)"NG",(char*)"Nigeria", + (char*)"NI",(char*)"Nicaragua", + (char*)"NL",(char*)"Netherlands", + (char*)"NO",(char*)"Norway", + (char*)"NP",(char*)"Nepal", + (char*)"NR",(char*)"Nauru", + (char*)"NT",(char*)"Neutral Zone", + (char*)"NU",(char*)"Niue", + (char*)"NZ",(char*)"New Zealand", + (char*)"OM",(char*)"Oman", + (char*)"PA",(char*)"Panama", + (char*)"PE",(char*)"Peru", + (char*)"PF",(char*)"French Polynesia", + (char*)"PG",(char*)"Papua New Guinea", + (char*)"PH",(char*)"Philippines", + (char*)"PK",(char*)"Pakistan", + (char*)"PL",(char*)"Poland", + (char*)"PM",(char*)"St. Pierre & Miquelon", + (char*)"PN",(char*)"Pitcairn", + (char*)"PR",(char*)"Puerto Rico", + (char*)"PT",(char*)"Portugal", + (char*)"PW",(char*)"Palau", + (char*)"PY",(char*)"Paraguay", + (char*)"QA",(char*)"Qatar", + (char*)"RE",(char*)"RĂ©union", + (char*)"RO",(char*)"Romania", + (char*)"RU",(char*)"Russian Federation", + (char*)"RW",(char*)"Rwanda", + (char*)"SA",(char*)"Saudi Arabia", + (char*)"SB",(char*)"Solomon Islands", + (char*)"SC",(char*)"Seychelles", + (char*)"SD",(char*)"Sudan", + (char*)"SE",(char*)"Sweden", + (char*)"SG",(char*)"Singapore", + (char*)"SH",(char*)"St. Helena", + (char*)"SI",(char*)"Slovenia", + (char*)"SJ",(char*)"Svalbard & Jan Mayen Islands", + (char*)"SK",(char*)"Slovakia", + (char*)"SL",(char*)"Sierra Leone", + (char*)"SM",(char*)"San Marino", + (char*)"SN",(char*)"Senegal", + (char*)"SO",(char*)"Somalia", + (char*)"SR",(char*)"Suriname", + (char*)"ST",(char*)"Sao Tome & Principe", + (char*)"SU",(char*)"Union of Soviet Socialist Republics", + (char*)"SV",(char*)"El Salvador", + (char*)"SY",(char*)"Syrian Arab Republic", + (char*)"SZ",(char*)"Swaziland", + (char*)"TC",(char*)"Turks & Caicos Islands", + (char*)"TD",(char*)"Chad", + (char*)"TF",(char*)"French Southern Territories", + (char*)"TG",(char*)"Togo", + (char*)"TH",(char*)"Thailand", + (char*)"TJ",(char*)"Tajikistan", + (char*)"TK",(char*)"Tokelau", + (char*)"TM",(char*)"Turkmenistan", + (char*)"TN",(char*)"Tunisia", + (char*)"TO",(char*)"Tonga", + (char*)"TP",(char*)"East Timor", + (char*)"TR",(char*)"Turkey", + (char*)"TT",(char*)"Trinidad & Tobago", + (char*)"TV",(char*)"Tuvalu", + (char*)"TW",(char*)"Taiwan, Province of China", + (char*)"TZ",(char*)"Tanzania, United Republic of", + (char*)"UA",(char*)"Ukraine", + (char*)"UG",(char*)"Uganda", + (char*)"UM",(char*)"United States Minor Outlying Islands", + (char*)"US",(char*)"United States of America", + (char*)"UY",(char*)"Uruguay", + (char*)"UZ",(char*)"Uzbekistan", + (char*)"VA",(char*)"Vatican City State", + (char*)"VC",(char*)"St. Vincent & the Grenadines", + (char*)"VE",(char*)"Venezuela", + (char*)"VG",(char*)"British Virgin Islands", + (char*)"VI",(char*)"United States Virgin Islands", + (char*)"VN",(char*)"Viet Nam", + (char*)"VU",(char*)"Vanuatu", + (char*)"WF",(char*)"Wallis & Futuna Islands", + (char*)"WS",(char*)"Samoa", + (char*)"YD",(char*)"Democratic Yemen", + (char*)"YE",(char*)"Yemen", + (char*)"YT",(char*)"Mayotte", + (char*)"YU",(char*)"Yugoslavia", + (char*)"ZA",(char*)"South Africa", + (char*)"ZM",(char*)"Zambia", + (char*)"ZR",(char*)"Zaire", + (char*)"ZW",(char*)"Zimbabwe", + (char*)"ZZ",(char*)"Unknown or unspecified country" +}; +//#define COUNTRY_CODES_RAW_SIZE ((__LINE__ - 1 - COUNTRY_CODES_RAW_START_LINE) * 2) +#define COUNTRY_CODES_RAW_SIZE 492 +#define LANGUAGE_CODES_RAW_START_LINE (__LINE__ + 2) +static char * languageCodesraw[]={ + (char*)"aa",(char*)"Afar", + (char*)"ab",(char*)"Abkhazian", + (char*)"ae",(char*)"Avestan", + (char*)"af",(char*)"Afrikaans", + (char*)"ak",(char*)"Akan", + (char*)"am",(char*)"Amharic", + (char*)"an",(char*)"Aragonese", + (char*)"ar",(char*)"Arabic", + (char*)"as",(char*)"Assamese", + (char*)"av",(char*)"Avaric", + (char*)"ay",(char*)"Aymara", + (char*)"az",(char*)"Azerbaijani", + (char*)"ba",(char*)"Bashkir", + (char*)"be",(char*)"Belarusian", + (char*)"bg",(char*)"Bulgarian", + (char*)"bh",(char*)"Bihari", + (char*)"bi",(char*)"Bislama", + (char*)"bm",(char*)"Bambara", + (char*)"bn",(char*)"Bengali", + (char*)"bo",(char*)"Tibetan", + (char*)"br",(char*)"Breton", + (char*)"bs",(char*)"Bosnian", + (char*)"ca",(char*)"Catalan", + (char*)"ce",(char*)"Chechen", + (char*)"ch",(char*)"Chamorro", + (char*)"co",(char*)"Corsican", + (char*)"cr",(char*)"Cree", + (char*)"cs",(char*)"Czech", + (char*)"cu",(char*)"ChurchSlavic", + (char*)"cv",(char*)"Chuvash", + (char*)"cy",(char*)"Welsh", + (char*)"da",(char*)"Danish", + (char*)"de",(char*)"German", + (char*)"dv",(char*)"Divehi", + (char*)"dz",(char*)"Dzongkha", + (char*)"ee",(char*)"Ewe", + (char*)"el",(char*)"ModernGreek", + (char*)"en",(char*)"English", + (char*)"eo",(char*)"Esperanto", + (char*)"es",(char*)"Spanish", + (char*)"et",(char*)"Estonian", + (char*)"eu",(char*)"Basque", + (char*)"fa",(char*)"Persian", + (char*)"ff",(char*)"Fulah", + (char*)"fi",(char*)"Finnish", + (char*)"fj",(char*)"Fijian", + (char*)"fo",(char*)"Faroese", + (char*)"fr",(char*)"French", + (char*)"fy",(char*)"WesternFrisian", + (char*)"ga",(char*)"Irish", + (char*)"gd",(char*)"Gaelic", + (char*)"gl",(char*)"Galician", + (char*)"gn",(char*)"GuaranĂ­", + (char*)"gu",(char*)"Gujarati", + (char*)"gv",(char*)"Manx", + (char*)"ha",(char*)"Hausa", + (char*)"he",(char*)"ModernHebrew", + (char*)"hi",(char*)"Hindi", + (char*)"ho",(char*)"HiriMotu", + (char*)"hr",(char*)"Croatian", + (char*)"ht",(char*)"Haitian", + (char*)"hu",(char*)"Hungarian", + (char*)"hy",(char*)"Armenian", + (char*)"hz",(char*)"Herero", + (char*)"ia",(char*)"Interlingua", + (char*)"id",(char*)"Indonesian", + (char*)"ie",(char*)"Interlingue", + (char*)"ig",(char*)"Igbo", + (char*)"ii",(char*)"SichuanYi", + (char*)"ik",(char*)"Inupiaq", + (char*)"io",(char*)"Ido", + (char*)"is",(char*)"Icelandic", + (char*)"it",(char*)"Italian", + (char*)"iu",(char*)"Inuktitut", + (char*)"ja",(char*)"Japanese", + (char*)"jv",(char*)"Javanese", + (char*)"ka",(char*)"Georgian", + (char*)"kg",(char*)"Kongo", + (char*)"ki",(char*)"Kikuyu", + (char*)"kj",(char*)"Kwanyama", + (char*)"kk",(char*)"Kazakh", + (char*)"kl",(char*)"Kalaallisut", + (char*)"km",(char*)"CentralKhmer", + (char*)"kn",(char*)"Kannada", + (char*)"ko",(char*)"Korean", + (char*)"kr",(char*)"Kanuri", + (char*)"ks",(char*)"Kashmiri", + (char*)"ku",(char*)"Kurdish", + (char*)"kv",(char*)"Komi", + (char*)"kw",(char*)"Cornish", + (char*)"ky",(char*)"Kirghiz", + (char*)"la",(char*)"Latin", + (char*)"lb",(char*)"Luxembourgish", + (char*)"lg",(char*)"Ganda", + (char*)"li",(char*)"Limburgish", + (char*)"ln",(char*)"Lingala", + (char*)"lo",(char*)"Lao", + (char*)"lt",(char*)"Lithuanian", + (char*)"lu",(char*)"Luba-Katanga", + (char*)"lv",(char*)"Latvian", + (char*)"mg",(char*)"Malagasy", + (char*)"mh",(char*)"Marshallese", + (char*)"mi",(char*)"Maori", + (char*)"mk",(char*)"Macedonian", + (char*)"ml",(char*)"Malayalam", + (char*)"mn",(char*)"Mongolian", + (char*)"mr",(char*)"Marathi", + (char*)"ms",(char*)"Malay", + (char*)"mt",(char*)"Maltese", + (char*)"my",(char*)"Burmese", + (char*)"na",(char*)"Nauru", + (char*)"nb",(char*)"NorwegianBokmal", + (char*)"nd",(char*)"NorthNdebele", + (char*)"ne",(char*)"Nepali", + (char*)"ng",(char*)"Ndonga", + (char*)"nl",(char*)"Dutch/Flemish", + (char*)"nn",(char*)"NorwegianNynorsk", + (char*)"no",(char*)"Norwegian", + (char*)"nr",(char*)"SouthNdebele", + (char*)"nv",(char*)"Navajo/Navaho", + (char*)"ny",(char*)"Nyanja", + (char*)"oc",(char*)"Occitan", + (char*)"oj",(char*)"Ojibwa", + (char*)"om",(char*)"Oromo", + (char*)"or",(char*)"Oriya", + (char*)"os",(char*)"Ossetian", + (char*)"pa",(char*)"Panjabi", + (char*)"pi",(char*)"Pali", + (char*)"pl",(char*)"Polish", + (char*)"ps",(char*)"Pashto/Pushto", + (char*)"pt",(char*)"Portuguese", + (char*)"qu",(char*)"Quechua", + (char*)"rm",(char*)"Romansh", + (char*)"rn",(char*)"Rundi", + (char*)"ro",(char*)"Romanian", + (char*)"ru",(char*)"Russian", + (char*)"rw",(char*)"Kinyarwanda", + (char*)"sa",(char*)"Sanskrit", + (char*)"sc",(char*)"Sardinian", + (char*)"sd",(char*)"Sindhi", + (char*)"se",(char*)"NorthernSami", + (char*)"sg",(char*)"Sango", + (char*)"si",(char*)"Sinhala", + (char*)"sk",(char*)"Slovak", + (char*)"sl",(char*)"Slovene", + (char*)"sm",(char*)"Samoan", + (char*)"sn",(char*)"Shona", + (char*)"so",(char*)"Somali", + (char*)"sq",(char*)"Albanian", + (char*)"sr",(char*)"Serbian", + (char*)"ss",(char*)"Swati", + (char*)"st",(char*)"SouthernSotho", + (char*)"su",(char*)"Sundanese", + (char*)"sv",(char*)"Swedish", + (char*)"sw",(char*)"Swahili", + (char*)"ta",(char*)"Tamil", + (char*)"te",(char*)"Telugu", + (char*)"tg",(char*)"Tajik", + (char*)"th",(char*)"Thai", + (char*)"ti",(char*)"Tigrinya", + (char*)"tk",(char*)"Turkmen", + (char*)"tl",(char*)"Tagalog", + (char*)"tn",(char*)"Tswana", + (char*)"to",(char*)"Tonga", + (char*)"tr",(char*)"Turkish", + (char*)"ts",(char*)"Tsonga", + (char*)"tt",(char*)"Tatar", + (char*)"tw",(char*)"Twi", + (char*)"ty",(char*)"Tahitian", + (char*)"ug",(char*)"Uighur", + (char*)"uk",(char*)"Ukrainian", + (char*)"ur",(char*)"Urdu", + (char*)"uz",(char*)"Uzbek", + (char*)"ve",(char*)"Venda", + (char*)"vi",(char*)"Vietnamese", + (char*)"vo",(char*)"VolapĂĽk", + (char*)"wa",(char*)"Walloon", + (char*)"wo",(char*)"Wolof", + (char*)"xh",(char*)"Xhosa", + (char*)"yi",(char*)"Yiddish", + (char*)"yo",(char*)"Yoruba", + (char*)"za",(char*)"Zhuang", + (char*)"zh",(char*)"Chinese", + (char*)"zu",(char*)"Zulu" +}; +//#define LANGUAGE_CODES_RAW_SIZE ((__LINE__ - 1 - LANGUAGE_CODES_RAW_START_LINE) * 2) +#define LANGUAGE_CODES_RAW_SIZE 368 + +lggHunSpell_Wrapper::lggHunSpell_Wrapper() +{ + //languageCodes(begin(languageCodesraw), end(languageCodesraw)); +// mSpellCheckHighlight = rebind_llcontrol("SpellDisplay", &gSavedSettings, true); +} + +lggHunSpell_Wrapper::~lggHunSpell_Wrapper() +{ +} + +BOOL lggHunSpell_Wrapper::getSpellCheckHighlight() +{ + static const LLCachedControl mSpellCheckHighlight("SpellDisplay", false); + + return mSpellCheckHighlight; +} + +std::string lggHunSpell_Wrapper::getCorrectPath(std::string file) +{ + //finds out if it is in user dir, if not, takes it from app dir + std::string dicpath1(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", file).c_str()); + if (!gDirUtilp->fileExists(dicpath1)) + { + dicpath1=gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", file).c_str(); + } + return dicpath1; +} + +void lggHunSpell_Wrapper::setNewDictionary(std::string newDict) +{ + + llinfos << "Setting new base dictionary long name is-> " << newDict.c_str() << llendl; + + currentBaseDic = newDict; + + //expecting a full name comming in + newDict = fullName2DictName(newDict); + + if (myHunspell) + { + delete myHunspell; + } + + std::string dicaffpath = getCorrectPath(newDict+".aff"); + std::string dicdicpath = getCorrectPath(newDict+".dic"); + + llinfos << "Setting new base dictionary -> " << dicaffpath.c_str() << llendl; + + myHunspell = new Hunspell(dicaffpath.c_str(), dicdicpath.c_str()); + llinfos << "Adding custom dictionary " << llendl; + createCustomDic(); + addDictionary("custom"); + std::vector toInstall = getInstalledDicts(); + for (int i = 0; i < (int)toInstall.size(); i++) + { + addDictionary(toInstall[i]); + } +} + +void lggHunSpell_Wrapper::createCustomDic() +{ + std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "custom.dic")); + if (!gDirUtilp->fileExists(filename)) + { + llofstream export_file; + export_file.open(filename); + std::string sizePart("1\nLordGregGreg\n"); + export_file.write(sizePart.c_str(),sizePart.length()); + export_file.close(); + } +} + +void lggHunSpell_Wrapper::addWordToCustomDictionary(std::string wordToAdd) +{ + if (!myHunspell) + { + return; + } + + myHunspell->add(wordToAdd.c_str()); + std::string filename(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", "custom.dic")); + std::vector lines; + if (gDirUtilp->fileExists(filename)) + { + //get words already there.. + llifstream importer(filename); + std::string line; + if (getline( importer, line ))//ignored the size + { + while ( getline( importer, line ) ) lines.push_back(line); + } + importer.close(); + } + + llofstream export_file; + export_file.open(filename); + std::string sizePart(llformat("%i", (int)(lines.size()+1)) + "\n"); + export_file.write(sizePart.c_str(), sizePart.length()); + for (int i = 0; i < (int)lines.size() ;i++) + { + export_file.write(std::string(lines[i]+"\n").c_str(),lines[i].length()+1); + } + //LLStringUtil::toLower(wordToAdd); + wordToAdd = wordToAdd+std::string("\n"); + export_file.write(wordToAdd.c_str(), wordToAdd.length()); + //export_file << std::hex << 10 ; + export_file.close(); +} + +BOOL lggHunSpell_Wrapper::isSpelledRight(std::string wordToCheck) +{ + if (!myHunspell || wordToCheck.length() < 3) + { + return TRUE; + } + return myHunspell->spell(wordToCheck.c_str()); +} + +std::vector lggHunSpell_Wrapper::getSuggestionList(std::string badWord) +{ + std::vector toReturn; + if (!myHunspell) + { + return toReturn; + } + + char** suggestionList; + int numberOfSuggestions = myHunspell->suggest(&suggestionList, badWord.c_str()); + if (numberOfSuggestions <= 0) + { + return toReturn; + } + for (int i = 0; i < numberOfSuggestions; i++) + { + std::string tempSugg(suggestionList[i]); + toReturn.push_back(tempSugg); + } + myHunspell->free_list(&suggestionList,numberOfSuggestions); + return toReturn; +} + +void lggHunSpell_Wrapper::debugTest(std::string testWord) +{ + llinfos << "Testing to see if " << testWord.c_str() << " is spelled correct" << llendl; + + if (isSpelledRight(testWord)) + { + llinfos << testWord.c_str() << " is spelled correctly" << llendl; + } + else + { + llinfos << testWord.c_str() << " is not spelled correctly, getting suggestions" << llendl; + std::vector suggList; + suggList.clear(); + suggList = getSuggestionList(testWord); + llinfos << "Got suggestions.. " << llendl; + + for (int i = 0; i < (int)suggList.size(); i++) + { + llinfos << "Suggestion for " << testWord.c_str() << ":" << suggList[i].c_str() << llendl; + } + } +} + +void lggHunSpell_Wrapper::initSettings() +{ + glggHunSpell = new lggHunSpell_Wrapper(); + glggHunSpell->processSettings(); +} + +void lggHunSpell_Wrapper::processSettings() +{ + //expects everything to already be in saved settings + //this will also reload and read the installed dicts + setNewDictionary(gSavedSettings.getString("SpellBase")); +} + +void lggHunSpell_Wrapper::addDictionary(std::string additionalDictionary) +{ + if (!myHunspell || additionalDictionary.empty()) + { + return; + } + + //expecting a full name here + std::string dicpath = getCorrectPath(fullName2DictName(additionalDictionary)+".dic"); + if (gDirUtilp->fileExists(dicpath)) + { + llinfos << "Adding additional dictionary -> " << dicpath.c_str() << llendl; + myHunspell->add_dic(dicpath.c_str()); + } +} + +std::string lggHunSpell_Wrapper::dictName2FullName(std::string dictName) +{ + if (dictName.empty()) + { + return dictName; + } + + std::string countryCode(""); + std::string languageCode(""); + + //remove extension + dictName = dictName.substr(0,dictName.find(".")); + + //break it up by - or _ + S32 breakPoint = dictName.find("-"); + if (breakPoint == std::string::npos) + { + breakPoint = dictName.find("_"); + } + if (breakPoint == std::string::npos) + { + //no country code given + languageCode = dictName; + } + else + { + languageCode = dictName.substr(0,breakPoint); + countryCode = dictName.substr(breakPoint+1); + } + + //get long language code + for (int i = 0; i lggHunSpell_Wrapper::getDicts() +{ + std::vector names; + std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", "")); + bool found = true; + while (found) + { + std::string name; + found = gDirUtilp->getNextFileInDir(path_name, "*.aff", name, false); + if (found) + { + names.push_back(dictName2FullName(name)); + } + } + path_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", ""); + found = true; + while (found) + { + std::string name; + found = gDirUtilp->getNextFileInDir(path_name, "*.aff", name, false); + if (found) + { + names.push_back(dictName2FullName(name)); + } + } + + return names; +} + +std::vector lggHunSpell_Wrapper::getExtraDicts() +{ + std::vector names; + std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "dictionaries", "")); + bool found = true; + while (found) + { + std::string name; + found = gDirUtilp->getNextFileInDir(path_name, "*.dic", name, false); + if (found) + { + names.push_back(dictName2FullName(name)); + } + } + path_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", ""); + found = true; + while (found) + { + std::string name; + found = gDirUtilp->getNextFileInDir(path_name, "*.dic", name, false); + if (found) + { + names.push_back(dictName2FullName(name)); + } + } + return names; +} + +std::vector lggHunSpell_Wrapper::getInstalledDicts() +{ + std::vector toReturn; + //expecting short names to be stored... + std::vector shortNames = CSV2VEC(gSavedSettings.getString("SpellInstalled")); + for (int i =0; i < (int)shortNames.size(); i++) + { + toReturn.push_back(dictName2FullName(shortNames[i])); + } + return toReturn; +} + +std::vector lggHunSpell_Wrapper::getAvailDicts() +{ + std::vector toReturn; + std::vector dics = getExtraDicts(); + std::vector installedDics = getInstalledDicts(); + for (int i = 0; i < (int)dics.size(); i++) + { + bool found = false; + for (int j = 0; j < (int)installedDics.size(); j++) + { + if (0 == LLStringUtil::compareInsensitive(dics[i], installedDics[j])) + { + found = true;//this dic is already installed + } + } + if (0 == LLStringUtil::compareInsensitive(dics[i], currentBaseDic)) + { + found = true; + } + if (0 == LLStringUtil::compareInsensitive(dics[i], "custom")) + { + found = true; + } + if (!found) + { + toReturn.push_back(dics[i]); + } + } + return toReturn; +} + +std::vector lggHunSpell_Wrapper::CSV2VEC(std::string csv) +{ + std::vector toReturn; + boost::regex re(","); + boost::sregex_token_iterator i(csv.begin(), csv.end(), re, -1); + boost::sregex_token_iterator j; + while (i != j) + { + toReturn.push_back(*i++); + } + return toReturn; +} + +std::string lggHunSpell_Wrapper::VEC2CSV(std::vector vec) +{ + std::string toReturn(""); + if (vec.size() < 1) + { + return toReturn; + } + + for (int i = 0;i < (int)vec.size() ;i++) + { + toReturn += vec[i] + ","; + } + return toReturn.erase(toReturn.length()-1); +} + +void lggHunSpell_Wrapper::addButton(std::string selection) +{ + if (selection.empty()) + { + return; + } + addDictionary(selection); + std::vector alreadyInstalled = CSV2VEC(gSavedSettings.getString("SpellInstalled")); + alreadyInstalled.push_back(fullName2DictName(selection)); + gSavedSettings.setString("SpellInstalled", VEC2CSV(alreadyInstalled)); +} + +void lggHunSpell_Wrapper::removeButton(std::string selection) +{ + if (selection.empty()) + { + return; + } + std::vector newInstalledDics; + std::vector currentlyInstalled = getInstalledDicts(); + for (int i = 0; i < (int)currentlyInstalled.size(); i++) + { + if (0 != LLStringUtil::compareInsensitive(selection, currentlyInstalled[i])) + { + newInstalledDics.push_back(fullName2DictName(currentlyInstalled[i])); + } + } + gSavedSettings.setString("SpellInstalled", VEC2CSV(newInstalledDics)); + processSettings(); +} + +void lggHunSpell_Wrapper::newDictSelection(std::string selection) +{ + currentBaseDic = selection; + gSavedSettings.setString("SpellBase", selection); + //better way to do this would be to check and see if there is a installed conflict + //and then only remove that one.. messy + gSavedSettings.setString("SpellInstalled", "en_sl"); + processSettings(); +} + +void lggHunSpell_Wrapper::getMoreButton(void* data) +{ + std::vector shortNames; + std::vector longNames; + LLSD response = LLHTTPClient::blockingGet(gSavedSettings.getString("SpellDownloadURL")+"dic_list.xml"); + if (response.has("body")) + { + const LLSD &dict_list = response["body"]; + if (dict_list.has("isComplete")) + { + LLSD dics = dict_list["data"]; + for (int i = 0; i < dics.size(); i++) + { + std::string dicFullName = dictName2FullName(dics[i].asString()); + longNames.push_back(dicFullName); + shortNames.push_back(fullName2DictName(dicFullName)); + } + LggDicDownload::show(true,shortNames,longNames, data); + } + } +} + +void lggHunSpell_Wrapper::editCustomButton() +{ + std::string dicdicpath(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "dictionaries", std::string("custom.dic")).c_str()); + + if (!gDirUtilp->fileExists(dicdicpath)) + { + createCustomDic(); + //glggHunSpell->addWordToCustomDictionary("temp"); + } + + gViewerWindow->getWindow()->ShellEx(dicdicpath); +} + +void lggHunSpell_Wrapper::setSpellCheckHighlight(BOOL highlight) +{ + gSavedSettings.setBOOL("SpellDisplay", highlight); +} diff --git a/indra/newview/lgghunspell_wrapper.h b/indra/newview/lgghunspell_wrapper.h new file mode 100644 index 000000000..51c1f37a7 --- /dev/null +++ b/indra/newview/lgghunspell_wrapper.h @@ -0,0 +1,75 @@ +/* Copyright (C) 2009 LordGregGreg Back + + This is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of + the License, or (at your option) any later version. + + This 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 General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the viewer; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#ifndef ASPELL_WRAPPER +#define ASPELL_WRAPPER 1 + +#if LL_WINDOWS +#include "hunspell/hunspelldll.h" +#else +#include "hunspell/hunspell.hxx" +#endif + +class lggHunSpell_Wrapper +{ + +public: + static Hunspell* myHunspell; + + static void initSettings(); + void processSettings(); + + std::vector getAvailDicts(); + std::vector getInstalledDicts(); + std::vector getDicts(); + std::vector getExtraDicts(); + void addDictionary(std::string additionalDictionary); + void addWordToCustomDictionary(std::string wordToAdd); + void addButton(std::string selection); + void removeButton(std::string selection); + void editCustomButton(); + void newDictSelection(std::string selection); + void getMoreButton(void * data); + static std::string dictName2FullName(std::string dictName); + static std::string fullName2DictName(std::string fullName); + void setNewDictionary(std::string newDict); + BOOL isSpelledRight(std::string wordToCheck); + std::vector getSuggestionList(std::string badWord); + S32 findNextError(std::string haystack, int startAt); + + std::vector CSV2VEC(std::string csv); + std::string VEC2CSV(std::vector vec); + + void setSpellCheckHighlight(BOOL highlight); + BOOL getSpellCheckHighlight(); + +private: + void createCustomDic(); + std::string getCorrectPath(std::string file); + lggHunSpell_Wrapper(); + ~lggHunSpell_Wrapper(); + + void debugTest(std::string testWord);//prints out debug about testing the word + std::string currentBaseDic; + //std::vector languageCodes; + //std::vector countryCodes; +// BOOL* mSpellCheckHighlight; +}; + +extern lggHunSpell_Wrapper* glggHunSpell; // the singleton hunspell wrapper + +#endif diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index ba101cdf9..77dd4d023 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -7,7 +7,7 @@ ## - Avoids using any OpenAL audio driver. #export LL_BAD_OPENAL_DRIVER=x ## - Avoids using any FMOD audio driver. -export LL_BAD_FMOD_DRIVER=x +#export LL_BAD_FMOD_DRIVER=x ## - Avoids using the FMOD ESD audio driver. #export LL_BAD_FMOD_ESD=x @@ -45,6 +45,7 @@ export LL_BAD_FMOD_DRIVER=x ## disable these by enabling this option: #export LL_DISABLE_GSTREAMER=x + ## Everything below this line is just for advanced troubleshooters. ##------------------------------------------------------------------- @@ -53,15 +54,8 @@ export LL_BAD_FMOD_DRIVER=x ## you're building your own viewer, bear in mind that the executable ## in the bin directory will be stripped: you should replace it with ## an unstripped binary before you run. -## -## I keep crashing without having GDB running, always run it if an -## environment variable is set. - -if [ -n "$ASCENDED_DEVELOPER" ]; then -# export LL_WRAPPER='cgdb --args' - export LL_WRAPPER='gdb --args' -# export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp' -fi +#export LL_WRAPPER='gdb --args' +#export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp' ## - Avoids an often-buggy X feature that doesn't really benefit us anyway. export SDL_VIDEO_X11_DGAMOUSE=0 @@ -74,13 +68,6 @@ if [ "$GTK_IM_MODULE" = "scim" ]; then export GTK_IM_MODULE=xim fi -# Work around for a crash bug when restarting OpenGL after a change in the -# graphic settings (anti-aliasing, VBO, FSAA, full screen mode, UI scale). -# When you enable this work around, you can change the settings without -# crashing, but you will have to restart the viewer after changing them -# because the display still gets corrupted. -export LL_OPENGL_RESTART_CRASH_BUG=x - ## - Automatically work around the ATI mouse cursor crash bug: ## (this workaround is disabled as most fglrx users do not see the bug) #if lsmod | grep fglrx &>/dev/null ; then @@ -121,7 +108,13 @@ if [ -n "$LL_TCMALLOC" ]; then fi export VIEWER_BINARY='singularity-do-not-run-directly' -export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla-runtime-linux-i686:"${LD_LIBRARY_PATH}"' +BINARY_TYPE=$(expr match "$(file -b bin/$VIEWER_BINARY)" '\(.*executable\)') +if [ "${BINARY_TYPE}" == "ELF 64-bit LSB executable" ]; then + export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib64:"`pwd`"/lib32:"${LD_LIBRARY_PATH}"' +else + export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"' +fi + export SL_CMD='$LL_WRAPPER bin/$VIEWER_BINARY' export SL_OPT="`cat gridargs.dat` $@" @@ -134,27 +127,7 @@ if [ -n "$LL_RUN_ERR" ]; then if [ "$LL_RUN_ERR" = "runerr" ]; then # generic error running the binary echo '*** Bad shutdown. ***' - BINARY_TYPE=$(expr match "$(file -b ${RUN_PATH}/bin/SLPlugin)" '\(.*executable\)') - BINARY_SYSTEM=$(expr match "$(file -b /bin/uname)" '\(.*executable\)') - if [ "${BINARY_SYSTEM}" == "ELF 64-bit LSB executable" -a "${BINARY_TYPE}" == "ELF 32-bit LSB executable" ]; then - echo - cat << EOFMARKER -You are running the Second Life Viewer on a x86_64 platform. The -most common problems when launching the Viewer (particularly -'bin/$VIEWER_BINARY: not found' and 'error while -loading shared libraries') may be solved by installing your Linux -distribution's 32-bit compatibility packages. -For example, on Ubuntu and other Debian-based Linuxes you might run: -$ sudo apt-get install ia32-libs ia32-libs-gtk ia32-libs-kde ia32-libs-sdl -EOFMARKER - fi + + fi fi - - -echo -echo '*******************************************************' -echo 'This is a BETA release of the Second Life linux client.' -echo 'Thank you for testing!' -echo 'Please see README-linux.txt before reporting problems.' -echo diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 5917d402f..49dee2357 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -7306,7 +7306,8 @@ void LLAgent::createStandardWearables(BOOL female) TRUE, //WT_UNDERPANTS FALSE, //WT_SKIRT FALSE, //WT_ALPHA - FALSE //WT_TATTOO + FALSE, //WT_TATTOO + FALSE, //WT_PHYSICS }; for( S32 i=0; i < WT_COUNT; i++ ) @@ -7732,6 +7733,8 @@ void LLAgent::sendAgentSetAppearance() } + static bool send_physics_params = false; + send_physics_params |= !!getWearable(WT_PHYSICS); S32 transmitted_params = 0; for (LLViewerVisualParam* param = (LLViewerVisualParam*)mAvatarObject->getFirstVisualParam(); param; @@ -7739,11 +7742,16 @@ void LLAgent::sendAgentSetAppearance() { if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) // do not transmit params of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT { + //A hack to prevent ruthing on older viewers when phys wearables aren't being worn. + if(!send_physics_params && param->getID() >= 10000) + { + break; + } msg->nextBlockFast(_PREHASH_VisualParam ); - // We don't send the param ids. Instead, we assume that the receiver has the same params in the same sequence. const F32 param_value = param->getWeight(); const U8 new_weight = F32_to_U8(param_value, param->getMinWeight(), param->getMaxWeight()); + msg->addU8Fast(_PREHASH_ParamValue, new_weight ); transmitted_params++; } @@ -7885,6 +7893,30 @@ struct LLSetWearableData LLWearable* mNewWearable; }; +static bool isFirstPhysicsWearable(EWearableType type, LLInventoryItem *new_item, LLWearable *new_wearable) +{ + if (type == WT_PHYSICS && gSavedSettings.getWarning("FirstPhysicsWearable")) + { + class WearableDelayedCallback + { + public: + static void setDelayedWearable( const LLSD& notification, const LLSD& response, LLUUID item_id, LLWearable *wearable ) + { + if(LLNotification::getSelectedOption(notification, response) == 0) //User selected wear + { + gSavedSettings.setWarning("FirstPhysicsWearable",FALSE); + LLInventoryItem *item = gInventory.getItem(item_id); + if(item) + gAgent.setWearable(item,wearable); //re-enter. + } + } + }; + LLNotifications::instance().add("FirstPhysicsWearable",LLSD(),LLSD(),boost::bind(WearableDelayedCallback::setDelayedWearable, _1, _2, new_item->getUUID(),new_wearable)); + return true; + } + return false; +} + BOOL LLAgent::needsReplacement(EWearableType wearableType, S32 remove) { return TRUE; @@ -7918,6 +7950,7 @@ void LLAgent::setWearableOutfit( wearables_to_remove[WT_SKIRT] = remove && gRlvWearableLocks.canRemove(WT_SKIRT); wearables_to_remove[WT_ALPHA] = remove && gRlvWearableLocks.canRemove(WT_ALPHA); wearables_to_remove[WT_TATTOO] = remove && gRlvWearableLocks.canRemove(WT_TATTOO); + wearables_to_remove[WT_PHYSICS] = remove && gRlvWearableLocks.canRemove(WT_PHYSICS); // [/RLVa:KB] S32 count = wearables.count(); @@ -7953,6 +7986,11 @@ void LLAgent::setWearableOutfit( } } + if (isFirstPhysicsWearable(type, new_item, new_wearable)) + { + return; + } + mWearableEntry[ type ].mItemID = new_item->getUUID(); mWearableEntry[ type ].mWearable = new_wearable; } @@ -8017,6 +8055,11 @@ void LLAgent::setWearable( LLInventoryItem* new_item, LLWearable* new_wearable ) } // [/RLVa:KB] + if (isFirstPhysicsWearable(type, new_item, new_wearable)) + { + return; + } + if( old_wearable ) { const LLUUID& old_item_id = mWearableEntry[ type ].mItemID; @@ -8199,6 +8242,7 @@ void LLAgent::userRemoveAllClothesStep2( BOOL proceed, void* userdata ) gAgent.removeWearable( WT_SKIRT ); gAgent.removeWearable( WT_ALPHA ); gAgent.removeWearable( WT_TATTOO ); + gAgent.removeWearable( WT_PHYSICS ); } } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index dff8e1b30..420a9ae67 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -44,7 +44,7 @@ #include "lltexteditor.h" #include "llalertdialog.h" #include "llerrorcontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llgroupmgr.h" #include "llagent.h" #include "llwindow.h" @@ -429,6 +429,7 @@ static void settings_to_globals() LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor"); LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor"); LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor"); + LLVOAvatar::sPhysicsLODFactor = gSavedSettings.getF32("RenderAvatarPhysicsLODFactor"); LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible"); LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible"); // clamp auto-open time to some minimum usable value @@ -567,7 +568,10 @@ bool LLAppViewer::init() gDirUtilp->setSkinFolder("default"); initLogging(); - + + // Logging is initialized. Now it's safe to start the error thread. + startErrorThread(); + // gDeleteScheduler = new LLDeleteScheduler(); gBuildNewViewsScheduler = new LLBuildNewViewsScheduler(); @@ -652,7 +656,8 @@ bool LLAppViewer::init() &gColors, LLUIImageList::getInstance(), ui_audio_callback, - &LLUI::sGLScaleFactor); + &LLUI::sGLScaleFactor + ); LLWeb::initClass(); // do this after LLUI LLTextEditor::setURLCallbacks(&LLWeb::loadURL, @@ -855,7 +860,7 @@ bool LLAppViewer::mainLoop() //------------------------------------------- // Create IO Pump to use for HTTP Requests. - gServicePump = new LLPumpIO(gAPRPoolp); + gServicePump = new LLPumpIO; LLHTTPClient::setPump(*gServicePump); LLCurl::setCAFile(gDirUtilp->getCAFile()); @@ -1118,16 +1123,6 @@ bool LLAppViewer::mainLoop() bool LLAppViewer::cleanup() { - //---------------------------------------------- - //this test code will be removed after the test - //test manual call stack tracer - if(gSavedSettings.getBOOL("QAMode")) - { - LLError::LLCallStacks::print() ; - } - //end of the test code - //---------------------------------------------- - //flag all elements as needing to be destroyed immediately // to ensure shutdown order LLMortician::setZealous(TRUE); @@ -1425,12 +1420,12 @@ bool LLAppViewer::cleanup() sImageDecodeThread = NULL; //Note: - //LLViewerMedia::cleanupClass() has to be put before gImageList.shutdown() + //LLViewerMedia::cleanupClass() has to be put before gTextureList.shutdown() //because some new image might be generated during cleaning up media. --bao LLViewerMediaFocus::cleanupClass(); LLViewerMedia::cleanupClass(); LLViewerParcelMedia::cleanupClass(); - gImageList.shutdown(); // shutdown again in case a callback added something + gTextureList.shutdown(); // shutdown again in case a callback added something LLUIImageList::getInstance()->cleanUp(); // This should eventually be done in LLAppViewer @@ -1586,8 +1581,9 @@ bool LLAppViewer::initLogging() return true; } -bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, - bool set_defaults) +bool LLAppViewer::loadSettingsFromDirectory(AIReadAccess const& settings_r, + std::string const& location_key, + bool set_defaults) { // Find and vet the location key. if(!mSettingsLocationList.has(location_key)) @@ -1614,11 +1610,13 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, LLSD files = location.get("Files"); for(LLSD::map_iterator itr = files.beginMap(); itr != files.endMap(); ++itr) { - std::string settings_group = (*itr).first; + std::string const settings_group = (*itr).first; + settings_map_type::const_iterator const settings_group_iter = settings_r->find(settings_group); + llinfos << "Attempting to load settings for the group " << settings_group << " - from location " << location_key << llendl; - if(gSettings.find(settings_group) == gSettings.end()) + if(settings_group_iter == settings_r->end()) { llwarns << "No matching settings group for name " << settings_group << llendl; continue; @@ -1632,11 +1630,10 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, std::string custom_name_setting = file.get("NameFromSetting"); // *NOTE: Regardless of the group currently being lodaed, // this setting is always read from the Global settings. - if(gSettings[sGlobalSettingsName]->controlExists(custom_name_setting)) + LLControlGroup const* control_group = settings_r->find(sGlobalSettingsName)->second; + if(control_group->controlExists(custom_name_setting)) { - std::string file_name = - gSettings[sGlobalSettingsName]->getString(custom_name_setting); - full_settings_path = file_name; + full_settings_path = control_group->getString(custom_name_setting); } } @@ -1652,7 +1649,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, requirement = file.get("Requirement").asInteger(); } - if(!gSettings[settings_group]->loadFromFile(full_settings_path, set_defaults)) + if(!settings_group_iter->second->loadFromFile(full_settings_path, set_defaults)) { if(requirement == 1) { @@ -1694,10 +1691,14 @@ std::string LLAppViewer::getSettingsFilename(const std::string& location_key, bool LLAppViewer::initConfiguration() { + // Grab and hold write locks for the entire duration of this function. + AIWriteAccess settings_w(gSettings); + settings_map_type& settings(*settings_w); + //Set up internal pointers - gSettings[sGlobalSettingsName] = &gSavedSettings; - gSettings[sPerAccountSettingsName] = &gSavedPerAccountSettings; - gSettings[sCrashSettingsName] = &gCrashSettings; + settings[sGlobalSettingsName] = &gSavedSettings; + settings[sPerAccountSettingsName] = &gSavedPerAccountSettings; + settings[sCrashSettingsName] = &gCrashSettings; //Load settings files list std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml"); @@ -1722,7 +1723,7 @@ bool LLAppViewer::initConfiguration() // - load defaults bool set_defaults = true; - if(!loadSettingsFromDirectory("Default", set_defaults)) + if(!loadSettingsFromDirectory(settings_w, "Default", set_defaults)) { std::ostringstream msg; msg << "Second Life could not load its default settings file. \n" @@ -1789,6 +1790,7 @@ bool LLAppViewer::initConfiguration() LLFirstUse::addConfigVariable("FirstSculptedPrim"); LLFirstUse::addConfigVariable("FirstVoice"); LLFirstUse::addConfigVariable("FirstMedia"); + LLFirstUse::addConfigVariable("FirstPhysicsWearable"); // [RLVa:KB] - Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a //LLFirstUse::addConfigVariable(RLV_SETTING_FIRSTUSE_DETACH); @@ -1838,7 +1840,7 @@ bool LLAppViewer::initConfiguration() } // - load overrides from user_settings - loadSettingsFromDirectory("User"); + loadSettingsFromDirectory(settings_w, "User"); // - apply command line settings clp.notify(); @@ -1918,7 +1920,7 @@ bool LLAppViewer::initConfiguration() { const std::string& name = *itr; const std::string& value = *(++itr); - LLControlVariable* c = gSettings[sGlobalSettingsName]->getControl(name); + LLControlVariable* c = settings[sGlobalSettingsName]->getControl(name); if(c) { c->setValue(value, false); @@ -3210,12 +3212,15 @@ void LLAppViewer::saveFinalSnapshot() gSavedSettings.setBOOL("ShowParcelOwners", FALSE); idle(); - std::string snap_filename = gDirUtilp->getLindenUserDir(); - snap_filename += gDirUtilp->getDirDelimiter(); - snap_filename += SCREEN_LAST_FILENAME; - // use full pixel dimensions of viewer window (not post-scale dimensions) - gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, TRUE); - mSavedFinalSnapshot = TRUE; + std::string snap_filename = gDirUtilp->getLindenUserDir(true); + if (!snap_filename.empty()) + { + snap_filename += gDirUtilp->getDirDelimiter(); + snap_filename += SCREEN_LAST_FILENAME; + // use full pixel dimensions of viewer window (not post-scale dimensions) + gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, TRUE); + mSavedFinalSnapshot = TRUE; + } } } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 14a39a6f9..933d4150a 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -33,7 +33,8 @@ #ifndef LL_LLAPPVIEWER_H #define LL_LLAPPVIEWER_H -#include "llsys.h" // LLOSInfo +#include "llsys.h" // LLOSInfo +#include "llviewercontrol.h" // settings_map_type class LLTextureCache; class LLImageDecodeThread; @@ -140,11 +141,12 @@ public: // Load settings from the location specified by loction_key. // Key availale and rules for loading, are specified in // 'app_settings/settings_files.xml' - bool loadSettingsFromDirectory(const std::string& location_key, - bool set_defaults = false); + bool loadSettingsFromDirectory(AIReadAccess const& settings_r, + std::string const& location_key, + bool set_defaults = false); - std::string getSettingsFilename(const std::string& location_key, - const std::string& file); + std::string getSettingsFilename(std::string const& location_key, + std::string const& file); // For thread debugging. // llstartup needs to control init. diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index bb9d61394..a19ad5658 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -139,6 +139,7 @@ int main( int argc, char **argv ) } delete viewer_app_ptr; viewer_app_ptr = NULL; + return 0; } diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 67fc17d28..b7bb39a74 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -119,6 +119,7 @@ int main( int argc, char **argv ) } delete viewer_app_ptr; viewer_app_ptr = NULL; + return 0; } diff --git a/indra/newview/llassetconverter.cpp b/indra/newview/llassetconverter.cpp index 3fec62779..73da5cd26 100644 --- a/indra/newview/llassetconverter.cpp +++ b/indra/newview/llassetconverter.cpp @@ -4,7 +4,7 @@ #include "llapr.h" #include "llvfile.h" #include "llassetconverter.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llvorbisencode.h" #include "llbvhloader.h" // static @@ -18,7 +18,7 @@ LLAssetType::EType LLAssetConverter::convert(std::string src_filename, std::stri else if(exten == "bmp") { asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerImageList::createUploadFile(src_filename, + if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_BMP )) { @@ -28,7 +28,7 @@ LLAssetType::EType LLAssetConverter::convert(std::string src_filename, std::stri else if( exten == "tga") { asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerImageList::createUploadFile(src_filename, + if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_TGA )) { @@ -38,7 +38,7 @@ LLAssetType::EType LLAssetConverter::convert(std::string src_filename, std::stri else if( exten == "jpg" || exten == "jpeg") { asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerImageList::createUploadFile(src_filename, + if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_JPEG )) { @@ -48,7 +48,7 @@ LLAssetType::EType LLAssetConverter::convert(std::string src_filename, std::stri else if( exten == "png") { asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerImageList::createUploadFile(src_filename, + if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_PNG )) { @@ -144,7 +144,7 @@ LLAssetType::EType LLAssetConverter::convert(std::string src_filename, std::stri return LLAssetType::AT_NONE; } } - else if(exten == "eyes" || exten == "gloves" || exten == "hair" || exten == "jacket" || exten == "pants" || exten == "shape" || exten == "shirt" || exten == "shoes" || exten == "skin" || exten == "skirt" || exten == "socks" || exten == "underpants" || exten == "undershirt" || exten == "bodypart" || exten == "clothing") + else if(exten == "eyes" || exten == "gloves" || exten == "hair" || exten == "jacket" || exten == "pants" || exten == "shape" || exten == "shirt" || exten == "shoes" || exten == "skin" || exten == "skirt" || exten == "socks" || exten == "underpants" || exten == "undershirt" || exten == "bodypart" || exten == "clothing" || exten == "physics") { asset_type = LLAssetType::AT_CLOTHING; if(!copyFile(src_filename, filename)) diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 77f95b24a..042a53632 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -279,7 +279,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) mPostData["name"].asString(), mPostData["description"].asString(), LLSaleInfo::DEFAULT, - LLInventoryItem::II_FLAGS_NONE, + LLInventoryItemFlags::II_FLAGS_NONE, creation_date_now); gInventory.updateItem(item); gInventory.notifyObservers(); diff --git a/indra/newview/llaudiosourcevo.cpp b/indra/newview/llaudiosourcevo.cpp index 7c3080c2d..9f43f3e3f 100644 --- a/indra/newview/llaudiosourcevo.cpp +++ b/indra/newview/llaudiosourcevo.cpp @@ -40,9 +40,9 @@ #include "llviewerparcelmgr.h" LLAudioSourceVO::LLAudioSourceVO(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, LLViewerObject *objectp) -// -// : LLAudioSource(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX), - : LLAudioSource(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, objectp->getID(), false), +// +// : LLAudioSource(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX), + : LLAudioSource(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, objectp->getID(), false), // mObjectp(objectp) { diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 265a65931..1d4ff5770 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -48,7 +48,7 @@ #include "lltextbox.h" #include "llfloatercolorpicker.h" #include "llviewborder.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llfocusmgr.h" static LLRegisterWidget r("color_swatch"); @@ -236,7 +236,7 @@ void LLColorSwatchCtrl::draw() { if (!mFallbackImageName.empty()) { - LLPointer fallback_image = gImageList.getImageFromFile(mFallbackImageName); + LLPointer fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName); if( fallback_image->getComponents() == 4 ) { gl_rect_2d_checkerboard( interior ); diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h index 0dd021f51..4d4b42bfe 100644 --- a/indra/newview/llcolorswatch.h +++ b/indra/newview/llcolorswatch.h @@ -36,7 +36,7 @@ #include "lluictrl.h" #include "v4color.h" #include "llfloater.h" -#include "llviewerimage.h" +#include "llviewertexture.h" // // Classes @@ -44,7 +44,6 @@ class LLColor4; class LLTextBox; class LLFloaterColorPicker; -class LLViewerImage; class LLColorSwatchCtrl : public LLUICtrl diff --git a/indra/newview/llcompass.cpp b/indra/newview/llcompass.cpp index 1019d8146..be4db43a8 100644 --- a/indra/newview/llcompass.cpp +++ b/indra/newview/llcompass.cpp @@ -43,8 +43,7 @@ #include "llagent.h" #include "llcompass.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewercontrol.h" #include "llviewercamera.h" @@ -76,12 +75,12 @@ LLCompass::LLCompass( const std::string& name, const LLRect& rect) void LLCompass::setTexture(LLUUID image_id) { - mTexture = gImageList.getImage(image_id, FALSE, TRUE); + mTexture = LLViewerTextureManager::getFetchedTexture(image_id, FALSE, LLViewerTexture::BOOST_UI); } void LLCompass::setBkgndTexture(LLUUID image_id) { - mBkgndTexture = gImageList.getImage(image_id, FALSE, TRUE); + mBkgndTexture = LLViewerTextureManager::getFetchedTexture(image_id, FALSE, LLViewerTexture::BOOST_UI); } // @@ -107,5 +106,5 @@ LLHorizontalCompass::LLHorizontalCompass( const std::string& name, const LLRect& void LLHorizontalCompass::setTexture( const LLUUID& image_id ) { - mTexture = gImageList.getImage(image_id, FALSE, TRUE); + mTexture = LLViewerTextureManager::getFetchedTexture(image_id, FALSE, LLViewerTexture::BOOST_UI); } diff --git a/indra/newview/llcompass.h b/indra/newview/llcompass.h index bd821bdda..1734a8a42 100644 --- a/indra/newview/llcompass.h +++ b/indra/newview/llcompass.h @@ -35,7 +35,7 @@ #include "llmath.h" #include "llview.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #ifndef LL_V4COLOR_H #include "v4color.h" #endif @@ -43,8 +43,8 @@ class LLCompass : public LLView { protected: - LLPointer mTexture; - LLPointer mBkgndTexture; + LLPointer mTexture; + LLPointer mBkgndTexture; public: LLCompass( const std::string& name, const LLRect& rect); @@ -77,7 +77,7 @@ class LLHorizontalCompass : public LLView { protected: LLColor4 mFocusColor; - LLPointer mTexture; + LLPointer mTexture; public: LLHorizontalCompass( const std::string& name, const LLRect& rect, diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index 689033a07..3d01eeff3 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -144,7 +144,7 @@ LLFloaterScriptQueue* LLFloaterScriptQueue::findInstance(const LLUUID& id) // worked on. // NOT static, virtual! void LLFloaterScriptQueue::inventoryChanged(LLViewerObject* viewer_object, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32, void* q_id) { @@ -353,7 +353,7 @@ LLFloaterCompileQueue::~LLFloaterCompileQueue() } void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object, - InventoryObjectList* inv) + LLInventoryObject::object_list_t* inv) { // find all of the lsl, leaving off duplicates. We'll remove // all matching asset uuids on compilation success. @@ -361,8 +361,8 @@ void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object, typedef std::multimap > uuid_item_map; uuid_item_map asset_item_map; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) @@ -678,14 +678,14 @@ LLFloaterResetQueue::~LLFloaterResetQueue() } void LLFloaterResetQueue::handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv) + LLInventoryObject::object_list_t* inv) { // find all of the lsl, leaving off duplicates. We'll remove // all matching asset uuids on compilation success. LLDynamicArray names; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) @@ -740,14 +740,14 @@ LLFloaterRunQueue::~LLFloaterRunQueue() } void LLFloaterRunQueue::handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv) + LLInventoryObject::object_list_t* inv) { // find all of the lsl, leaving off duplicates. We'll remove // all matching asset uuids on compilation success. LLDynamicArray names; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) @@ -804,14 +804,14 @@ LLFloaterNotRunQueue::~LLFloaterNotRunQueue() } void LLFloaterNotRunQueue::handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv) + LLInventoryObject::object_list_t* inv) { // find all of the lsl, leaving off duplicates. We'll remove // all matching asset uuids on compilation success. LLDynamicArray names; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) diff --git a/indra/newview/llcompilequeue.h b/indra/newview/llcompilequeue.h index 51240423b..25b001e30 100644 --- a/indra/newview/llcompilequeue.h +++ b/indra/newview/llcompilequeue.h @@ -76,13 +76,13 @@ protected: // This is the callback method for the viewer object currently // being worked on. /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* queue); // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv) = 0; + LLInventoryObject::object_list_t* inv) = 0; static void onCloseBtn(void* user_data); @@ -149,7 +149,7 @@ protected: // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); // This is the callback for when each script arrives static void scriptArrived(LLVFS *vfs, const LLUUID& asset_id, @@ -201,7 +201,7 @@ protected: // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); protected: }; @@ -225,7 +225,7 @@ protected: // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); protected: }; @@ -249,7 +249,7 @@ protected: // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); protected: }; diff --git a/indra/newview/llconsole.cpp b/indra/newview/llconsole.cpp index aeea9d517..937ccec24 100644 --- a/indra/newview/llconsole.cpp +++ b/indra/newview/llconsole.cpp @@ -41,8 +41,7 @@ #include "llfontgl.h" #include "llgl.h" #include "llui.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerwindow.h" #include "lltextparser.h" #include "llsd.h" @@ -69,8 +68,7 @@ LLConsole::LLConsole(const std::string& name, const LLRect &rect, mFadeTime(persist_time - FADE_DURATION), mFont(LLFontGL::getFontSansSerif()), mConsoleWidth(0), - mConsoleHeight(0), - mQueueMutex(NULL) + mConsoleHeight(0) { mTimer.reset(); diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index eeeac9a93..8b2aac6e9 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -90,7 +90,7 @@ LLDebugView::LLDebugView(const std::string& name, const LLRect &rect) mMemoryView->setVisible(FALSE); // start invisible addChild(mMemoryView); - r.set(150, rect.getHeight() - 50, 820, 100); + r.set(150, rect.getHeight() - 50, 870, 100); gTextureView = new LLTextureView("gTextureView", r); gTextureView->setRect(r); gTextureView->setFollowsBottom(); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index bc1ccfc10..e8d6daca4 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -229,7 +229,7 @@ S32 LLDrawable::findReferences(LLDrawable *drawablep) return count; } -LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerImage *texturep) +LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep) { LLMemType mt(LLMemType::MTYPE_DRAWABLE); @@ -253,7 +253,7 @@ LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerImage *texturep) return face; } -LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerImage *texturep) +LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep) { LLMemType mt(LLMemType::MTYPE_DRAWABLE); @@ -275,7 +275,7 @@ LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerImage *texturep) } -void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerImage *texturep) +void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep) { if (newFaces == (S32)mFaces.size()) { @@ -298,7 +298,7 @@ void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerImag llassert_always(mFaces.size() == newFaces); } -void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewerImage *texturep) +void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep) { if (newFaces <= (S32)mFaces.size() && newFaces >= (S32)mFaces.size()/2) { @@ -704,8 +704,8 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update) { LLVector3 box = (facep->mExtents[1] - facep->mExtents[0]) * 0.25f; LLVector3 v = (facep->mCenterLocal-camera.getOrigin()); - LLVector3 at = camera.getAtAxis(); - for (U32 j = 0; j < 3; j++) + const LLVector3& at = camera.getAtAxis(); + for (U32 j = 0; j < 3; j++) { v.mV[j] -= box.mV[j] * at.mV[j]; } diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index 47bbcf1c1..7202f3476 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -44,9 +44,7 @@ #include "llquaternion.h" #include "xform.h" #include "llmemtype.h" -#include "llprimitive.h" #include "lldarray.h" -#include "llstat.h" #include "llviewerobject.h" #include "llrect.h" #include "llappviewer.h" // for gFrameTimeSeconds @@ -55,11 +53,12 @@ class LLCamera; class LLDrawPool; class LLDrawable; class LLFace; +class LLFacePool; class LLSpatialGroup; class LLSpatialBridge; class LLSpatialPartition; class LLVOVolume; -class LLViewerImage; +class LLViewerTexture; // Can have multiple silhouettes for each object const U32 SILHOUETTE_HIGHLIGHT = 0; @@ -127,11 +126,11 @@ public: inline S32 getNumFaces() const; //void removeFace(const S32 i); // SJB: Avoid using this, it's slow - LLFace* addFace(LLFacePool *poolp, LLViewerImage *texturep); - LLFace* addFace(const LLTextureEntry *te, LLViewerImage *texturep); + LLFace* addFace(LLFacePool *poolp, LLViewerTexture *texturep); + LLFace* addFace(const LLTextureEntry *te, LLViewerTexture *texturep); void deleteFaces(S32 offset, S32 count); - void setNumFaces(const S32 numFaces, LLFacePool *poolp, LLViewerImage *texturep); - void setNumFacesFast(const S32 numFaces, LLFacePool *poolp, LLViewerImage *texturep); + void setNumFaces(const S32 numFaces, LLFacePool *poolp, LLViewerTexture *texturep); + void setNumFacesFast(const S32 numFaces, LLFacePool *poolp, LLViewerTexture *texturep); void mergeFaces(LLDrawable* src); void init(); diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 243c51eb9..0d41ab85f 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -60,7 +60,7 @@ S32 LLDrawPool::sNumDrawPools = 0; //============================= // Draw Pool Implementation //============================= -LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerImage *tex0) +LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerTexture *tex0) { LLDrawPool *poolp = NULL; switch (type) @@ -130,7 +130,7 @@ LLDrawPool::~LLDrawPool() } -LLViewerImage *LLDrawPool::getDebugTexture() +LLViewerTexture *LLDrawPool::getDebugTexture() { return NULL; } @@ -245,7 +245,7 @@ void LLFacePool::destroy() } } -void LLFacePool::dirtyTextures(const std::set& textures) +void LLFacePool::dirtyTextures(const std::set& textures) { } @@ -297,7 +297,7 @@ void LLFacePool::drawLoop() } void LLFacePool::renderFaceSelected(LLFace *facep, - LLImageGL *image, + LLViewerTexture *image, const LLColor4 &color, const S32 index_offset, const S32 index_count) { @@ -331,7 +331,7 @@ void LLFacePool::resetDrawOrders() mDrawFace.resize(0); } -LLViewerImage *LLFacePool::getTexture() +LLViewerTexture *LLFacePool::getTexture() { return NULL; } diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index f8c2ead5d..f92756ae3 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -39,8 +39,8 @@ #include "llvertexbuffer.h" class LLFace; -class LLImageGL; -class LLViewerImage; +class LLViewerTexture; +class LLViewerFetchedTexture; class LLSpatialGroup; class LLDrawInfo; @@ -78,7 +78,7 @@ public: S32 getId() const { return mId; } U32 getType() const { return mType; } - virtual LLViewerImage *getDebugTexture(); + virtual LLViewerTexture *getDebugTexture(); virtual void beginRenderPass( S32 pass ); virtual void endRenderPass( S32 pass ); virtual S32 getNumPasses(); @@ -104,9 +104,9 @@ public: virtual BOOL verify() const { return TRUE; } // Verify that all data in the draw pool is correct! virtual S32 getVertexShaderLevel() const { return mVertexShaderLevel; } - static LLDrawPool* createPool(const U32 type, LLViewerImage *tex0 = NULL); + static LLDrawPool* createPool(const U32 type, LLViewerTexture *tex0 = NULL); virtual LLDrawPool *instancePool() = 0; // Create an empty new instance of the pool. - virtual LLViewerImage* getTexture() = 0; + virtual LLViewerTexture* getTexture() = 0; virtual BOOL isFacePool() { return FALSE; } virtual void resetDrawOrders() = 0; @@ -129,6 +129,7 @@ public: PASS_FULLBRIGHT_SHINY, PASS_SHINY, PASS_BUMP, + PASS_POST_BUMP, PASS_GLOW, PASS_ALPHA, PASS_ALPHA_MASK, @@ -140,8 +141,8 @@ public: LLRenderPass(const U32 type); virtual ~LLRenderPass(); /*virtual*/ LLDrawPool* instancePool(); - /*virtual*/ LLViewerImage* getDebugTexture() { return NULL; } - LLViewerImage* getTexture() { return NULL; } + /*virtual*/ LLViewerTexture* getDebugTexture() { return NULL; } + LLViewerTexture* getTexture() { return NULL; } BOOL isDead() { return FALSE; } void resetDrawOrders() { } @@ -170,11 +171,11 @@ public: virtual void renderForSelect() = 0; BOOL isDead() { return mReferences.empty(); } - virtual void renderFaceSelected(LLFace *facep, LLImageGL *image, const LLColor4 &color, + virtual void renderFaceSelected(LLFace *facep, LLViewerTexture *image, const LLColor4 &color, const S32 index_offset = 0, const S32 index_count = 0); - virtual LLViewerImage *getTexture(); - virtual void dirtyTextures(const std::set& textures); + virtual LLViewerTexture *getTexture(); + virtual void dirtyTextures(const std::set& textures); virtual void enqueue(LLFace *face); virtual BOOL addFace(LLFace *face); diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index d3a326c93..08c430e62 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -46,7 +46,7 @@ #include "lldrawable.h" #include "llface.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" // For debugging +#include "llviewertexturelist.h" // For debugging #include "llviewerobjectlist.h" // For debugging #include "llviewerwindow.h" #include "pipeline.h" @@ -237,8 +237,8 @@ void LLDrawPoolAlpha::render(S32 pass) } gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); glColor4f(1,0,0,1); - LLViewerImage::sSmokeImagep->addTextureStats(1024.f*1024.f); - gGL.getTexUnit(0)->bind(LLViewerImage::sSmokeImagep.get(), TRUE); + LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f); + gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep.get(), TRUE); renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); } diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 97daff8aa..a6e43e5b5 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -650,7 +650,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) if (pass==1 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0)) { // debug code to draw a sphere in place of avatar - gGL.getTexUnit(0)->bind(LLViewerImage::sWhiteImagep.get()); + gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep.get()); gGL.setColorMask(true, true); LLVector3 pos = avatarp->getPositionAgent(); gGL.color4f(1.0f, 1.0f, 1.0f, 0.7f); @@ -839,7 +839,7 @@ void LLDrawPoolAvatar::renderForSelect() //----------------------------------------------------------------------------- // getDebugTexture() //----------------------------------------------------------------------------- -LLViewerImage *LLDrawPoolAvatar::getDebugTexture() +LLViewerTexture *LLDrawPoolAvatar::getDebugTexture() { if (mReferences.empty()) { diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index e12f5081f..fc5f9dbff 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -105,7 +105,7 @@ public: void endDeferredRigid(); void endDeferredSkinned(); - /*virtual*/ LLViewerImage *getDebugTexture(); + /*virtual*/ LLViewerTexture *getDebugTexture(); /*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display void renderAvatars(LLVOAvatar *single_avatar, S32 pass = -1); // renders only one avatar if single_avatar is not null. diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 486e909ac..6ca90c2be 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -37,7 +37,6 @@ #include "llstl.h" #include "llviewercontrol.h" #include "lldir.h" -#include "llimagegl.h" #include "m3math.h" #include "m4math.h" #include "v4math.h" @@ -51,7 +50,7 @@ #include "llsky.h" #include "lltextureentry.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "pipeline.h" #include "llspatialpartition.h" #include "llviewershadermgr.h" @@ -95,7 +94,16 @@ void LLStandardBumpmap::shutdown() // static void LLStandardBumpmap::restoreGL() { - llassert( LLStandardBumpmap::sStandardBumpmapCount == 0 ); + addstandard(); +} + +// static +void LLStandardBumpmap::addstandard() +{ + // can't assert; we destroyGL and restoreGL a lot during *first* startup, which populates this list already, THEN we explicitly init the list as part of *normal* startup. Sigh. So clear the list every time before we (re-)add the standard bumpmaps. + //llassert( LLStandardBumpmap::sStandardBumpmapCount == 0 ); + clear(); + llinfos << "Adding standard bumpmaps." << llendl; gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount++] = LLStandardBumpmap("None"); // BE_NO_BUMP gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount++] = LLStandardBumpmap("Brightness"); // BE_BRIGHTNESS gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount++] = LLStandardBumpmap("Darkness"); // BE_DARKNESS @@ -127,9 +135,9 @@ void LLStandardBumpmap::restoreGL() { // *NOTE: This buffer size is hard coded into scanf() below. char label[2048] = ""; /* Flawfinder: ignore */ - char bump_file[2048] = ""; /* Flawfinder: ignore */ + char bump_image_id[2048] = ""; /* Flawfinder: ignore */ fields_read = fscanf( /* Flawfinder: ignore */ - file, "\n%2047s %2047s", label, bump_file); + file, "\n%2047s %2047s", label, bump_image_id); if( EOF == fields_read ) { break; @@ -139,16 +147,19 @@ void LLStandardBumpmap::restoreGL() llwarns << "Bad LLStandardBumpmap entry" << llendl; return; } - + if(strlen(bump_image_id) == (UUID_STR_LENGTH - 1) + 4 && !stricmp(&(bump_image_id[UUID_STR_LENGTH-1]),".j2c")) + bump_image_id[UUID_STR_LENGTH-1] = 0; // truncate to a valid uuid (hopefully) // llinfos << "Loading bumpmap: " << bump_file << " from viewerart" << llendl; gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mLabel = label; gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage = - gImageList.getImageFromFile(bump_file, + LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id), TRUE, - FALSE, + LLViewerTexture::BOOST_NONE, + LLViewerTexture::LOD_TEXTURE, 0, - 0); - gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL ); + 0); + gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLViewerTexture::BOOST_BUMP) ; + gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL ); LLStandardBumpmap::sStandardBumpmapCount++; } @@ -156,8 +167,9 @@ void LLStandardBumpmap::restoreGL() } // static -void LLStandardBumpmap::destroyGL() +void LLStandardBumpmap::clear() { + llinfos << "Clearing standard bumpmaps." << llendl; for( U32 i = 0; i < LLStandardBumpmap::sStandardBumpmapCount; i++ ) { gStandardBumpmapList[i].mLabel.assign(""); @@ -166,6 +178,12 @@ void LLStandardBumpmap::destroyGL() sStandardBumpmapCount = 0; } +// static +void LLStandardBumpmap::destroyGL() +{ + clear(); +} + //////////////////////////////////////////////////////////////// @@ -570,27 +588,25 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL // static BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel) { - LLImageGL* bump = NULL; + LLViewerTexture* bump = NULL; U8 bump_code = params.mBump; - LLViewerImage* tex = params.mTexture; + + //Note: texture atlas does not support bump texture now. + LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(params.mTexture) ; + if(!tex) + { + //if the texture is not a fetched texture + return FALSE; + } switch( bump_code ) { - case BE_NO_BUMP: - bump = NULL; + case BE_NO_BUMP: break; case BE_BRIGHTNESS: case BE_DARKNESS: - if( tex ) - { - if(tex->getID()== IMG_DEFAULT) - { - return TRUE; - } - - bump = gBumpImageList.getBrightnessDarknessImage( tex, bump_code ); - } + bump = gBumpImageList.getBrightnessDarknessImage( tex, bump_code ); break; default: @@ -621,9 +637,9 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel) } //static -void LLDrawPoolBump::beginBump() +void LLDrawPoolBump::beginBump(U32 pass) { - if (!gPipeline.hasRenderBatches(LLRenderPass::PASS_BUMP)) + if (!gPipeline.hasRenderBatches(pass)) { return; } @@ -666,9 +682,9 @@ void LLDrawPoolBump::beginBump() } //static -void LLDrawPoolBump::renderBump() +void LLDrawPoolBump::renderBump(U32 pass) { - if (!gPipeline.hasRenderBatches(LLRenderPass::PASS_BUMP)) + if (!gPipeline.hasRenderBatches(pass)) { return; } @@ -681,13 +697,13 @@ void LLDrawPoolBump::renderBump() /// Get rid of z-fighting with non-bump pass. LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL); glPolygonOffset(-1.0f, -1.0f); - renderBump(LLRenderPass::PASS_BUMP, sVertexMask); + renderBump(pass, sVertexMask); } //static -void LLDrawPoolBump::endBump() +void LLDrawPoolBump::endBump(U32 pass) { - if (!gPipeline.hasRenderBatches(LLRenderPass::PASS_BUMP)) + if (!gPipeline.hasRenderBatches(pass)) { return; } @@ -704,6 +720,12 @@ void LLDrawPoolBump::endBump() gGL.setSceneBlendType(LLRender::BT_ALPHA); } +S32 LLDrawPoolBump::getNumDeferredPasses() +{ + static const LLCachedControl render_object_bump("RenderObjectBump",false); + return render_object_bump ? 1 : 0; +} + void LLDrawPoolBump::beginDeferredPass(S32 pass) { if (!gPipeline.hasRenderBatches(LLRenderPass::PASS_BUMP)) @@ -758,17 +780,41 @@ void LLDrawPoolBump::renderDeferred(S32 pass) void LLDrawPoolBump::beginPostDeferredPass(S32 pass) { - beginFullbrightShiny(); + switch (pass) + { + case 0: + beginFullbrightShiny(); + break; + case 1: + beginBump(LLRenderPass::PASS_POST_BUMP); + break; + } } void LLDrawPoolBump::endPostDeferredPass(S32 pass) { - endFullbrightShiny(); + switch (pass) + { + case 0: + endFullbrightShiny(); + break; + case 1: + endBump(LLRenderPass::PASS_POST_BUMP); + break; + } } void LLDrawPoolBump::renderPostDeferred(S32 pass) { - renderFullbrightShiny(); + switch (pass) + { + case 0: + renderFullbrightShiny(); + break; + case 1: + renderBump(LLRenderPass::PASS_POST_BUMP); + break; + } } //////////////////////////////////////////////////////////////// @@ -785,24 +831,32 @@ void LLBumpImageList::init() LLStandardBumpmap::init(); } -void LLBumpImageList::shutdown() +void LLBumpImageList::clear() { + llinfos << "Clearing dynamic bumpmaps." << llendl; + // these will be re-populated on-demand mBrightnessEntries.clear(); mDarknessEntries.clear(); + + LLStandardBumpmap::clear(); +} + +void LLBumpImageList::shutdown() +{ + clear(); LLStandardBumpmap::shutdown(); } void LLBumpImageList::destroyGL() { - mBrightnessEntries.clear(); - mDarknessEntries.clear(); + clear(); LLStandardBumpmap::destroyGL(); } void LLBumpImageList::restoreGL() { - // Images will be recreated as they are needed. LLStandardBumpmap::restoreGL(); + // Images will be recreated as they are needed. } @@ -818,9 +872,9 @@ LLBumpImageList::~LLBumpImageList() void LLBumpImageList::addTextureStats(U8 bump, const LLUUID& base_image_id, F32 virtual_size) { bump &= TEM_BUMP_MASK; - LLViewerImage* bump_image = gStandardBumpmapList[bump].mImage; + LLViewerFetchedTexture* bump_image = gStandardBumpmapList[bump].mImage; if( bump_image ) - { + { bump_image->addTextureStats(virtual_size); } } @@ -832,11 +886,11 @@ void LLBumpImageList::updateImages() for (bump_image_map_t::iterator iter = mBrightnessEntries.begin(); iter != mBrightnessEntries.end(); ) { bump_image_map_t::iterator curiter = iter++; - LLImageGL* image = curiter->second; + LLViewerTexture* image = curiter->second; if( image ) { BOOL destroy = TRUE; - if( image->getHasGLTexture()) + if( image->hasGLTexture()) { if( image->getBoundRecently() ) { @@ -859,11 +913,11 @@ void LLBumpImageList::updateImages() for (bump_image_map_t::iterator iter = mDarknessEntries.begin(); iter != mDarknessEntries.end(); ) { bump_image_map_t::iterator curiter = iter++; - LLImageGL* image = curiter->second; + LLViewerTexture* image = curiter->second; if( image ) { BOOL destroy = TRUE; - if( image->getHasGLTexture()) + if( image->hasGLTexture()) { if( image->getBoundRecently() ) { @@ -887,16 +941,16 @@ void LLBumpImageList::updateImages() // Note: the caller SHOULD NOT keep the pointer that this function returns. It may be updated as more data arrives. -LLImageGL* LLBumpImageList::getBrightnessDarknessImage(LLViewerImage* src_image, U8 bump_code ) +LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedTexture* src_image, U8 bump_code ) { llassert( (bump_code == BE_BRIGHTNESS) || (bump_code == BE_DARKNESS) ); - LLImageGL* bump = NULL; + LLViewerTexture* bump = NULL; const F32 BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD = 1000; - if( src_image->mMaxVirtualSize > BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD ) + if( src_image->getMaxVirtualSize() > BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD ) { bump_image_map_t* entries_list = NULL; - void (*callback_func)( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL; + void (*callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL; switch( bump_code ) { @@ -923,17 +977,12 @@ LLImageGL* LLBumpImageList::getBrightnessDarknessImage(LLViewerImage* src_image, LLPointer raw = new LLImageRaw(1,1,1); raw->clear(0x77, 0x77, 0x77, 0xFF); - //------------------------------ - bump = new LLImageGL( raw, TRUE); - //immediately assign bump to a global smart pointer in case some local smart pointer - //accidently releases it. - (*entries_list)[src_image->getID()] = bump; - //------------------------------ - - bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); + (*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE); + (*entries_list)[src_image->getID()]->setExplicitFormat(GL_ALPHA8, GL_ALPHA); // Note: this may create an LLImageGL immediately - src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()) ); + src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ; + src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL ); bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image // bump_total++; @@ -946,7 +995,7 @@ LLImageGL* LLBumpImageList::getBrightnessDarknessImage(LLViewerImage* src_image, // static -void LLBumpImageList::onSourceBrightnessLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) +void LLBumpImageList::onSourceBrightnessLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) { LLUUID* source_asset_id = (LLUUID*)userdata; LLBumpImageList::onSourceLoaded( success, src_vi, src, *source_asset_id, BE_BRIGHTNESS ); @@ -957,7 +1006,7 @@ void LLBumpImageList::onSourceBrightnessLoaded( BOOL success, LLViewerImage *src } // static -void LLBumpImageList::onSourceDarknessLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) +void LLBumpImageList::onSourceDarknessLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) { LLUUID* source_asset_id = (LLUUID*)userdata; LLBumpImageList::onSourceLoaded( success, src_vi, src, *source_asset_id, BE_DARKNESS ); @@ -967,14 +1016,14 @@ void LLBumpImageList::onSourceDarknessLoaded( BOOL success, LLViewerImage *src_v } } -void LLBumpImageList::onSourceStandardLoaded( BOOL success, LLViewerImage* src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) +void LLBumpImageList::onSourceStandardLoaded( BOOL success, LLViewerFetchedTexture* src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) { if (success && LLPipeline::sRenderDeferred) { LLPointer nrm_image = new LLImageRaw(src->getWidth(), src->getHeight(), 4); generateNormalMapFromAlpha(src, nrm_image); src_vi->setExplicitFormat(GL_RGBA, GL_RGBA); - src_vi->createGLTexture(0, nrm_image); + src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image); } } @@ -1014,8 +1063,8 @@ void LLBumpImageList::generateNormalMapFromAlpha(LLImageRaw* src, LLImageRaw* nr LLVector3 right = LLVector3(norm_scale, 0, (F32) src_data[(j*resX+rX)*src_cmp+src_cmp-1]-cH); LLVector3 left = LLVector3(-norm_scale, 0, (F32) src_data[(j*resX+lX)*src_cmp+src_cmp-1]-cH); - LLVector3 up = LLVector3(0, -norm_scale, (F32) src_data[(rY*resX+i)*src_cmp+src_cmp-1]-cH); - LLVector3 down = LLVector3(0, norm_scale, (F32) src_data[(lY*resX+i)*src_cmp+src_cmp-1]-cH); + LLVector3 up = LLVector3(0, -norm_scale, (F32) src_data[(lY*resX+i)*src_cmp+src_cmp-1]-cH); + LLVector3 down = LLVector3(0, norm_scale, (F32) src_data[(rY*resX+i)*src_cmp+src_cmp-1]-cH); LLVector3 norm = right%down + down%left + left%up + up%right; @@ -1034,7 +1083,7 @@ void LLBumpImageList::generateNormalMapFromAlpha(LLImageRaw* src, LLImageRaw* nr } // static -void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump_code ) +void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump_code ) { if( success ) { @@ -1151,9 +1200,9 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerImage *src_vi, LLIma } //--------------------------------------------------- - //immediately assign bump to a global smart pointer in case some local smart pointer - //accidently releases it. - LLPointer bump = new LLImageGL( TRUE); + // immediately assign bump to a global smart pointer in case some local smart pointer + // accidentally releases it. + LLPointer bump = LLViewerTextureManager::getLocalTexture( TRUE ); if (!LLPipeline::sRenderDeferred) { @@ -1162,8 +1211,8 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerImage *src_vi, LLIma } else { - LLPointer nrm_image = new LLImageRaw(src->getWidth(), src->getHeight(), 4); - generateNormalMapFromAlpha(src, nrm_image); + LLPointer nrm_image = new LLImageRaw(dst_image->getWidth(), dst_image->getHeight(), 4); + generateNormalMapFromAlpha(dst_image, nrm_image); bump->setExplicitFormat(GL_RGBA, GL_RGBA); bump->createGLTexture(0, nrm_image); } @@ -1226,8 +1275,8 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) { if (params.mTexture.notNull()) { - gGL.getTexUnit(diffuse_channel)->bind(params.mTexture.get()); - //params.mTexture->addTextureStats(params.mVSize); + gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ; + params.mTexture->addTextureStats(params.mVSize); } else { diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h index 34c1e9c29..f67ba7d3d 100644 --- a/indra/newview/lldrawpoolbump.h +++ b/indra/newview/lldrawpoolbump.h @@ -41,6 +41,7 @@ class LLImageRaw; class LLSpatialGroup; class LLDrawInfo; +class LLViewerFetchedTexture; class LLDrawPoolBump : public LLRenderPass { @@ -74,16 +75,16 @@ public: void renderFullbrightShiny(); void endFullbrightShiny(); - void beginBump(); - void renderBump(); - void endBump(); + void beginBump(U32 pass = LLRenderPass::PASS_BUMP); + void renderBump(U32 pass = LLRenderPass::PASS_BUMP); + void endBump(U32 pass = LLRenderPass::PASS_BUMP); - virtual S32 getNumDeferredPasses() { return 1; } + virtual S32 getNumDeferredPasses(); /*virtual*/ void beginDeferredPass(S32 pass); /*virtual*/ void endDeferredPass(S32 pass); /*virtual*/ void renderDeferred(S32 pass); - virtual S32 getNumPostDeferredPasses() { return 1; } + virtual S32 getNumPostDeferredPasses() { return 2; } /*virtual*/ void beginPostDeferredPass(S32 pass); /*virtual*/ void endPostDeferredPass(S32 pass); /*virtual*/ void renderPostDeferred(S32 pass); @@ -110,10 +111,12 @@ public: LLStandardBumpmap( const std::string& label ) : mLabel(label) {} std::string mLabel; - LLPointer mImage; + LLPointer mImage; static U32 sStandardBumpmapCount; // Number of valid values in gStandardBumpmapList[] + static void clear(); + static void addstandard(); static void init(); static void shutdown(); static void restoreGL(); @@ -135,26 +138,26 @@ public: void init(); void shutdown(); + void clear(); void destroyGL(); void restoreGL(); void updateImages(); - LLImageGL* getBrightnessDarknessImage(LLViewerImage* src_image, U8 bump_code); -// LLImageGL* getTestImage(); + LLViewerTexture* getBrightnessDarknessImage(LLViewerFetchedTexture* src_image, U8 bump_code); void addTextureStats(U8 bump, const LLUUID& base_image_id, F32 virtual_size); - static void onSourceBrightnessLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); - static void onSourceDarknessLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); - static void onSourceStandardLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); + static void onSourceBrightnessLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); + static void onSourceDarknessLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); + static void onSourceStandardLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); static void generateNormalMapFromAlpha(LLImageRaw* src, LLImageRaw* nrm_image); private: - static void onSourceLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump ); + static void onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump ); private: - typedef std::map > bump_image_map_t; + typedef std::map > bump_image_map_t; bump_image_map_t mBrightnessEntries; bump_image_map_t mDarknessEntries; }; diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 63e24ec8a..98c729dfe 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -41,7 +41,7 @@ #include "llface.h" #include "llsky.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "llviewerwindow.h" #include "llvosky.h" diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 833c74873..97af1285b 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -49,7 +49,7 @@ #include "llviewerparceloverlay.h" #include "llvosurfacepatch.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" // To get alpha gradients +#include "llviewertexturelist.h" // To get alpha gradients #include "llworld.h" #include "pipeline.h" #include "llviewershadermgr.h" @@ -62,28 +62,32 @@ S32 LLDrawPoolTerrain::sDetailMode = 1; F32 LLDrawPoolTerrain::sDetailScale = DETAIL_SCALE; static LLGLSLShader* sShader = NULL; -LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerImage *texturep) : +LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : LLFacePool(POOL_TERRAIN), mTexturep(texturep) { // Hack! sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale"); sDetailMode = gSavedSettings.getS32("RenderTerrainDetail"); - mAlphaRampImagep = gImageList.getImageFromFile("alpha_gradient.tga", - TRUE, TRUE, GL_ALPHA8, GL_ALPHA, + mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", + TRUE, LLViewerTexture::BOOST_UI, + LLViewerTexture::FETCHED_TEXTURE, + GL_ALPHA8, GL_ALPHA, LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); //gGL.getTexUnit(0)->bind(mAlphaRampImagep.get()); mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP); - m2DAlphaRampImagep = gImageList.getImageFromFile("alpha_gradient_2d.j2c", - TRUE, TRUE, GL_ALPHA8, GL_ALPHA, + m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", + TRUE, LLViewerTexture::BOOST_UI, + LLViewerTexture::FETCHED_TEXTURE, + GL_ALPHA8, GL_ALPHA, LLUUID("38b86f85-2575-52a9-a531-23108d8da837")); //gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get()); m2DAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP); - mTexturep->setBoostLevel(LLViewerImageBoostLevel::BOOST_TERRAIN); + mTexturep->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -170,7 +174,7 @@ void LLDrawPoolTerrain::render(S32 pass) LLVLComposition *compp = regionp->getComposition(); for (S32 i = 0; i < 4; i++) { - compp->mDetailTextures[i]->setBoostLevel(LLViewerImageBoostLevel::BOOST_TERRAIN); + compp->mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); compp->mDetailTextures[i]->addTextureStats(1024.f*1024.f); // assume large pixel area } @@ -290,10 +294,10 @@ void LLDrawPoolTerrain::renderFullShader() // Hack! Get the region that this draw pool is rendering from! LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion(); LLVLComposition *compp = regionp->getComposition(); - LLViewerImage *detail_texture0p = compp->mDetailTextures[0]; - LLViewerImage *detail_texture1p = compp->mDetailTextures[1]; - LLViewerImage *detail_texture2p = compp->mDetailTextures[2]; - LLViewerImage *detail_texture3p = compp->mDetailTextures[3]; + LLViewerTexture *detail_texture0p = compp->mDetailTextures[0]; + LLViewerTexture *detail_texture1p = compp->mDetailTextures[1]; + LLViewerTexture *detail_texture2p = compp->mDetailTextures[2]; + LLViewerTexture *detail_texture3p = compp->mDetailTextures[3]; LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal(); F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale; @@ -364,7 +368,7 @@ void LLDrawPoolTerrain::renderFullShader() // Alpha Ramp // S32 alpha_ramp = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP); - gGL.getTexUnit(alpha_ramp)->bind(m2DAlphaRampImagep.get()); + gGL.getTexUnit(alpha_ramp)->bind(m2DAlphaRampImagep); // GL_BLEND disabled by default drawLoop(); @@ -430,10 +434,10 @@ void LLDrawPoolTerrain::renderFull4TU() // Hack! Get the region that this draw pool is rendering from! LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion(); LLVLComposition *compp = regionp->getComposition(); - LLViewerImage *detail_texture0p = compp->mDetailTextures[0]; - LLViewerImage *detail_texture1p = compp->mDetailTextures[1]; - LLViewerImage *detail_texture2p = compp->mDetailTextures[2]; - LLViewerImage *detail_texture3p = compp->mDetailTextures[3]; + LLViewerTexture *detail_texture0p = compp->mDetailTextures[0]; + LLViewerTexture *detail_texture1p = compp->mDetailTextures[1]; + LLViewerTexture *detail_texture2p = compp->mDetailTextures[2]; + LLViewerTexture *detail_texture3p = compp->mDetailTextures[3]; LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal(); F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale; @@ -528,7 +532,7 @@ void LLDrawPoolTerrain::renderFull4TU() // // Stage 1: Generate alpha ramp for detail2/detail3 transition // - gGL.getTexUnit(1)->bind(m2DAlphaRampImagep.get()); + gGL.getTexUnit(1)->bind(m2DAlphaRampImagep); gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(1)->activate(); @@ -560,7 +564,7 @@ void LLDrawPoolTerrain::renderFull4TU() // // Stage 3: Generate alpha ramp for detail1/detail2 transition // - gGL.getTexUnit(3)->bind(m2DAlphaRampImagep.get()); + gGL.getTexUnit(3)->bind(m2DAlphaRampImagep); gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(3)->activate(); @@ -631,10 +635,10 @@ void LLDrawPoolTerrain::renderFull2TU() // Hack! Get the region that this draw pool is rendering from! LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion(); LLVLComposition *compp = regionp->getComposition(); - LLViewerImage *detail_texture0p = compp->mDetailTextures[0]; - LLViewerImage *detail_texture1p = compp->mDetailTextures[1]; - LLViewerImage *detail_texture2p = compp->mDetailTextures[2]; - LLViewerImage *detail_texture3p = compp->mDetailTextures[3]; + LLViewerTexture *detail_texture0p = compp->mDetailTextures[0]; + LLViewerTexture *detail_texture1p = compp->mDetailTextures[1]; + LLViewerTexture *detail_texture2p = compp->mDetailTextures[2]; + LLViewerTexture *detail_texture3p = compp->mDetailTextures[3]; LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal(); F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale; @@ -672,7 +676,7 @@ void LLDrawPoolTerrain::renderFull2TU() // // Stage 0: Generate alpha ramp for detail0/detail1 transition // - gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get()); + gGL.getTexUnit(0)->bind(m2DAlphaRampImagep); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); @@ -710,7 +714,7 @@ void LLDrawPoolTerrain::renderFull2TU() // // Stage 0: Generate alpha ramp for detail1/detail2 transition // - gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get()); + gGL.getTexUnit(0)->bind(m2DAlphaRampImagep); // Set the texture matrix glMatrixMode(GL_TEXTURE); @@ -750,7 +754,7 @@ void LLDrawPoolTerrain::renderFull2TU() // Stage 0: Generate alpha ramp for detail2/detail3 transition // gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get()); + gGL.getTexUnit(0)->bind(m2DAlphaRampImagep); // Set the texture matrix glMatrixMode(GL_TEXTURE); glLoadIdentity(); @@ -823,7 +827,7 @@ void LLDrawPoolTerrain::renderSimple() gGL.getTexUnit(0)->activate(); gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(0)->bind(mTexturep.get()); + gGL.getTexUnit(0)->bind(mTexturep); LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent(); F32 tscale = 1.f/256.f; @@ -873,7 +877,7 @@ void LLDrawPoolTerrain::renderOwnership() LLSurface *surfacep = surface_patchp->getSurface(); LLViewerRegion *regionp = surfacep->getRegion(); LLViewerParcelOverlay *overlayp = regionp->getParcelOverlay(); - LLImageGL *texturep = overlayp->getTexture(); + LLViewerTexture *texturep = overlayp->getTexture(); gGL.getTexUnit(0)->bind(texturep); @@ -921,9 +925,10 @@ void LLDrawPoolTerrain::renderForSelect() } } -void LLDrawPoolTerrain::dirtyTextures(const std::set& textures) +void LLDrawPoolTerrain::dirtyTextures(const std::set& textures) { - if (textures.find(mTexturep) != textures.end()) + LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(mTexturep) ; + if (tex && textures.find(tex) != textures.end()) { for (std::vector::iterator iter = mReferences.begin(); iter != mReferences.end(); iter++) @@ -934,12 +939,12 @@ void LLDrawPoolTerrain::dirtyTextures(const std::set& textures) } } -LLViewerImage *LLDrawPoolTerrain::getTexture() +LLViewerTexture *LLDrawPoolTerrain::getTexture() { return mTexturep; } -LLViewerImage *LLDrawPoolTerrain::getDebugTexture() +LLViewerTexture *LLDrawPoolTerrain::getDebugTexture() { return mTexturep; } diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h index 19d09e2fe..61cec0e47 100644 --- a/indra/newview/lldrawpoolterrain.h +++ b/indra/newview/lldrawpoolterrain.h @@ -35,9 +35,11 @@ #include "lldrawpool.h" +class LLViewerFetchedTexture; + class LLDrawPoolTerrain : public LLFacePool { - LLPointer mTexturep; + LLPointer mTexturep; public: enum { @@ -53,7 +55,7 @@ public: virtual U32 getVertexDataMask(); static S32 getDetailMode(); - LLDrawPoolTerrain(LLViewerImage *texturep); + LLDrawPoolTerrain(LLViewerTexture *texturep); virtual ~LLDrawPoolTerrain(); /*virtual*/ LLDrawPool *instancePool(); @@ -73,14 +75,14 @@ public: /*virtual*/ void beginRenderPass( S32 pass ); /*virtual*/ void endRenderPass( S32 pass ); /*virtual*/ void renderForSelect(); - /*virtual*/ void dirtyTextures(const std::set& textures); - /*virtual*/ LLViewerImage *getTexture(); - /*virtual*/ LLViewerImage *getDebugTexture(); + /*virtual*/ void dirtyTextures(const std::set& textures); + /*virtual*/ LLViewerTexture *getTexture(); + /*virtual*/ LLViewerTexture *getDebugTexture(); /*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display - LLPointer mAlphaRampImagep; - LLPointer m2DAlphaRampImagep; - LLPointer mAlphaNoiseImagep; + LLPointer mAlphaRampImagep; + LLPointer m2DAlphaRampImagep; + LLPointer mAlphaNoiseImagep; static S32 sDetailMode; static F32 sDetailScale; // meters per texture diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index f08e22569..957869004 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -48,7 +48,7 @@ S32 LLDrawPoolTree::sDiffTex = 0; static LLGLSLShader* shader = NULL; -LLDrawPoolTree::LLDrawPoolTree(LLViewerImage *texturep) : +LLDrawPoolTree::LLDrawPoolTree(LLViewerTexture *texturep) : LLFacePool(POOL_TREE), mTexturep(texturep) { @@ -380,12 +380,12 @@ BOOL LLDrawPoolTree::verify() const return TRUE; } -LLViewerImage *LLDrawPoolTree::getTexture() +LLViewerTexture *LLDrawPoolTree::getTexture() { return mTexturep; } -LLViewerImage *LLDrawPoolTree::getDebugTexture() +LLViewerTexture *LLDrawPoolTree::getDebugTexture() { return mTexturep; } diff --git a/indra/newview/lldrawpooltree.h b/indra/newview/lldrawpooltree.h index 80c4fdfff..bc7711d4e 100644 --- a/indra/newview/lldrawpooltree.h +++ b/indra/newview/lldrawpooltree.h @@ -37,7 +37,7 @@ class LLDrawPoolTree : public LLFacePool { - LLPointer mTexturep; + LLPointer mTexturep; public: enum { @@ -48,7 +48,7 @@ public: virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; } - LLDrawPoolTree(LLViewerImage *texturep); + LLDrawPoolTree(LLViewerTexture *texturep); /*virtual*/ LLDrawPool *instancePool(); @@ -70,8 +70,8 @@ public: /*virtual*/ S32 getNumPasses() { return 1; } /*virtual*/ void renderForSelect(); /*virtual*/ BOOL verify() const; - /*virtual*/ LLViewerImage *getTexture(); - /*virtual*/ LLViewerImage *getDebugTexture(); + /*virtual*/ LLViewerTexture *getTexture(); + /*virtual*/ LLViewerTexture *getDebugTexture(); /*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display static S32 sDiffTex; diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 4b9f55946..3e260f8b1 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -46,7 +46,7 @@ #include "llface.h" #include "llsky.h" #include "llviewercamera.h" // to get OGL_TO_CFR_ROTATION -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "llvosky.h" #include "llvowater.h" @@ -70,18 +70,20 @@ LLVector3 LLDrawPoolWater::sLightDir; LLDrawPoolWater::LLDrawPoolWater() : LLFacePool(POOL_WATER) { - mHBTex[0] = gImageList.getImage(gSunTextureID, TRUE, TRUE); - gGL.getTexUnit(0)->bind(mHBTex[0].get()); + mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); + gGL.getTexUnit(0)->bind(mHBTex[0]) ; mHBTex[0]->setAddressMode(LLTexUnit::TAM_CLAMP); - mHBTex[1] = gImageList.getImage(gMoonTextureID, TRUE, TRUE); - gGL.getTexUnit(0)->bind(mHBTex[1].get()); + mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); + gGL.getTexUnit(0)->bind(mHBTex[1]); mHBTex[1]->setAddressMode(LLTexUnit::TAM_CLAMP); - mWaterImagep = gImageList.getImage(WATER_TEST); + + mWaterImagep = LLViewerTextureManager::getFetchedTexture(WATER_TEST); + llassert(mWaterImagep); mWaterImagep->setNoDelete() ; - mWaterNormp = gImageList.getImage(DEFAULT_WATER_NORMAL); - mWaterNormp->setNoDelete() ; + mWaterNormp = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL); + mWaterNormp->setNoDelete(); restoreGL(); } @@ -198,7 +200,7 @@ void LLDrawPoolWater::render(S32 pass) mWaterImagep->addTextureStats(1024.f*1024.f); gGL.getTexUnit(1)->activate(); gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(1)->bind(mWaterImagep.get()); + gGL.getTexUnit(1)->bind(mWaterImagep) ; LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis(); F32 up_dot = camera_up * LLVector3::z_axis; @@ -343,7 +345,7 @@ void LLDrawPoolWater::renderReflection(LLFace* face) LLGLSNoFog noFog; - gGL.getTexUnit(0)->bind(mHBTex[dr].get()); + gGL.getTexUnit(0)->bind(mHBTex[dr]); LLOverrideFaceColor override(this, face->getFaceColor().mV); face->renderIndexed(); @@ -445,11 +447,11 @@ void LLDrawPoolWater::shade() // change mWaterNormp if needed if (mWaterNormp->getID() != param_mgr->getNormalMapID()) { - mWaterNormp = gImageList.getImage(param_mgr->getNormalMapID()); + mWaterNormp = LLViewerTextureManager::getFetchedTexture(param_mgr->getNormalMapID()); } mWaterNormp->addTextureStats(1024.f*1024.f); - gGL.getTexUnit(bumpTex)->bind(mWaterNormp.get()); + gGL.getTexUnit(bumpTex)->bind(mWaterNormp) ; if (gSavedSettings.getBOOL("RenderWaterMipNormal")) { mWaterNormp->setFilteringOption(LLTexUnit::TFO_ANISOTROPIC); @@ -552,7 +554,8 @@ void LLDrawPoolWater::shade() } LLVOWater* water = (LLVOWater*) face->getViewerObject(); - gGL.getTexUnit(diffTex)->bind(face->getTexture()); + if(diffTex > -1 && face->getTexture()->hasGLTexture()) + gGL.getTexUnit(diffTex)->bind(face->getTexture()); sNeedsReflectionUpdate = TRUE; @@ -570,6 +573,8 @@ void LLDrawPoolWater::shade() LLGLSquashToFarClip far_clip(glh_get_current_projection()); face->renderIndexed(); } + if(diffTex > -1 && face->getTexture()->hasGLTexture()) + gGL.getTexUnit(diffTex)->unbind(LLTexUnit::TT_TEXTURE); } } @@ -606,7 +611,7 @@ void LLDrawPoolWater::renderForSelect() void LLDrawPoolWater::renderFaceSelected(LLFace *facep, - LLImageGL *image, + LLViewerTexture *image, const LLColor4 &color, const S32 index_offset, const S32 index_count) { @@ -615,9 +620,9 @@ void LLDrawPoolWater::renderFaceSelected(LLFace *facep, } -LLViewerImage *LLDrawPoolWater::getDebugTexture() +LLViewerTexture *LLDrawPoolWater::getDebugTexture() { - return LLViewerImage::sSmokeImagep; + return LLViewerFetchedTexture::sSmokeImagep; } LLColor3 LLDrawPoolWater::getDebugColor() const diff --git a/indra/newview/lldrawpoolwater.h b/indra/newview/lldrawpoolwater.h index 90db2ed29..0ce14eae3 100644 --- a/indra/newview/lldrawpoolwater.h +++ b/indra/newview/lldrawpoolwater.h @@ -43,11 +43,10 @@ class LLWaterSurface; class LLDrawPoolWater: public LLFacePool { protected: - LLPointer mHBTex[2]; - LLPointer mWaterImagep; - LLPointer mWaterNormp; + LLPointer mHBTex[2]; + LLPointer mWaterImagep; + LLPointer mWaterNormp; - const LLWaterSurface *mWaterSurface; public: static BOOL sSkipScreenCopy; static BOOL sNeedsReflectionUpdate; @@ -80,12 +79,12 @@ public: /*virtual*/ S32 getNumPasses(); /*virtual*/ void render(S32 pass = 0); - /*virtual*/ void renderFaceSelected(LLFace *facep, LLImageGL *image, const LLColor4 &color, + /*virtual*/ void renderFaceSelected(LLFace *facep, LLViewerTexture *image, const LLColor4 &color, const S32 index_offset = 0, const S32 index_count = 0); /*virtual*/ void prerender(); /*virtual*/ void renderForSelect(); - /*virtual*/ LLViewerImage *getDebugTexture(); + /*virtual*/ LLViewerTexture *getDebugTexture(); /*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display void renderReflection(LLFace* face); diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 3f5754007..07ce6c59c 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -47,7 +47,7 @@ #include "llface.h" #include "llrender.h" -LLPointer LLDrawPoolWLSky::sCloudNoiseTexture = NULL; +LLPointer LLDrawPoolWLSky::sCloudNoiseTexture = NULL; LLPointer LLDrawPoolWLSky::sCloudNoiseRawImage = NULL; @@ -71,7 +71,7 @@ LLDrawPoolWLSky::LLDrawPoolWLSky(void) : cloudNoiseFile->decode(sCloudNoiseRawImage, 0.0f); - LLImageGL::create(sCloudNoiseTexture, sCloudNoiseRawImage, TRUE); + sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE); LLWLParamManager::instance()->propagateParameters(); } @@ -83,7 +83,7 @@ LLDrawPoolWLSky::~LLDrawPoolWLSky() sCloudNoiseRawImage = NULL; } -LLViewerImage *LLDrawPoolWLSky::getDebugTexture() +LLViewerTexture *LLDrawPoolWLSky::getDebugTexture() { return NULL; } @@ -233,7 +233,7 @@ void LLDrawPoolWLSky::renderHeavenlyBodies() LLFace * face = gSky.mVOSkyp->mFace[LLVOSky::FACE_SUN]; if (gSky.mVOSkyp->getSun().getDraw() && face->getGeomCount()) { - LLImageGL * tex = face->getTexture(); + LLViewerTexture * tex = face->getTexture(); gGL.getTexUnit(0)->bind(tex); LLColor4 color(gSky.mVOSkyp->getSun().getInterpColor()); LLFacePool::LLOverrideFaceColor color_override(this, color); @@ -248,8 +248,7 @@ void LLDrawPoolWLSky::renderHeavenlyBodies() // *NOTE: even though we already bound this texture above for the // stars register combiners, we bind again here for defensive reasons, // since LLImageGL::bind detects that it's a noop, and optimizes it out. - LLImageGL * tex = face->getTexture(); - gGL.getTexUnit(0)->bind(tex); + gGL.getTexUnit(0)->bind(face->getTexture()); LLColor4 color(gSky.mVOSkyp->getMoon().getInterpColor()); F32 a = gSky.mVOSkyp->getMoon().getDirection().mV[2]; if (a > 0.f) @@ -289,14 +288,12 @@ void LLDrawPoolWLSky::render(S32 pass) // *NOTE: have to bind a texture here since register combiners blending in // renderStars() requires something to be bound and we might as well only - // bind the moon's texture once. - LLImageGL * tex = gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture(); - gGL.getTexUnit(0)->bind(tex); + // bind the moon's texture once. + gGL.getTexUnit(0)->bind(gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture()); renderHeavenlyBodies(); - - renderStars(); + renderStars(); glPopMatrix(); @@ -316,7 +313,7 @@ LLDrawPoolWLSky *LLDrawPoolWLSky::instancePool() return new LLDrawPoolWLSky(); } -LLViewerImage* LLDrawPoolWLSky::getTexture() +LLViewerTexture* LLDrawPoolWLSky::getTexture() { return NULL; } @@ -334,5 +331,5 @@ void LLDrawPoolWLSky::cleanupGL() //static void LLDrawPoolWLSky::restoreGL() { - LLImageGL::create(sCloudNoiseTexture, sCloudNoiseRawImage, TRUE); + sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE); } diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h index 0e2220e7f..9059f6382 100644 --- a/indra/newview/lldrawpoolwlsky.h +++ b/indra/newview/lldrawpoolwlsky.h @@ -55,7 +55,7 @@ public: /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); } /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); } - /*virtual*/ LLViewerImage *getDebugTexture(); + /*virtual*/ LLViewerTexture *getDebugTexture(); /*virtual*/ void beginRenderPass( S32 pass ); /*virtual*/ void endRenderPass( S32 pass ); /*virtual*/ S32 getNumPasses() { return 1; } @@ -65,11 +65,11 @@ public: /*virtual*/ BOOL verify() const { return TRUE; } // Verify that all data in the draw pool is correct! /*virtual*/ S32 getVertexShaderLevel() const { return mVertexShaderLevel; } - //static LLDrawPool* createPool(const U32 type, LLViewerImage *tex0 = NULL); + //static LLDrawPool* createPool(const U32 type, LLViewerTexture *tex0 = NULL); // Create an empty new instance of the pool. /*virtual*/ LLDrawPoolWLSky *instancePool(); ///< covariant override - /*virtual*/ LLViewerImage* getTexture(); + /*virtual*/ LLViewerTexture* getTexture(); /*virtual*/ BOOL isFacePool() { return FALSE; } /*virtual*/ void resetDrawOrders(); @@ -83,7 +83,7 @@ private: void renderHeavenlyBodies(); private: - static LLPointer sCloudNoiseTexture; + static LLPointer sCloudNoiseTexture; static LLPointer sCloudNoiseRawImage; }; diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h index 7bc0c1544..2e53ce563 100644 --- a/indra/newview/lldriverparam.h +++ b/indra/newview/lldriverparam.h @@ -35,6 +35,7 @@ #include "llviewervisualparam.h" +class LLPhysicsMotion; class LLVOAvatar; //----------------------------------------------------------------------------- @@ -78,6 +79,7 @@ protected: class LLDriverParam : public LLViewerVisualParam { + friend class LLPhysicsMotion; // physics motion needs to access driven params directly. public: LLDriverParam(LLVOAvatar *avatarp); ~LLDriverParam(); diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index 960d6cdf2..609fdc64b 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -37,24 +37,20 @@ #include "llviewerwindow.h" #include "llviewercamera.h" #include "llviewercontrol.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llvertexbuffer.h" #include "llviewerdisplay.h" #include "llrender.h" // static -LLDynamicTexture::instance_list_t LLDynamicTexture::sInstances[ LLDynamicTexture::ORDER_COUNT ]; -S32 LLDynamicTexture::sNumRenders = 0; +LLViewerDynamicTexture::instance_list_t LLViewerDynamicTexture::sInstances[ LLViewerDynamicTexture::ORDER_COUNT ]; +S32 LLViewerDynamicTexture::sNumRenders = 0; //----------------------------------------------------------------------------- -// LLDynamicTexture() +// LLViewerDynamicTexture() //----------------------------------------------------------------------------- -LLDynamicTexture::LLDynamicTexture(S32 width, S32 height, S32 components, EOrder order, BOOL clamp) : - mWidth(width), - mHeight(height), - mComponents(components), - mTexture(NULL), - mLastBindTime(0), +LLViewerDynamicTexture::LLViewerDynamicTexture(S32 width, S32 height, S32 components, EOrder order, BOOL clamp) : + LLViewerTexture(width, height, components, FALSE), mClamp(clamp) { llassert((1 <= components) && (components <= 4)); @@ -62,66 +58,58 @@ LLDynamicTexture::LLDynamicTexture(S32 width, S32 height, S32 components, EOrder generateGLTexture(); llassert( 0 <= order && order < ORDER_COUNT ); - LLDynamicTexture::sInstances[ order ].insert(this); + LLViewerDynamicTexture::sInstances[ order ].insert(this); } //----------------------------------------------------------------------------- -// LLDynamicTexture() +// LLViewerDynamicTexture() //----------------------------------------------------------------------------- -LLDynamicTexture::~LLDynamicTexture() +LLViewerDynamicTexture::~LLViewerDynamicTexture() { - releaseGLTexture(); for( S32 order = 0; order < ORDER_COUNT; order++ ) { - LLDynamicTexture::sInstances[order].erase(this); // will fail in all but one case. + LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case. } } -//----------------------------------------------------------------------------- -// releaseGLTexture() -//----------------------------------------------------------------------------- -void LLDynamicTexture::releaseGLTexture() +//virtual +S8 LLViewerDynamicTexture::getType() const { - if (mTexture.notNull()) - { -// llinfos << "RELEASING " << (mWidth*mHeight*mComponents)/1024 << "K" << llendl; - mTexture = NULL; - } + return LLViewerTexture::DYNAMIC_TEXTURE ; } //----------------------------------------------------------------------------- // generateGLTexture() //----------------------------------------------------------------------------- -void LLDynamicTexture::generateGLTexture() +void LLViewerDynamicTexture::generateGLTexture() { + LLViewerTexture::generateGLTexture() ; generateGLTexture(-1, 0, 0, FALSE); } -void LLDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes, const LLColor4U *fill_color/* = NULL*/) +void LLViewerDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes, const LLColor4U *fill_color/*=NULL*/) { if (mComponents < 1 || mComponents > 4) { llerrs << "Bad number of components in dynamic texture: " << mComponents << llendl; } - releaseGLTexture(); - LLPointer raw_image = new LLImageRaw(mWidth, mHeight, mComponents); - if(fill_color) - raw_image->fill(*fill_color); - mTexture = new LLViewerImage(mWidth, mHeight, mComponents, FALSE); + + LLPointer raw_image = new LLImageRaw(mFullWidth, mFullHeight, mComponents); if (internal_format >= 0) { - mTexture->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes); + setExplicitFormat(internal_format, primary_format, type_format, swap_bytes); } -// llinfos << "ALLOCATING " << (mWidth*mHeight*mComponents)/1024 << "K" << llendl; - mTexture->createGLTexture(0, raw_image, 0, TRUE, LLViewerImageBoostLevel::DYNAMIC_TEX); - mTexture->setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP); - mTexture->setGLTextureCreated(false); + if(fill_color) + raw_image->fill(*fill_color); + createGLTexture(0, raw_image, 0, TRUE, LLViewerTexture::DYNAMIC_TEX); + setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP); + mGLTexturep->setGLTextureCreated(false); } //----------------------------------------------------------------------------- // render() //----------------------------------------------------------------------------- -BOOL LLDynamicTexture::render() +BOOL LLViewerDynamicTexture::render() { return FALSE; } @@ -129,13 +117,13 @@ BOOL LLDynamicTexture::render() //----------------------------------------------------------------------------- // preRender() //----------------------------------------------------------------------------- -void LLDynamicTexture::preRender(BOOL clear_depth) +void LLViewerDynamicTexture::preRender(BOOL clear_depth) { { // force rendering to on-screen portion of frame buffer LLCoordScreen window_pos; gViewerWindow->getWindow()->getPosition( &window_pos ); - mOrigin.set(0, gViewerWindow->getWindowDisplayHeight() - mHeight); // top left corner + mOrigin.set(0, gViewerWindow->getWindowDisplayHeight() - mFullHeight); // top left corner if (window_pos.mX < 0) { @@ -150,13 +138,14 @@ void LLDynamicTexture::preRender(BOOL clear_depth) gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } // Set up camera - mCamera.setOrigin(*LLViewerCamera::getInstance()); - mCamera.setAxes(*LLViewerCamera::getInstance()); - mCamera.setAspect(LLViewerCamera::getInstance()->getAspect()); - mCamera.setView(LLViewerCamera::getInstance()->getView()); - mCamera.setNear(LLViewerCamera::getInstance()->getNear()); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + mCamera.setOrigin(*camera); + mCamera.setAxes(*camera); + mCamera.setAspect(camera->getAspect()); + mCamera.setView(camera->getView()); + mCamera.setNear(camera->getNear()); - glViewport(mOrigin.mX, mOrigin.mY, mWidth, mHeight); + glViewport(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight); if (clear_depth) { glClear(GL_DEPTH_BUFFER_BIT); @@ -166,12 +155,25 @@ void LLDynamicTexture::preRender(BOOL clear_depth) //----------------------------------------------------------------------------- // postRender() //----------------------------------------------------------------------------- -void LLDynamicTexture::postRender(BOOL success) +void LLViewerDynamicTexture::postRender(BOOL success) { { if (success) { - success = mTexture->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mWidth, mHeight); + if(mGLTexturep.isNull()) + { + generateGLTexture() ; + } + else if(!mGLTexturep->getHasGLTexture()) + { + generateGLTexture() ; + } + else if(mGLTexturep->getDiscardLevel() != 0)//do not know how it happens, but regenerate one if it does. + { + generateGLTexture() ; + } + + success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight); } } @@ -179,11 +181,12 @@ void LLDynamicTexture::postRender(BOOL success) gViewerWindow->setupViewport(); // restore camera - LLViewerCamera::getInstance()->setOrigin(mCamera); - LLViewerCamera::getInstance()->setAxes(mCamera); - LLViewerCamera::getInstance()->setAspect(mCamera.getAspect()); - LLViewerCamera::getInstance()->setView(mCamera.getView()); - LLViewerCamera::getInstance()->setNear(mCamera.getNear()); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + camera->setOrigin(mCamera); + camera->setAxes(mCamera); + camera->setAspect(mCamera.getAspect()); + camera->setView(mCamera.getView()); + camera->setNear(mCamera.getNear()); } //----------------------------------------------------------------------------- @@ -191,7 +194,7 @@ void LLDynamicTexture::postRender(BOOL success) // updateDynamicTextures() // Calls update on each dynamic texture. Calls each group in order: "first," then "middle," then "last." //----------------------------------------------------------------------------- -BOOL LLDynamicTexture::updateAllInstances() +BOOL LLViewerDynamicTexture::updateAllInstances() { sNumRenders = 0; if (gGLManager.mIsDisabled) @@ -203,16 +206,15 @@ BOOL LLDynamicTexture::updateAllInstances() BOOL ret = FALSE ; for( S32 order = 0; order < ORDER_COUNT; order++ ) { - for (instance_list_t::iterator iter = LLDynamicTexture::sInstances[order].begin(); - iter != LLDynamicTexture::sInstances[order].end(); ++iter) + for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin(); + iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter) { - LLDynamicTexture *dynamicTexture = *iter; + LLViewerDynamicTexture *dynamicTexture = *iter; if (dynamicTexture->needsRender()) - { + { glClear(GL_DEPTH_BUFFER_BIT); gDepthDirty = TRUE; - - + gGL.color4f(1,1,1,1); dynamicTexture->preRender(); // Must be called outside of startRender() result = FALSE; @@ -233,30 +235,18 @@ BOOL LLDynamicTexture::updateAllInstances() return ret; } -//virtual -void LLDynamicTexture::restoreGLTexture() -{ - generateGLTexture() ; -} - -//virtual -void LLDynamicTexture::destroyGLTexture() -{ - releaseGLTexture() ; -} - //----------------------------------------------------------------------------- // static // destroyGL() //----------------------------------------------------------------------------- -void LLDynamicTexture::destroyGL() +void LLViewerDynamicTexture::destroyGL() { for( S32 order = 0; order < ORDER_COUNT; order++ ) { - for (instance_list_t::iterator iter = LLDynamicTexture::sInstances[order].begin(); - iter != LLDynamicTexture::sInstances[order].end(); ++iter) + for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin(); + iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter) { - LLDynamicTexture *dynamicTexture = *iter; + LLViewerDynamicTexture *dynamicTexture = *iter; dynamicTexture->destroyGLTexture() ; } } @@ -266,7 +256,7 @@ void LLDynamicTexture::destroyGL() // static // restoreGL() //----------------------------------------------------------------------------- -void LLDynamicTexture::restoreGL() +void LLViewerDynamicTexture::restoreGL() { if (gGLManager.mIsDisabled) { @@ -275,10 +265,10 @@ void LLDynamicTexture::restoreGL() for( S32 order = 0; order < ORDER_COUNT; order++ ) { - for (instance_list_t::iterator iter = LLDynamicTexture::sInstances[order].begin(); - iter != LLDynamicTexture::sInstances[order].end(); ++iter) + for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin(); + iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter) { - LLDynamicTexture *dynamicTexture = *iter; + LLViewerDynamicTexture *dynamicTexture = *iter; dynamicTexture->restoreGLTexture() ; } } diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h index db24000e7..2342669f2 100644 --- a/indra/newview/lldynamictexture.h +++ b/indra/newview/lldynamictexture.h @@ -35,59 +35,64 @@ #include "llgl.h" #include "llcoord.h" -#include "llimagegl.h" +#include "llviewertexture.h" -class LLDynamicTexture +class LLViewerDynamicTexture : public LLViewerTexture { +public: + enum + { + LL_VIEWER_DYNAMIC_TEXTURE = LLViewerTexture::DYNAMIC_TEXTURE, + LL_TEX_LAYER_SET_BUFFER = LLViewerTexture::INVALID_TEXTURE_TYPE + 1, + LL_VISUAL_PARAM_HINT, + LL_VISUAL_PARAM_RESET, + LL_PREVIEW_ANIMATION, + LL_IMAGE_PREVIEW_SCULPTED, + LL_IMAGE_PREVIEW_AVATAR, + INVALID_DYNAMIC_TEXTURE + }; + +protected: + /*virtual*/ ~LLViewerDynamicTexture(); + public: enum EOrder { ORDER_FIRST = 0, ORDER_MIDDLE = 1, ORDER_LAST = 2, ORDER_RESET = 3, ORDER_COUNT = 4 }; - LLDynamicTexture(S32 width, + LLViewerDynamicTexture(S32 width, S32 height, S32 components, // = 4, EOrder order, // = ORDER_MIDDLE, BOOL clamp); - virtual ~LLDynamicTexture(); + + /*virtual*/ S8 getType() const ; S32 getOriginX() { return mOrigin.mX; } S32 getOriginY() { return mOrigin.mY; } - S32 getWidth() { return mWidth; } - S32 getHeight() { return mHeight; } - S32 getComponents() { return mComponents; } - S32 getSize() { return mWidth * mHeight * mComponents; } + + S32 getSize() { return mFullWidth * mFullHeight * mComponents; } virtual BOOL needsRender() { return TRUE; } virtual void preRender(BOOL clear_depth = TRUE); virtual BOOL render(); virtual void postRender(BOOL success); - virtual void restoreGLTexture() ; - virtual void destroyGLTexture() ; - - LLImageGL* getTexture(void) const { return mTexture; } + virtual void restoreGLTexture() {} + virtual void destroyGLTexture() {} static BOOL updateAllInstances(); - - static void destroyGL(); - static void restoreGL(); - + static void destroyGL() ; + static void restoreGL() ; protected: - void releaseGLTexture(); void generateGLTexture(); - void generateGLTexture(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes = FALSE, const LLColor4U *fill_color = NULL); + void generateGLTexture(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes = FALSE, const LLColor4U *fill_color=NULL); protected: - S32 mWidth; - S32 mHeight; - S32 mComponents; - LLPointer mTexture; - F32 mLastBindTime; BOOL mClamp; LLCoordGL mOrigin; - LLCamera mCamera; - typedef std::set instance_list_t; - static instance_list_t sInstances[ LLDynamicTexture::ORDER_COUNT ]; + + typedef std::set instance_list_t; + static instance_list_t sInstances[ LLViewerDynamicTexture::ORDER_COUNT ]; static S32 sNumRenders; }; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 18a9ed8e7..186870a80 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -47,7 +47,7 @@ #include "lllightconstants.h" #include "llsky.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llvosky.h" #include "llvovolume.h" #include "pipeline.h" @@ -228,7 +228,7 @@ void LLFace::setWorldMatrix(const LLMatrix4 &mat) llerrs << "Faces on this drawable are not independently modifiable\n" << llendl; } -void LLFace::setPool(LLFacePool* new_pool, LLViewerImage *texturep) +void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep) { LLMemType mt1(LLMemType::MTYPE_DRAWABLE); @@ -262,7 +262,7 @@ void LLFace::setPool(LLFacePool* new_pool, LLViewerImage *texturep) setTexture(texturep) ; } -void LLFace::setTexture(LLViewerImage* tex) +void LLFace::setTexture(LLViewerTexture* tex) { if(mTexture == tex) { @@ -287,7 +287,7 @@ void LLFace::dirtyTexture() gPipeline.markTextured(getDrawable()); } -void LLFace::switchTexture(LLViewerImage* new_texture) +void LLFace::switchTexture(LLViewerTexture* new_texture) { if(mTexture == new_texture) { @@ -299,7 +299,7 @@ void LLFace::switchTexture(LLViewerImage* new_texture) llerrs << "Can not switch to a null texture." << llendl; return; } - new_texture->addTextureStats(mTexture->mMaxVirtualSize) ; + new_texture->addTextureStats(mTexture->getMaxVirtualSize()) ; getViewerObject()->changeTEImage(mTEOffset, new_texture) ; setTexture(new_texture) ; @@ -476,8 +476,7 @@ void LLFace::renderForSelect(U32 data_mask) } } } - -void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color) +void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color) { if (mDrawablep->getSpatialGroup() == NULL) { @@ -521,8 +520,8 @@ void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color) /* removed in lieu of raycast uv detection void LLFace::renderSelectedUV() { - LLViewerImage* red_blue_imagep = gImageList.getImageFromFile("uv_test1.j2c", TRUE, TRUE); - LLViewerImage* green_imagep = gImageList.getImageFromFile("uv_test2.tga", TRUE, TRUE); + LLViewerTexture* red_blue_imagep = gTextureList.getImageFromFile("uv_test1.j2c", TRUE, TRUE); + LLViewerTexture* green_imagep = gTextureList.getImageFromFile("uv_test2.tga", TRUE, TRUE); LLGLSUVSelect object_select; @@ -961,7 +960,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, { if (num_indices + (S32) mIndicesIndex > mVertexBuffer->getNumIndices()) { - llwarns << "Index buffer overflow!" << llendl; + llwarns << "Index buffer overflow!" << llendl; + llwarns << "Indices Count: " << mIndicesCount + << " VF Num Indices: " << num_indices + << " Indices Index: " << mIndicesIndex + << " VB Num Indices: " << mVertexBuffer->getNumIndices() << llendl; + llwarns << "Last Indices Count: " << mLastIndicesCount + << " Last Indices Index: " << mLastIndicesIndex + << " Face Index: " << f + << " Pool Type: " << mPoolType << llendl; return FALSE; } @@ -1152,7 +1159,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, break; case BE_BRIGHTNESS: case BE_DARKNESS: - if( mTexture.notNull() && mTexture->getHasGLTexture()) + if( mTexture.notNull() && mTexture->hasGLTexture()) { // Offset by approximately one texel S32 cur_discard = mTexture->getDiscardLevel(); @@ -1346,7 +1353,7 @@ F32 LLFace::getTextureVirtualSize() } face_area = LLFace::adjustPixelArea(mImportanceToCamera, face_area); - if (/*mImportanceToCamera < 1.0f && */face_area > LLViewerImage::sMinLargeImageSize) //if is large image, shrink face_area by considering the partial overlapping. + if (/*mImportanceToCamera < 1.0f && */face_area > LLViewerTexture::sMinLargeImageSize) //if is large image, shrink face_area by considering the partial overlapping. { if (mImportanceToCamera > LEAST_IMPORTANCE_FOR_LARGE_IMAGE && mTexture.notNull() && mTexture->isLargeImage()) { @@ -1359,28 +1366,6 @@ F32 LLFace::getTextureVirtualSize() return face_area; } -//static -F32 LLFace::adjustPixelArea(F32 importance, F32 pixel_area) -{ - if (pixel_area > LLViewerImage::sMaxSmallImageSize) - { - if (importance < LEAST_IMPORTANCE) //if the face is not important, do not load hi-res. - { - static const F32 MAX_LEAST_IMPORTANCE_IMAGE_SIZE = 128.0f * 128.0f; - pixel_area = llmin(pixel_area * 0.5f, MAX_LEAST_IMPORTANCE_IMAGE_SIZE); - } - else if (pixel_area > LLViewerImage::sMinLargeImageSize) //if is large image, shrink face_area by considering the partial overlapping. - { - if (importance < LEAST_IMPORTANCE_FOR_LARGE_IMAGE) //if the face is not important, do not load hi-res. - { - pixel_area = LLViewerImage::sMinLargeImageSize; - } - } - } - - return pixel_area ; -} - BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) { //get area of circle around face @@ -1398,7 +1383,7 @@ BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) mPixelArea = radius*radius * 3.14159f; cos_angle_to_view_dir = lookAt * camera->getXAxis(); - if (dist < mBoundingSphereRadius || dist < 10.0f) //camera is very close + if(dist < mBoundingSphereRadius) //camera is very close { cos_angle_to_view_dir = 1.0f; mImportanceToCamera = 1.0f; @@ -1479,6 +1464,28 @@ F32 LLFace::calcImportanceToCamera(F32 cos_angle_to_view_dir, F32 dist) return importance ; } +//static +F32 LLFace::adjustPixelArea(F32 importance, F32 pixel_area) +{ + if(pixel_area > LLViewerTexture::sMaxSmallImageSize) + { + if(importance < LEAST_IMPORTANCE) //if the face is not important, do not load hi-res. + { + static const F32 MAX_LEAST_IMPORTANCE_IMAGE_SIZE = 128.0f * 128.0f ; + pixel_area = llmin(pixel_area * 0.5f, MAX_LEAST_IMPORTANCE_IMAGE_SIZE) ; + } + else if(pixel_area > LLViewerTexture::sMinLargeImageSize) //if is large image, shrink face_area by considering the partial overlapping. + { + if(importance < LEAST_IMPORTANCE_FOR_LARGE_IMAGE)//if the face is not important, do not load hi-res. + { + pixel_area = LLViewerTexture::sMinLargeImageSize ; + } + } + } + + return pixel_area ; +} + BOOL LLFace::verify(const U32* indices_array) const { BOOL ok = TRUE; @@ -1667,3 +1674,7 @@ LLVector3 LLFace::getPositionAgent() const return mCenterLocal * getRenderMatrix(); } } +LLViewerTexture* LLFace::getTexture() const +{ + return mTexture ; +} diff --git a/indra/newview/llface.h b/indra/newview/llface.h index c23cf2586..9825d4dc2 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -45,16 +45,16 @@ #include "xform.h" #include "lldarrayptr.h" #include "llvertexbuffer.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llstat.h" #include "lldrawable.h" class LLFacePool; class LLVolume; -class LLViewerImage; +class LLViewerTexture; class LLTextureEntry; class LLVertexProgram; -class LLViewerImage; +class LLViewerTexture; class LLGeometryManager; const F32 MIN_ALPHA_SIZE = 1024.f; @@ -87,8 +87,8 @@ public: U16 getGeomCount() const { return mGeomCount; } // vertex count for this face U16 getGeomIndex() const { return mGeomIndex; } // index into draw pool U16 getGeomStart() const { return mGeomIndex; } // index into draw pool - void setTexture(LLViewerImage* tex) ; - void switchTexture(LLViewerImage* new_texture); + void setTexture(LLViewerTexture* tex) ; + void switchTexture(LLViewerTexture* new_texture); void dirtyTexture(); LLXformMatrix* getXform() const { return mXform; } BOOL hasGeometry() const { return mGeomCount > 0; } @@ -127,10 +127,10 @@ public: LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; } void setPoolType(U32 type) { mPoolType = type; } S32 getTEOffset() { return mTEOffset; } - LLViewerImage* getTexture() const { return mTexture; } + LLViewerTexture* getTexture() const; void setViewerObject(LLViewerObject* object); - void setPool(LLFacePool *pool, LLViewerImage *texturep); + void setPool(LLFacePool *pool, LLViewerTexture *texturep); void setDrawable(LLDrawable *drawable); void setTEOffset(const S32 te_offset); @@ -180,7 +180,7 @@ public: void renderSelectedUV(); void renderForSelect(U32 data_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); - void renderSelected(LLImageGL *image, const LLColor4 &color); + void renderSelected(LLViewerTexture *image, const LLColor4 &color); F32 getKey() const { return mDistance; } @@ -240,7 +240,7 @@ private: U32 mLastIndicesIndex; LLXformMatrix* mXform; - LLPointer mTexture; + LLPointer mTexture; LLPointer mDrawablep; LLPointer mVObjp; S32 mTEOffset; diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 5e8095e2f..27661567e 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -43,7 +43,7 @@ #include "llfontgl.h" #include "llappviewer.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llui.h" #include "llviewercontrol.h" #include "llstat.h" @@ -85,6 +85,7 @@ static struct ft_display_info ft_display_table[] = { LLFastTimer::FTM_IDLE, " Idle", &blue0, 0 }, { LLFastTimer::FTM_PUMP, " Pump", &LLColor4::magenta2, 1 }, { LLFastTimer::FTM_CURL, " Curl", &LLColor4::magenta3, 0 }, + { LLFastTimer::FTM_PUMPIO, " PumpIO", &LLColor4::magenta1, 0 }, { LLFastTimer::FTM_INVENTORY, " Inventory Update", &LLColor4::purple6, 1 }, { LLFastTimer::FTM_AUTO_SELECT, " Open and Select", &LLColor4::red, 0 }, { LLFastTimer::FTM_FILTER, " Filter", &LLColor4::red2, 0 }, diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 338e2ae51..9614f639d 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -50,7 +50,7 @@ #include "llviewercontrol.h" #include "llworld.h" #include "lldrawpoolterrain.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llwindow.h" #include "llui.h" #include "llcontrol.h" @@ -252,12 +252,10 @@ BOOL LLFeatureManager::loadFeatureTables() mTableVersion = version; LLFeatureList *flp = NULL; - while (!file.eof() && file.good()) + while (file >> name) { char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - file >> name; - if (name.substr(0,2) == "//") { // This is a comment. @@ -265,13 +263,6 @@ BOOL LLFeatureManager::loadFeatureTables() continue; } - if (name.empty()) - { - // This is a blank line - file.getline(buffer, MAX_STRING); - continue; - } - if (name == "list") { if (flp) diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 8648eef7c..5cea197ca 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -693,6 +693,16 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename) L"Asset Blacklists (*.blacklist)\0*.blacklist\0" \ L"\0"; break; + case FFSAVE_PHYSICS: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.phy", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"phy"; + mOFN.lpstrFilter = + L"Landmarks (*.phy)\0*.phy\0" \ + L"\0"; + break; // default: return FALSE; diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h index ea1e61fc2..feba53423 100644 --- a/indra/newview/llfilepicker.h +++ b/indra/newview/llfilepicker.h @@ -139,6 +139,7 @@ public: FFSAVE_LANDMARK = 34, FFSAVE_AO = 35, FFSAVE_BLACKLIST = 36, + FFSAVE_PHYSICS = 37, // }; diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index b9032107a..091c2b82b 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -43,7 +43,7 @@ #include "llagent.h" #include "llsky.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewercontrol.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 043de9c23..62b0ee495 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -75,7 +75,6 @@ -extern LLCPUInfo gSysCPU; extern LLMemoryInfo gSysMemory; extern U32 gPacketsIn; @@ -275,7 +274,7 @@ LLFloaterAbout::LLFloaterAbout() // TODO: Implement media plugin version query - support.append("Qt Webkit Version: 4.7.1 "); + support.append("Qt Webkit Version: 4.7.1 (version number hard-coded)"); support.append("\n"); if (gPacketsIn > 0) diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index c71a258d3..aea63301e 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -497,7 +497,6 @@ BOOL LLFloaterAnimPreview::postBuild() } else { - delete mAnimPreview; mAnimPreview = NULL; mMotionID.setNull(); childSetValue("bad_animation_text", getString("failed_to_initialize")); @@ -536,7 +535,6 @@ LLFloaterAnimPreview::~LLFloaterAnimPreview() avatarp->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET); } } - delete mAnimPreview; mAnimPreview = NULL; setEnabled(FALSE); @@ -556,7 +554,7 @@ void LLFloaterAnimPreview::draw() { gGL.color3f(1.f, 1.f, 1.f); - gGL.getTexUnit(0)->bind(mAnimPreview->getTexture()); + gGL.getTexUnit(0)->bind(mAnimPreview); gGL.begin( LLRender::QUADS ); { @@ -1469,7 +1467,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata) //----------------------------------------------------------------------------- // LLPreviewAnimation //----------------------------------------------------------------------------- -LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) +LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) { mNeedsUpdate = TRUE; mCameraDistance = PREVIEW_CAMERA_DISTANCE; @@ -1504,6 +1502,12 @@ LLPreviewAnimation::~LLPreviewAnimation() mDummyAvatar->markDead(); } +//virtual +S8 LLPreviewAnimation::getType() const +{ + return LLViewerDynamicTexture::LL_PREVIEW_ANIMATION ; +} + //----------------------------------------------------------------------------- // update() //----------------------------------------------------------------------------- @@ -1515,7 +1519,7 @@ BOOL LLPreviewAnimation::render() glMatrixMode(GL_PROJECTION); gGL.pushMatrix(); glLoadIdentity(); - glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f); + glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); gGL.pushMatrix(); @@ -1525,7 +1529,7 @@ BOOL LLPreviewAnimation::render() gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.color4f(0.15f, 0.2f, 0.3f, 1.f); - gl_rect_2d_simple( mWidth, mHeight ); + gl_rect_2d_simple( mFullWidth, mFullHeight ); glMatrixMode(GL_PROJECTION); gGL.popMatrix(); @@ -1547,7 +1551,7 @@ BOOL LLPreviewAnimation::render() target_pos + (mCameraOffset * av_rot) ); // point of interest LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom); - LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE); + LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); mCameraRelPos = LLViewerCamera::getInstance()->getOrigin() - avatarp->mHeadp->getWorldPosition(); diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h index daf8621e4..6390fe161 100644 --- a/indra/newview/llfloateranimpreview.h +++ b/indra/newview/llfloateranimpreview.h @@ -41,12 +41,16 @@ class LLVOAvatar; class LLViewerJointMesh; -class LLPreviewAnimation : public LLDynamicTexture +class LLPreviewAnimation : public LLViewerDynamicTexture { -public: - LLPreviewAnimation(S32 width, S32 height); +protected: virtual ~LLPreviewAnimation(); +public: + LLPreviewAnimation(S32 width, S32 height); + + /*virtual*/ S8 getType() const ; + BOOL render(); void requestUpdate(); void rotate(F32 yaw_radians, F32 pitch_radians); @@ -116,7 +120,7 @@ protected: void draw(); void resetMotion(); - LLPreviewAnimation* mAnimPreview; + LLPointer< LLPreviewAnimation> mAnimPreview; S32 mLastMouseX; S32 mLastMouseY; LLButton* mPlayButton; diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 85a0ef98b..fd886f10b 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -45,7 +45,7 @@ #include "llagent.h" #include "llcombobox.h" #include "llnotify.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" #include "lluictrlfactory.h" @@ -196,7 +196,7 @@ void LLFloaterAuction::onClickSnapshot(void* data) tga->encode(raw); LLVFile::writeFile(tga->getData(), tga->getDataSize(), gVFS, self->mImageID, LLAssetType::AT_IMAGE_TGA); - raw->biasedScaleToPowerOfTwo(LLViewerImage::MAX_IMAGE_SIZE_DEFAULT); + raw->biasedScaleToPowerOfTwo(LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT); llinfos << "Writing J2C..." << llendl; @@ -204,7 +204,7 @@ void LLFloaterAuction::onClickSnapshot(void* data) j2c->encode(raw, 0.0f); LLVFile::writeFile(j2c->getData(), j2c->getDataSize(), gVFS, self->mImageID, LLAssetType::AT_TEXTURE); - self->mImage = new LLImageGL((LLImageRaw*)raw, FALSE); + self->mImage = LLViewerTextureManager::getLocalTexture((LLImageRaw*)raw, FALSE); gGL.getTexUnit(0)->bind(self->mImage); self->mImage->setAddressMode(LLTexUnit::TAM_CLAMP); } diff --git a/indra/newview/llfloaterauction.h b/indra/newview/llfloaterauction.h index e13bce01e..a9f1ea874 100644 --- a/indra/newview/llfloaterauction.h +++ b/indra/newview/llfloaterauction.h @@ -37,7 +37,7 @@ #include "llfloater.h" #include "lluuid.h" #include "llmemory.h" -#include "llviewerimage.h" +#include "llviewertexture.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLFloaterAuction @@ -69,7 +69,7 @@ private: private: LLTransactionID mTransactionID; LLAssetID mImageID; - LLPointer mImage; + LLPointer mImage; LLSafeHandle mParcelp; S32 mParcelID; LLHost mParcelHost; diff --git a/indra/newview/llfloateravatarinfo.h b/indra/newview/llfloateravatarinfo.h index b751aeda9..9d78e18ec 100644 --- a/indra/newview/llfloateravatarinfo.h +++ b/indra/newview/llfloateravatarinfo.h @@ -57,7 +57,7 @@ class LLTextBox; class LLTextEditor; class LLTextureCtrl; class LLUICtrl; -class LLViewerImage; +class LLViewerTexture; class LLViewerObject; class LLFloaterAvatarInfo diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index 0eb91f7f8..7ddc609fd 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -345,7 +345,9 @@ BOOL LLFloaterAvatarList::postBuild() mAvatarList = getChild("avatar_list"); mAvatarList->sortByColumn("distance", TRUE); mAvatarList->setCommitOnSelectionChange(TRUE); - childSetCommitCallback("avatar_list", onSelectName, this); + mAvatarList->setCallbackUserData(this); + mAvatarList->setCommitCallback(onSelectName); + mAvatarList->setDoubleClickCallback(onClickFocus); refreshAvatarList(); gIdleCallbacks.addFunction(LLFloaterAvatarList::callbackIdle); diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp index 11af4b628..5f656bae2 100644 --- a/indra/newview/llfloateravatartextures.cpp +++ b/indra/newview/llfloateravatartextures.cpp @@ -89,9 +89,9 @@ void LLFloaterAvatarTextures::draw() LLFloater::draw(); } -// -//#if !LL_RELEASE_FOR_DOWNLOAD -// +// +//#if !LL_RELEASE_FOR_DOWNLOAD +// static void update_texture_ctrl(LLVOAvatar* avatarp, LLTextureCtrl* ctrl, ETextureIndex te) @@ -148,9 +148,9 @@ void LLFloaterAvatarTextures::refresh() } } -// -/* -// +// +/* +// #else void LLFloaterAvatarTextures::refresh() @@ -158,16 +158,16 @@ void LLFloaterAvatarTextures::refresh() } #endif -// -*/ -// +// +*/ +// // static void LLFloaterAvatarTextures::onClickDump(void* data) { -// -//#if !LL_RELEASE_FOR_DOWNLOAD -// +// +//#if !LL_RELEASE_FOR_DOWNLOAD +// LLFloaterAvatarTextures* self = (LLFloaterAvatarTextures*)data; LLVOAvatar* avatarp = find_avatar(self->mID); if (!avatarp) return; @@ -179,7 +179,7 @@ void LLFloaterAvatarTextures::onClickDump(void* data) llinfos << "Avatar TE " << i << " id " << te->getID() << llendl; } -// -//#endif -// +// +//#endif +// } diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 6721661b1..3216a8de0 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -110,7 +110,7 @@ void LLFloaterBulkPermission::doApply() // worked on. // NOT static, virtual! void LLFloaterBulkPermission::inventoryChanged(LLViewerObject* viewer_object, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32, void* q_id) { @@ -253,12 +253,12 @@ void LLFloaterBulkPermission::doCheckUncheckAll(BOOL check) } -void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, InventoryObjectList* inv) +void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInventoryObject::object_list_t* inv) { LLScrollListCtrl* list = getChild("queue output"); - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { LLAssetType::EType asstype = (*it)->getType(); @@ -292,7 +292,7 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, Invent if((perm.getMaskNextOwner() != desired_next_owner_perms) && (new_item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; } // If everyone permissions have changed (and this is an object) // then set the overwrite everyone permissions flag so they @@ -300,7 +300,7 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, Invent if ((perm.getMaskEveryone() != desired_everyone_perms) && (new_item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; } // If group permissions have changed (and this is an object) // then set the overwrite group permissions flag so they @@ -308,7 +308,7 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, Invent if ((perm.getMaskGroup() != desired_group_perms) && (new_item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; } // chomp the inventory name so it fits in the scroll window nicely diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index a26b5b4f7..5194b1563 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -62,13 +62,13 @@ private: // This is the callback method for the viewer object currently // being worked on. /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* queue); // This is called by inventoryChanged void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); void updateInventory(LLViewerObject* object, diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index 99c9fed5d..ab7bdce7c 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -199,7 +199,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info) } void LLFloaterBuy::inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data) { @@ -224,8 +224,8 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj, return; } - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it ) { LLInventoryObject* obj = (LLInventoryObject*)(*it); @@ -254,7 +254,7 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj, // Compute icon for this item BOOL item_is_multi = FALSE; - if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED ) + if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED ) { item_is_multi = TRUE; } diff --git a/indra/newview/llfloaterbuy.h b/indra/newview/llfloaterbuy.h index 7473e6c85..409358d68 100644 --- a/indra/newview/llfloaterbuy.h +++ b/indra/newview/llfloaterbuy.h @@ -63,7 +63,7 @@ protected: void requestObjectInventories(); /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data); diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index e16f98dff..aa7468d38 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -145,7 +145,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info) void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data) { @@ -179,8 +179,8 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj, LLInventoryType::EType inv_type; S32 wearable_count = 0; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it ) { @@ -222,7 +222,7 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj, LLSD row; BOOL item_is_multi = FALSE; - if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED ) + if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED ) { item_is_multi = TRUE; } diff --git a/indra/newview/llfloaterbuycontents.h b/indra/newview/llfloaterbuycontents.h index 908ff134e..63e62ea83 100644 --- a/indra/newview/llfloaterbuycontents.h +++ b/indra/newview/llfloaterbuycontents.h @@ -58,7 +58,7 @@ protected: void requestObjectInventories(); /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data); diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 7f0720f3b..88d925490 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -165,7 +165,7 @@ createUI () * ( bits + x + y * linesize + 2 ) = ( U8 )( bVal * 255.0f ); } } - mRGBImage = new LLImageGL ( (LLImageRaw*)raw, FALSE ); + mRGBImage = LLViewerTextureManager::getLocalTexture( (LLImageRaw*)raw, FALSE ); gGL.getTexUnit(0)->bind(mRGBImage); mRGBImage->setAddressMode(LLTexUnit::TAM_CLAMP); diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h index ad66e2e33..b93ea664c 100644 --- a/indra/newview/llfloatercolorpicker.h +++ b/indra/newview/llfloatercolorpicker.h @@ -180,7 +180,7 @@ class LLFloaterColorPicker const S32 mPaletteRegionHeight; // image used to compose color grid - LLPointer mRGBImage; + LLPointer mRGBImage; // current swatch in use LLColorSwatchCtrl* mSwatch; diff --git a/indra/newview/llfloatercustomize.cpp b/indra/newview/llfloatercustomize.cpp index f4f52eb73..6a313c2bd 100644 --- a/indra/newview/llfloatercustomize.cpp +++ b/indra/newview/llfloatercustomize.cpp @@ -55,7 +55,7 @@ #include "llinventoryview.h" #include "lltextbox.h" #include "lllineeditor.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llfocusmgr.h" #include "llviewerwindow.h" #include "llviewercamera.h" @@ -405,12 +405,19 @@ enum ESubpart { SUBPART_UNDERPANTS, SUBPART_SKIRT, SUBPART_ALPHA, - SUBPART_TATTOO + SUBPART_TATTOO, + SUBPART_PHYSICS_BREASTS_UPDOWN, + SUBPART_PHYSICS_BREASTS_INOUT, + SUBPART_PHYSICS_BREASTS_LEFTRIGHT, + SUBPART_PHYSICS_BELLY_UPDOWN, + SUBPART_PHYSICS_BUTT_UPDOWN, + SUBPART_PHYSICS_BUTT_LEFTRIGHT, + SUBPART_PHYSICS_ADVANCED }; struct LLSubpart { - LLSubpart() : mSex( SEX_BOTH ) {} + LLSubpart() : mSex( SEX_BOTH ), mVisualHint(true) {} std::string mButtonName; std::string mTargetJoint; @@ -418,6 +425,8 @@ struct LLSubpart LLVector3d mTargetOffset; LLVector3d mCameraOffset; ESex mSex; + + bool mVisualHint; }; //////////////////////////////////////////////////////////////////////////// @@ -622,7 +631,7 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart ) llassert( sorted_params.find(-param->getDisplayOrder()) == sorted_params.end() ); // Check for duplicates sorted_params.insert(vt); } - gFloaterCustomize->generateVisualParamHints(NULL, sorted_params); + gFloaterCustomize->generateVisualParamHints(NULL, sorted_params, part->mVisualHint); gFloaterCustomize->updateScrollingPanelUI(); gFloaterCustomize->childSetEnabled("Export", can_export); gFloaterCustomize->childSetEnabled("Import", can_import); @@ -763,7 +772,7 @@ void LLPanelEditWearable::onInvisibilityCommit(LLUICtrl* ctrl, void* userdata) bool new_invis_state = checkbox_ctrl->get(); if (new_invis_state) { - LLViewerImage* image = gImageList.getImage(IMG_INVISIBLE); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(IMG_INVISIBLE); const LLTextureEntry* current_te = avatar->getTE(te); if (current_te) { @@ -782,7 +791,7 @@ void LLPanelEditWearable::onInvisibilityCommit(LLUICtrl* ctrl, void* userdata) } if (prev_id.notNull()) { - LLViewerImage* image = gImageList.getImage(prev_id); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id); avatar->setLocTexTE(te, image, TRUE); avatar->wearableUpdated(self->mType, FALSE); } @@ -888,10 +897,10 @@ void LLPanelEditWearable::onTextureCommit( LLUICtrl* ctrl, void* userdata ) ETextureIndex te = (ETextureIndex)(self->mTextureList[ctrl->getName()]); // Set the new version - LLViewerImage* image = gImageList.getImage( texture_ctrl->getImageAssetID() ); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( texture_ctrl->getImageAssetID() ); if (image->getID().isNull()) { - image = gImageList.getImage(IMG_DEFAULT_AVATAR); + image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); } self->mTextureList[ctrl->getName()] = te; if (gAgent.getWearable(self->mType)) @@ -926,6 +935,7 @@ ESubpart LLPanelEditWearable::getDefaultSubpart() case WT_SKIRT: return SUBPART_SKIRT; case WT_ALPHA: return SUBPART_ALPHA; case WT_TATTOO: return SUBPART_TATTOO; + case WT_PHYSICS: return SUBPART_PHYSICS_BELLY_UPDOWN; default: llassert(0); return SUBPART_SHAPE_WHOLE; } @@ -974,6 +984,7 @@ void LLPanelEditWearable::draw() for (std::map::iterator iter = mSubpartList.begin(); iter != mSubpartList.end(); ++iter) { + childSetVisible(iter->second->mButtonName,has_wearable); if( has_wearable && is_complete && is_modifiable ) { childSetEnabled(iter->second->mButtonName, iter->second->mSex & avatar->getSex() ); @@ -993,6 +1004,8 @@ void LLPanelEditWearable::draw() childSetVisible("path", FALSE); + LLTextBox *av_height = getChild("avheight",FALSE,FALSE); + if(av_height) //Only display this if the element exists { // Display the shape's nominal height. // @@ -1006,8 +1019,8 @@ void LLPanelEditWearable::draw() std::ostringstream avheight(std::ostringstream::trunc); avheight << std::fixed << std::setprecision(2) << avsize << " m (" << feet << "' " << inches << "\")"; - childSetVisible("avheight", TRUE); - childSetTextArg("avheight", "[AVHEIGHT]", avheight.str()); + av_height->setVisible(TRUE); + av_height->setTextArg("[AVHEIGHT]",avheight.str()); } if(has_wearable && !is_modifiable) @@ -1271,7 +1284,7 @@ void LLPanelEditWearable::setUIPermissions(U32 perm_mask, BOOL is_complete) class LLScrollingPanelParam : public LLScrollingPanel { public: - LLScrollingPanelParam( const std::string& name, LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify ); + LLScrollingPanelParam( const std::string& name, LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint ); virtual ~LLScrollingPanelParam(); virtual void draw(); @@ -1297,8 +1310,11 @@ public: public: LLViewerVisualParam* mParam; - LLVisualParamHint* mHintMin; - LLVisualParamHint* mHintMax; + LLPointer mHintMin; + LLPointer mHintMax; + LLButton* mLess; + LLButton* mMore; + static S32 sUpdateDelayFrames; protected: @@ -1319,51 +1335,68 @@ const S32 PARAM_PANEL_WIDTH = 2 * (3* BTN_BORDER + PARAM_HINT_WIDTH + LLPANEL_B const S32 PARAM_PANEL_HEIGHT = 2 * BTN_BORDER + PARAM_HINT_HEIGHT + PARAM_HINT_LABEL_HEIGHT + 4 * LLPANEL_BORDER_WIDTH; LLScrollingPanelParam::LLScrollingPanelParam( const std::string& name, - LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify ) + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, bool bVisualHint ) : LLScrollingPanel( name, LLRect( 0, PARAM_PANEL_HEIGHT, PARAM_PANEL_WIDTH, 0 ) ), mParam(param), - mAllowModify(allow_modify) + mAllowModify(allow_modify), + mLess(NULL), + mMore(NULL) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_scrolling_param.xml"); - - S32 pos_x = 2 * LLPANEL_BORDER_WIDTH; - S32 pos_y = 3 * LLPANEL_BORDER_WIDTH + SLIDERCTRL_HEIGHT; - F32 min_weight = param->getMinWeight(); - F32 max_weight = param->getMaxWeight(); - - mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, min_weight); - pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER; - mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, max_weight ); - mHintMin->setAllowsUpdates( FALSE ); - mHintMax->setAllowsUpdates( FALSE ); - childSetValue("param slider", weightToPercent(param->getWeight())); - childSetLabelArg("param slider", "[DESC]", param->getDisplayName()); - childSetEnabled("param slider", mAllowModify); - childSetCommitCallback("param slider", LLScrollingPanelParam::onSliderMoved, this); + //Set up the slider + LLSliderCtrl *slider = getChild("param slider"); + slider->setValue(weightToPercent(param->getWeight())); + slider->setLabelArg("[DESC]", param->getDisplayName()); + slider->setEnabled(mAllowModify); + slider->setCommitCallback(LLScrollingPanelParam::onSliderMoved); + slider->setCallbackUserData(this); - // *TODO::translate - std::string min_name = param->getMinDisplayName(); - std::string max_name = param->getMaxDisplayName(); - childSetValue("min param text", min_name); - childSetValue("max param text", max_name); - - LLButton* less = getChild("less"); - if (less) + if(bVisualHint) { - less->setMouseDownCallback( LLScrollingPanelParam::onHintMinMouseDown ); - less->setMouseUpCallback( LLScrollingPanelParam::onHintMinMouseUp ); - less->setHeldDownCallback( LLScrollingPanelParam::onHintMinHeldDown ); - less->setHeldDownDelay( PARAM_STEP_TIME_THRESHOLD ); + S32 pos_x = 2 * LLPANEL_BORDER_WIDTH; + S32 pos_y = 3 * LLPANEL_BORDER_WIDTH + SLIDERCTRL_HEIGHT; + F32 min_weight = param->getMinWeight(); + F32 max_weight = param->getMaxWeight(); + + mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, min_weight); + pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER; + mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, max_weight ); + + mHintMin->setAllowsUpdates( FALSE ); + mHintMax->setAllowsUpdates( FALSE ); + + // *TODO::translate + std::string min_name = param->getMinDisplayName(); + std::string max_name = param->getMaxDisplayName(); + childSetValue("min param text", min_name); + childSetValue("max param text", max_name); + mLess = getChild("less"); + mLess->setMouseDownCallback( LLScrollingPanelParam::onHintMinMouseDown ); + mLess->setMouseUpCallback( LLScrollingPanelParam::onHintMinMouseUp ); + mLess->setHeldDownCallback( LLScrollingPanelParam::onHintMinHeldDown ); + mLess->setHeldDownDelay( PARAM_STEP_TIME_THRESHOLD ); + + mMore = getChild("more"); + mMore->setMouseDownCallback( LLScrollingPanelParam::onHintMaxMouseDown ); + mMore->setMouseUpCallback( LLScrollingPanelParam::onHintMaxMouseUp ); + mMore->setHeldDownCallback( LLScrollingPanelParam::onHintMaxHeldDown ); + mMore->setHeldDownDelay( PARAM_STEP_TIME_THRESHOLD ); } - - LLButton* more = getChild("more"); - if (more) + else { - more->setMouseDownCallback( LLScrollingPanelParam::onHintMaxMouseDown ); - more->setMouseUpCallback( LLScrollingPanelParam::onHintMaxMouseUp ); - more->setHeldDownCallback( LLScrollingPanelParam::onHintMaxHeldDown ); - more->setHeldDownDelay( PARAM_STEP_TIME_THRESHOLD ); + //Kill everything that isn't the slider... + for(child_list_t::const_iterator it = getChildList()->begin();it!=getChildList()->end();) + { + if((*it)!=slider && (*it)->getName() != "panel border") + { + llinfos << "removing: " << (*it)->getName() << llendl; + removeChild((*(it++)),TRUE); + } + else ++it; + } + slider->translate(0,PARAM_HINT_HEIGHT); + reshape(getRect().getWidth(),getRect().getHeight()-PARAM_HINT_HEIGHT); } setVisible(FALSE); @@ -1372,21 +1405,25 @@ LLScrollingPanelParam::LLScrollingPanelParam( const std::string& name, LLScrollingPanelParam::~LLScrollingPanelParam() { - delete mHintMin; - delete mHintMax; + mHintMin = NULL; + mHintMax = NULL; } void LLScrollingPanelParam::updatePanel(BOOL allow_modify) { - LLViewerVisualParam* param = mHintMin->getVisualParam(); - childSetValue("param slider", weightToPercent( param->getWeight() ) ); - mHintMin->requestUpdate( sUpdateDelayFrames++ ); - mHintMax->requestUpdate( sUpdateDelayFrames++ ); + childSetValue("param slider", weightToPercent( mParam->getWeight() ) ); + if(mHintMin) + mHintMin->requestUpdate( sUpdateDelayFrames++ ); + if(mHintMax) + mHintMax->requestUpdate( sUpdateDelayFrames++ ); mAllowModify = allow_modify; childSetEnabled("param slider", mAllowModify); - childSetEnabled("less", mAllowModify); - childSetEnabled("more", mAllowModify); + + if(mLess) + mLess->setEnabled(mAllowModify); + if(mMore) + mMore->setEnabled(mAllowModify); } void LLScrollingPanelParam::setVisible( BOOL visible ) @@ -1394,13 +1431,17 @@ void LLScrollingPanelParam::setVisible( BOOL visible ) if( getVisible() != visible ) { LLPanel::setVisible( visible ); - mHintMin->setAllowsUpdates( visible ); - mHintMax->setAllowsUpdates( visible ); + if(mHintMin) + mHintMin->setAllowsUpdates( visible ); + if(mHintMax) + mHintMax->setAllowsUpdates( visible ); if( visible ) { - mHintMin->setUpdateDelayFrames( sUpdateDelayFrames++ ); - mHintMax->setUpdateDelayFrames( sUpdateDelayFrames++ ); + if(mHintMin) + mHintMin->setUpdateDelayFrames( sUpdateDelayFrames++ ); + if(mHintMax) + mHintMax->setUpdateDelayFrames( sUpdateDelayFrames++ ); } } } @@ -1412,8 +1453,10 @@ void LLScrollingPanelParam::draw() return; } - childSetVisible("less", mHintMin->getVisible()); - childSetVisible("more", mHintMax->getVisible()); + if(mLess) + mLess->setVisible(mHintMin ? mHintMin->getVisible() : false); + if(mMore) + mMore->setVisible(mHintMax ? mHintMax->getVisible() : false); // Draw all the children except for the labels childSetVisible( "min param text", FALSE ); @@ -1421,25 +1464,31 @@ void LLScrollingPanelParam::draw() LLPanel::draw(); // Draw the hints over the "less" and "more" buttons. - glPushMatrix(); + if(mHintMin) { - const LLRect& r = mHintMin->getRect(); - F32 left = (F32)(r.mLeft + BTN_BORDER); - F32 bot = (F32)(r.mBottom + BTN_BORDER); - glTranslatef(left, bot, 0.f); - mHintMin->draw(); + glPushMatrix(); + { + const LLRect& r = mHintMin->getRect(); + F32 left = (F32)(r.mLeft + BTN_BORDER); + F32 bot = (F32)(r.mBottom + BTN_BORDER); + glTranslatef(left, bot, 0.f); + mHintMin->draw(); + } + glPopMatrix(); } - glPopMatrix(); - glPushMatrix(); + if(mHintMax) { - const LLRect& r = mHintMax->getRect(); - F32 left = (F32)(r.mLeft + BTN_BORDER); - F32 bot = (F32)(r.mBottom + BTN_BORDER); - glTranslatef(left, bot, 0.f); - mHintMax->draw(); + glPushMatrix(); + { + const LLRect& r = mHintMax->getRect(); + F32 left = (F32)(r.mLeft + BTN_BORDER); + F32 bot = (F32)(r.mBottom + BTN_BORDER); + glTranslatef(left, bot, 0.f); + mHintMax->draw(); + } + glPopMatrix(); } - glPopMatrix(); // Draw labels on top of the buttons @@ -1684,6 +1733,8 @@ LLFloaterCustomize::LLFloaterCustomize() mNextStepAfterSaveCallback( NULL ), mNextStepAfterSaveUserdata( NULL ) { + memset(&mWearablePanelList[0],0,sizeof(char*)*WT_COUNT); //Initialize to 0 + gSavedSettings.setU32("AvatarSex", (gAgent.getAvatarObject()->getSex() == SEX_MALE) ); mResetParams = new LLVisualParamReset(); @@ -1708,6 +1759,7 @@ LLFloaterCustomize::LLFloaterCustomize() factory_map["Skirt"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_SKIRT) ) ); factory_map["Alpha"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_ALPHA))); factory_map["Tattoo"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_TATTOO))); + factory_map["Physics"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_PHYSICS))); LLUICtrlFactory::getInstance()->buildFloater(this, "floater_customize.xml", &factory_map); } @@ -1741,6 +1793,7 @@ BOOL LLFloaterCustomize::postBuild() childSetTabChangeCallback("customize tab container", "Skirt", onTabChanged, (void*)WT_SKIRT, onTabPrecommit ); childSetTabChangeCallback("customize tab container", "Alpha", onTabChanged, (void*)WT_ALPHA, onTabPrecommit); childSetTabChangeCallback("customize tab container", "Tattoo", onTabChanged, (void*)WT_TATTOO, onTabPrecommit); + childSetTabChangeCallback("customize tab container", "Physics", onTabChanged, (void*)WT_PHYSICS, onTabPrecommit); // Remove underwear panels for teens if (gAgent.isTeen()) @@ -2406,63 +2459,72 @@ void LLFloaterCustomize::initWearablePanels() } ///////////////////////////////////////// - // Alpha - panel = mWearablePanelList[WT_ALPHA]; + // Physics - if (panel) + panel = mWearablePanelList[WT_PHYSICS]; + + if(panel) { part = new LLSubpart(); - part->mTargetJoint = "mPelvis"; - part->mEditGroup = "alpha"; + part->mSex = SEX_FEMALE; + part->mTargetJoint = "mTorso"; + part->mEditGroup = "physics_breasts_updown"; part->mTargetOffset.setVec(0.f, 0.f, 0.1f); - part->mCameraOffset.setVec(-2.5f, 0.5f, 0.8f); - panel->addSubpart(LLStringUtil::null, SUBPART_ALPHA, part); + part->mCameraOffset.setVec(-0.8f, 0.15f, 0.38f); + part->mVisualHint = false; + panel->addSubpart("Breast Bounce", SUBPART_PHYSICS_BREASTS_UPDOWN, part); - panel->addTextureDropTarget(TEX_LOWER_ALPHA, "Lower Alpha", - LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), - TRUE); - panel->addTextureDropTarget(TEX_UPPER_ALPHA, "Upper Alpha", - LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), - TRUE); - panel->addTextureDropTarget(TEX_HEAD_ALPHA, "Head Alpha", - LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), - TRUE); - panel->addTextureDropTarget(TEX_EYES_ALPHA, "Eye Alpha", - LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), - TRUE); - panel->addTextureDropTarget(TEX_HAIR_ALPHA, "Hair Alpha", - LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), - TRUE); + part = new LLSubpart(); + part->mSex = SEX_FEMALE; + part->mTargetJoint = "mTorso"; + part->mEditGroup = "physics_breasts_inout"; + part->mTargetOffset.setVec(0.f, 0.f, 0.1f); + part->mCameraOffset.setVec(-0.8f, 0.15f, 0.38f); + part->mVisualHint = false; + panel->addSubpart("Breast Cleavage", SUBPART_PHYSICS_BREASTS_INOUT, part); - panel->addInvisibilityCheckbox(TEX_LOWER_ALPHA, "lower alpha texture invisible"); - panel->addInvisibilityCheckbox(TEX_UPPER_ALPHA, "upper alpha texture invisible"); - panel->addInvisibilityCheckbox(TEX_HEAD_ALPHA, "head alpha texture invisible"); - panel->addInvisibilityCheckbox(TEX_EYES_ALPHA, "eye alpha texture invisible"); - panel->addInvisibilityCheckbox(TEX_HAIR_ALPHA, "hair alpha texture invisible"); - } + part = new LLSubpart(); + part->mSex = SEX_FEMALE; + part->mTargetJoint = "mTorso"; + part->mEditGroup = "physics_breasts_leftright"; + part->mTargetOffset.setVec(0.f, 0.f, 0.1f); + part->mCameraOffset.setVec(-0.8f, 0.15f, 0.38f); + part->mVisualHint = false; + panel->addSubpart("Breast Sway", SUBPART_PHYSICS_BREASTS_LEFTRIGHT, part); - ///////////////////////////////////////// - // Tattoo - panel = mWearablePanelList[WT_TATTOO]; + part = new LLSubpart(); + part->mSex = SEX_FEMALE; + part->mTargetJoint = "mTorso"; + part->mEditGroup = "physics_belly_updown"; + part->mTargetOffset.setVec(0.f, 0.f, -.05f); + part->mCameraOffset.setVec(-0.8f, 0.15f, 0.38f); + part->mVisualHint = false; + panel->addSubpart("Belly Bounce", SUBPART_PHYSICS_BELLY_UPDOWN, part); - if (panel) - { part = new LLSubpart(); part->mTargetJoint = "mPelvis"; - part->mEditGroup = "tattoo"; + part->mEditGroup = "physics_butt_updown"; + part->mTargetOffset.setVec(0.f, 0.f, -0.1f); + part->mCameraOffset.setVec(0.3f, 0.8f, -0.1f); + part->mVisualHint = false; + panel->addSubpart("Butt Bounce", SUBPART_PHYSICS_BUTT_UPDOWN, part); + + part = new LLSubpart(); + part->mTargetJoint = "mPelvis"; + part->mEditGroup = "physics_butt_leftright"; + part->mTargetOffset.setVec(0.f, 0.f, -0.1f); + part->mCameraOffset.setVec(0.3f, 0.8f, -0.1f); + part->mVisualHint = false; + panel->addSubpart("Butt Sway", SUBPART_PHYSICS_BUTT_LEFTRIGHT, part); + + part = new LLSubpart(); + part->mTargetJoint = "mTorso"; + part->mEditGroup = "physics_advanced"; part->mTargetOffset.setVec(0.f, 0.f, 0.1f); part->mCameraOffset.setVec(-2.5f, 0.5f, 0.8f); - panel->addSubpart(LLStringUtil::null, SUBPART_TATTOO, part); + part->mVisualHint = false; + panel->addSubpart("Advanced Parameters", SUBPART_PHYSICS_ADVANCED, part); - panel->addTextureDropTarget(TEX_LOWER_TATTOO, "Lower Tattoo", - LLUUID::null, - TRUE); - panel->addTextureDropTarget(TEX_UPPER_TATTOO, "Upper Tattoo", - LLUUID::null, - TRUE); - panel->addTextureDropTarget(TEX_HEAD_TATTOO, "Head Tattoo", - LLUUID::null, - TRUE); } } @@ -2471,7 +2533,7 @@ void LLFloaterCustomize::initWearablePanels() LLFloaterCustomize::~LLFloaterCustomize() { llinfos << "Destroying LLFloaterCustomize" << llendl; - delete mResetParams; + mResetParams = NULL; gInventory.removeObserver(mInventoryObserver); delete mInventoryObserver; } @@ -2597,7 +2659,7 @@ void LLFloaterCustomize::clearScrollingPanelList() } } -void LLFloaterCustomize::generateVisualParamHints(LLViewerJointMesh* joint_mesh, LLFloaterCustomize::param_map& params) +void LLFloaterCustomize::generateVisualParamHints(LLViewerJointMesh* joint_mesh, LLFloaterCustomize::param_map& params, bool bVisualHint) { // sorted_params is sorted according to magnitude of effect from // least to greatest. Adding to the front of the child list @@ -2608,7 +2670,7 @@ void LLFloaterCustomize::generateVisualParamHints(LLViewerJointMesh* joint_mesh, param_map::iterator end = params.end(); for(param_map::iterator it = params.begin(); it != end; ++it) { - mScrollingPanelList->addPanel( new LLScrollingPanelParam( "LLScrollingPanelParam", joint_mesh, (*it).second.second, (*it).second.first) ); + mScrollingPanelList->addPanel( new LLScrollingPanelParam( "LLScrollingPanelParam", joint_mesh, (*it).second.second, (*it).second.first, bVisualHint) ); } } } diff --git a/indra/newview/llfloatercustomize.h b/indra/newview/llfloatercustomize.h index 5648cc6af..ceb49af01 100644 --- a/indra/newview/llfloatercustomize.h +++ b/indra/newview/llfloatercustomize.h @@ -88,7 +88,7 @@ public: // New methods void clearScrollingPanelList(); void generateVisualParamHints(LLViewerJointMesh* joint_mesh, - param_map& params); + param_map& params, bool bVisualHint); const std::string& getEditGroup(); void updateScrollingPanelList(BOOL allow_modify); diff --git a/indra/newview/llfloaterexploreanimations.cpp b/indra/newview/llfloaterexploreanimations.cpp index 1704e63e3..3d1f1b737 100644 --- a/indra/newview/llfloaterexploreanimations.cpp +++ b/indra/newview/llfloaterexploreanimations.cpp @@ -44,7 +44,7 @@ void LLFloaterExploreAnimations::close(bool app_quitting) LLFloaterExploreAnimations::~LLFloaterExploreAnimations() { - delete mAnimPreview; + mAnimPreview = NULL; LLFloaterExploreAnimations::sInstance = NULL; } @@ -99,7 +99,7 @@ void LLFloaterExploreAnimations::draw() gGL.color3f(1.f, 1.f, 1.f); - gGL.getTexUnit(0)->bind(mAnimPreview->getTexture()); + gGL.getTexUnit(0)->bind(mAnimPreview); gGL.begin( LLRender::QUADS ); { diff --git a/indra/newview/llfloaterexploreanimations.h b/indra/newview/llfloaterexploreanimations.h index 544ca965c..27c4af3c1 100644 --- a/indra/newview/llfloaterexploreanimations.h +++ b/indra/newview/llfloaterexploreanimations.h @@ -29,7 +29,7 @@ public: void update(); LLUUID mAvatarID; - LLPreviewAnimation* mAnimPreview; + LLPointer mAnimPreview; private: virtual ~LLFloaterExploreAnimations(); diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 658aa1642..cf641e0ea 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -55,7 +55,7 @@ #include "lltextbox.h" #include "lluictrlfactory.h" #include "llviewergesture.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llvoavatar.h" #include "llviewercontrol.h" diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp index 3b721c6ba..fd6bcca05 100644 --- a/indra/newview/llfloaterhardwaresettings.cpp +++ b/indra/newview/llfloaterhardwaresettings.cpp @@ -36,7 +36,7 @@ #include "llfloaterpreference.h" #include "llviewerwindow.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llfeaturemanager.h" #include "llstartup.h" @@ -90,8 +90,8 @@ void LLFloaterHardwareSettings::refresh() void LLFloaterHardwareSettings::refreshEnabledState() { - S32 min_tex_mem = LLViewerImageList::getMinVideoRamSetting(); - S32 max_tex_mem = LLViewerImageList::getMaxVideoRamSetting(); + S32 min_tex_mem = LLViewerTextureList::getMinVideoRamSetting(); + S32 max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(); childSetMinValue("GrapicsCardTextureMemory", min_tex_mem); childSetMaxValue("GrapicsCardTextureMemory", max_tex_mem); @@ -169,32 +169,20 @@ BOOL LLFloaterHardwareSettings::postBuild() } -void LLFloaterHardwareSettings::apply() +void LLFloaterHardwareSettings::apply() { - // Anisotropic rendering - BOOL old_anisotropic = LLImageGL::sGlobalUseAnisotropic; - LLImageGL::sGlobalUseAnisotropic = childGetValue("ani"); - - U32 fsaa = (U32) childGetValue("fsaa").asInteger(); - U32 old_fsaa = gSavedSettings.getU32("RenderFSAASamples"); - - BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED); - - if (old_fsaa != fsaa) + //Still do a bit of voodoo here. V2 forces restart to change FSAA with FBOs off. + //Let's not do that, and instead do pre-V2 FSAA change handling for that particular case + if(!LLRenderTarget::sUseFBO && (mFSAASamples != (U32)childGetValue("fsaa").asInteger())) { - gSavedSettings.setU32("RenderFSAASamples", fsaa); + BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED); LLWindow* window = gViewerWindow->getWindow(); LLCoordScreen size; window->getSize(&size); gViewerWindow->changeDisplaySettings(window->getFullscreen(), - size, - gSavedSettings.getBOOL("DisableVerticalSync"), - logged_in); - } - else if (old_anisotropic != LLImageGL::sGlobalUseAnisotropic) - { - LLImageGL::dirtyTexOptions(); - gViewerWindow->restartDisplay(logged_in); + size, + gSavedSettings.getBOOL("DisableVerticalSync"), + logged_in); } refresh(); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index bca92a006..27cd5055d 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -56,7 +56,7 @@ #include "llvoavatar.h" #include "pipeline.h" #include "lluictrlfactory.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llstring.h" // #include "llviewercontrol.h" @@ -162,8 +162,8 @@ LLFloaterImagePreview::~LLFloaterImagePreview() clearAllPreviewTextures(); mRawImagep = NULL; - delete mAvatarPreview; - delete mSculptedPreview; + mAvatarPreview = NULL; + mSculptedPreview = NULL; mImagep = NULL ; } @@ -272,7 +272,7 @@ void LLFloaterImagePreview::draw() } else { - mImagep = new LLImageGL(mRawImagep, FALSE) ; + mImagep = LLViewerTextureManager::getLocalTexture(mRawImagep.get(), FALSE) ; gGL.getTexUnit(0)->unbind(mImagep->getTarget()) ; gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mImagep->getTexName()); @@ -314,11 +314,11 @@ void LLFloaterImagePreview::draw() if (selected == 9) { - gGL.getTexUnit(0)->bind(mSculptedPreview->getTexture()); + gGL.getTexUnit(0)->bind(mSculptedPreview); } else { - gGL.getTexUnit(0)->bind(mAvatarPreview->getTexture()); + gGL.getTexUnit(0)->bind(mAvatarPreview); } gGL.begin( LLRender::QUADS ); @@ -626,7 +626,7 @@ void LLFloaterImagePreview::onMouseCaptureLostImagePreview(LLMouseHandler* handl //----------------------------------------------------------------------------- // LLImagePreviewAvatar //----------------------------------------------------------------------------- -LLImagePreviewAvatar::LLImagePreviewAvatar(S32 width, S32 height) : LLDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) +LLImagePreviewAvatar::LLImagePreviewAvatar(S32 width, S32 height) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) { mNeedsUpdate = TRUE; mTargetJoint = NULL; @@ -655,6 +655,11 @@ LLImagePreviewAvatar::~LLImagePreviewAvatar() mDummyAvatar->markDead(); } +//virtual +S8 LLImagePreviewAvatar::getType() const +{ + return LLViewerDynamicTexture::LL_IMAGE_PREVIEW_AVATAR ; +} void LLImagePreviewAvatar::setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male) { @@ -716,7 +721,7 @@ BOOL LLImagePreviewAvatar::render() glMatrixMode(GL_PROJECTION); gGL.pushMatrix(); glLoadIdentity(); - glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f); + glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); gGL.pushMatrix(); @@ -725,7 +730,7 @@ BOOL LLImagePreviewAvatar::render() LLGLSUIDefault def; gGL.color4f(0.15f, 0.2f, 0.3f, 1.f); - gl_rect_2d_simple( mWidth, mHeight ); + gl_rect_2d_simple( mFullWidth, mFullHeight ); glMatrixMode(GL_PROJECTION); gGL.popMatrix(); @@ -747,9 +752,9 @@ BOOL LLImagePreviewAvatar::render() stop_glerror(); - LLViewerCamera::getInstance()->setAspect((F32)mWidth / mHeight); + LLViewerCamera::getInstance()->setAspect((F32)mFullWidth / mFullHeight); LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom); - LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE); + LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); LLVertexBuffer::unbind(); avatarp->updateLOD(); @@ -807,7 +812,7 @@ void LLImagePreviewAvatar::pan(F32 right, F32 up) // LLImagePreviewSculpted //----------------------------------------------------------------------------- -LLImagePreviewSculpted::LLImagePreviewSculpted(S32 width, S32 height) : LLDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) +LLImagePreviewSculpted::LLImagePreviewSculpted(S32 width, S32 height) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE) { mNeedsUpdate = TRUE; mCameraDistance = 0.f; @@ -829,6 +834,11 @@ LLImagePreviewSculpted::~LLImagePreviewSculpted() { } +//virtual +S8 LLImagePreviewSculpted::getType() const +{ + return LLViewerDynamicTexture::LL_IMAGE_PREVIEW_SCULPTED ; +} void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance) { @@ -890,7 +900,7 @@ BOOL LLImagePreviewSculpted::render() glMatrixMode(GL_PROJECTION); gGL.pushMatrix(); glLoadIdentity(); - glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f); + glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); gGL.pushMatrix(); @@ -898,7 +908,7 @@ BOOL LLImagePreviewSculpted::render() gGL.color4f(0.15f, 0.2f, 0.3f, 1.f); - gl_rect_2d_simple( mWidth, mHeight ); + gl_rect_2d_simple( mFullWidth, mFullHeight ); glMatrixMode(GL_PROJECTION); gGL.popMatrix(); @@ -921,9 +931,9 @@ BOOL LLImagePreviewSculpted::render() stop_glerror(); - LLViewerCamera::getInstance()->setAspect((F32) mWidth / mHeight); + LLViewerCamera::getInstance()->setAspect((F32) mFullWidth / mFullHeight); LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom); - LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE); + LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); const LLVolumeFace &vf = mVolume->getVolumeFace(0); U32 num_indices = vf.mIndices.size(); diff --git a/indra/newview/llfloaterimagepreview.h b/indra/newview/llfloaterimagepreview.h index 003e57917..e55ea7f45 100644 --- a/indra/newview/llfloaterimagepreview.h +++ b/indra/newview/llfloaterimagepreview.h @@ -43,13 +43,18 @@ class LLViewerJointMesh; class LLVOAvatar; class LLTextBox; class LLVertexBuffer; +class LLVolume; -class LLImagePreviewSculpted : public LLDynamicTexture +class LLImagePreviewSculpted : public LLViewerDynamicTexture { - public: - LLImagePreviewSculpted(S32 width, S32 height); +protected: virtual ~LLImagePreviewSculpted(); + public: + LLImagePreviewSculpted(S32 width, S32 height); + + /*virtual*/ S8 getType() const ; + void setPreviewTarget(LLImageRaw *imagep, F32 distance); void setTexture(U32 name) { mTextureName = name; } @@ -73,12 +78,16 @@ class LLImagePreviewSculpted : public LLDynamicTexture }; -class LLImagePreviewAvatar : public LLDynamicTexture +class LLImagePreviewAvatar : public LLViewerDynamicTexture { -public: - LLImagePreviewAvatar(S32 width, S32 height); +protected: virtual ~LLImagePreviewAvatar(); +public: + LLImagePreviewAvatar(S32 width, S32 height); + + /*virtual*/ S8 getType() const ; + void setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male); void setTexture(U32 name) { mTextureName = name; } void clearPreviewTexture(const std::string& mesh_name); @@ -130,13 +139,13 @@ protected: bool loadImage(const std::string& filename); LLPointer mRawImagep; - LLImagePreviewAvatar* mAvatarPreview; - LLImagePreviewSculpted* mSculptedPreview; + LLPointer mAvatarPreview; + LLPointer mSculptedPreview; S32 mLastMouseX; S32 mLastMouseY; LLRect mPreviewRect; LLRectf mPreviewImageRect; - LLPointer mImagep ; + LLPointer mImagep ; static S32 sUploadAmount; }; diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index c69df827a..4ba6cc806 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -327,7 +327,7 @@ void LLFloaterInspect::refresh() } // void LLFloaterInspect::inventoryChanged(LLViewerObject* viewer_object, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32, void* q_id) { @@ -335,8 +335,8 @@ void LLFloaterInspect::inventoryChanged(LLViewerObject* viewer_object, std::vector::iterator iter = std::find(mQueue.begin(),mQueue.end(),viewer_object->getID()); if (viewer_object && inv && iter != mQueue.end() ) { - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h index b9d43358c..29a2fce77 100644 --- a/indra/newview/llfloaterinspect.h +++ b/indra/newview/llfloaterinspect.h @@ -66,7 +66,7 @@ protected: bool mDirty; // /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* queue); diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp index 8fe455fde..a2d120ad8 100644 --- a/indra/newview/llfloaterlagmeter.cpp +++ b/indra/newview/llfloaterlagmeter.cpp @@ -36,7 +36,7 @@ #include "lluictrlfactory.h" #include "llviewerstats.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llviewercontrol.h" #include "llappviewer.h" @@ -180,7 +180,7 @@ void LLFloaterLagMeter::determineClient() { mClientCause->setText( getString("client_texture_loading_cause_msg", mStringArgs) ); } - else if((BYTES_TO_MEGA_BYTES(LLViewerImage::sBoundTextureMemoryInBytes)) > LLViewerImage::sMaxBoundTextureMemInMegaBytes) + else if((BYTES_TO_MEGA_BYTES(LLViewerTexture::sBoundTextureMemoryInBytes)) > LLViewerTexture::sMaxBoundTextureMemInMegaBytes) { mClientCause->setText( getString("client_texture_memory_cause_msg", mStringArgs) ); } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 78b9e0b1f..efb6057bb 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -68,7 +68,7 @@ #include "lltexturectrl.h" #include "lluiconstants.h" #include "lluictrlfactory.h" -#include "llviewerimagelist.h" // LLUIImageList +#include "llviewertexturelist.h" // LLUIImageList #include "llviewermessage.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" @@ -1072,10 +1072,10 @@ BOOL LLPanelLandObjects::postBuild() mBtnReturnOwnerList = getChild("Return objects..."); mBtnReturnOwnerList->setClickedCallback(onClickReturnOwnerList, this); - mIconAvatarOnline = LLUIImageList::getInstance()->getUIImage("icon_avatar_online.tga"); - mIconAvatarInSim = LLUIImageList::getInstance()->getUIImage("ff_visible_map.tga"); - mIconAvatarOffline = LLUIImageList::getInstance()->getUIImage("icon_avatar_offline.tga"); - mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga"); + mIconAvatarOnline = LLUI::getUIImage("icon_avatar_online.tga"); + mIconAvatarInSim = LLUI::getUIImage("ff_visible_map.tga"); + mIconAvatarOffline = LLUI::getUIImage("icon_avatar_offline.tga"); + mIconGroup = LLUI::getUIImage("icon_group.tga"); mOwnerList = getChild("owner list"); mOwnerList->sortByColumnIndex(3, FALSE); diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index 9635ccbfa..6c99dea91 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -38,7 +38,7 @@ #include #include "llfloater.h" -//#include "llviewerimagelist.h" +//#include "llviewertexturelist.h" #include "llmemory.h" // LLPointer<> typedef std::set uuid_list_t; diff --git a/indra/newview/llfloaterlandmark.h b/indra/newview/llfloaterlandmark.h index 0effadfbd..56ac41832 100644 --- a/indra/newview/llfloaterlandmark.h +++ b/indra/newview/llfloaterlandmark.h @@ -46,7 +46,7 @@ class LLFolderViewItem; class LLSearchEditor; class LLInventoryPanel; class LLSaveFolderState; -class LLViewerImage; +class LLViewerTexture; // used for setting drag & drop callbacks. typedef BOOL (*drag_n_drop_callback)(LLUICtrl*, LLInventoryItem*, void*); @@ -89,7 +89,7 @@ public: static void onSearchEdit(const std::string& search_string, void* user_data ); protected: - LLPointer mLandmarkp; + LLPointer mLandmarkp; LLUUID mImageAssetID; // Currently selected texture diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp index 54c422e48..c2f76c354 100644 --- a/indra/newview/llfloaterpostcard.cpp +++ b/indra/newview/llfloaterpostcard.cpp @@ -82,7 +82,7 @@ LLFloaterPostcard::instance_list_t LLFloaterPostcard::sInstances; /// Class LLFloaterPostcard ///---------------------------------------------------------------------------- -LLFloaterPostcard::LLFloaterPostcard(LLImageJPEG* jpeg, LLImageGL *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global) +LLFloaterPostcard::LLFloaterPostcard(LLImageJPEG* jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global) : LLFloater(std::string("Postcard Floater")), mJPEGImage(jpeg), mViewerImage(img), @@ -144,7 +144,7 @@ BOOL LLFloaterPostcard::postBuild() // static -LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLImageGL *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global) +LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global) { // Take the images from the caller // It's now our job to clean them up diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h index f9e1b50cb..bce14609d 100644 --- a/indra/newview/llfloaterpostcard.h +++ b/indra/newview/llfloaterpostcard.h @@ -37,25 +37,27 @@ #include "llimagejpeg.h" #include "llfloater.h" #include "llcheckboxctrl.h" +#include "llviewertexture.h" #include "llmemory.h" class LLTextEditor; class LLLineEditor; class LLButton; +class LLImageJPEG; class LLFloaterPostcard : public LLFloater { public: - LLFloaterPostcard(LLImageJPEG* jpeg, LLImageGL *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global); + LLFloaterPostcard(LLImageJPEG* jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global); virtual ~LLFloaterPostcard(); virtual void init(); virtual BOOL postBuild(); virtual void draw(); - static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLImageGL *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global); + static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global); static void onClickCancel(void* data); static void onClickSend(void* data); @@ -74,12 +76,12 @@ public: protected: LLPointer mJPEGImage; - LLPointer mViewerImage; + LLPointer mViewerImage; LLTransactionID mTransactionID; LLAssetID mAssetID; LLVector2 mImageScale; LLVector3d mPosTakenGlobal; - boolean mHasFirstMsgFocus; + bool mHasFirstMsgFocus; typedef std::set instance_list_t; static instance_list_t sInstances; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index d5bb4969d..82955afea 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -204,8 +204,8 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def mGridsPanel->setDefaultBtn(default_btn); mPrefsAscentSys = new LLPrefsAscentSys(); - mTabContainer->addTabPanel(mPrefsAscentSys->getPanel(), mPrefsAscentSys->getPanel()->getLabel(), FALSE, onTabChanged, mTabContainer); - mPrefsAscentSys->getPanel()->setDefaultBtn(default_btn); + mTabContainer->addTabPanel(mPrefsAscentSys, mPrefsAscentSys->getLabel(), FALSE, onTabChanged, mTabContainer); + mPrefsAscentSys->setDefaultBtn(default_btn); mPrefsAscentVan = new LLPrefsAscentVan(); mTabContainer->addTabPanel(mPrefsAscentVan->getPanel(), mPrefsAscentVan->getPanel()->getLabel(), FALSE, onTabChanged, mTabContainer); diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index c87bb4812..62ecd8faf 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -478,9 +478,9 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) if (item->getType() == LLAssetType::AT_OBJECT) { U32 flags = item->getFlags(); - slam_perm = flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; - overwrite_everyone = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; - overwrite_group = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + slam_perm = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; + overwrite_everyone = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + overwrite_group = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; } std::string perm_string; @@ -805,7 +805,7 @@ void LLFloaterProperties::onCommitPermissions(LLUICtrl* ctrl, void* data) if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; } // If everyone permissions have changed (and this is an object) // then set the overwrite everyone permissions flag so they @@ -813,7 +813,7 @@ void LLFloaterProperties::onCommitPermissions(LLUICtrl* ctrl, void* data) if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; } // If group permissions have changed (and this is an object) // then set the overwrite group permissions flag so they @@ -821,7 +821,7 @@ void LLFloaterProperties::onCommitPermissions(LLUICtrl* ctrl, void* data) if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; } new_item->setFlags(flags); if(self->mObjectID.isNull()) @@ -939,7 +939,7 @@ void LLFloaterProperties::updateSaleInfo() if (item->getType() == LLAssetType::AT_OBJECT) { U32 flags = new_item->getFlags(); - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE; new_item->setFlags(flags); } diff --git a/indra/newview/llfloaterproperties.h b/indra/newview/llfloaterproperties.h index f14692a37..c82b2a7e7 100644 --- a/indra/newview/llfloaterproperties.h +++ b/indra/newview/llfloaterproperties.h @@ -61,14 +61,14 @@ public: static void closeByID(const LLUUID& item_id, const LLUUID& object_id); - // - static void onClickMore(void* user_data); - static void onClickLess(void* user_data); - static void onClickCopy(void* user_data); - static void onClickUpdate(void* user_data); - void setExpanded(BOOL expanded); - // - + // + static void onClickMore(void* user_data); + static void onClickLess(void* user_data); + static void onClickCopy(void* user_data); + static void onClickUpdate(void* user_data); + void setExpanded(BOOL expanded); + // + LLFloaterProperties(const std::string& name, const LLRect& rect, const std::string& title, const LLUUID& item_id, const LLUUID& object_id); virtual ~LLFloaterProperties(); @@ -102,9 +102,9 @@ protected: LLUUID mObjectID; BOOL mDirty; - // - BOOL mExpanded; - // + // + BOOL mExpanded; + // typedef std::map instance_map; static instance_map sInstances; @@ -116,11 +116,11 @@ class LLMultiProperties : public LLMultiFloater { public: LLMultiProperties(const LLRect& rect); - // - void setExpanded(BOOL expanded); -protected: - BOOL mExpanded; - // + // + void setExpanded(BOOL expanded); +protected: + BOOL mExpanded; + // }; #endif // LL_LLFLOATERPROPERTIES_H diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 35561e408..03f616af3 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -73,8 +73,7 @@ #include "lltrans.h" #include "llviewercontrol.h" #include "lluictrlfactory.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "llviewerstats.h" #include "llviewertexteditor.h" @@ -1140,11 +1139,11 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes() if (!texture_ctrl) continue; LLUUID image_asset_id = texture_ctrl->getImageAssetID(); - LLViewerImage* img = gImageList.getImage(image_asset_id); + LLViewerTexture* img = LLViewerTextureManager::getFetchedTexture(image_asset_id); S32 components = img->getComponents(); // Must ask for highest resolution version's width. JC - S32 width = img->getWidth(0); - S32 height = img->getHeight(0); + S32 width = img->getFullWidth(); + S32 height = img->getFullHeight(); //llinfos << "texture detail " << i << " is " << width << "x" << height << "x" << components << llendl; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index cc5101a10..6e524a05f 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -74,7 +74,7 @@ #include "lltoolmgr.h" #include "llresourcedata.h" // for LLResourceData #include "llviewerwindow.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llworldmap.h" #include "llfilepicker.h" #include "llfloateravatarpicker.h" @@ -927,7 +927,7 @@ void LLFloaterReporter::takeScreenshot() llwarns << "Unable to take screenshot" << llendl; return; } - LLPointer upload_data = LLViewerImageList::convertToUploadFile(raw); + LLPointer upload_data = LLViewerTextureList::convertToUploadFile(raw); // create a resource data mResourceDatap->mInventoryType = LLInventoryType::IT_NONE; @@ -961,9 +961,9 @@ void LLFloaterReporter::takeScreenshot() mResourceDatap->mAssetInfo.mType); // store in the image list so it doesn't try to fetch from the server - LLPointer image_in_list = new LLViewerImage(mResourceDatap->mAssetInfo.mUuid); - image_in_list->createGLTexture(0, raw, 0, TRUE, LLViewerImageBoostLevel::OTHER); - gImageList.addImage(image_in_list); + LLPointer image_in_list = + LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::FETCHED_TEXTURE); + image_in_list->createGLTexture(0, raw, 0, TRUE, LLViewerTexture::OTHER); // the texture picker then uses that texture LLTexturePicker* texture = getChild("screenshot"); diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index 86bc60559..5f53142e4 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -39,7 +39,7 @@ #include "v3math.h" class LLMessageSystem; -class LLViewerImage; +class LLViewerTexture; class LLInventoryItem; class LLViewerObject; class LLAgent; diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp index bc774e77a..2c50046cc 100644 --- a/indra/newview/llfloaterscriptdebug.cpp +++ b/indra/newview/llfloaterscriptdebug.cpp @@ -45,7 +45,7 @@ #include "llviewertexteditor.h" #include "llviewercontrol.h" #include "llviewerobjectlist.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" // // Statics @@ -129,7 +129,7 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std: if (objectp) { - objectp->setIcon(gImageList.getImageFromFile("script_error.j2c", TRUE, TRUE)); + objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI)); floater_label = llformat("%s(%.2f, %.2f)", user_name.c_str(), objectp->getPositionRegion().mV[VX], objectp->getPositionRegion().mV[VY]); } else diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp old mode 100755 new mode 100644 diff --git a/indra/newview/llfloatersellland.h b/indra/newview/llfloatersellland.h old mode 100755 new mode 100644 diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 7e0557d17..2d7ce1da4 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -104,7 +104,7 @@ BOOL LLFloaterSettingsDebug::postBuild() void LLFloaterSettingsDebug::draw() { LLComboBox* settings_combo = getChild("settings_combo"); - LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata(); + LLControlVariable* controlp = static_cast(settings_combo->getCurrentUserdata()); updateControl(controlp ? controlp->getCOAActive() : NULL); LLFloater::draw(); @@ -127,8 +127,8 @@ void LLFloaterSettingsDebug::show(void*) void LLFloaterSettingsDebug::onSettingSelect(LLUICtrl* ctrl, void* user_data) { LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; - LLComboBox* combo_box = (LLComboBox*)ctrl; - LLControlVariable* controlp = (LLControlVariable*)combo_box->getCurrentUserdata(); + LLComboBox* combo_box = static_cast(ctrl); + LLControlVariable* controlp = static_cast(combo_box->getCurrentUserdata()); floaterp->updateControl(controlp ? controlp->getCOAActive() : NULL); } @@ -139,7 +139,7 @@ void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; LLComboBox* settings_combo = floaterp->getChild("settings_combo"); - LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata(); + LLControlVariable* controlp = static_cast(settings_combo->getCurrentUserdata()); controlp = controlp ? controlp->getCOAActive() : NULL; if(!controlp)//Uh oh! return; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 6ac8f7ebc..5af0de858 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -131,12 +131,12 @@ public: LLFloaterSnapshot::ESnapshotFormat getSnapshotFormat() const { return mSnapshotFormat; } BOOL getSnapshotUpToDate() const { return mSnapshotUpToDate; } BOOL isSnapshotActive() { return mSnapshotActive; } - LLImageGL* getThumbnailImage() const { return mThumbnailImage ; } + LLViewerTexture* getThumbnailImage() const { return mThumbnailImage ; } S32 getThumbnailWidth() const { return mThumbnailWidth ; } S32 getThumbnailHeight() const { return mThumbnailHeight ; } BOOL getThumbnailLock() const { return mThumbnailUpdateLock ; } BOOL getThumbnailUpToDate() const { return mThumbnailUpToDate ;} - LLImageGL* getCurrentImage(); + LLViewerTexture* getCurrentImage(); F32 getImageAspect(); F32 getAspect() ; LLRect getImageRect(); @@ -161,7 +161,7 @@ public: private: LLColor4 mColor; - LLPointer mViewerImage[2]; //used to represent the scene when the frame is frozen. + LLPointer mViewerImage[2]; //used to represent the scene when the frame is frozen. LLRect mImageRect[2]; S32 mWidth[2]; S32 mHeight[2]; @@ -169,7 +169,7 @@ private: S32 mMaxImageSize ; //thumbnail image - LLPointer mThumbnailImage ; + LLPointer mThumbnailImage ; S32 mThumbnailWidth ; S32 mThumbnailHeight ; LLRect mPreviewRect ; @@ -269,7 +269,7 @@ void LLSnapshotLivePreview::setMaxImageSize(S32 size) } } -LLImageGL* LLSnapshotLivePreview::getCurrentImage() +LLViewerTexture* LLSnapshotLivePreview::getCurrentImage() { return mViewerImage[mCurImageIndex]; } @@ -718,7 +718,7 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update) if(raw) { - mThumbnailImage = new LLImageGL(raw, FALSE); + mThumbnailImage = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); mThumbnailUpToDate = TRUE ; } @@ -867,8 +867,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) scaled->expandToPowerOfTwo(1024, FALSE); } - previewp->mViewerImage[previewp->mCurImageIndex] = new LLImageGL(scaled, FALSE); - LLPointer curr_preview_image = previewp->mViewerImage[previewp->mCurImageIndex]; + previewp->mViewerImage[previewp->mCurImageIndex] = LLViewerTextureManager::getLocalTexture(scaled.get(), FALSE); + LLPointer curr_preview_image = previewp->mViewerImage[previewp->mCurImageIndex]; gGL.getTexUnit(0)->bind(curr_preview_image); if (previewp->getSnapshotType() != SNAPSHOT_TEXTURE) { @@ -888,7 +888,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) S32 w = get_lower_power_two(scaled->getWidth(), 512) * 2 ; S32 h = get_lower_power_two(scaled->getHeight(), 512) * 2 ; scaled->scale(w,h); - previewp->mThumbnailImage = new LLImageGL(scaled, FALSE); + previewp->mThumbnailImage = LLViewerTextureManager::getLocalTexture(scaled.get(), FALSE); previewp->mThumbnailUpdateLock = FALSE ; previewp->setThumbnailImageSize(); } diff --git a/indra/newview/llfloaterstats.cpp b/indra/newview/llfloaterstats.cpp index 3ecdb80b8..f19b86040 100644 --- a/indra/newview/llfloaterstats.cpp +++ b/indra/newview/llfloaterstats.cpp @@ -44,7 +44,7 @@ #include "llviewerstats.h" #include "pipeline.h" #include "llviewerobjectlist.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" const S32 LL_SCROLL_BORDER = 1; @@ -144,7 +144,7 @@ void LLFloaterStats::buildStats() // Texture statistics LLStatView *texture_statviewp = render_statviewp->addStatView("texture stat view", "Texture", "OpenDebugStatTexture", rect); - stat_barp = texture_statviewp->addStat("Count", &(gImageList.sNumImagesStat), "DebugStatModeTextureCount"); + stat_barp = texture_statviewp->addStat("Count", &(gTextureList.sNumImagesStat), "DebugStatModeTextureCount"); stat_barp->setUnitLabel(""); stat_barp->mMinBar = 0.f; stat_barp->mMaxBar = 8000.f; @@ -152,7 +152,7 @@ void LLFloaterStats::buildStats() stat_barp->mLabelSpacing = 4000.f; stat_barp->mPerSec = FALSE; - stat_barp = texture_statviewp->addStat("Raw Count", &(gImageList.sNumRawImagesStat), "DebugStatModeRawCount"); + stat_barp = texture_statviewp->addStat("Raw Count", &(gTextureList.sNumRawImagesStat), "DebugStatModeRawCount"); stat_barp->setUnitLabel(""); stat_barp->mMinBar = 0.f; stat_barp->mMaxBar = 8000.f; @@ -160,7 +160,7 @@ void LLFloaterStats::buildStats() stat_barp->mLabelSpacing = 4000.f; stat_barp->mPerSec = FALSE; - stat_barp = texture_statviewp->addStat("GL Mem", &(gImageList.sGLTexMemStat), "DebugStatModeGLMem"); + stat_barp = texture_statviewp->addStat("GL Mem", &(gTextureList.sGLTexMemStat), "DebugStatModeGLMem"); stat_barp->setUnitLabel(""); stat_barp->mMinBar = 0.f; stat_barp->mMaxBar = 400.f; @@ -169,7 +169,7 @@ void LLFloaterStats::buildStats() stat_barp->mPrecision = 1; stat_barp->mPerSec = FALSE; - stat_barp = texture_statviewp->addStat("Formatted Mem", &(gImageList.sFormattedMemStat), "DebugStatModeFormattedMem"); + stat_barp = texture_statviewp->addStat("Formatted Mem", &(gTextureList.sFormattedMemStat), "DebugStatModeFormattedMem"); stat_barp->setUnitLabel(""); stat_barp->mMinBar = 0.f; stat_barp->mMaxBar = 400.f; @@ -178,7 +178,7 @@ void LLFloaterStats::buildStats() stat_barp->mPrecision = 1; stat_barp->mPerSec = FALSE; - stat_barp = texture_statviewp->addStat("Raw Mem", &(gImageList.sRawMemStat), "DebugStatModeRawMem"); + stat_barp = texture_statviewp->addStat("Raw Mem", &(gTextureList.sRawMemStat), "DebugStatModeRawMem"); stat_barp->setUnitLabel(""); stat_barp->mMinBar = 0.f; stat_barp->mMaxBar = 400.f; @@ -187,7 +187,7 @@ void LLFloaterStats::buildStats() stat_barp->mPrecision = 1; stat_barp->mPerSec = FALSE; - stat_barp = texture_statviewp->addStat("Bound Mem", &(gImageList.sGLBoundMemStat), "DebugStatModeBoundMem"); + stat_barp = texture_statviewp->addStat("Bound Mem", &(gTextureList.sGLBoundMemStat), "DebugStatModeBoundMem"); stat_barp->setUnitLabel(""); stat_barp->mMinBar = 0.f; stat_barp->mMaxBar = 400.f; diff --git a/indra/newview/llfloatervfs.cpp b/indra/newview/llfloatervfs.cpp index 18ee463cb..2db5b3459 100644 --- a/indra/newview/llfloatervfs.cpp +++ b/indra/newview/llfloatervfs.cpp @@ -8,8 +8,7 @@ #include "lllocalinventory.h" #include "llviewerwindow.h" #include "llassetconverter.h" -#include "llviewerimagelist.h" -#include "llviewerimage.h" +#include "llviewertexturelist.h" #include "llimagej2c.h" LLFloaterVFS* LLFloaterVFS::sInstance; @@ -206,7 +205,7 @@ void LLFloaterVFS::removeEntry() if((*iter).mID == mEditID) { if((*iter).mType == LLAssetType::AT_TEXTURE) - gImageList.deleteImage(gImageList.hasImage( (*iter).mID )); + gTextureList.deleteImage(gTextureList.findImage( (*iter).mID )); else gVFS->removeFile((*iter).mID, (*iter).mType); iter = mFiles.erase(iter); @@ -270,9 +269,9 @@ void LLFloaterVFS::onClickAdd(void* user_data) llinfos << "Image: " << file_name << " is corrupt." << llendl; return; } - LLPointer imagep = new LLViewerImage(asset_id); - imagep->createGLTexture(0, image_raw, 0, TRUE, LLViewerImageBoostLevel::BOOST_NONE); - gImageList.addImage(imagep); + LLPointer imagep = new LLViewerFetchedTexture(asset_id); + imagep->createGLTexture(0, image_raw, 0, TRUE, LLViewerTexture::BOOST_NONE); + gTextureList.addImage(imagep); } else { diff --git a/indra/newview/llfloatervfsexplorer.h b/indra/newview/llfloatervfsexplorer.h index fc77def51..34fd8e2d4 100644 --- a/indra/newview/llfloatervfsexplorer.h +++ b/indra/newview/llfloatervfsexplorer.h @@ -1,41 +1,41 @@ -// -#ifndef LL_LLFLOATERVFSEXPLORER_H -#define LL_LLFLOATERVFSEXPLORER_H - -#include "llfloater.h" -#include "llassettype.h" -#include "llvfs.h" - -class LLFloaterVFSExplorer : LLFloater -{ -typedef struct -{ - std::string mFilename; - std::string mName; - LLUUID mID; - LLAssetType::EType mType; -} entry; -public: - LLFloaterVFSExplorer(); - ~LLFloaterVFSExplorer(); - static void show(); - BOOL postBuild(); - void refresh(); - void reloadAll(); - void removeEntry(); - void setEditID(LLUUID edit_id); - LLVFSFileSpecifier getEditEntry(); - static void onCommitFileList(LLUICtrl* ctrl, void* user_data); - static void onClickCopyUUID(void* user_data); - static void onClickRemove(void* user_data); - static void onClickReload(void* user_data); - static void onClickEditData(void* user_data); - static void onClickItem(void* user_data); -private: - static LLFloaterVFSExplorer* sInstance; - static std::map sVFSFileMap; - LLUUID mEditID; - void setEditEnabled(bool enabled); -}; -#endif -// +// +#ifndef LL_LLFLOATERVFSEXPLORER_H +#define LL_LLFLOATERVFSEXPLORER_H + +#include "llfloater.h" +#include "llassettype.h" +#include "llvfs.h" + +class LLFloaterVFSExplorer : LLFloater +{ +typedef struct +{ + std::string mFilename; + std::string mName; + LLUUID mID; + LLAssetType::EType mType; +} entry; +public: + LLFloaterVFSExplorer(); + ~LLFloaterVFSExplorer(); + static void show(); + BOOL postBuild(); + void refresh(); + void reloadAll(); + void removeEntry(); + void setEditID(LLUUID edit_id); + LLVFSFileSpecifier getEditEntry(); + static void onCommitFileList(LLUICtrl* ctrl, void* user_data); + static void onClickCopyUUID(void* user_data); + static void onClickRemove(void* user_data); + static void onClickReload(void* user_data); + static void onClickEditData(void* user_data); + static void onClickItem(void* user_data); +private: + static LLFloaterVFSExplorer* sInstance; + static std::map sVFSFileMap; + LLUUID mEditID; + void setEditEnabled(bool enabled); +}; +#endif +// diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 603ed921a..e9593ffde 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -55,8 +55,7 @@ #include "llscrollcontainer.h" // hack to allow scrolling #include "lltooldraganddrop.h" #include "llui.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerjointattachment.h" #include "llviewermenu.h" #include "lluictrlfactory.h" diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index bbc1060c7..9e4f9e24b 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -52,7 +52,7 @@ #include "stdenums.h" #include "llfontgl.h" #include "lleditmenuhandler.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "lldepthstack.h" #include "lltooldraganddrop.h" @@ -97,7 +97,7 @@ public: virtual void move( LLFolderViewEventListener* parent_listener ) = 0; virtual BOOL isItemCopyable() const = 0; virtual BOOL copyToClipboard() const = 0; - virtual void cutToClipboard() = 0; + virtual BOOL cutToClipboard() const = 0; virtual BOOL isClipboardPasteable() const = 0; virtual void pasteFromClipboard() = 0; virtual void pasteLinkFromClipboard() = 0; diff --git a/indra/newview/llhoverview.cpp b/indra/newview/llhoverview.cpp index 1b3fe90e7..b51a2c589 100644 --- a/indra/newview/llhoverview.cpp +++ b/indra/newview/llhoverview.cpp @@ -66,7 +66,7 @@ #include "llviewerregion.h" #include "llviewerwindow.h" #include "llglheaders.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" //#include "lltoolobjpicker.h" #include "llhudmanager.h" // HACK for creating flex obj's diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 3e3b83eab..98814e882 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -509,6 +509,8 @@ void LLHUDEffectLookAt::render() (gAgent.getAvatarObject() == ((LLVOAvatar*)(LLViewerObject*)mSourceObject))) return; if (sDebugLookAt && mSourceObject.notNull()) { + LLGLDepthTest gls_depth(GL_TRUE,GL_FALSE); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); LLVector3 target = mTargetPos + ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->mHeadp->getWorldPosition(); diff --git a/indra/newview/llhudeffecttrail.cpp b/indra/newview/llhudeffecttrail.cpp index fa69a27e0..fbba2c354 100644 --- a/indra/newview/llhudeffecttrail.cpp +++ b/indra/newview/llhudeffecttrail.cpp @@ -41,7 +41,7 @@ #include "llbox.h" #include "lldrawable.h" #include "llhudrender.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobjectlist.h" #include "llviewerpartsim.h" #include "llviewerpartsource.h" diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp index 1e49d9ef2..273533798 100644 --- a/indra/newview/llhudicon.cpp +++ b/indra/newview/llhudicon.cpp @@ -40,7 +40,7 @@ #include "llviewerobject.h" #include "lldrawable.h" #include "llviewercamera.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llviewerwindow.h" //----------------------------------------------------------------------------- @@ -145,7 +145,7 @@ void LLHUDIcon::renderIcon(BOOL for_select) alpha_factor *= clamp_rescale(time_elapsed, MAX_VISIBLE_TIME - FADE_OUT_TIME, MAX_VISIBLE_TIME, 1.f, 0.f); } - F32 image_aspect = (F32)mImagep->mFullWidth / (F32)mImagep->mFullHeight; + F32 image_aspect = (F32)mImagep->getFullWidth() / (F32)mImagep->getFullHeight(); LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * x_pixel_vec; LLVector3 y_scale = (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * y_pixel_vec; @@ -165,7 +165,7 @@ void LLHUDIcon::renderIcon(BOOL for_select) LLColor4 icon_color = LLColor4::white; icon_color.mV[VALPHA] = alpha_factor; gGL.color4fv(icon_color.mV); - gGL.getTexUnit(0)->bind(mImagep.get()); + gGL.getTexUnit(0)->bind(mImagep); } gGL.begin(LLRender::QUADS); @@ -182,7 +182,7 @@ void LLHUDIcon::renderIcon(BOOL for_select) gGL.end(); } -void LLHUDIcon::setImage(LLViewerImage* imagep) +void LLHUDIcon::setImage(LLViewerTexture* imagep) { mImagep = imagep; mImagep->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -262,7 +262,7 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en return FALSE; } - F32 image_aspect = (F32)mImagep->mFullWidth / (F32)mImagep->mFullHeight; + F32 image_aspect = (F32)mImagep->getFullWidth() / (F32)mImagep->getFullHeight(); LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * x_pixel_vec; LLVector3 y_scale = (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * y_pixel_vec; diff --git a/indra/newview/llhudicon.h b/indra/newview/llhudicon.h index 154e6df51..6d523a287 100644 --- a/indra/newview/llhudicon.h +++ b/indra/newview/llhudicon.h @@ -50,6 +50,7 @@ // Renders a 2D icon billboard floating at the location specified. class LLDrawable; class LLViewerObject; +class LLViewerTexture; class LLHUDIcon : public LLHUDObject { @@ -61,7 +62,7 @@ public: /*virtual*/ void markDead(); /*virtual*/ F32 getDistance() const { return mDistance; } - void setImage(LLViewerImage* imagep); + void setImage(LLViewerTexture* imagep); void setScale(F32 fraction_of_fov); void restartLifeTimer() { mLifeTimer.reset(); } @@ -88,7 +89,7 @@ protected: void renderIcon(BOOL for_select); // common render code private: - LLPointer mImagep; + LLPointer mImagep; LLFrameTimer mAnimTimer; LLFrameTimer mLifeTimer; F32 mDistance; diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index 2f1a653f5..62ac19671 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -113,7 +113,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, glMatrixMode(GL_PROJECTION); glPushMatrix(); glMatrixMode(GL_MODELVIEW); - + gGL.pushMatrix(); LLUI::pushMatrix(); gViewerWindow->setup2DRender(); @@ -126,6 +126,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, font.render(wstr, 0, 0, 0, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, wstr.length(), 1000, &right_x); LLUI::popMatrix(); + gGL.popMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index efe73f52d..0d4bca83d 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -48,7 +48,7 @@ #include "llimagegl.h" #include "llui.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobject.h" #include "llvovolume.h" #include "llviewerwindow.h" diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index d96aa3bbc..31743deb3 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1347,7 +1347,7 @@ void LLIMMgr::saveIgnoreGroup() { // llinfos << "saving ignore_groups.xml" << llendl; - std::string user_dir = gDirUtilp->getLindenUserDir(); + std::string user_dir = gDirUtilp->getLindenUserDir(true); if (!user_dir.empty()) { std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "ignore_groups.xml"); diff --git a/indra/newview/llinventoryactions.cpp b/indra/newview/llinventoryactions.cpp index 0941728f5..b770a531d 100644 --- a/indra/newview/llinventoryactions.cpp +++ b/indra/newview/llinventoryactions.cpp @@ -73,7 +73,7 @@ #include "llscrollcontainer.h" #include "llimview.h" #include "lltooldraganddrop.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerobjectlist.h" #include "llviewerwindow.h" @@ -462,7 +462,11 @@ void do_create(LLInventoryModel *model, LLInventoryPanel *ptr, std::string type, LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_EYES); } - + else if ("physics" == type) + { + LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + LLFolderBridge::createWearable(parent_id, WT_PHYSICS); + } ptr->getRootFolder()->setNeedsAutoRename(TRUE); } diff --git a/indra/newview/llinventorybackup.cpp b/indra/newview/llinventorybackup.cpp index 5f59c6b6b..a5ce38e59 100644 --- a/indra/newview/llinventorybackup.cpp +++ b/indra/newview/llinventorybackup.cpp @@ -6,8 +6,7 @@ #include "llviewerinventory.h" #include "llfilepicker.h" #include "lldirpicker.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" // gImageList +#include "llviewertexturelist.h" // gTextureList #include "llagent.h" // gAgent #include "llviewerwindow.h" // gViewerWindow #include "llfloater.h" @@ -210,6 +209,8 @@ LLFilePicker::ESaveFilter LLInventoryBackup::getSaveFilter(LLInventoryItem* item return LLFilePicker::FFSAVE_UNDERPANTS; case WT_UNDERSHIRT: return LLFilePicker::FFSAVE_UNDERSHIRT; + case WT_PHYSICS: + return LLFilePicker::FFSAVE_PHYSICS; default: return LLFilePicker::FFSAVE_ALL; } @@ -294,13 +295,13 @@ void LLInventoryBackup::download(LLInventoryItem* item, LLFloater* floater, load LLInventoryBackup::callbackdata* userdata = new LLInventoryBackup::callbackdata(); userdata->floater = floater; userdata->item = item; - LLViewerImage* imagep; + LLViewerFetchedTexture* imagep; switch(item->getType()) { case LLAssetType::AT_TEXTURE: - imagep = gImageList.getImage(item->getAssetUUID(), MIPMAP_TRUE, TRUE); - imagep->setLoadedCallbackNoAux( onImage, 0, TRUE, FALSE, userdata ); + imagep = LLViewerTextureManager::getFetchedTexture(item->getAssetUUID(), MIPMAP_TRUE, LLViewerTexture::BOOST_UI); + imagep->setLoadedCallback( onImage, 0, TRUE, FALSE, userdata, NULL ); // was setLoadedCallbackNoAuth break; case LLAssetType::AT_NOTECARD: case LLAssetType::AT_SCRIPT: @@ -331,7 +332,7 @@ void LLInventoryBackup::download(LLInventoryItem* item, LLFloater* floater, load // static void LLInventoryBackup::imageCallback(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, @@ -376,7 +377,7 @@ void LLInventoryBackup::imageCallback(BOOL success, } else { - src_vi->setBoostLevel(LLViewerImageBoostLevel::BOOST_UI); + src_vi->setBoostLevel(LLViewerTexture::BOOST_UI); } } @@ -683,7 +684,7 @@ void LLFloaterInventoryBackup::finishItem(LLUUID itemid, std::string status) // static void LLFloaterInventoryBackup::imageCallback(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, @@ -726,7 +727,7 @@ void LLFloaterInventoryBackup::imageCallback(BOOL success, } else { - src_vi->setBoostLevel(LLViewerImageBoostLevel::BOOST_UI); + src_vi->setBoostLevel(LLViewerTexture::BOOST_UI); } } diff --git a/indra/newview/llinventorybackup.h b/indra/newview/llinventorybackup.h index 70a7c076f..98664a9a5 100644 --- a/indra/newview/llinventorybackup.h +++ b/indra/newview/llinventorybackup.h @@ -12,7 +12,7 @@ #include "llviewerinventory.h" #include "llfolderview.h" #include "llfilepicker.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llfloater.h" @@ -71,7 +71,7 @@ private: void finishItem(LLUUID itemid, std::string status); void advance(); static void imageCallback(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, @@ -114,7 +114,7 @@ public: private: static void imageCallback(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 176d26e44..3455caf19 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -77,7 +77,7 @@ #include "lltooldraganddrop.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerobjectlist.h" @@ -143,7 +143,7 @@ bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& respon // void gotImageForSaveItemAs(BOOL success, - LLViewerImage *src_vi, + LLViewerTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, @@ -186,6 +186,7 @@ std::string ICON_NAME[ICON_NAME_COUNT] = "inv_item_skirt.tga", "inv_item_alpha.tga", "inv_item_tattoo.tga", + "inv_item_physics.png", "inv_item_animation.tga", "inv_item_gesture.tga", @@ -879,13 +880,13 @@ void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, } -const char* safe_inv_type_lookup(LLInventoryType::EType inv_type) +const std::string &safe_inv_type_lookup(LLInventoryType::EType inv_type) { - const char* rv = LLInventoryType::lookup(inv_type); - if(!rv) + const std::string &rv = LLInventoryType::lookup(inv_type); + if(rv.empty()) { - const char* INVALID_TYPE = ""; - rv = INVALID_TYPE; + static const std::string INVALID_TYPE(""); + return INVALID_TYPE; } return rv; } @@ -2712,6 +2713,10 @@ void LLFolderBridge::createNewEyes(void* user_data) LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); } +void LLFolderBridge::createNewPhysics(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PHYSICS); +} // static void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) { @@ -5452,7 +5457,7 @@ LLUIImagePtr LLLinkItemBridge::getIcon() const if (LLViewerInventoryItem *item = getItem()) { U32 attachment_point = (item->getFlags() & 0xff); // low byte of inventory flags - bool is_multi = LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS & item->getFlags(); + bool is_multi = LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS & item->getFlags(); return get_item_icon(item->getActualType(), item->getInventoryType(), attachment_point, is_multi); } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h old mode 100755 new mode 100644 index 47ca004c5..a3108d653 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -72,6 +72,7 @@ enum EInventoryIcon CLOTHING_SKIRT_ICON_NAME, CLOTHING_ALPHA_ICON_NAME, CLOTHING_TATTOO_ICON_NAME, + CLOTHING_PHYSICS_ICON_NAME, ANIMATION_ICON_NAME, GESTURE_ICON_NAME, @@ -231,7 +232,7 @@ public: virtual void move(LLFolderViewEventListener* new_parent_bridge) {} virtual BOOL isItemCopyable() const { return FALSE; } virtual BOOL copyToClipboard() const { return FALSE; } - virtual void cutToClipboard() {} + virtual BOOL cutToClipboard() const { return FALSE; } virtual BOOL isClipboardPasteable() const; virtual BOOL isClipboardPasteableAsLink() const; virtual void pasteFromClipboard() {} @@ -375,6 +376,7 @@ protected: static void createNewSkin(void* user_data); static void createNewHair(void* user_data); static void createNewEyes(void* user_data); + static void createNewPhysics(void* user_data); BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck); @@ -454,7 +456,7 @@ protected: LLItemBridge(inventory, uuid) { mVisited = FALSE; - if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) + if (flags & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED) { mVisited = TRUE; } @@ -593,7 +595,7 @@ protected: { mAttachPt = (flags & 0xff); // low bye of inventory flags - mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; + mIsMultiObject = ( flags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; } protected: diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index eeae559e2..910d94baf 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -239,7 +239,7 @@ LLInventoryModel::~LLInventoryModel() // chain up to the category specified by UUID. BOOL LLInventoryModel::isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id, - const BOOL break_on_recursion) + const BOOL break_on_recursion) const { LLInventoryObject* obj = getObject(obj_id); int depthCounter = 0; @@ -375,7 +375,7 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id) // specifies 'type' as what it defaults to containing. The category is // not necessarily only for that type. *NOTE: This will create a new // inventory category on the fly if one does not exist. -LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool create_folder) +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool create_folder) { LLUUID rv = findCatUUID(t); if(rv.isNull() && isInventoryUsable() && create_folder) @@ -750,7 +750,7 @@ void LLInventoryModel::appendPath(const LLUUID& id, std::string& path) path.append(temp); } -bool LLInventoryModel::isInventoryUsable() +bool LLInventoryModel::isInventoryUsable() const { bool result = false; if(gAgent.getInventoryRootID().notNull() && mIsAgentInvUsable) @@ -1230,7 +1230,7 @@ void LLInventoryModel::removeObserver(LLInventoryObserver* observer) mObservers.erase(observer); } -BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer) +BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer) const { return mObservers.find(observer) != mObservers.end(); } @@ -1381,14 +1381,14 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str gInventory.notifyObservers("fetchinventory"); } -void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) +bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const { LLViewerInventoryCategory* cat = getCategory(folder_id); if(!cat) { llwarns << "Asked to fetch descendents of non-existent folder: " << folder_id << llendl; - return; + return false; } //S32 known_descendents = 0; ///cat_array_t* categories = get_ptr_in_map(mParentChildCategoryTree, folder_id); @@ -1401,10 +1401,7 @@ void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) //{ // known_descendents += items->count(); //} - if(!cat->fetchDescendents()) - { - //llinfos << "Not fetching descendents" << llendl; - } + return cat->fetchDescendents(); } //Initialize statics. @@ -1999,7 +1996,7 @@ void LLInventoryModel::empty() //mInventory.clear(); } -void LLInventoryModel::accountForUpdate(const LLCategoryUpdate& update) +void LLInventoryModel::accountForUpdate(const LLCategoryUpdate& update) const { LLViewerInventoryCategory* cat = getCategory(update.mCategoryID); if(cat) @@ -3799,11 +3796,11 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**) } // *NOTE: DEBUG functionality -void LLInventoryModel::dumpInventory() +void LLInventoryModel::dumpInventory() const { LL_DEBUGS("Inventory") << "\nBegin Inventory Dump\n**********************:" << LL_ENDL; LL_DEBUGS("Inventory") << "mCategroy[] contains " << mCategoryMap.size() << " items." << LL_ENDL; - for(cat_map_t::iterator cit = mCategoryMap.begin(); cit != mCategoryMap.end(); ++cit) + for(cat_map_t::const_iterator cit = mCategoryMap.begin(); cit != mCategoryMap.end(); ++cit) { LLViewerInventoryCategory* cat = cit->second; if(cat) @@ -3818,7 +3815,7 @@ void LLInventoryModel::dumpInventory() } } LL_DEBUGS("Inventory") << "mItemMap[] contains " << mItemMap.size() << " items." << LL_ENDL; - for(item_map_t::iterator iit = mItemMap.begin(); iit != mItemMap.end(); ++iit) + for(item_map_t::const_iterator iit = mItemMap.begin(); iit != mItemMap.end(); ++iit) { LLViewerInventoryItem* item = iit->second; if(item) diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index e5a7e432c..6fdb59d1a 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -72,18 +72,6 @@ public: virtual void changed(U32 mask) = 0; std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328] }; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryModel -// -// This class represents a collection of inventory, and provides -// efficient ways to access that information. This class could in -// theory be used for any place where you need inventory, though it -// optimizes for time efficiency - not space efficiency, probably -// making it inappropriate for use on tasks. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - class LLInventoryObject; class LLInventoryItem; class LLInventoryCategory; @@ -94,159 +82,255 @@ class LLViewerInventoryCategory; class LLMessageSystem; class LLInventoryCollectFunctor; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLInventoryModel +// +// Represents a collection of inventory, and provides efficient ways to access +// that information. +// NOTE: This class could in theory be used for any place where you need +// inventory, though it optimizes for time efficiency - not space efficiency, +// probably making it inappropriate for use on tasks. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLInventoryModel { public: - typedef enum e_has_children + enum EHasChildren { CHILDREN_NO, CHILDREN_YES, CHILDREN_MAYBE - }EHasChildren; + }; - // These are used a lot... typedef LLDynamicArray > cat_array_t; typedef LLDynamicArray > item_array_t; - // construction & destruction - LLInventoryModel(); - ~LLInventoryModel(); + typedef std::set changed_items_t; - class fetchInventoryResponder: public LLHTTPClient::Responder + class fetchInventoryResponder : public LLHTTPClient::Responder { public: fetchInventoryResponder(const LLSD& request_sd) : mRequestSD(request_sd) {}; void result(const LLSD& content); void error(U32 status, const std::string& reason); - public: typedef std::vector folder_ref_t; protected: LLSD mRequestSD; }; - // - // Accessors - // +/******************************************************************************** + ** ** + ** INITIALIZATION/SETUP + **/ - // This is a convenience function to check if one object has a - // parent chain up to the category specified by UUID. - BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id, const BOOL break_on_recursion=FALSE); + //-------------------------------------------------------------------- + // Constructors / Destructors + //-------------------------------------------------------------------- +public: + LLInventoryModel(); + ~LLInventoryModel(); +// +//protected: +// + void empty(); // empty the entire contents - // Get the object by id. Returns NULL if not found. - // * WARNING: use the pointer returned for read operations - do - // not modify the object values in place or you will break stuff. - LLInventoryObject* getObject(const LLUUID& id) const; + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- +public: + // The inventory model usage is sensitive to the initial construction of the model + bool isInventoryUsable() const; +private: + bool mIsAgentInvUsable; // used to handle an invalid inventory state - // Get the item by id. Returns NULL if not found. - // * WARNING: use the pointer for read operations - use the - // updateItem() method to actually modify values. - LLViewerInventoryItem* getItem(const LLUUID& id) const; + //-------------------------------------------------------------------- + // Structure + //-------------------------------------------------------------------- +public: + // Methods to load up inventory skeleton & meat. These are used + // during authentication. Returns true if everything parsed. + bool loadSkeleton(const LLSD& options, const LLUUID& owner_id); + void buildParentChildMap(); // brute force method to rebuild the entire parent-child relations + // Call on logout to save a terse representation. + void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id); +private: + // Information for tracking the actual inventory. We index this + // information in a lot of different ways so we can access + // the inventory using several different identifiers. + // mInventory member data is the 'master' list of inventory, and + // mCategoryMap and mItemMap store uuid->object mappings. + typedef std::map > cat_map_t; + typedef std::map > item_map_t; + cat_map_t mCategoryMap; + item_map_t mItemMap; + // This last set of indices is used to map parents to children. + typedef std::map parent_cat_map_t; + typedef std::map parent_item_map_t; + parent_cat_map_t mParentChildCategoryTree; + parent_item_map_t mParentChildItemTree; - // Get the category by id. Returns NULL if not found. - // * WARNING: use the pointer for read operations - use the - // updateCategory() method to actually modify values. - LLViewerInventoryCategory* getCategory(const LLUUID& id) const; + //-------------------------------------------------------------------- + // Login + //-------------------------------------------------------------------- + const static S32 sCurrentInvCacheVersion; // expected inventory cache version - // Return the number of items or categories - S32 getItemCount() const; - S32 getCategoryCount() const; +/** Initialization/Setup + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** ACCESSORS + **/ + + //-------------------------------------------------------------------- + // Descendents + //-------------------------------------------------------------------- +public: + // Make sure we have the descendents in the structure. Returns true + // if a fetch was performed. + bool fetchDescendentsOf(const LLUUID& folder_id) const; // Return the direct descendents of the id provided.Set passed // in values to NULL if the call fails. - // *WARNING: The array provided points straight into the guts of - // this object, and should only be used for read operations, since - // modifications may invalidate the internal state of the - // inventory. + // NOTE: The array provided points straight into the guts of + // this object, and should only be used for read operations, since + // modifications may invalidate the internal state of the inventory. void getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t*& categories, item_array_t*& items) const; - // SJB: Added version to lock the arrays to catch potential logic bugs - void lockDirectDescendentArrays(const LLUUID& cat_id, - cat_array_t*& categories, - item_array_t*& items); - void unlockDirectDescendentArrays(const LLUUID& cat_id); - - // Starting with the object specified, add it's descendents to the + // Starting with the object specified, add its descendents to the // array provided, but do not add the inventory object specified - // by id. There is no guaranteed order. Neither array will be - // erased before adding objects to it. Do not store a copy of the - // pointers collected - use them, and collect them again later if - // you need to reference the same objects. - enum { EXCLUDE_TRASH = FALSE, INCLUDE_TRASH = TRUE }; + // by id. There is no guaranteed order. + // NOTE: Neither array will be erased before adding objects to it. + // Do not store a copy of the pointers collected - use them, and + // collect them again later if you need to reference the same objects. + enum { + EXCLUDE_TRASH = FALSE, + INCLUDE_TRASH = TRUE + }; void collectDescendents(const LLUUID& id, cat_array_t& categories, item_array_t& items, BOOL include_trash); - void collectDescendentsIf(const LLUUID& id, cat_array_t& categories, item_array_t& items, BOOL include_trash, LLInventoryCollectFunctor& add, BOOL follow_folder_links = FALSE); + // Collect all items in inventory that are linked to item_id. // Assumes item_id is itself not a linked item. item_array_t collectLinkedItems(const LLUUID& item_id, const LLUUID& start_folder_id = LLUUID::null); + - // Get the inventoryID that this item points to, else just return item_id + // Check if one object has a parent chain up to the category specified by UUID. + BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id, const BOOL break_on_recursion=FALSE) const; + + //-------------------------------------------------------------------- + // Find + //-------------------------------------------------------------------- +public: + // Returns the uuid of the category that specifies 'type' as what it + // defaults to containing. The category is not necessarily only for that type. + // NOTE: If create_folder is true, this will create a new inventory category + // on the fly if one does not exist. *NOTE: if find_in_library is true it + // will search in the user's library folder instead of "My Inventory" + const LLUUID findCategoryUUIDForType(LLAssetType::EType preferred_type, + bool create_folder = true + /*,bool find_in_library = false*/); + + // Get whatever special folder this object is a child of, if any. + const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const; + + // Get the object by id. Returns NULL if not found. + // NOTE: Use the pointer returned for read operations - do + // not modify the object values in place or you will break stuff. + LLInventoryObject* getObject(const LLUUID& id) const; + + // Get the item by id. Returns NULL if not found. + // NOTE: Use the pointer for read operations - use the + // updateItem() method to actually modify values. + LLViewerInventoryItem* getItem(const LLUUID& id) const; + + // Get the category by id. Returns NULL if not found. + // NOTE: Use the pointer for read operations - use the + // updateCategory() method to actually modify values. + LLViewerInventoryCategory* getCategory(const LLUUID& id) const; + + // Get the inventoryID or item that this item points to, else just return object_id const LLUUID& getLinkedItemID(const LLUUID& object_id) const; LLViewerInventoryItem* getLinkedItem(const LLUUID& object_id) const; + + LLUUID findCategoryByName(std::string name); +private: + mutable LLPointer mLastItem; // cache recent lookups - // This method will return false if this inventory model is in an usabel state. - // The inventory model usage is sensitive to the initial construction of the - // model. - bool isInventoryUsable(); + //-------------------------------------------------------------------- + // Count + //-------------------------------------------------------------------- +public: + // Return the number of items or categories + S32 getItemCount() const; + S32 getCategoryCount() const; - // - // Mutators - // +/** Accessors + ** ** + *******************************************************************************/ - // Calling this method with an inventory item will either change - // an existing item with a matching item_id, or will add the item +/******************************************************************************** + ** ** + ** MUTATORS + **/ + +public: + // Change an existing item with a matching item_id or add the item // to the current inventory. Returns the change mask generated by - // the update. No notifcation will be sent to observers. This + // the update. No notification will be sent to observers. This // method will only generate network traffic if the item had to be // reparented. - // *NOTE: In usage, you will want to perform cache accounting - // operations in LLInventoryModel::accountForUpdate() or - // LLViewerInventoryItem::updateServer() before calling this - // method. + // NOTE: In usage, you will want to perform cache accounting + // operations in LLInventoryModel::accountForUpdate() or + // LLViewerInventoryItem::updateServer() before calling this method. U32 updateItem(const LLViewerInventoryItem* item); - // Calling this method with an inventory category will either - // change an existing item with the matching id, or it will add + // Change an existing item with the matching id or add // the category. No notifcation will be sent to observers. This // method will only generate network traffic if the item had to be // reparented. - // *NOTE: In usage, you will want to perform cache accounting - // operations in LLInventoryModel::accountForUpdate() or - // LLViewerInventoryCategory::updateServer() before calling this - // method. + // NOTE: In usage, you will want to perform cache accounting + // operations in accountForUpdate() or LLViewerInventoryCategory:: + // updateServer() before calling this method. void updateCategory(const LLViewerInventoryCategory* cat); - // This method will move the specified object id to the specified - // category, update the internal structures. No cache accounting, + // Move the specified object id to the specified category and + // update the internal structures. No cache accounting, // observer notification, or server update is performed. void moveObject(const LLUUID& object_id, const LLUUID& cat_id); - // delete a particular inventory object by ID. This will purge one - // object from the internal data structures maintaining a - // cosistent internal state. No cache accounting, observer + //-------------------------------------------------------------------- + // Delete + //-------------------------------------------------------------------- +public: + // Delete a particular inventory object by ID. Will purge one + // object from the internal data structures, maintaining a + // consistent internal state. No cache accounting, observer // notification, or server update is performed. void deleteObject(const LLUUID& id); - + // Delete a particular inventory object by ID, and delete it from // the server. Also updates linked items. void purgeObject(const LLUUID& id); - // This is a method which collects the descendents of the id + // Collects and purges the descendants of the id // provided. If the category is not found, no action is // taken. This method goes through the long winded process of // removing server representation of folders and items while doing // cache accounting in a fairly efficient manner. This method does - // not notify observers (though maybe it shouldd...) + // not notify observers (though maybe it should...) void purgeDescendentsOf(const LLUUID& id); // This method optimally removes the referenced categories and @@ -256,51 +340,15 @@ public: void deleteFromServer(LLDynamicArray& category_ids, LLDynamicArray& item_ids); - // Add/remove an observer. If the observer is destroyed, be sure - // to remove it. - void addObserver(LLInventoryObserver* observer); - void removeObserver(LLInventoryObserver* observer); - BOOL containsObserver(LLInventoryObserver* observer); - // // Misc Methods // - // findCategoryUUIDForType() returns the uuid of the category that - // specifies 'type' as what it defaults to containing. The - // category is not necessarily only for that type. *NOTE: This - // will create a new inventory category on the fly if one does not - // exist. - - // SDK: Added flag to specify whether the folder should be created if not found. This fixes the horrible - // multiple trash can bug. - LLUUID findCategoryUUIDForType(LLAssetType::EType preferred_type, bool create_folder = true); - - // Get whatever special folder this object is a child of, if any. - const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const; - - // Call this method when it's time to update everyone on a new - // state, by default, the inventory model will not update - // observers automatically. - // The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328] - void notifyObservers(const std::string service_name=""); - - // This allows outsiders to tell the inventory if something has - // been changed 'under the hood', but outside the control of the - // inventory. For example, if we grant someone modify permissions, - // then that changes the data structures for LLAvatarTracker, but - // potentially affects inventory observers. This API makes sure - // that the next notify will include that notification. - void addChangedMask(U32 mask, const LLUUID& referent); - - const std::set& getChangedIDs() { return mChangedItemIDs; } // This method to prepares a set of mock inventory which provides // minimal functionality before the actual arrival of inventory. //void mock(const LLUUID& root_id); - // make sure we have the descendents in the structure. - void fetchDescendentsOf(const LLUUID& folder_id); // Add categories to a list to be fetched in bulk. static void bulkFetch(std::string url); @@ -308,27 +356,27 @@ public: // call this method to request the inventory. //void requestFromServer(const LLUUID& agent_id); - // call this method on logout to save a terse representation - void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id); // Generates a string containing the path to the item specified by // item_id. void appendPath(const LLUUID& id, std::string& path); - // message handling functionality - static void registerCallbacks(LLMessageSystem* msg); - - // Convenience function to create a new category. You could call - // updateCatgory() with a newly generated UUID category, but this - // version will take care of details like what the name should be - // based on preferred type. Returns the UUID of the new - // category. If you want to use the default name based on type, - // pass in a NULL to the 'name parameter. + //-------------------------------------------------------------------- + // Creation + //-------------------------------------------------------------------- +public: + // Returns the UUID of the new category. If you want to use the default + // name based on type, pass in a NULL to the 'name' parameter. LLUUID createNewCategory(const LLUUID& parent_id, LLAssetType::EType preferred_type, const std::string& name); - - LLUUID findCategoryByName(std::string name); + + // Internal methods that add inventory and make sure that all of + // the internal data structures are consistent. These methods + // should be passed pointers of newly created objects, and the + // instance will take over the memory management from there. + void addCategory(LLViewerInventoryCategory* category); + void addItem(LLViewerInventoryItem* item); // methods to load up inventory skeleton & meat. These are used // during authentication. return true if everything parsed. @@ -339,19 +387,19 @@ public: //... we do inventory queries on should be examined, and the usage of //... the skeleton in querying the wearables needs to be examined as well. bool loadSkeleton(const options_t& options, const LLUUID& owner_id); - bool loadSkeleton(const LLSD& options, const LLUUID& owner_id); bool loadMeat(const options_t& options, const LLUUID& owner_id); - // This is a brute force method to rebuild the entire parent-child - // relations. - void buildParentChildMap(); +/** Mutators + ** ** + *******************************************************************************/ - // - // Category accounting. - // +/******************************************************************************** + ** ** + ** CATEGORY ACCOUNTING + **/ - // This structure represents the number of items added or removed - // from a category. +public: + // Represents the number of items added or removed from a category. struct LLCategoryUpdate { LLCategoryUpdate() : mDescendentDelta(0) {} @@ -363,8 +411,7 @@ public: }; typedef std::vector update_list_t; - // This structure eixts to make it easier to account for deltas in - // a map. + // This exists to make it easier to account for deltas in a map. struct LLInitializedS32 { LLInitializedS32() : mValue(0) {} @@ -375,21 +422,59 @@ public: }; typedef std::map update_map_t; - // Call these methods when there are category updates, but call - // them *before* the actual update so the method can do descendent - // accounting correctly. - void accountForUpdate(const LLCategoryUpdate& update); + // Call when there are category updates. Call them *before* the + // actual update so the method can do descendent accounting correctly. + void accountForUpdate(const LLCategoryUpdate& update) const; void accountForUpdate(const update_list_t& updates); void accountForUpdate(const update_map_t& updates); - // Return child status of category children. yes/no/maybe + // Return (yes/no/maybe) child status of category children. EHasChildren categoryHasChildren(const LLUUID& cat_id) const; - // returns true iff category version is known and theoretical + // Returns true iff category version is known and theoretical // descendents == actual descendents. bool isCategoryComplete(const LLUUID& cat_id) const; + +/** Category Accounting + ** ** + *******************************************************************************/ - // start and stop background breadth-first fetching of inventory contents +/******************************************************************************** + ** ** + ** NOTIFICATIONS + **/ + +public: + // Call to explicitly update everyone on a new state. The optional argument + // 'service_name' is used by Agent Inventory Service [DEV-20328] + void notifyObservers(const std::string service_name=""); + + // Allows outsiders to tell the inventory if something has + // been changed 'under the hood', but outside the control of the + // inventory. The next notify will include that notification. + void addChangedMask(U32 mask, const LLUUID& referent); + const changed_items_t& getChangedIDs() const { return mChangedItemIDs; } +protected: + // Updates all linked items pointing to this id. + void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); +private: + // Variables used to track what has changed since the last notify. + U32 mModifyMask; + changed_items_t mChangedItemIDs; + + //-------------------------------------------------------------------- + // Observers + //-------------------------------------------------------------------- +public: + // If the observer is destroyed, be sure to remove it. + void addObserver(LLInventoryObserver* observer); + void removeObserver(LLInventoryObserver* observer); + BOOL containsObserver(LLInventoryObserver* observer) const; +private: + typedef std::set observer_list_t; + observer_list_t mObservers; + +public: // this gets triggered when performing a filter-search static void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null); // start fetch process static void findLostItems(); @@ -404,20 +489,12 @@ protected: // should be passed pointers of newly created objects, and the // instance will take over the memory management from there. // -public: -// - void addCategory(LLViewerInventoryCategory* category); - void addItem(LLViewerInventoryItem* item); -// -//protected: -// // Internal method which looks for a category with the specified // preferred type. Returns LLUUID::null if not found LLUUID findCatUUID(LLAssetType::EType preferred_type); // Empty the entire contents - void empty(); // Given the current state of the inventory items, figure out the // clone information. *FIX: This is sub-optimal, since we can @@ -427,8 +504,27 @@ public: // file import/export. // +/** Notifications + ** ** + *******************************************************************************/ + + +/******************************************************************************** + ** ** + ** MISCELLANEOUS + **/ + + //-------------------------------------------------------------------- + // Callbacks + //-------------------------------------------------------------------- public: -// + static void registerCallbacks(LLMessageSystem* msg); + + //-------------------------------------------------------------------- + // File I/O + //-------------------------------------------------------------------- +protected: + friend class LLLocalInventory; static bool loadFromFile(const std::string& filename, cat_array_t& categories, item_array_t& items, @@ -436,65 +532,37 @@ public: static bool saveToFile(const std::string& filename, const cat_array_t& categories, const item_array_t& items); -// -protected: -// - // message handling functionality - //static void processUseCachedInventory(LLMessageSystem* msg, void**); + //-------------------------------------------------------------------- + // Message handling functionality + //-------------------------------------------------------------------- +public: static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**); static void processRemoveInventoryItem(LLMessageSystem* msg, void**); static void processUpdateInventoryFolder(LLMessageSystem* msg, void**); static void processRemoveInventoryFolder(LLMessageSystem* msg, void**); - //static void processExchangeCallingcard(LLMessageSystem* msg, void**); - //static void processAddCallingcard(LLMessageSystem* msg, void**); - //static void processDeclineCallingcard(LLMessageSystem* msg, void**); static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**); static void processBulkUpdateInventory(LLMessageSystem* msg, void**); static void processInventoryDescendents(LLMessageSystem* msg, void**); static void processMoveInventoryItem(LLMessageSystem* msg, void**); static void processFetchInventoryReply(LLMessageSystem* msg, void**); - +protected: bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting); - // Updates all linked items pointing to this id. - void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); - + //-------------------------------------------------------------------- + // Locks + //-------------------------------------------------------------------- +public: + void lockDirectDescendentArrays(const LLUUID& cat_id, + cat_array_t*& categories, + item_array_t*& items); + void unlockDirectDescendentArrays(const LLUUID& cat_id); protected: cat_array_t* getUnlockedCatArray(const LLUUID& id); item_array_t* getUnlockedItemArray(const LLUUID& id); - -protected: - // Varaibles used to track what has changed since the last notify. - U32 mModifyMask; - typedef std::set changed_items_t; - changed_items_t mChangedItemIDs; - - // Information for tracking the actual inventory. We index this - // information in a lot of different ways so we can access - // the inventory using several different identifiers. - // mInventory member data is the 'master' list of inventory, and - // mCategoryMap and mItemMap store uuid->object mappings. - typedef std::map > cat_map_t; - typedef std::map > item_map_t; - //inv_map_t mInventory; - cat_map_t mCategoryMap; - item_map_t mItemMap; - +private: std::map mCategoryLock; std::map mItemLock; - - // cache recent lookups - mutable LLPointer mLastItem; - - // This last set of indices is used to map parents to children. - typedef std::map parent_cat_map_t; - typedef std::map parent_item_map_t; - parent_cat_map_t mParentChildCategoryTree; - parent_item_map_t mParentChildItemTree; - - typedef std::set observer_list_t; - observer_list_t mObservers; // completing the fetch once per session should be sufficient static BOOL sBackgroundFetchActive; @@ -505,20 +573,19 @@ protected: static F32 sMaxTimeBetweenFetches; static S16 sBulkFetchCount; - // This flag is used to handle an invalid inventory state. - bool mIsAgentInvUsable; - -private: - const static S32 sCurrentInvCacheVersion; // expected inventory cache version - public: // *NOTE: DEBUG functionality - void dumpInventory(); + void dumpInventory() const; + static bool isBulkFetchProcessingComplete(); static void stopBackgroundFetch(); // stop fetch process static BOOL sFullFetchStarted; static BOOL sAllFoldersFetched; + +/** Miscellaneous + ** ** + *******************************************************************************/ }; // a special inventory model for the agent diff --git a/indra/newview/llinventoryview.cpp b/indra/newview/llinventoryview.cpp index 0007034a3..1d89872c9 100644 --- a/indra/newview/llinventoryview.cpp +++ b/indra/newview/llinventoryview.cpp @@ -71,7 +71,7 @@ #include "llscrollbar.h" #include "llimview.h" #include "lltooldraganddrop.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerobjectlist.h" #include "llviewerwindow.h" @@ -1474,7 +1474,7 @@ std::string get_item_icon_name(LLAssetType::EType asset_type, { idx = BODYPART_ICON_NAME; } - switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point) + switch(LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK & attachment_point) { case WT_SHAPE: idx = BODYPART_SHAPE_ICON_NAME; @@ -1521,6 +1521,9 @@ std::string get_item_icon_name(LLAssetType::EType asset_type, case WT_TATTOO: idx = CLOTHING_TATTOO_ICON_NAME; break; + case WT_PHYSICS: + idx = CLOTHING_PHYSICS_ICON_NAME; + break; default: // no-op, go with choice above break; diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp index 05c5e4140..6eab2343a 100644 --- a/indra/newview/lljoystickbutton.cpp +++ b/indra/newview/lljoystickbutton.cpp @@ -42,8 +42,7 @@ // Project includes #include "llui.h" #include "llagent.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerwindow.h" #include "llmoveview.h" @@ -651,7 +650,7 @@ void LLJoystickCameraRotate::draw() } // Draws image rotated by multiples of 90 degrees -void LLJoystickCameraRotate::drawRotatedImage( LLImageGL* image, S32 rotations ) +void LLJoystickCameraRotate::drawRotatedImage( LLTexture* image, S32 rotations ) { S32 width = image->getWidth(); S32 height = image->getHeight(); @@ -735,8 +734,8 @@ LLJoystickCameraZoom::LLJoystickCameraZoom(const std::string& name, LLRect rect, mInTop( FALSE ), mInBottom( FALSE ) { - mPlusInImage = LLUIImageList::getInstance()->getUIImage(plus_in_img); - mMinusInImage = LLUIImageList::getInstance()->getUIImage(minus_in_img); + mPlusInImage = LLUI::getUIImage(plus_in_img); + mMinusInImage = LLUI::getUIImage(minus_in_img); } diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h index b26851f13..2d0492a11 100644 --- a/indra/newview/lljoystickbutton.h +++ b/indra/newview/lljoystickbutton.h @@ -35,7 +35,7 @@ #include "llbutton.h" #include "llcoord.h" -#include "llviewerimage.h" +#include "llviewertexture.h" typedef enum e_joystick_quadrant { @@ -136,7 +136,7 @@ public: protected: F32 getOrbitRate(); virtual void updateSlop(); - void drawRotatedImage( LLImageGL* image, S32 rotations ); + void drawRotatedImage( LLTexture* image, S32 rotations ); protected: BOOL mInLeft; diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index befc7177b..775c916c3 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -40,7 +40,7 @@ #include "llrender.h" #include "llprimitive.h" #include "llview.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llagent.h" #include "llviewercontrol.h" @@ -89,6 +89,7 @@ void LLManip::rebuild(LLViewerObject* vobj) if (group) { group->dirtyGeom(); + gPipeline.markRebuild(group, TRUE); } } } diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 74e9637f8..fdf8c2166 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -82,7 +82,7 @@ const F32 PLANE_TICK_SIZE = 0.4f; const F32 MANIPULATOR_SCALE_HALF_LIFE = 0.07f; const F32 SNAP_ARROW_SCALE = 0.7f; -static LLPointer sGridTex = NULL ; +static LLPointer sGridTex = NULL ; const LLManip::EManipPart MANIPULATOR_IDS[9] = { @@ -158,7 +158,7 @@ void LLManipTranslate::restoreGL() U32 mip = 0; destroyGL() ; - sGridTex = new LLImageGL() ; + sGridTex = LLViewerTextureManager::getLocalTexture() ; if(!sGridTex->createGLTexture()) { sGridTex = NULL ; @@ -167,7 +167,7 @@ void LLManipTranslate::restoreGL() GLuint* d = new GLuint[rez*rez]; - gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex->getTexName()); + gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex->getTexName(), true); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR); while (rez >= 1) diff --git a/indra/newview/llmapresponders.cpp b/indra/newview/llmapresponders.cpp index 9d974f229..60758a396 100644 --- a/indra/newview/llmapresponders.cpp +++ b/indra/newview/llmapresponders.cpp @@ -35,7 +35,7 @@ #include "llmapresponders.h" #include "llfloaterworldmap.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llworldmap.h" #include "llagent.h" @@ -80,7 +80,7 @@ void LLMapLayerResponder::result(const LLSD& result) // } // else // { - new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE); + new_layer.LayerImage = LLViewerTextureManager::getFetchedTexture(new_layer.LayerImageID); // } gGL.getTexUnit(0)->bind(new_layer.LayerImage.get()); new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -179,14 +179,14 @@ void LLMapLayerResponder::result(const LLSD& result) } else { - siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); + siminfo->mCurrentImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap]); } siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP); gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get()); if (siminfo->mMapImageID[2].notNull()) { - siminfo->mOverlayImage = gImageList.getImage(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE); + siminfo->mOverlayImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[2]); } else { diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index db6d29cfc..f524be097 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -93,7 +93,7 @@ LLMediaCtrl::LLMediaCtrl( const std::string& name, const LLRect& rect ) : if ( !mMediaSource ) { llwarns << "media source create failed " << llendl; - // return; + return; } else { @@ -123,7 +123,6 @@ LLMediaCtrl::~LLMediaCtrl() if ( mWebBrowserImage ) { - delete mWebBrowserImage; mWebBrowserImage = NULL; } } @@ -589,7 +588,7 @@ void LLMediaCtrl::draw() } // scale texture to fit the space using texture coords - gGL.getTexUnit(0)->bind(mWebBrowserImage->getTexture()); + gGL.getTexUnit(0)->bind(mWebBrowserImage); gGL.color4fv( LLColor4::white.mV ); F32 max_u = ( F32 )mWebBrowserImage->getMediaWidth() / ( F32 )mWebBrowserImage->getWidth(); F32 max_v = ( F32 )mWebBrowserImage->getMediaHeight() / ( F32 )mWebBrowserImage->getHeight(); @@ -914,7 +913,7 @@ void LLMediaCtrl::onClickLinkNoFollow( LLPluginClassMedia* self ) //////////////////////////////////////////////////////////////////////////////// // LLWebBrowserTexture::LLWebBrowserTexture( S32 width, S32 height, LLMediaCtrl* browserCtrl, viewer_media_t media_source ) : - LLDynamicTexture( 512, 512, 4, ORDER_FIRST, TRUE ), + LLViewerDynamicTexture( 512, 512, 4, ORDER_FIRST, TRUE ), mNeedsUpdate( true ), mNeedsResize( false ), mTextureCoordsOpenGL( true ), @@ -1005,7 +1004,7 @@ BOOL LLWebBrowserTexture::render() data += ( x_pos * media_plugin->getTextureDepth() * media_plugin->getBitsWidth() ); data += ( y_pos * media_plugin->getTextureDepth() ); - mTexture->setSubImage( + setSubImage( data, media_plugin->getBitsWidth(), media_plugin->getBitsHeight(), @@ -1120,18 +1119,18 @@ bool LLWebBrowserTexture::updateBrowserTexture() return false; if(mMediaSource->mNeedsNewTexture - || media->getTextureWidth() != mWidth - || media->getTextureHeight() != mHeight ) + || media->getTextureWidth() != getFullWidth() + || media->getTextureHeight() != getFullHeight() ) { - releaseGLTexture(); + //releaseGLTexture(); - mWidth = media->getTextureWidth(); - mHeight = media->getTextureHeight(); + mFullWidth = media->getTextureWidth(); + mFullHeight = media->getTextureHeight(); mTextureCoordsOpenGL = media->getTextureCoordsOpenGL(); const LLColor4U fill_color(0,0,0,255); // will create mWidth * mHeight sized texture, using the texture params specified by the media. - LLDynamicTexture::generateGLTexture( + generateGLTexture( media->getTextureFormatInternal(), media->getTextureFormatPrimary(), media->getTextureFormatType(), diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 77f59c7e7..f185fb9b9 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -143,7 +143,7 @@ class LLMediaCtrl : static bool onClickLinkExternalTarget( const LLSD&, const LLSD& ); const S32 mTextureDepthBytes; - LLWebBrowserTexture* mWebBrowserImage; + LLPointer mWebBrowserImage; LLViewBorder* mBorder; bool mFrequentUpdates; bool mForceUpdate; @@ -165,7 +165,7 @@ class LLMediaCtrl : //////////////////////////////////////////////////////////////////////////////// // -class LLWebBrowserTexture : public LLDynamicTexture +class LLWebBrowserTexture : public LLViewerDynamicTexture { LOG_CLASS(LLWebBrowserTexture); public: diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 40b1c6414..dca58d5f4 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -264,7 +264,7 @@ LLMuteList::~LLMuteList() // If we quit from the login screen we will not have an SL account // name. Don't try to save, otherwise we'll dump a file in // C:\Program Files\SecondLife\ JC - std::string user_dir = gDirUtilp->getLindenUserDir(); + std::string user_dir = gDirUtilp->getLindenUserDir(true); if (!user_dir.empty()) { std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml"); diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 453cf7fab..364fb1c44 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -72,7 +72,7 @@ LLNameListCtrl::~LLNameListCtrl() // public BOOL LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos, - BOOL enabled, std::string& suffix) + BOOL enabled, std::string const& suffix) { //llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl; diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 1b7795ddf..4485faedf 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -58,7 +58,7 @@ public: // Add a user to the list by name. It will be added, the name // requested from the cache, and updated as necessary. BOOL addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM, - BOOL enabled = TRUE, std::string& suffix = LLStringUtil::null); + BOOL enabled = TRUE, std::string const& suffix = LLStringUtil::null); BOOL addNameItem(LLScrollListItem* item, EAddPosition pos = ADD_BOTTOM); virtual LLScrollListItem* addElement(const LLSD& value, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL); diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index fd0635887..b266df2cb 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -58,8 +58,7 @@ #include "lluictrlfactory.h" #include "lluuid.h" #include "llviewercamera.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermenu.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" @@ -395,7 +394,8 @@ void LLNetMap::draw() avColor = muted_color; } - LLUUID estate_owner = LLWorld::getInstance()->getRegionFromPosGlobal(positions[i])->getOwner(); + LLViewerRegion* avatar_region = LLWorld::getInstance()->getRegionFromPosGlobal(positions[i]); + LLUUID estate_owner = avatar_region? avatar_region->getOwner() : LLUUID::null; //Lindens are always more Linden than your friend, make that take precedence if(LLMuteList::getInstance()->isLinden(avName)) @@ -883,7 +883,7 @@ void LLNetMap::createObjectImage() mObjectRawImagep = new LLImageRaw(img_size, img_size, 4); U8* data = mObjectRawImagep->getData(); memset( data, 0, img_size * img_size * 4 ); - mObjectImagep = new LLImageGL( mObjectRawImagep, FALSE); + mObjectImagep = LLViewerTextureManager::getLocalTexture( mObjectRawImagep.get(), FALSE); } setScale(mScale); mUpdateNow = TRUE; diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 306fbad31..308ec11b4 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -39,9 +39,9 @@ #include "v3dmath.h" #include "v4color.h" #include "llimage.h" -#include "llimagegl.h" class LLTextBox; +class LLViewerTexture; typedef enum e_minimap_center { @@ -112,7 +112,7 @@ private: BOOL mUpdateNow; LLVector3d mObjectImageCenterGlobal; LLPointer mObjectRawImagep; - LLPointer mObjectImagep; + LLPointer mObjectImagep; private: LLUUID mClosestAgentToCursor; diff --git a/indra/newview/llnotify.cpp b/indra/newview/llnotify.cpp index cd63228a3..9a36b6542 100644 --- a/indra/newview/llnotify.cpp +++ b/indra/newview/llnotify.cpp @@ -50,7 +50,7 @@ #include "llalertdialog.h" #include "llviewercontrol.h" #include "llviewerdisplay.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llfloaterchat.h" // for add_chat_history() #include "lloverlaybar.h" // for gOverlayBar #include "lluictrlfactory.h" diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp index 7decd1eaa..5f74a9ecb 100644 --- a/indra/newview/lloverlaybar.cpp +++ b/indra/newview/lloverlaybar.cpp @@ -52,7 +52,7 @@ #include "lltextbox.h" #include "llui.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerjoystick.h" #include "llviewermedia.h" #include "llviewermenu.h" // handle_reset_view() diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index be9431e69..52e812924 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -726,15 +726,6 @@ void LLPanelAvatarWeb::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent ev } } - - - - - - - - - //----------------------------------------------------------------------------- // LLPanelAvatarAdvanced //----------------------------------------------------------------------------- @@ -1434,44 +1425,6 @@ void LLPanelAvatar::onCommitKey(LLUICtrl* ctrl, void* data) self->setAvatarID(av_key, LLStringUtil::null, ONLINE_STATUS_NO); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void LLPanelAvatar::setOnlineStatus(EOnlineStatus online_status) { // Online status NO could be because they are hidden @@ -1483,13 +1436,6 @@ void LLPanelAvatar::setOnlineStatus(EOnlineStatus online_status) online_status = ONLINE_STATUS_YES; } - - - - - - - if(online_status == ONLINE_STATUS_YES) { mPanelSecondLife->childSetVisible("online_yes", TRUE); @@ -1505,9 +1451,6 @@ void LLPanelAvatar::setOnlineStatus(EOnlineStatus online_status) childSetVisible("Offer Teleport...",TRUE); } - - - BOOL in_prelude = gAgent.inPrelude(); if(gAgent.isGodlike()) { @@ -1521,7 +1464,7 @@ void LLPanelAvatar::setOnlineStatus(EOnlineStatus online_status) } else { - childSetEnabled("Offer Teleport...", (online_status == ONLINE_STATUS_YES)); + childSetEnabled("Offer Teleport...", TRUE /*(online_status == ONLINE_STATUS_YES)*/); childSetToolTip("Offer Teleport...", childGetValue("TeleportNormal").asString()); } } diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index 86b72bba0..24de55cb5 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -52,7 +52,7 @@ class LLTextBox; class LLTextEditor; class LLTextureCtrl; class LLUICtrl; -class LLViewerImage; +class LLViewerTexture; class LLViewerObject; class LLMessageSystem; class LLIconCtrl; diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 6c9651e1d..29929e82d 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -212,7 +212,7 @@ void LLPanelContents::onClickNewScript(void *userdata) std::string("New Script"), desc, LLSaleInfo::DEFAULT, - LLViewerInventoryItem::II_FLAGS_NONE, + LLInventoryItemFlags::II_FLAGS_NONE, time_corrected()); object->saveScript(new_item, TRUE, true); diff --git a/indra/newview/llpaneldirbrowser.cpp b/indra/newview/llpaneldirbrowser.cpp index 2aa5703e3..e2a24c163 100644 --- a/indra/newview/llpaneldirbrowser.cpp +++ b/indra/newview/llpaneldirbrowser.cpp @@ -69,7 +69,7 @@ #include "lltrans.h" #include "lluiconstants.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermessage.h" #include "lluictrlfactory.h" #include "llnotify.h" diff --git a/indra/newview/llpaneldirfind.cpp b/indra/newview/llpaneldirfind.cpp index 26156ca25..398cb2972 100644 --- a/indra/newview/llpaneldirfind.cpp +++ b/indra/newview/llpaneldirfind.cpp @@ -53,7 +53,7 @@ #include "llpluginclassmedia.h" #include "lltextbox.h" #include "lluiconstants.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermessage.h" #include "llfloateravatarinfo.h" #include "lldir.h" diff --git a/indra/newview/llpaneldisplay.cpp b/indra/newview/llpaneldisplay.cpp index 50e5cabab..273e68fdb 100644 --- a/indra/newview/llpaneldisplay.cpp +++ b/indra/newview/llpaneldisplay.cpp @@ -57,8 +57,7 @@ #include "lltexteditor.h" #include "llui.h" #include "llviewercamera.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermessage.h" #include "llviewerobjectlist.h" #include "llviewerwindow.h" diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 328efbd91..483b755de 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -541,7 +541,7 @@ void LLPanelFace::getState() { LLUUID get(LLViewerObject* object, S32 te) { - LLViewerImage* image = object->getTEImage(te); + LLViewerTexture* image = object->getTEImage(te); return image ? image->getID() : LLUUID::null; } } func; diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 43e1a09a4..950f08699 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -305,7 +305,7 @@ void LLPanelGroupNotices::setItem(LLPointer inv_item) mInventoryItem = inv_item; BOOL item_is_multi = FALSE; - if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) { item_is_multi = TRUE; }; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 6e65181f9..fe42aef8d 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -47,7 +47,7 @@ #include "lltabcontainer.h" #include "lltextbox.h" #include "lltexteditor.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerwindow.h" #include "llfocusmgr.h" diff --git a/indra/newview/llpanelinventory.cpp b/indra/newview/llpanelinventory.cpp index 573c7e27e..38c90783b 100644 --- a/indra/newview/llpanelinventory.cpp +++ b/indra/newview/llpanelinventory.cpp @@ -74,7 +74,7 @@ #include "lltooldraganddrop.h" #include "llviewercontrol.h" #include "llviewerregion.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewermessage.h" #include "llviewerobject.h" @@ -144,7 +144,7 @@ public: virtual void move(LLFolderViewEventListener* parent_listener); virtual BOOL isItemCopyable() const; virtual BOOL copyToClipboard() const; - virtual void cutToClipboard(); + virtual BOOL cutToClipboard() const; virtual BOOL isClipboardPasteable() const; virtual void pasteFromClipboard(); virtual void pasteLinkFromClipboard(); @@ -353,7 +353,7 @@ time_t LLTaskInvFVBridge::getCreationDate() const LLUIImagePtr LLTaskInvFVBridge::getIcon() const { BOOL item_is_multi = FALSE; - if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + if ( mFlags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) { item_is_multi = TRUE; } @@ -596,8 +596,9 @@ BOOL LLTaskInvFVBridge::copyToClipboard() const return FALSE; } -void LLTaskInvFVBridge::cutToClipboard() +BOOL LLTaskInvFVBridge::cutToClipboard() const { + return FALSE; } BOOL LLTaskInvFVBridge::isClipboardPasteable() const @@ -1372,7 +1373,7 @@ LLTaskObjectBridge::LLTaskObjectBridge( LLUIImagePtr LLTaskObjectBridge::getIcon() const { BOOL item_is_multi = FALSE; - if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + if ( mFlags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) { item_is_multi = TRUE; } @@ -1787,7 +1788,7 @@ void LLPanelInventory::reset() } void LLPanelInventory::inventoryChanged(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void* data) { @@ -1810,8 +1811,8 @@ void LLPanelInventory::inventoryChanged(LLViewerObject* object, LLFloaterProperties* floater = NULL; LLDynamicArray refresh; - InventoryObjectList::const_iterator it = inventory->begin(); - InventoryObjectList::const_iterator end = inventory->end(); + LLInventoryObject::object_list_t::const_iterator it = inventory->begin(); + LLInventoryObject::object_list_t::const_iterator end = inventory->end(); for( ; it != end; ++it) { floater = LLFloaterProperties::find((*it)->getUUID(), @@ -1927,7 +1928,7 @@ void LLPanelInventory::createFolderViews(LLInventoryObject* inventory_root, Inve typedef std::pair obj_folder_pair; -void LLPanelInventory::createViewsForCategory(InventoryObjectList* inventory, +void LLPanelInventory::createViewsForCategory(LLInventoryObject::object_list_t* inventory, LLInventoryObject* parent, LLFolderViewFolder* folder) { diff --git a/indra/newview/llpanelinventory.h b/indra/newview/llpanelinventory.h index e5b72afe5..c4028624c 100644 --- a/indra/newview/llpanelinventory.h +++ b/indra/newview/llpanelinventory.h @@ -78,12 +78,12 @@ protected: protected: void reset(); /*virtual*/ void inventoryChanged(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void* user_data); void updateInventory(); void createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents); - void createViewsForCategory(InventoryObjectList* inventory, + void createViewsForCategory(LLInventoryObject::object_list_t* inventory, LLInventoryObject* parent, LLFolderViewFolder* folder); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 71dd025e3..7d7d65a35 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -63,7 +63,7 @@ #include "llurlhistory.h" // OGPX : regionuri text box has a history of region uris (if FN/LN are loaded at startup) #include "llurlsimstring.h" #include "llviewerbuild.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermenu.h" // for handle_preferences() #include "llviewernetwork.h" #include "llviewerwindow.h" // to link into child list @@ -456,7 +456,7 @@ LLPanelLogin::~LLPanelLogin() gResponsePtr->setParent( 0 ); //// We know we're done with the image, so be rid of it. - //gImageList.deleteImage( mLogoImage ); + //gTextureList.deleteImage( mLogoImage ); if ( gFocusMgr.getDefaultKeyboardFocus() == this ) { @@ -911,20 +911,11 @@ void LLPanelLogin::loadLoginPage() std::string version = llformat("%d.%d.%d (%d)", LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BUILD); - char* curl_channel = curl_escape(LL_CHANNEL, 0); - - char* curl_version = curl_escape(version.c_str(), 0); - - oStr << "&channel=" << curl_channel; - oStr << "&version=" << curl_version; - - curl_free(curl_channel); - curl_free(curl_version); + oStr << "&channel=" << LLWeb::curlEscape(LL_CHANNEL); + oStr << "&version=" << LLWeb::curlEscape(version); // Grid - char* curl_grid = curl_escape(LLViewerLogin::getInstance()->getGridLabel().c_str(), 0); - oStr << "&grid=" << curl_grid; - curl_free(curl_grid); + oStr << "&grid=" << LLWeb::curlEscape(LLViewerLogin::getInstance()->getGridLabel()); if (gHippoGridManager->getConnectedGrid()->isSecondLife()) { // find second life grid from login URI @@ -938,9 +929,7 @@ void LLPanelLogin::loadLoginPage() i = tmp.rfind('/'); if (i != std::string::npos) { tmp = tmp.substr(i+1); - char* curl_grid = curl_escape(tmp.c_str(), 0); - oStr << "&grid=" << curl_grid; - curl_free(curl_grid); + oStr << "&grid=" << LLWeb::curlEscape(tmp); } } } @@ -997,13 +986,11 @@ void LLPanelLogin::loadLoginPage() lastname = gSavedSettings.getString("LastName"); } - char* curl_region = curl_escape(region.c_str(), 0); + std::string curl_region = LLWeb::curlEscape(region); oStr <<"firstname=" << firstname << "&lastname=" << lastname << "&location=" << location << "®ion=" << curl_region; - curl_free(curl_region); - if (!password.empty()) { oStr << "&password=" << password; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index f6ce2fe3b..9f8561835 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -2771,4 +2771,4 @@ void LLPanelObject::onPasteRotClip(void* user_data) calcp->setVar(LLCalc::Y_ROT, mClipboardRot.mV[VY]); calcp->setVar(LLCalc::Z_ROT, mClipboardRot.mV[VZ]); self->sendRotation(FALSE); -} \ No newline at end of file +} diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp new file mode 100644 index 000000000..d69ebd0b2 --- /dev/null +++ b/indra/newview/llphysicsmotion.cpp @@ -0,0 +1,850 @@ +/** + * @file llphysicsmotion.cpp + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +//----------------------------------------------------------------------------- +// Header Files +//----------------------------------------------------------------------------- +#include "llviewerprecompiledheaders.h" +#include "linden_common.h" + +#include "m3math.h" +#include "v3dmath.h" + +#include "llphysicsmotion.h" +#include "llagent.h" +#include "llcharacter.h" +#include "llviewercontrol.h" +#include "llviewervisualparam.h" +#include "llvoavatar.h" +#include "lldriverparam.h" + +typedef std::map controller_map_t; +typedef std::map default_controller_map_t; + +#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f +#define TIME_ITERATION_STEP 0.1f + +inline F64 llsgn(const F64 a) +{ + if (a >= 0) + return 1; + return -1; +} + +/* + At a high level, this works by setting temporary parameters that are not stored + in the avatar's list of params, and are not conveyed to other users. We accomplish + this by creating some new temporary driven params inside avatar_lad that are then driven + by the actual params that the user sees and sets. For example, in the old system, + the user sets a param called breast bouyancy, which controls the Z value of the breasts. + In our new system, the user still sets the breast bouyancy, but that param is redefined + as a driver param so that affects a new temporary driven param that the bounce is applied + to. +*/ + +class LLPhysicsMotion +{ +public: + /* + param_driver_name: The param that controls the params that are being affected by the physics. + joint_name: The joint that the body part is attached to. The joint is + used to determine the orientation (rotation) of the body part. + + character: The avatar that this physics affects. + + motion_direction_vec: The direction (in world coordinates) that determines the + motion. For example, (0,0,1) is up-down, and means that up-down motion is what + determines how this joint moves. + + controllers: The various settings (e.g. spring force, mass) that determine how + the body part behaves. + */ + LLPhysicsMotion(const std::string ¶m_driver_name, + const std::string &joint_name, + LLCharacter *character, + const LLVector3 &motion_direction_vec, + const controller_map_t &controllers) : + mParamDriverName(param_driver_name), + mJointName(joint_name), + mMotionDirectionVec(motion_direction_vec), + mParamDriver(NULL), + mParamControllers(controllers), + mCharacter(character), + mLastTime(0), + mPosition_local(0), + mVelocityJoint_local(0), + mPositionLastUpdate_local(0), + mAccelerationJoint_local(0), + mVelocity_local(0) + { + mJointState = new LLJointState; + } + + void getString(std::ostringstream &oss); + + BOOL initialize(); + + ~LLPhysicsMotion() {} + + BOOL onUpdate(F32 time); + + LLPointer getJointState() + { + return mJointState; + } + + void reset(); +protected: + F32 getParamValue(const std::string& controller_key) + { + const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key); + if (entry == mParamControllers.end()) + { + return sDefaultController[controller_key]; + } + return mCharacter->getVisualParamWeight((*entry).second.c_str()); + } + void setParamValue(LLViewerVisualParam *param, + const F32 new_value_local, + F32 behavior_maxeffect); + + F32 toLocal(const LLVector3 &world); + F32 calculateVelocity_local(); + F32 calculateAcceleration_local(F32 velocity_local); + +private: + const std::string mParamDriverName; + const std::string mParamControllerName; + const LLVector3 mMotionDirectionVec; + const std::string mJointName; + + F32 mPosition_local; + F32 mVelocityJoint_local; // How fast the joint is moving + F32 mAccelerationJoint_local; // Acceleration on the joint + + F32 mVelocity_local; // How fast the param is moving + F32 mPositionLastUpdate_local; + LLVector3 mPosition_world; + + LLViewerVisualParam *mParamDriver; + const controller_map_t mParamControllers; + + LLPointer mJointState; + LLCharacter *mCharacter; + + F32 mLastTime; + + static default_controller_map_t sDefaultController; +}; + +default_controller_map_t initDefaultController() +{ + default_controller_map_t controller; + controller["Mass"] = 0.2f; + controller["Gravity"] = 0.0f; + controller["Damping"] = .05f; + controller["Drag"] = 0.15f; + controller["MaxEffect"] = 0.1f; + controller["Spring"] = 0.1f; + controller["Gain"] = 10.0f; + return controller; +} + +default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController(); + +BOOL LLPhysicsMotion::initialize() +{ + if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str()))) + return FALSE; + mJointState->setUsage(LLJointState::ROT); + + mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str()); + if (mParamDriver == NULL) + { + llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl; + return FALSE; + } + + return TRUE; +} + +std::string LLPhysicsMotionController::getString() +{ + std::ostringstream oss; + oss << "{" << std::endl << + "Active: " << mActive << std::endl << + "IsDefault: " << mIsDefault << std::endl << + "Stopped: " << isStopped() << std::endl << + "Name: " << getName() << std::endl << + "ID: " << getID().asString() << std::endl; + + for (motion_vec_t::iterator iter = mMotions.begin();iter != mMotions.end();++iter) + { + (*iter)->getString(oss); + } + oss << "}" << std::endl; + return oss.str(); +} +void getParamString(U32 depth, LLViewerVisualParam *param, std::ostringstream &oss) +{ + std::string indent; + indent.resize(depth,' '); + + oss << + indent << "getID: " << param->getID() << std::endl << + indent << "getName: " << param->getName() << std::endl << + indent << "getDisplayName: " << param->getDisplayName() << std::endl << + indent << "getGroup: " << param->getGroup() << std::endl << + indent << "getSex: " << param->getSex() << std::endl << + indent << "getMinWeight: " << param->getMinWeight() << std::endl << + indent << "getMaxWeight: " << param->getMaxWeight() << std::endl << + indent << "getDefaultWeight: " << param->getDefaultWeight() << std::endl << + indent << "getWeight: " << param->getWeight() << std::endl << + indent << "getCurrentWeight: " << param->getCurrentWeight() << std::endl << + indent << "getLastWeight: " << param->getLastWeight() << std::endl << + indent << "isAnimating: " << param->isAnimating() << std::endl << + indent << "isTweakable: " << param->isTweakable() << std::endl; +} +void LLPhysicsMotion::getString(std::ostringstream &oss) +{ + oss << + " mParamDriverName: " << mParamDriverName << std::endl << + " mParamControllerName: " << mParamControllerName << std::endl << + " mMotionDirectionVec: " << mMotionDirectionVec << std::endl << + " mJointName: " << mJointName << std::endl << + " mPosition_local: " << mPosition_local << std::endl << + " mVelocityJoint_local: " << mVelocityJoint_local << std::endl << + " mAccelerationJoint_local: " << mAccelerationJoint_local << std::endl << + " mPositionLastUpdate_local: " << mPositionLastUpdate_local << std::endl << + " mPosition_world: " << mPosition_world << std::endl << + " mVelocity_local: " << mVelocity_local << std::endl; + if(mParamDriver) + { + oss << " " << std::endl; + getParamString(2,mParamDriver,oss); + LLDriverParam *driver_param = dynamic_cast(mParamDriver); + if(driver_param) + { + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end();++iter) + { + oss << " " << std::endl; + getParamString(3,iter->mParam,oss); + } + } + } + else + oss << " mParamDriver: (NULL)" << std::endl; + oss << " Controllers:" << std::endl; + for(controller_map_t::const_iterator it = mParamControllers.begin(); it!= mParamControllers.end(); ++it) + { + oss << " mParamControllers[\"" << it->first << "\"] = \"" << it->second << "\" =" << getParamValue(it->first) << std::endl; + } +} + +LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : + LLMotion(id), + mCharacter(NULL), + mIsDefault(true) +{ + mName = "breast_motion"; +} + +LLPhysicsMotionController::~LLPhysicsMotionController() +{ + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + delete (*iter); + } +} + +BOOL LLPhysicsMotionController::onActivate() +{ + return TRUE; +} + +void LLPhysicsMotionController::onDeactivate() +{ +} + +LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) +{ + mCharacter = character; + + mMotions.clear(); + + // Breast Cleavage + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_InOut_Damping"; + controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect"; + controller["Spring"] = "Breast_Physics_InOut_Spring"; + controller["Gain"] = "Breast_Physics_InOut_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller", + "mChest", + character, + LLVector3(-1,0,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Bounce + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Breast_Physics_UpDown_Spring"; + controller["Gain"] = "Breast_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller", + "mChest", + character, + LLVector3(0,0,1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Breast Sway + { + controller_map_t controller; + controller["Mass"] = "Breast_Physics_Mass"; + controller["Gravity"] = "Breast_Physics_Gravity"; + controller["Drag"] = "Breast_Physics_Drag"; + controller["Damping"] = "Breast_Physics_LeftRight_Damping"; + controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect"; + controller["Spring"] = "Breast_Physics_LeftRight_Spring"; + controller["Gain"] = "Breast_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller", + "mChest", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + // Butt Bounce + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Butt_Physics_UpDown_Spring"; + controller["Gain"] = "Butt_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Butt LeftRight + { + controller_map_t controller; + controller["Mass"] = "Butt_Physics_Mass"; + controller["Gravity"] = "Butt_Physics_Gravity"; + controller["Drag"] = "Butt_Physics_Drag"; + controller["Damping"] = "Butt_Physics_LeftRight_Damping"; + controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect"; + controller["Spring"] = "Butt_Physics_LeftRight_Spring"; + controller["Gain"] = "Butt_Physics_LeftRight_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller", + "mPelvis", + character, + LLVector3(0,-1,0), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + // Belly Bounce + { + controller_map_t controller; + controller["Mass"] = "Belly_Physics_Mass"; + controller["Gravity"] = "Belly_Physics_Gravity"; + controller["Drag"] = "Belly_Physics_Drag"; + controller["Damping"] = "Belly_Physics_UpDown_Damping"; + controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect"; + controller["Spring"] = "Belly_Physics_UpDown_Spring"; + controller["Gain"] = "Belly_Physics_UpDown_Gain"; + LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller", + "mPelvis", + character, + LLVector3(0,0,-1), + controller); + if (!motion->initialize()) + { + llassert_always(FALSE); + return STATUS_FAILURE; + } + addMotion(motion); + } + + return STATUS_SUCCESS; +} + +void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion) +{ + addJointState(motion->getJointState()); + mMotions.push_back(motion); +} + +F32 LLPhysicsMotionController::getMinPixelArea() +{ + return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION; +} + +// Local space means "parameter space". +F32 LLPhysicsMotion::toLocal(const LLVector3 &world) +{ + LLJoint *joint = mJointState->getJoint(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + + LLVector3 dir_world = mMotionDirectionVec * rotation_world; + dir_world.normalize(); + return world * dir_world; +} + +F32 LLPhysicsMotion::calculateVelocity_local() +{ + const F32 world_to_model_scale = 100.0f; + LLJoint *joint = mJointState->getJoint(); + const LLVector3 position_world = joint->getWorldPosition(); + const LLQuaternion rotation_world = joint->getWorldRotation(); + const LLVector3 last_position_world = mPosition_world; + const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; + const LLVector3 velocity_world = positionchange_world; + const F32 velocity_local = toLocal(velocity_world); + return velocity_local; +} + +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) +{ +// const F32 smoothing = getParamValue("Smoothing"); + static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary + const F32 acceleration_local = velocity_local - mVelocityJoint_local; + + const F32 smoothed_acceleration_local = + acceleration_local * 1.0/smoothing + + mAccelerationJoint_local * (smoothing-1.0)/smoothing; + + return smoothed_acceleration_local; +} + +BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask) +{ + // Skip if disabled globally. + static const LLCachedControl avatar_physics("AvatarPhysics",false); + if (!avatar_physics || (!((LLVOAvatar*)mCharacter)->isSelf() && !((LLVOAvatar*)mCharacter)->mSupportsPhysics)) + { + if(!mIsDefault) + { + mIsDefault = true; + for (motion_vec_t::iterator iter = mMotions.begin();iter != mMotions.end();++iter) + { + (*iter)->reset(); + } + mCharacter->updateVisualParams(); + } + ((LLVOAvatar*)mCharacter)->idleUpdateBoobEffect(); //Fall back to emerald physics + return TRUE; + } + + mIsDefault = false; + + BOOL update_visuals = FALSE; + for (motion_vec_t::iterator iter = mMotions.begin(); + iter != mMotions.end(); + ++iter) + { + LLPhysicsMotion *motion = (*iter); + update_visuals |= motion->onUpdate(time); + } + + if (update_visuals) + mCharacter->updateVisualParams(); + + return TRUE; +} + +// Return TRUE if character has to update visual params. +BOOL LLPhysicsMotion::onUpdate(F32 time) +{ + // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w"); + + if (!mParamDriver) + return FALSE; + + if (!mLastTime) + { + mLastTime = time; + return FALSE; + } + + //////////////////////////////////////////////////////////////////////////////// + // Get all parameters and settings + // + + const F32 time_delta = time - mLastTime; + + // Don't update too frequently, to avoid precision errors from small time slices. + if (time_delta <= .01) + { + return FALSE; + } + + // If less than 1FPS, we don't want to be spending time updating physics at all. + if (time_delta > 1.0) + { + mLastTime = time; + return FALSE; + } + + // Higher LOD is better. This controls the granularity + // and frequency of updates for the motions. + const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor; + if (lod_factor == 0) + { + return TRUE; + } + + LLJoint *joint = mJointState->getJoint(); + + const F32 behavior_mass = getParamValue("Mass"); + const F32 behavior_gravity = getParamValue("Gravity"); + const F32 behavior_spring = getParamValue("Spring"); + const F32 behavior_gain = getParamValue("Gain"); + const F32 behavior_damping = getParamValue("Damping"); + const F32 behavior_drag = getParamValue("Drag"); + const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts. + + F32 behavior_maxeffect = getParamValue("MaxEffect"); + if (physics_test) + behavior_maxeffect = 1.0f; + + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); + const F32 velocity_joint_local = calculateVelocity_local(); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + BOOL update_visuals = FALSE; + + // Break up the physics into a bunch of iterations so that differing framerates will show + // roughly the same behavior. + for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) + { + F32 time_iteration_step = TIME_ITERATION_STEP; + if (time_iteration + TIME_ITERATION_STEP > time_delta) + { + time_iteration_step = time_delta-time_iteration; + } + + // mPositon_local should be in normalized 0,1 range already. Just making sure... + const F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); + // If the effect is turned off then don't process unless we need one more update + // to set the position to the default (i.e. user) position. + if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) + { + return update_visuals; + } + + //////////////////////////////////////////////////////////////////////////////// + // Calculate the total force + // + + // Spring force is a restoring force towards the original user-set breast position. + // F = kx + const F32 spring_length = position_current_local - position_user_local; + const F32 force_spring = -spring_length * behavior_spring; + + // Acceleration is the force that comes from the change in velocity of the torso. + // F = ma + const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass); + + // Gravity always points downward in world space. + // F = mg + const LLVector3 gravity_world(0,0,1); + const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass); + + // Damping is a restoring force that opposes the current velocity. + // F = -kv + const F32 force_damping = -behavior_damping * mVelocity_local; + + // Drag is a force imparted by velocity (intuitively it is similar to wind resistance) + // F = .5kv^2 + const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local); + + const F32 force_net = (force_accel + + force_gravity + + force_spring + + force_damping + + force_drag); + + // + // End total force + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate new params + // + + // Calculate the new acceleration based on the net force. + // a = F/m + const F32 acceleration_new_local = force_net / behavior_mass; + static const F32 max_velocity = 100.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step; + velocity_new_local = llclamp(velocity_new_local, + -max_velocity, max_velocity); + + // Temporary debugging setting to cause all avatars to move, for profiling purposes. + if (physics_test) + { + velocity_new_local = sin(time*4.0); + } + // Calculate the new parameters, or remain unchanged if max speed is 0. + F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step; + if (behavior_maxeffect == 0) + position_new_local = position_user_local; + + // Zero out the velocity if the param is being pushed beyond its limits. + if ((position_new_local < 0 && velocity_new_local < 0) || + (position_new_local > 1 && velocity_new_local > 0)) + { + velocity_new_local = 0; + } + + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. + // If NaN, then reset everything. + if ((mPosition_local != mPosition_local) || + (mVelocity_local != mVelocity_local) || + (position_new_local != position_new_local)) + { + position_new_local = 0; + mVelocity_local = 0; + mVelocityJoint_local = 0; + mAccelerationJoint_local = 0; + mPosition_local = 0; + mPosition_world = LLVector3(0,0,0); + } + + const F32 position_new_local_clamped = llclamp(position_new_local, + 0.0f, + 1.0f); + + LLDriverParam *driver_param = dynamic_cast(mParamDriver); + llassert_always(driver_param); + if (driver_param) + { + // If this is one of our "hidden" driver params, then make sure it's + // the default value. + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param, + 0, + FALSE); + } + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end(); + ++iter) + { + LLDrivenEntry &entry = (*iter); + LLViewerVisualParam *driven_param = entry.mParam; + setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); + } + } + + // + // End calculate new params + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // Conditionally update the visual params + // + + // Updating the visual params (i.e. what the user sees) is fairly expensive. + // So only update if the params have changed enough, and also take into account + // the graphics LOD settings. + + // For non-self, if the avatar is small enough visually, then don't update. + const F32 area_for_max_settings = 0.0; + const F32 area_for_min_settings = 1400.0; + const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor); + const F32 pixel_area = fsqrtf(mCharacter->getPixelArea()); + + const BOOL is_self = (dynamic_cast(mCharacter) != NULL && ((LLVOAvatar*)mCharacter)->isSelf()); + if ((pixel_area > area_for_this_setting) || is_self) + { + const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); + const F32 min_delta = (1.0001f-lod_factor)*0.4f; + if (llabs(position_diff_local) > min_delta) + { + update_visuals = TRUE; + mPositionLastUpdate_local = position_new_local; + } + } + + // + // End update visual params + //////////////////////////////////////////////////////////////////////////////// + + mVelocity_local = velocity_new_local; + mAccelerationJoint_local = acceleration_joint_local; + mPosition_local = position_new_local; + } + mLastTime = time; + mPosition_world = joint->getWorldPosition(); + mVelocityJoint_local = velocity_joint_local; + + + /* + // Write out debugging info into a spreadsheet. + if (mFileWrite != NULL && is_self) + { + fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n", + position_new_local, + velocity_new_local, + acceleration_new_local, + + time_delta, + + mPosition_world[0], + mPosition_world[1], + mPosition_world[2], + + force_net, + force_spring, + force_accel, + force_damping, + force_drag, + + spring_length, + velocity_joint_local, + acceleration_joint_local + ); + } + */ + + return update_visuals; +} + +// Range of new_value_local is assumed to be [0 , 1] normalized. +void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, + F32 new_value_normalized, + F32 behavior_maxeffect) +{ + const F32 value_min_local = param->getMinWeight(); + const F32 value_max_local = param->getMaxWeight(); + const F32 min_val = 0.5f-behavior_maxeffect/2.0; + const F32 max_val = 0.5f+behavior_maxeffect/2.0; + + // Scale from [0,1] to [min_val,max_val] + const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; + + // Scale from [0,1] to [value_min_local,value_max_local] + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; + + mCharacter->setVisualParamWeight(param, + new_value_local, + FALSE); +} + +void LLPhysicsMotion::reset() +{ + LLDriverParam *driver_param = dynamic_cast(mParamDriver); + if (driver_param) + { + if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) && + (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT)) + { + mCharacter->setVisualParamWeight(driver_param,driver_param->getDefaultWeight()); + } + for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); + iter != driver_param->mDriven.end();++iter) + { + mCharacter->setVisualParamWeight((*iter).mParam,(*iter).mParam->getDefaultWeight()); + } + } +} diff --git a/indra/newview/llphysicsmotion.h b/indra/newview/llphysicsmotion.h new file mode 100644 index 000000000..7e6bddd17 --- /dev/null +++ b/indra/newview/llphysicsmotion.h @@ -0,0 +1,128 @@ +/** + * @file llphysicsmotion.h + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H +#define LL_LLPHYSICSMOTIONCONTROLLER_H + +//----------------------------------------------------------------------------- +// Header files +//----------------------------------------------------------------------------- +#include "llmotion.h" +#include "llframetimer.h" + +#define PHYSICS_MOTION_FADEIN_TIME 1.0f +#define PHYSICS_MOTION_FADEOUT_TIME 1.0f + +class LLPhysicsMotion; + +//----------------------------------------------------------------------------- +// class LLPhysicsMotion +//----------------------------------------------------------------------------- +class LLPhysicsMotionController : + public LLMotion +{ +public: + + std::string getString(); + + // Constructor + LLPhysicsMotionController(const LLUUID &id); + + // Destructor + virtual ~LLPhysicsMotionController(); + +public: + //------------------------------------------------------------------------- + // functions to support MotionController and MotionRegistry + //------------------------------------------------------------------------- + + // static constructor + // all subclasses must implement such a function and register it + static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); } + +public: + //------------------------------------------------------------------------- + // animation callbacks to be implemented by subclasses + //------------------------------------------------------------------------- + + // motions must specify whether or not they loop + virtual BOOL getLoop() { return TRUE; } + + // motions must report their total duration + virtual F32 getDuration() { return 0.0; } + + // motions must report their "ease in" duration + virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; } + + // motions must report their "ease out" duration. + virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; } + + // called to determine when a motion should be activated/deactivated based on avatar pixel coverage + virtual F32 getMinPixelArea(); + + // motions must report their priority + virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; } + + virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; } + + // run-time (post constructor) initialization, + // called after parameters have been set + // must return true to indicate success and be available for activation + virtual LLMotionInitStatus onInitialize(LLCharacter *character); + + // called when a motion is activated + // must return TRUE to indicate success, or else + // it will be deactivated + virtual BOOL onActivate(); + + // called per time step + // must return TRUE while it is active, and + // must return FALSE when the motion is completed. + virtual BOOL onUpdate(F32 time, U8* joint_mask); + + // called when a motion is deactivated + virtual void onDeactivate(); + + LLCharacter* getCharacter() { return mCharacter; } +protected: + void addMotion(LLPhysicsMotion *motion); +private: + LLCharacter* mCharacter; + + typedef std::vector motion_vec_t; + motion_vec_t mMotions; + + bool mIsDefault; +}; + +#endif // LL_LLPHYSICSMOTION_H + diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index dbe6079ed..a23c199c9 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -49,7 +49,16 @@ #define HEADER_ASCII "Linden Mesh 1.0" #define HEADER_BINARY "Linden Binary Mesh 1.0" -extern LLControlGroup gSavedSettings; // read only +extern LLControlGroup gSavedSettings; // read only + +LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data, + const std::string &name); +LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data, + const LLVector3 &direction, + const std::string &name); +LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, + F32 scale, + const std::string &name); //----------------------------------------------------------------------------- // Global table of loaded LLPolyMeshes @@ -606,8 +615,60 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) continue; } - mMorphData.insert(morph_data); - } + mMorphData.insert(morph_data); + + if (!strcmp(morphName, "Breast_Female_Cleavage")) + { + mMorphData.insert(clone_morph_param_cleavage(morph_data, + .75f, + "Breast_Physics_LeftRight_Driven")); + } + + if (!strcmp(morphName, "Breast_Female_Cleavage")) + { + mMorphData.insert(clone_morph_param_duplicate(morph_data, + "Breast_Physics_InOut_Driven")); + } + if (!strcmp(morphName, "Breast_Gravity")) + { + mMorphData.insert(clone_morph_param_duplicate(morph_data, + "Breast_Physics_UpDown_Driven")); + } + + if (!strcmp(morphName, "Big_Belly_Torso")) + { + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Torso_UpDown_Driven")); + } + + if (!strcmp(morphName, "Big_Belly_Legs")) + { + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Legs_UpDown_Driven")); + } + + if (!strcmp(morphName, "skirt_belly")) + { + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0,0.05f), + "Belly_Physics_Skirt_UpDown_Driven")); + } + + if (!strcmp(morphName, "Small_Butt")) + { + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0,0.05f), + "Butt_Physics_UpDown_Driven")); + } + if (!strcmp(morphName, "Small_Butt")) + { + mMorphData.insert(clone_morph_param_direction(morph_data, + LLVector3(0,0.03f,0), + "Butt_Physics_LeftRight_Driven")); + } + } S32 numRemaps; if (fread(&numRemaps, sizeof(S32), 1, fp) == 1) @@ -1156,4 +1217,55 @@ void LLPolySkeletalDistortion::apply( ESex avatar_sex ) mLastWeight = mCurWeight; } + +LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data, + const std::string &name) +{ + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); + cloned_morph_data->mName = name; + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) + { + cloned_morph_data->mCoords[v] = src_data->mCoords[v]; + cloned_morph_data->mNormals[v] = src_data->mNormals[v]; + cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]; + } + return cloned_morph_data; +} + +LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data, + const LLVector3 &direction, + const std::string &name) +{ + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); + cloned_morph_data->mName = name; + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) + { + cloned_morph_data->mCoords[v] = direction; + cloned_morph_data->mNormals[v] = LLVector3(0,0,0); + cloned_morph_data->mBinormals[v] = LLVector3(0,0,0); + } + return cloned_morph_data; +} + +LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, + F32 scale, + const std::string &name) +{ + LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); + cloned_morph_data->mName = name; + for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) + { + cloned_morph_data->mCoords[v] = src_data->mCoords[v]*scale; + cloned_morph_data->mNormals[v] = src_data->mNormals[v]*scale; + cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]*scale; + if (cloned_morph_data->mCoords[v][1] < 0) + { + cloned_morph_data->mCoords[v][1] *= -1; + cloned_morph_data->mNormals[v][1] *= -1; + cloned_morph_data->mBinormals[v][1] *= -1; + } + } + return cloned_morph_data; +} + // End diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp index 3a57b6f9f..72a332440 100644 --- a/indra/newview/llpolymorph.cpp +++ b/indra/newview/llpolymorph.cpp @@ -64,6 +64,36 @@ LLPolyMorphData::LLPolyMorphData(const std::string& morph_name) mMesh = NULL; } +LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) : + mName(rhs.mName), + mNumIndices(rhs.mNumIndices), + mTotalDistortion(rhs.mTotalDistortion), + mAvgDistortion(rhs.mAvgDistortion), + mMaxDistortion(rhs.mMaxDistortion), + mVertexIndices(NULL), + mCoords(NULL), + mNormals(NULL), + mBinormals(NULL), + mTexCoords(NULL) +{ + const S32 numVertices = mNumIndices; + + mCoords = new LLVector3[numVertices]; + mNormals = new LLVector3[numVertices]; + mBinormals = new LLVector3[numVertices]; + mTexCoords = new LLVector2[numVertices]; + mVertexIndices = new U32[numVertices]; + + for (S32 v=0; v < numVertices; v++) + { + mCoords[v] = rhs.mCoords[v]; + mNormals[v] = rhs.mNormals[v]; + mBinormals[v] = rhs.mBinormals[v]; + mTexCoords[v] = rhs.mTexCoords[v]; + mVertexIndices[v] = rhs.mVertexIndices[v]; + } +} + //----------------------------------------------------------------------------- // ~LLPolyMorphData() //----------------------------------------------------------------------------- @@ -292,10 +322,22 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info) } } - mMorphData = mMesh->getMorphData(getInfo()->mMorphName); + std::string morph_param_name = getInfo()->mMorphName; + + mMorphData = mMesh->getMorphData(morph_param_name); if (!mMorphData) { - llwarns << "No morph target named " << getInfo()->mMorphName << " found in mesh." << llendl; + const std::string driven_tag = "_Driven"; + U32 pos = morph_param_name.find(driven_tag); + if (pos > 0) + { + morph_param_name = morph_param_name.substr(0,pos); + mMorphData = mMesh->getMorphData(morph_param_name); + } + } + if (!mMorphData) + { + llwarns << "No morph target named " << morph_param_name << " found in mesh." << llendl; return FALSE; // Continue, ignoring this tag } return TRUE; @@ -445,6 +487,16 @@ void LLPolyMorphTarget::apply( ESex avatar_sex ) mLastSex = avatar_sex; + // Check for NaN condition (NaN is detected if a variable doesn't equal itself. + if (mCurWeight != mCurWeight) + { + mCurWeight = 0.0; + } + if (mLastWeight != mLastWeight) + { + mLastWeight = mCurWeight+.001; + } + // perform differential update of morph F32 delta_weight = ( getSex() & avatar_sex ) ? (mCurWeight - mLastWeight) : (getDefaultWeight() - mLastWeight); // store last weight diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h index f8dd52ca3..3fdaf3785 100644 --- a/indra/newview/llpolymorph.h +++ b/indra/newview/llpolymorph.h @@ -51,6 +51,7 @@ class LLPolyMorphData public: LLPolyMorphData(const std::string& morph_name); ~LLPolyMorphData(); + LLPolyMorphData(const LLPolyMorphData &rhs); BOOL loadBinary(LLFILE* fp, LLPolyMeshSharedData *mesh); const std::string& getName() { return mName; } diff --git a/indra/newview/llpreviewanim.h b/indra/newview/llpreviewanim.h index b1d26c0ee..115419fb6 100644 --- a/indra/newview/llpreviewanim.h +++ b/indra/newview/llpreviewanim.h @@ -46,29 +46,29 @@ public: static void playAnim( void* userdata ); static void auditionAnim( void* userdata ); - // - /* - static void copyAnim(void* userdata); - static void gotAssetForCopy(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status); - static void onSaveCopyComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status); - */ - static void gotAssetForSave(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status); - static void copyAnimID(void* userdata); + // + /* + static void copyAnim(void* userdata); + static void gotAssetForCopy(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status); + static void onSaveCopyComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status); + */ + static void gotAssetForSave(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status); + static void copyAnimID(void* userdata); // static void endAnimCallback( void *userdata ); protected: virtual void onClose(bool app_quitting); - // - virtual BOOL canSaveAs() const; - virtual void saveAs(); - virtual LLUUID getItemID(); + // + virtual BOOL canSaveAs() const; + virtual void saveAs(); + virtual LLUUID getItemID(); // virtual const char *getTitleName() const { return "Animation"; } diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index d26c7a64b..1c7a57abc 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -1789,4 +1789,4 @@ void LLPreviewGesture::onDonePreview(LLMultiGesture* gesture, void* data) self->mPreviewGesture = NULL; self->refresh(); -} \ No newline at end of file +} diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 3c22f15b5..7b6bab72e 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -1686,38 +1686,38 @@ void LLPreviewLSL::reshape(S32 width, S32 height, BOOL called_from_parent) gSavedSettings.setRect("PreviewScriptRect", getRect()); } } -// -// virtual -BOOL LLPreviewLSL::canSaveAs() const -{ - return TRUE; -} - -// virtual -void LLPreviewLSL::saveAs() -{ - std::string default_filename("untitled.lsl"); - const LLInventoryItem *item = getItem(); - if(item) - { - default_filename = LLDir::getScrubbedFileName(item->getName()); - } - - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_LSL, default_filename ) ) - { - // User canceled or we failed to acquire save file. - return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); - - std::string utf8text = mScriptEd->mEditor->getText(); - LLFILE* fp = LLFile::fopen(filename, "wb"); - fputs(utf8text.c_str(), fp); - fclose(fp); - fp = NULL; -} +// +// virtual +BOOL LLPreviewLSL::canSaveAs() const +{ + return TRUE; +} + +// virtual +void LLPreviewLSL::saveAs() +{ + std::string default_filename("untitled.lsl"); + const LLInventoryItem *item = getItem(); + if(item) + { + default_filename = LLDir::getScrubbedFileName(item->getName()); + } + + LLFilePicker& file_picker = LLFilePicker::instance(); + if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_LSL, default_filename ) ) + { + // User canceled or we failed to acquire save file. + return; + } + // remember the user-approved/edited file name. + std::string filename = file_picker.getFirstFile(); + + std::string utf8text = mScriptEd->mEditor->getText(); + LLFILE* fp = LLFile::fopen(filename, "wb"); + fputs(utf8text.c_str(), fp); + fclose(fp); + fp = NULL; +} // /// --------------------------------------------------------------------------- /// LLLiveLSLEditor @@ -1962,7 +1962,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new) DEFAULT_SCRIPT_NAME, DEFAULT_SCRIPT_DESC, LLSaleInfo::DEFAULT, - LLInventoryItem::II_FLAGS_NONE, + LLInventoryItemFlags::II_FLAGS_NONE, time_corrected()); mAssetStatus = PREVIEW_ASSET_LOADED; } @@ -2637,36 +2637,36 @@ BOOL LLLiveLSLEditor::monoChecked() const return FALSE; } -// -// virtual -BOOL LLLiveLSLEditor::canSaveAs() const -{ - return TRUE; -} - -// virtual -void LLLiveLSLEditor::saveAs() -{ - std::string default_filename("untitled.lsl"); - const LLInventoryItem *item = getItem(); - if(item) - { - default_filename = LLDir::getScrubbedFileName(item->getName()); - } - - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_LSL, default_filename ) ) - { - // User canceled or we failed to acquire save file. - return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); - - std::string utf8text = mScriptEd->mEditor->getText(); - LLFILE* fp = LLFile::fopen(filename, "wb"); - fputs(utf8text.c_str(), fp); - fclose(fp); - fp = NULL; -} -// \ No newline at end of file +// +// virtual +BOOL LLLiveLSLEditor::canSaveAs() const +{ + return TRUE; +} + +// virtual +void LLLiveLSLEditor::saveAs() +{ + std::string default_filename("untitled.lsl"); + const LLInventoryItem *item = getItem(); + if(item) + { + default_filename = LLDir::getScrubbedFileName(item->getName()); + } + + LLFilePicker& file_picker = LLFilePicker::instance(); + if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_LSL, default_filename ) ) + { + // User canceled or we failed to acquire save file. + return; + } + // remember the user-approved/edited file name. + std::string filename = file_picker.getFirstFile(); + + std::string utf8text = mScriptEd->mEditor->getText(); + LLFILE* fp = LLFile::fopen(filename, "wb"); + fputs(utf8text.c_str(), fp); + fclose(fp); + fp = NULL; +} +// diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 11a9356bf..58959e445 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -186,9 +186,9 @@ protected: void uploadAssetLegacy(const std::string& filename, const LLUUID& item_id, const LLTransactionID& tid); - // - virtual BOOL canSaveAs() const; - virtual void saveAs(); + // + virtual BOOL canSaveAs() const; + virtual void saveAs(); // static void onSearchReplace(void* userdata); @@ -258,9 +258,9 @@ protected: LLViewerObject* object, const LLTransactionID& tid, BOOL is_running); - // - virtual BOOL canSaveAs() const; - virtual void saveAs(); + // + virtual BOOL canSaveAs() const; + virtual void saveAs(); // static void onSearchReplace(void* userdata); diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index ef5400753..e40dddbd2 100644 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -43,14 +43,14 @@ #include "llviewercontrol.h" #include "llviewermessage.h" // send_guid_sound_trigger #include "lluictrlfactory.h" -// -#include "llvoavatar.h" -#include "llchat.h" -#include "llfloaterchat.h" -#include "llviewerwindow.h" // for alert -#include "llfilepicker.h" -// for ambient play: -#include "llviewerregion.h" +// +#include "llvoavatar.h" +#include "llchat.h" +#include "llfloaterchat.h" +#include "llviewerwindow.h" // for alert +#include "llfilepicker.h" +// for ambient play: +#include "llviewerregion.h" // extern LLAudioEngine* gAudiop; @@ -66,9 +66,9 @@ LLPreviewSound::LLPreviewSound(const std::string& name, const LLRect& rect, cons childSetAction("Sound play btn",&LLPreviewSound::playSound,this); childSetAction("Sound audition btn",&LLPreviewSound::auditionSound,this); - // - childSetAction("Sound copy uuid btn", &LLPreviewSound::copyUUID, this); - childSetAction("Play ambient btn", &LLPreviewSound::playAmbient, this); + // + childSetAction("Sound copy uuid btn", &LLPreviewSound::copyUUID, this); + childSetAction("Play ambient btn", &LLPreviewSound::playAmbient, this); // LLButton* button = getChild("Sound play btn"); @@ -87,12 +87,12 @@ LLPreviewSound::LLPreviewSound(const std::string& name, const LLRect& rect, cons if(item && gAudiop) { gAudiop->preloadSound(item->getAssetUUID()); - // - // that thing above doesn't actually start a sound transfer, so I will do it - //LLAudioSource *asp = new LLAudioSource(gAgent.getID(), gAgent.getID(), F32(1.0f), LLAudioEngine::AUDIO_TYPE_UI); - LLAudioSource *asp = gAgent.getAvatarObject()->getAudioSource(gAgent.getID()); - LLAudioData *datap = gAudiop->getAudioData(item->getAssetUUID()); - asp->addAudioData(datap, FALSE); + // + // that thing above doesn't actually start a sound transfer, so I will do it + //LLAudioSource *asp = new LLAudioSource(gAgent.getID(), gAgent.getID(), F32(1.0f), LLAudioEngine::AUDIO_TYPE_UI); + LLAudioSource *asp = gAgent.getAvatarObject()->getAudioSource(gAgent.getID()); + LLAudioData *datap = gAudiop->getAudioData(item->getAssetUUID()); + asp->addAudioData(datap, FALSE); // } @@ -130,228 +130,228 @@ void LLPreviewSound::auditionSound( void *userdata ) gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global); } } - -// -void LLPreviewSound::playAmbient( void* userdata ) -{ - LLPreviewSound* self = (LLPreviewSound*) userdata; - const LLInventoryItem *item = self->getItem(); - - if(item && gAudiop) - { - int gain = 0.01f; - for(int i = 0; i < 2; i++) - { - gMessageSystem->newMessageFast(_PREHASH_SoundTrigger); - gMessageSystem->nextBlockFast(_PREHASH_SoundData); - gMessageSystem->addUUIDFast(_PREHASH_SoundID, LLUUID(item->getAssetUUID())); - gMessageSystem->addUUIDFast(_PREHASH_OwnerID, LLUUID::null); - gMessageSystem->addUUIDFast(_PREHASH_ObjectID, LLUUID::null); - gMessageSystem->addUUIDFast(_PREHASH_ParentID, LLUUID::null); - gMessageSystem->addU64Fast(_PREHASH_Handle, gAgent.getRegion()->getHandle()); - LLVector3d pos = -from_region_handle(gAgent.getRegion()->getHandle()); - gMessageSystem->addVector3Fast(_PREHASH_Position, (LLVector3)pos); - gMessageSystem->addF32Fast(_PREHASH_Gain, gain); - - gMessageSystem->sendReliable(gAgent.getRegionHost()); - - gain = 1.0f; - } - } -} -// -/* -struct LLSaveInfo -{ - LLSaveInfo(const LLUUID& item_id, const LLUUID& object_id, const std::string& desc, - const LLTransactionID tid) - : mItemUUID(item_id), mObjectUUID(object_id), mDesc(desc), mTransactionID(tid) - { - } - - LLUUID mItemUUID; - LLUUID mObjectUUID; - std::string mDesc; - LLTransactionID mTransactionID; -}; - -// static -void LLPreviewSound::makeCopy( void *userdata ) -{ - LLPreviewSound* self = (LLPreviewSound*) userdata; - const LLInventoryItem *item = self->getItem(); - - if(item && gAudiop) - { - // Find out if asset data is ready - // I might be able to get rid of this - if(!gAssetStorage->hasLocalAsset(item->getAssetUUID(), LLAssetType::AT_SOUND)) - { - LLChat chat("Sound isn't downloaded yet, please try again in a moment."); - LLFloaterChat::addChat(chat); - return; - } - - gAssetStorage->getAssetData(item->getAssetUUID(), LLAssetType::AT_SOUND, LLPreviewSound::gotAssetForCopy, self, TRUE); - } -} - -// static -void LLPreviewSound::gotAssetForCopy(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status) -{ - LLPreviewSound* self = (LLPreviewSound*) user_data; - //const LLInventoryItem *item = self->getItem(); - - LLVFile file(vfs, asset_uuid, type, LLVFile::READ); - S32 size = file.getSize(); - - char* buffer = new char[size]; - if (buffer == NULL) - { - llerrs << "Memory Allocation Failed" << llendl; - return; - } - - file.read((U8*)buffer, size); - - // Write it back out... - - LLTransactionID tid; - LLAssetID asset_id; - tid.generate(); - asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - LLVFile ofile(gVFS, asset_id, LLAssetType::AT_SOUND, LLVFile::APPEND); - - ofile.setMaxSize(size); - ofile.write((U8*)buffer, size); - - // Upload that asset to the database - LLSaveInfo* info = new LLSaveInfo(self->mItemUUID, self->mObjectUUID, "sound", tid); - gAssetStorage->storeAssetData(tid, LLAssetType::AT_SOUND, onSaveCopyComplete, info, FALSE); -} - -// static -void LLPreviewSound::onSaveCopyComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status) -{ - LLSaveInfo* info = (LLSaveInfo*)user_data; - - if (status == 0) - { - std::string item_name = "New Sound"; - std::string item_desc = ""; - // Saving into user inventory - LLViewerInventoryItem* item; - item = (LLViewerInventoryItem*)gInventory.getItem(info->mItemUUID); - if(item) - { - item_name = item->getName(); - item_desc = item->getDescription(); - } - gMessageSystem->newMessageFast(_PREHASH_CreateInventoryItem); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_InventoryBlock); - gMessageSystem->addU32Fast(_PREHASH_CallbackID, 0); - gMessageSystem->addUUIDFast(_PREHASH_FolderID, LLUUID::null); - gMessageSystem->addUUIDFast(_PREHASH_TransactionID, info->mTransactionID); - gMessageSystem->addU32Fast(_PREHASH_NextOwnerMask, 2147483647); - gMessageSystem->addS8Fast(_PREHASH_Type, 1); - gMessageSystem->addS8Fast(_PREHASH_InvType, 1); - gMessageSystem->addU8Fast(_PREHASH_WearableType, 0); - gMessageSystem->addStringFast(_PREHASH_Name, item_name); - gMessageSystem->addStringFast(_PREHASH_Description, item_desc); - gMessageSystem->sendReliable(gAgent.getRegionHost()); - } - else - { - llwarns << "Problem saving sound: " << status << llendl; - LLStringUtil::format_map_t args; - args["[REASON]"] = std::string(LLAssetStorage::getErrorString(status)); - gViewerWindow->alertXml("CannotUploadReason",args); - } -} -*/ -// static -void LLPreviewSound::copyUUID( void *userdata ) -{ - LLPreviewSound* self = (LLPreviewSound*) userdata; - const LLInventoryItem *item = self->getItem(); - - if(item ) - { - gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(item->getAssetUUID().asString())); - } -} -// - -// -// virtual -BOOL LLPreviewSound::canSaveAs() const -{ - return TRUE; -} - -// virtual -void LLPreviewSound::saveAs() -{ - const LLInventoryItem *item = getItem(); - - if(item) - { - gAssetStorage->getAssetData(item->getAssetUUID(), LLAssetType::AT_SOUND, LLPreviewSound::gotAssetForSave, this, TRUE); - } -} - -// static -void LLPreviewSound::gotAssetForSave(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status) -{ - LLPreviewSound* self = (LLPreviewSound*) user_data; - //const LLInventoryItem *item = self->getItem(); - - LLVFile file(vfs, asset_uuid, type, LLVFile::READ); - S32 size = file.getSize(); - - char* buffer = new char[size]; - if (buffer == NULL) - { - llerrs << "Memory Allocation Failed" << llendl; - return; - } - - file.read((U8*)buffer, size); - - // Write it back out... - - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_OGG, LLDir::getScrubbedFileName(self->getItem()->getName())) ) - { - // User canceled or we failed to acquire save file. - return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); - - std::ofstream export_file(filename.c_str(), std::ofstream::binary); - export_file.write(buffer, size); - export_file.close(); -} - -// virtual -LLUUID LLPreviewSound::getItemID() -{ - const LLViewerInventoryItem* item = getItem(); - if(item) - { - return item->getUUID(); - } - return LLUUID::null; -} -// + +// +void LLPreviewSound::playAmbient( void* userdata ) +{ + LLPreviewSound* self = (LLPreviewSound*) userdata; + const LLInventoryItem *item = self->getItem(); + + if(item && gAudiop) + { + int gain = 0.01f; + for(int i = 0; i < 2; i++) + { + gMessageSystem->newMessageFast(_PREHASH_SoundTrigger); + gMessageSystem->nextBlockFast(_PREHASH_SoundData); + gMessageSystem->addUUIDFast(_PREHASH_SoundID, LLUUID(item->getAssetUUID())); + gMessageSystem->addUUIDFast(_PREHASH_OwnerID, LLUUID::null); + gMessageSystem->addUUIDFast(_PREHASH_ObjectID, LLUUID::null); + gMessageSystem->addUUIDFast(_PREHASH_ParentID, LLUUID::null); + gMessageSystem->addU64Fast(_PREHASH_Handle, gAgent.getRegion()->getHandle()); + LLVector3d pos = -from_region_handle(gAgent.getRegion()->getHandle()); + gMessageSystem->addVector3Fast(_PREHASH_Position, (LLVector3)pos); + gMessageSystem->addF32Fast(_PREHASH_Gain, gain); + + gMessageSystem->sendReliable(gAgent.getRegionHost()); + + gain = 1.0f; + } + } +} +// +/* +struct LLSaveInfo +{ + LLSaveInfo(const LLUUID& item_id, const LLUUID& object_id, const std::string& desc, + const LLTransactionID tid) + : mItemUUID(item_id), mObjectUUID(object_id), mDesc(desc), mTransactionID(tid) + { + } + + LLUUID mItemUUID; + LLUUID mObjectUUID; + std::string mDesc; + LLTransactionID mTransactionID; +}; + +// static +void LLPreviewSound::makeCopy( void *userdata ) +{ + LLPreviewSound* self = (LLPreviewSound*) userdata; + const LLInventoryItem *item = self->getItem(); + + if(item && gAudiop) + { + // Find out if asset data is ready + // I might be able to get rid of this + if(!gAssetStorage->hasLocalAsset(item->getAssetUUID(), LLAssetType::AT_SOUND)) + { + LLChat chat("Sound isn't downloaded yet, please try again in a moment."); + LLFloaterChat::addChat(chat); + return; + } + + gAssetStorage->getAssetData(item->getAssetUUID(), LLAssetType::AT_SOUND, LLPreviewSound::gotAssetForCopy, self, TRUE); + } +} + +// static +void LLPreviewSound::gotAssetForCopy(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status) +{ + LLPreviewSound* self = (LLPreviewSound*) user_data; + //const LLInventoryItem *item = self->getItem(); + + LLVFile file(vfs, asset_uuid, type, LLVFile::READ); + S32 size = file.getSize(); + + char* buffer = new char[size]; + if (buffer == NULL) + { + llerrs << "Memory Allocation Failed" << llendl; + return; + } + + file.read((U8*)buffer, size); + + // Write it back out... + + LLTransactionID tid; + LLAssetID asset_id; + tid.generate(); + asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + + LLVFile ofile(gVFS, asset_id, LLAssetType::AT_SOUND, LLVFile::APPEND); + + ofile.setMaxSize(size); + ofile.write((U8*)buffer, size); + + // Upload that asset to the database + LLSaveInfo* info = new LLSaveInfo(self->mItemUUID, self->mObjectUUID, "sound", tid); + gAssetStorage->storeAssetData(tid, LLAssetType::AT_SOUND, onSaveCopyComplete, info, FALSE); +} + +// static +void LLPreviewSound::onSaveCopyComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status) +{ + LLSaveInfo* info = (LLSaveInfo*)user_data; + + if (status == 0) + { + std::string item_name = "New Sound"; + std::string item_desc = ""; + // Saving into user inventory + LLViewerInventoryItem* item; + item = (LLViewerInventoryItem*)gInventory.getItem(info->mItemUUID); + if(item) + { + item_name = item->getName(); + item_desc = item->getDescription(); + } + gMessageSystem->newMessageFast(_PREHASH_CreateInventoryItem); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_InventoryBlock); + gMessageSystem->addU32Fast(_PREHASH_CallbackID, 0); + gMessageSystem->addUUIDFast(_PREHASH_FolderID, LLUUID::null); + gMessageSystem->addUUIDFast(_PREHASH_TransactionID, info->mTransactionID); + gMessageSystem->addU32Fast(_PREHASH_NextOwnerMask, 2147483647); + gMessageSystem->addS8Fast(_PREHASH_Type, 1); + gMessageSystem->addS8Fast(_PREHASH_InvType, 1); + gMessageSystem->addU8Fast(_PREHASH_WearableType, 0); + gMessageSystem->addStringFast(_PREHASH_Name, item_name); + gMessageSystem->addStringFast(_PREHASH_Description, item_desc); + gMessageSystem->sendReliable(gAgent.getRegionHost()); + } + else + { + llwarns << "Problem saving sound: " << status << llendl; + LLStringUtil::format_map_t args; + args["[REASON]"] = std::string(LLAssetStorage::getErrorString(status)); + gViewerWindow->alertXml("CannotUploadReason",args); + } +} +*/ +// static +void LLPreviewSound::copyUUID( void *userdata ) +{ + LLPreviewSound* self = (LLPreviewSound*) userdata; + const LLInventoryItem *item = self->getItem(); + + if(item ) + { + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(item->getAssetUUID().asString())); + } +} +// + +// +// virtual +BOOL LLPreviewSound::canSaveAs() const +{ + return TRUE; +} + +// virtual +void LLPreviewSound::saveAs() +{ + const LLInventoryItem *item = getItem(); + + if(item) + { + gAssetStorage->getAssetData(item->getAssetUUID(), LLAssetType::AT_SOUND, LLPreviewSound::gotAssetForSave, this, TRUE); + } +} + +// static +void LLPreviewSound::gotAssetForSave(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status) +{ + LLPreviewSound* self = (LLPreviewSound*) user_data; + //const LLInventoryItem *item = self->getItem(); + + LLVFile file(vfs, asset_uuid, type, LLVFile::READ); + S32 size = file.getSize(); + + char* buffer = new char[size]; + if (buffer == NULL) + { + llerrs << "Memory Allocation Failed" << llendl; + return; + } + + file.read((U8*)buffer, size); + + // Write it back out... + + LLFilePicker& file_picker = LLFilePicker::instance(); + if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_OGG, LLDir::getScrubbedFileName(self->getItem()->getName())) ) + { + // User canceled or we failed to acquire save file. + return; + } + // remember the user-approved/edited file name. + std::string filename = file_picker.getFirstFile(); + + std::ofstream export_file(filename.c_str(), std::ofstream::binary); + export_file.write(buffer, size); + export_file.close(); +} + +// virtual +LLUUID LLPreviewSound::getItemID() +{ + const LLViewerInventoryItem* item = getItem(); + if(item) + { + return item->getUUID(); + } + return LLUUID::null; +} +// diff --git a/indra/newview/llpreviewsound.h b/indra/newview/llpreviewsound.h index b137a1a9d..535b233c9 100644 --- a/indra/newview/llpreviewsound.h +++ b/indra/newview/llpreviewsound.h @@ -44,29 +44,29 @@ public: static void playSound( void* userdata ); static void auditionSound( void* userdata ); - // - /* - static void makeCopy(void* userdata); - static void gotAssetForCopy(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status); - static void onSaveCopyComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status); - */ - static void playAmbient(void* userdata); - static void copyUUID(void* userdata); - static void gotAssetForSave(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status); + // + /* + static void makeCopy(void* userdata); + static void gotAssetForCopy(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status); + static void onSaveCopyComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status); + */ + static void playAmbient(void* userdata); + static void copyUUID(void* userdata); + static void gotAssetForSave(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status); // protected: virtual const char *getTitleName() const { return "Sound"; } - // - virtual BOOL canSaveAs() const; - virtual void saveAs(); - virtual LLUUID getItemID(); + // + virtual BOOL canSaveAs() const; + virtual void saveAs(); + virtual LLUUID getItemID(); // }; diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index b2db762e8..8eb803401 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -45,8 +45,7 @@ #include "lltextbox.h" #include "lltextureview.h" #include "llui.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "lluictrlfactory.h" #include "llviewerwindow.h" #include "lllineeditor.h" @@ -74,11 +73,13 @@ LLPreviewTexture::LLPreviewTexture(const std::string& name, mLoadingFullImage( FALSE ), mShowKeepDiscard(show_keep_discard), mCopyToInv(FALSE), - mIsCopyable(FALSE), + mIsCopyable(FALSE), + mUpdateDimensions(TRUE), mLastHeight(0), mLastWidth(0), mAspectRatio(0.f), - mCreatorKey(LLUUID()) + mImage(NULL), + mImageOldBoostLevel(LLViewerTexture::BOOST_NONE) { const LLInventoryItem *item = getItem(); if(item) @@ -155,15 +156,13 @@ LLPreviewTexture::LLPreviewTexture( LLPreviewTexture::~LLPreviewTexture() { + LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList) ; + if( mLoadingFullImage ) { getWindow()->decBusyCount(); } - - if(mImage.notNull()) - { - mImage->destroySavedRawImage() ; - } + mImage->setBoostLevel(mImageOldBoostLevel); mImage = NULL; sInstance = NULL; } @@ -252,8 +251,11 @@ void LLPreviewTexture::callbackLoadAvatarName(const LLUUID& id, const std::strin void LLPreviewTexture::draw() { - updateDimensions(); - + if (mUpdateDimensions) + { + updateDimensions(); + } + LLPreview::draw(); if (!isMinimized()) @@ -324,7 +326,7 @@ void LLPreviewTexture::draw() LLColor4::white, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::DROP_SHADOW); - F32 data_progress = mImage->mDownloadProgress; + F32 data_progress = mImage->getDownloadProgress(); // Draw the progress bar. const S32 BAR_HEIGHT = 12; @@ -375,7 +377,8 @@ BOOL LLPreviewTexture::canSaveAs() const // virtual void LLPreviewTexture::saveAs() { - if( mLoadingFullImage ) return; + if( mLoadingFullImage ) + return; LLFilePicker& file_picker = LLFilePicker::instance(); const LLViewerInventoryItem* item = getItem() ; @@ -388,14 +391,15 @@ void LLPreviewTexture::saveAs() mSaveFileName = file_picker.getFirstFile(); mLoadingFullImage = TRUE; getWindow()->incBusyCount(); + mImage->forceToSaveRawImage(0) ;//re-fetch the raw image if the old one is removed. mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave, - 0, TRUE, FALSE, new LLUUID( mItemUUID ) ); + 0, TRUE, FALSE, new LLUUID( mItemUUID ), &mCallbackTextureList ); } // static void LLPreviewTexture::onFileLoadedForSave(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, @@ -522,8 +526,8 @@ void LLPreviewTexture::updateDimensions() S32 view_height = client_height + vert_pad; // set text on dimensions display (should be moved out of here and into a callback of some sort) - childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->mFullWidth)); - childSetTextArg("dimensions", "[HEIGHT]", llformat("%d", mImage->mFullHeight)); + childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->getFullWidth())); + childSetTextArg("dimensions", "[HEIGHT]", llformat("%d", mImage->getFullHeight())); // add space for dimensions and aspect ratio S32 info_height = 0; @@ -626,6 +630,8 @@ void LLPreviewTexture::updateDimensions() // Return true if everything went fine, false if we somewhat modified the ratio as we bumped on border values bool LLPreviewTexture::setAspectRatio(const F32 width, const F32 height) { + mUpdateDimensions = TRUE; + // We don't allow negative width or height. Also, if height is positive but too small, we reset to default // A default 0.f value for mAspectRatio means "unconstrained" in the rest of the code if ((width <= 0.f) || (height <= F_APPROXIMATELY_ZERO)) @@ -633,9 +639,11 @@ bool LLPreviewTexture::setAspectRatio(const F32 width, const F32 height) mAspectRatio = 0.f; return false; } + // Compute and store the ratio F32 ratio = width / height; mAspectRatio = llclamp(ratio, PREVIEW_TEXTURE_MIN_ASPECT, PREVIEW_TEXTURE_MAX_ASPECT); + // Return false if we clamped the value, true otherwise return (ratio == mAspectRatio); } @@ -672,15 +680,18 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata) void LLPreviewTexture::loadAsset() { - mImage = gImageList.getImage(mImageID, MIPMAP_TRUE, FALSE); - mImage->setBoostLevel(LLViewerImageBoostLevel::BOOST_PREVIEW); + mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mImageOldBoostLevel = mImage->getBoostLevel(); + mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); mImage->forceToSaveRawImage(0) ; mAssetStatus = PREVIEW_ASSET_LOADING; + mUpdateDimensions = TRUE; + updateDimensions(); } LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus() { - if (mImage.notNull() && (mImage->mFullWidth * mImage->mFullHeight > 0)) + if (mImage.notNull() && (mImage->getFullWidth() * mImage->getFullHeight() > 0)) { mAssetStatus = PREVIEW_ASSET_LOADED; } diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index f82fdabd1..fb75876fc 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -36,7 +36,7 @@ #include "llpreview.h" #include "llbutton.h" #include "llframetimer.h" -#include "llviewerimage.h" +#include "llviewertexture.h" class LLComboBox; class LLImageRaw; @@ -73,7 +73,7 @@ public: static void saveToFile(void* userdata); static void onFileLoadedForSave( BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, @@ -90,12 +90,14 @@ protected: virtual const char *getTitleName() const { return "Texture"; } private: + void updateImageID(); // set what image is being uploaded. void updateDimensions(); - LLUUID mImageID; - LLPointer mImage; - BOOL mLoadingFullImage; + LLUUID mImageID; + LLPointer mImage; + S32 mImageOldBoostLevel; std::string mSaveFileName; LLFrameTimer mSavedFileTimer; + BOOL mLoadingFullImage; BOOL mShowKeepDiscard; BOOL mCopyToInv; @@ -106,12 +108,12 @@ private: // This is stored off in a member variable, because the save-as // button and drag and drop functionality need to know. BOOL mIsCopyable; - + BOOL mUpdateDimensions; S32 mLastHeight; S32 mLastWidth; F32 mAspectRatio; // 0 = Unconstrained S32 mAlphaMaskResult; + + LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ; }; - - #endif // LL_LLPREVIEWTEXTURE_H diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index bfd14f709..18235ff66 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -50,7 +50,7 @@ #include "llprogressbar.h" #include "llstartup.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerwindow.h" #include "llappviewer.h" #include "llweb.h" @@ -146,10 +146,10 @@ void LLProgressView::draw() // Paint bitmap if we've got one glPushMatrix(); - if (gStartImageGL) + if (gStartTexture) { LLGLSUIDefault gls_ui; - gGL.getTexUnit(0)->bind(gStartImageGL); + gGL.getTexUnit(0)->bind(gStartTexture); gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f); F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; S32 width = getRect().getWidth(); @@ -185,7 +185,7 @@ void LLProgressView::draw() { gFocusMgr.removeTopCtrlWithoutCallback(this); LLPanel::setVisible(FALSE); - gStartImageGL = NULL; + gStartTexture = NULL; } return; } diff --git a/indra/newview/llsavedsettingsglue.cpp b/indra/newview/llsavedsettingsglue.cpp index 0e58b5f89..72879837f 100644 --- a/indra/newview/llsavedsettingsglue.cpp +++ b/indra/newview/llsavedsettingsglue.cpp @@ -182,4 +182,4 @@ void LLSavedSettingsGlue::setColor4(const std::string &name, LLColor4 value) gSavedSettings.setColor4(name, value); else gSavedPerAccountSettings.setColor4(name, value); -}*/ \ No newline at end of file +}*/ diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 0478df637..bbfd90177 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1,6582 +1,6582 @@ -/** - * @file llselectmgr.cpp - * @brief A manager for selected objects and faces. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -// file include -#include "llselectmgr.h" - -// library includes -#include "llcachename.h" -#include "lldbstrings.h" -#include "lleconomy.h" -#include "llgl.h" -#include "llrender.h" -#include "llpermissions.h" -#include "llpermissionsflags.h" -#include "llundo.h" -#include "lluuid.h" -#include "llvolume.h" -#include "message.h" -#include "object_flags.h" -#include "llquaternion.h" - -// viewer includes -#include "llagent.h" -#include "llviewerwindow.h" -#include "lldrawable.h" -#include "llfloaterinspect.h" -#include "llfloaterproperties.h" -#include "llfloaterreporter.h" -#include "llfloatertools.h" -#include "llframetimer.h" -#include "llfocusmgr.h" -#include "llhudeffecttrail.h" -#include "llhudmanager.h" -#include "llinventorymodel.h" -#include "llmenugl.h" -#include "llmutelist.h" -#include "llstatusbar.h" -#include "llsurface.h" -#include "lltool.h" -#include "lltooldraganddrop.h" -#include "lltoolmgr.h" -#include "lltoolpie.h" -#include "llui.h" -#include "llviewercamera.h" -#include "llviewercontrol.h" -#include "llviewerimagelist.h" -#include "llviewermedia.h" -#include "llviewermediafocus.h" -#include "llviewermenu.h" -#include "llviewerobject.h" -#include "llviewerobjectlist.h" -#include "llviewerregion.h" -#include "llviewerstats.h" -#include "llvoavatar.h" -#include "llvovolume.h" -#include "pipeline.h" - -#include "llglheaders.h" -#include "hippogridmanager.h" - -// [RLVa:KB] -#include "rlvhandler.h" -// [/RLVa:KB] - -#include "llglheaders.h" - -LLViewerObject* getSelectedParentObject(LLViewerObject *object) ; -// -// Consts -// - -const S32 NUM_SELECTION_UNDO_ENTRIES = 200; -const F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f; -const S32 OWNERSHIP_COST_PER_OBJECT = 10; // Must be the same as economy_constants.price_object_claim in the database. -const S32 MAX_ACTION_QUEUE_SIZE = 20; -const S32 MAX_SILS_PER_FRAME = 50; -const S32 MAX_OBJECTS_PER_PACKET = 254; -const S32 TE_SELECT_MASK_ALL = 0xFFFFFFFF; - -// -// Globals -// - -BOOL gDebugSelectMgr = FALSE; - -BOOL gHideSelectedObjects = FALSE; -BOOL gAllowSelectAvatar = FALSE; - -BOOL LLSelectMgr::sRectSelectInclusive = TRUE; -BOOL LLSelectMgr::sRenderSelectionHighlights = TRUE; -BOOL LLSelectMgr::sRenderHiddenSelections = TRUE; -BOOL LLSelectMgr::sRenderLightRadius = FALSE; -F32 LLSelectMgr::sHighlightThickness = 0.f; -F32 LLSelectMgr::sHighlightUScale = 0.f; -F32 LLSelectMgr::sHighlightVScale = 0.f; -F32 LLSelectMgr::sHighlightAlpha = 0.f; -F32 LLSelectMgr::sHighlightAlphaTest = 0.f; -F32 LLSelectMgr::sHighlightUAnim = 0.f; -F32 LLSelectMgr::sHighlightVAnim = 0.f; -LLColor4 LLSelectMgr::sSilhouetteParentColor; -LLColor4 LLSelectMgr::sSilhouetteChildColor; -LLColor4 LLSelectMgr::sHighlightInspectColor; -LLColor4 LLSelectMgr::sHighlightParentColor; -LLColor4 LLSelectMgr::sHighlightChildColor; -LLColor4 LLSelectMgr::sContextSilhouetteColor; -std::set LLSelectMgr::sObjectPropertiesFamilyRequests; - -static LLObjectSelection *get_null_object_selection(); -template<> - const LLSafeHandle::NullFunc - LLSafeHandle::sNullFunc = get_null_object_selection; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// struct LLDeRezInfo -// -// Used to keep track of important derez info. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -struct LLDeRezInfo -{ - EDeRezDestination mDestination; - LLUUID mDestinationID; - LLDeRezInfo(EDeRezDestination dest, const LLUUID& dest_id) : - mDestination(dest), mDestinationID(dest_id) {} -}; - -// -// Imports -// - - -static LLPointer sNullSelection; - -// -// Functions -// - -void LLSelectMgr::cleanupGlobals() -{ - sNullSelection = NULL; - LLSelectMgr::getInstance()->clearSelections(); -} - -LLObjectSelection *get_null_object_selection() -{ - if (sNullSelection.isNull()) - { - sNullSelection = new LLObjectSelection; - } - return sNullSelection; -} - - -//----------------------------------------------------------------------------- -// LLSelectMgr() -//----------------------------------------------------------------------------- -LLSelectMgr::LLSelectMgr() -{ - mTEMode = FALSE; - mLastCameraPos.clearVec(); - - sHighlightThickness = gSavedSettings.getF32("SelectionHighlightThickness"); - sHighlightUScale = gSavedSettings.getF32("SelectionHighlightUScale"); - sHighlightVScale = gSavedSettings.getF32("SelectionHighlightVScale"); - sHighlightAlpha = gSavedSettings.getF32("SelectionHighlightAlpha"); - sHighlightAlphaTest = gSavedSettings.getF32("SelectionHighlightAlphaTest"); - sHighlightUAnim = gSavedSettings.getF32("SelectionHighlightUAnim"); - sHighlightVAnim = gSavedSettings.getF32("SelectionHighlightVAnim"); - - sSilhouetteParentColor = gColors.getColor("SilhouetteParentColor"); - sSilhouetteChildColor = gColors.getColor("SilhouetteChildColor"); - sHighlightParentColor = gColors.getColor("HighlightParentColor"); - sHighlightChildColor = gColors.getColor("HighlightChildColor"); - sHighlightInspectColor = gColors.getColor("HighlightInspectColor"); - sContextSilhouetteColor = gColors.getColor("ContextSilhouetteColor")*0.5f; - - sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius"); - - mRenderSilhouettes = TRUE; - - mGridMode = GRID_MODE_WORLD; - gSavedSettings.setS32("GridMode", (S32)GRID_MODE_WORLD); - mGridValid = FALSE; - - mSelectedObjects = new LLObjectSelection(); - mHoverObjects = new LLObjectSelection(); - mHighlightedObjects = new LLObjectSelection(); - - mForceSelection = FALSE; - mShowSelection = FALSE; -} - - -//----------------------------------------------------------------------------- -// ~LLSelectMgr() -//----------------------------------------------------------------------------- -LLSelectMgr::~LLSelectMgr() -{ - clearSelections(); -} - -void LLSelectMgr::clearSelections() -{ - mHoverObjects->deleteAllNodes(); - mSelectedObjects->deleteAllNodes(); - mHighlightedObjects->deleteAllNodes(); - mRectSelectedObjects.clear(); - mGridObjects.deleteAllNodes(); -} - -void LLSelectMgr::update() -{ - mSelectedObjects->cleanupNodes(); -} - -void LLSelectMgr::updateEffects() -{ - //keep reference grid objects active - struct f : public LLSelectedObjectFunctor - { - virtual bool apply(LLViewerObject* object) - { - LLDrawable* drawable = object->mDrawable; - if (drawable) - { - gPipeline.markMoved(drawable); - } - return true; - } - } func; - mGridObjects.applyToObjects(&func); - - if (mEffectsTimer.getElapsedTimeF32() > 1.f) - { - mSelectedObjects->updateEffects(); - mEffectsTimer.reset(); - } -} - -void LLSelectMgr::overrideObjectUpdates() -{ - //override any position updates from simulator on objects being edited - struct f : public LLSelectedNodeFunctor - { - virtual bool apply(LLSelectNode* selectNode) - { - LLViewerObject* object = selectNode->getObject(); - if (object && object->permMove()) - { - if (!selectNode->mLastPositionLocal.isExactlyZero()) - { - object->setPosition(selectNode->mLastPositionLocal); - } - if (selectNode->mLastRotation != LLQuaternion()) - { - object->setRotation(selectNode->mLastRotation); - } - if (!selectNode->mLastScale.isExactlyZero()) - { - object->setScale(selectNode->mLastScale); - } - } - return true; - } - } func; - getSelection()->applyToNodes(&func); -} - -//----------------------------------------------------------------------------- -// Select just the object, not any other group members. -//----------------------------------------------------------------------------- -LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face) -{ - llassert( object ); - - //remember primary object - mSelectedObjects->mPrimaryObject = object; - - // Don't add an object that is already in the list - if (object->isSelected() ) { - // make sure point at position is updated - updatePointAt(); - gEditMenuHandler = this; - return NULL; - } - - if (!canSelectObject(object)) - { - //make_ui_sound("UISndInvalidOp"); - return NULL; - } - - // llinfos << "Adding object to selected object list" << llendl; - - // Place it in the list and tag it. - // This will refresh dialogs. - addAsIndividual(object, face); - - // Stop the object from moving (this anticipates changes on the - // simulator in LLTask::userSelect) - // *FIX: shouldn't zero out these either - object->setVelocity(LLVector3::zero); - object->setAcceleration(LLVector3::zero); - //object->setAngularVelocity(LLVector3::zero); - object->resetRot(); - - // Always send to simulator, so you get a copy of the - // permissions structure back. - gMessageSystem->newMessageFast(_PREHASH_ObjectSelect); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() ); - LLViewerRegion* regionp = object->getRegion(); - gMessageSystem->sendReliable( regionp->getHost()); - - updatePointAt(); - updateSelectionCenter(); - saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); - - // have selection manager handle edit menu immediately after - // user selects an object - if (mSelectedObjects->getObjectCount()) - { - gEditMenuHandler = this; - } - - return mSelectedObjects; -} - -//----------------------------------------------------------------------------- -// Select the object, parents and children. -//----------------------------------------------------------------------------- -LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end) -{ - llassert( obj ); - - //remember primary object - mSelectedObjects->mPrimaryObject = obj; - - // This may be incorrect if things weren't family selected before... - djs 07/08/02 - // Don't add an object that is already in the list - if (obj->isSelected() ) - { - // make sure pointat position is updated - updatePointAt(); - gEditMenuHandler = this; - return NULL; - } - - if (!canSelectObject(obj)) - { - //make_ui_sound("UISndInvalidOp"); - return NULL; - } - - // Since we're selecting a family, start at the root, but - // don't include an avatar. - LLViewerObject* root = obj; - - while(!root->isAvatar() && root->getParent() && !root->isJointChild()) - { - LLViewerObject* parent = (LLViewerObject*)root->getParent(); - if (parent->isAvatar()) - { - break; - } - root = parent; - } - - // Collect all of the objects - std::vector objects; - - root->addThisAndNonJointChildren(objects); - addAsFamily(objects, add_to_end); - - updateSelectionCenter(); - saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); - updatePointAt(); - - dialog_refresh_all(); - - // Always send to simulator, so you get a copy of the permissions - // structure back. - sendSelect(); - - // Stop the object from moving (this anticipates changes on the - // simulator in LLTask::userSelect) - root->setVelocity(LLVector3::zero); - root->setAcceleration(LLVector3::zero); - //root->setAngularVelocity(LLVector3::zero); - root->resetRot(); - - // leave component mode - if (gSavedSettings.getBOOL("EditLinkedParts")) - { - gSavedSettings.setBOOL("EditLinkedParts", FALSE); - promoteSelectionToRoot(); - } - - // have selection manager handle edit menu immediately after - // user selects an object - if (mSelectedObjects->getObjectCount()) - { - gEditMenuHandler = this; - } - - return mSelectedObjects; -} - -//----------------------------------------------------------------------------- -// Select the object, parents and children. -//----------------------------------------------------------------------------- -LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const std::vector& object_list, - BOOL send_to_sim) -{ - // Collect all of the objects, children included - std::vector objects; - - //clear primary object (no primary object) - mSelectedObjects->mPrimaryObject = NULL; - - if (object_list.size() < 1) - { - return NULL; - } - - // NOTE -- we add the objects in REVERSE ORDER - // to preserve the order in the mSelectedObjects list - for (std::vector::const_reverse_iterator riter = object_list.rbegin(); - riter != object_list.rend(); ++riter) - { - LLViewerObject *object = *riter; - - llassert( object ); - - if (!canSelectObject(object)) continue; - - object->addThisAndNonJointChildren(objects); - addAsFamily(objects); - - // Stop the object from moving (this anticipates changes on the - // simulator in LLTask::userSelect) - object->setVelocity(LLVector3::zero); - object->setAcceleration(LLVector3::zero); - //object->setAngularVelocity(LLVector3::zero); - object->resetRot(); - } - - updateSelectionCenter(); - saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); - updatePointAt(); - dialog_refresh_all(); - - // Almost always send to simulator, so you get a copy of the permissions - // structure back. - // JC: The one case where you don't want to do this is if you're selecting - // all the objects on a sim. - if (send_to_sim) - { - sendSelect(); - } - - // leave component mode - if (gSavedSettings.getBOOL("EditLinkedParts")) - { - gSavedSettings.setBOOL("EditLinkedParts", FALSE); - promoteSelectionToRoot(); - } - - // have selection manager handle edit menu immediately after - // user selects an object - if (mSelectedObjects->getObjectCount()) - { - gEditMenuHandler = this; - } - - return mSelectedObjects; -} - -// Use for when the simulator kills an object. This version also -// handles informing the current tool of the object's deletion. -// -// Caller needs to call dialog_refresh_all if necessary. -BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id) -{ - BOOL object_found = FALSE; - LLTool *tool = NULL; - if (!gNoRender) - { - tool = LLToolMgr::getInstance()->getCurrentTool(); - - // It's possible that the tool is editing an object that is not selected - LLViewerObject* tool_editing_object = tool->getEditingObject(); - if( tool_editing_object && tool_editing_object->mID == id) - { - tool->stopEditing(); - object_found = TRUE; - } - } - - // Iterate through selected objects list and kill the object - if( !object_found ) - { - for (LLObjectSelection::iterator iter = getSelection()->begin(); - iter != getSelection()->end(); ) - { - LLObjectSelection::iterator curiter = iter++; - LLViewerObject* object = (*curiter)->getObject(); - if (object->mID == id) - { - if (tool) - { - tool->stopEditing(); - } - - // lose the selection, don't tell simulator, it knows - deselectObjectAndFamily(object, FALSE); - object_found = TRUE; - break; // must break here, may have removed multiple objects from list - } - else if (object->isAvatar() && object->getParent() && ((LLViewerObject*)object->getParent())->mID == id) - { - // It's possible the item being removed has an avatar sitting on it - // So remove the avatar that is sitting on the object. - deselectObjectAndFamily(object, FALSE); - break; // must break here, may have removed multiple objects from list - } - } - } - - return object_found; -} - -void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim, BOOL include_entire_object) -{ - // bail if nothing selected or if object wasn't selected in the first place - if(!object) return; - if(!object->isSelected()) return; - - // Collect all of the objects, and remove them - std::vector objects; - - if (include_entire_object) - { - // Since we're selecting a family, start at the root, but - // don't include an avatar. - LLViewerObject* root = object; - - while(!root->isAvatar() && root->getParent() && !root->isJointChild()) - { - LLViewerObject* parent = (LLViewerObject*)root->getParent(); - if (parent->isAvatar()) - { - break; - } - root = parent; - } - - object = root; - } - else - { - object = (LLViewerObject*)object->getRoot(); - } - - object->addThisAndAllChildren(objects); - remove(objects); - - if (!send_to_sim) return; - - //----------------------------------------------------------- - // Inform simulator of deselection - //----------------------------------------------------------- - LLViewerRegion* regionp = object->getRegion(); - - BOOL start_new_message = TRUE; - S32 select_count = 0; - - LLMessageSystem* msg = gMessageSystem; - for (U32 i = 0; i < objects.size(); i++) - { - if (start_new_message) - { - msg->newMessageFast(_PREHASH_ObjectDeselect); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - select_count++; - start_new_message = FALSE; - } - - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addU32Fast(_PREHASH_ObjectLocalID, (objects[i])->getLocalID()); - select_count++; - - // Zap the angular velocity, as the sim will set it to zero - objects[i]->setAngularVelocity( 0,0,0 ); - objects[i]->setVelocity( 0,0,0 ); - - if(msg->isSendFull(NULL) || select_count >= MAX_OBJECTS_PER_PACKET) - { - msg->sendReliable(regionp->getHost() ); - select_count = 0; - start_new_message = TRUE; - } - } - - if (!start_new_message) - { - msg->sendReliable(regionp->getHost() ); - } - - updatePointAt(); - updateSelectionCenter(); -} - -void LLSelectMgr::deselectObjectOnly(LLViewerObject* object, BOOL send_to_sim) -{ - // bail if nothing selected or if object wasn't selected in the first place - if (!object) return; - if (!object->isSelected() ) return; - - // Zap the angular velocity, as the sim will set it to zero - object->setAngularVelocity( 0,0,0 ); - object->setVelocity( 0,0,0 ); - - if (send_to_sim) - { - LLViewerRegion* region = object->getRegion(); - gMessageSystem->newMessageFast(_PREHASH_ObjectDeselect); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() ); - gMessageSystem->sendReliable(region->getHost()); - } - - // This will refresh dialogs. - remove( object ); - - updatePointAt(); - updateSelectionCenter(); -} - - -//----------------------------------------------------------------------------- -// addAsFamily -//----------------------------------------------------------------------------- - -void LLSelectMgr::addAsFamily(std::vector& objects, BOOL add_to_end) -{ - for (std::vector::iterator iter = objects.begin(); - iter != objects.end(); ++iter) - { - LLViewerObject* objectp = *iter; - - // Can't select yourself - if (objectp->mID == gAgentID - && !gAllowSelectAvatar) - { - continue; - } - - if (!objectp->isSelected()) - { - LLSelectNode *nodep = new LLSelectNode(objectp, TRUE); - if (add_to_end) - { - mSelectedObjects->addNodeAtEnd(nodep); - } - else - { - mSelectedObjects->addNode(nodep); - } - objectp->setSelected(TRUE); - - if (objectp->getNumTEs() > 0) - { - nodep->selectAllTEs(TRUE); - } - else - { - // object has no faces, so don't mess with faces - } - } - else - { - // we want this object to be selected for real - // so clear transient flag - LLSelectNode* select_node = mSelectedObjects->findNode(objectp); - if (select_node) - { - select_node->setTransient(FALSE); - } - } - } - saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); -} - -//----------------------------------------------------------------------------- -// addAsIndividual() - a single object, face, etc -//----------------------------------------------------------------------------- -void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoable) -{ - // check to see if object is already in list - LLSelectNode *nodep = mSelectedObjects->findNode(objectp); - - // if not in list, add it - if (!nodep) - { - nodep = new LLSelectNode(objectp, TRUE); - mSelectedObjects->addNode(nodep); - llassert_always(nodep->getObject()); - } - else - { - // make this a full-fledged selection - nodep->setTransient(FALSE); - // Move it to the front of the list - mSelectedObjects->moveNodeToFront(nodep); - } - - // Make sure the object is tagged as selected - objectp->setSelected( TRUE ); - - // And make sure we don't consider it as part of a family - nodep->mIndividualSelection = TRUE; - - // Handle face selection - if (objectp->getNumTEs() <= 0) - { - // object has no faces, so don't do anything - } - else if (face == SELECT_ALL_TES) - { - nodep->selectAllTEs(TRUE); - } - else if (0 <= face && face < SELECT_MAX_TES) - { - nodep->selectTE(face, TRUE); - } - else - { - llerrs << "LLSelectMgr::add face " << face << " out-of-range" << llendl; - return; - } - - saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); - updateSelectionCenter(); - dialog_refresh_all(); -} - - -LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32 face) -{ - if (!objectp) - { - mHoverObjects->deleteAllNodes(); - return NULL; - } - - // Can't select yourself - if (objectp->mID == gAgentID) - { - mHoverObjects->deleteAllNodes(); - return NULL; - } - - // Can't select land - if (objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) - { - mHoverObjects->deleteAllNodes(); - return NULL; - } - - mHoverObjects->mPrimaryObject = objectp; - - objectp = objectp->getRootEdit(); - - // is the requested object the same as the existing hover object root? - // NOTE: there is only ever one linked set in mHoverObjects - if (mHoverObjects->getFirstRootObject() != objectp) - { - - // Collect all of the objects - std::vector objects; - objectp = objectp->getRootEdit(); - objectp->addThisAndNonJointChildren(objects); - - mHoverObjects->deleteAllNodes(); - for (std::vector::iterator iter = objects.begin(); - iter != objects.end(); ++iter) - { - LLViewerObject* cur_objectp = *iter; - LLSelectNode* nodep = new LLSelectNode(cur_objectp, FALSE); - nodep->selectTE(face, TRUE); - mHoverObjects->addNodeAtEnd(nodep); - } - - requestObjectPropertiesFamily(objectp); - } - - return mHoverObjects; -} - -LLSelectNode *LLSelectMgr::getHoverNode() -{ - return getHoverObjects()->getFirstRootNode(); -} - -void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp) -{ - if (!objectp) - { - return; - } - - if (objectp->getPCode() != LL_PCODE_VOLUME) - { - return; - } - - if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !objectp->permYouOwner()) || - (gSavedSettings.getBOOL("SelectMovableOnly") && !objectp->permMove())) - { - // only select my own objects - return; - } - - mRectSelectedObjects.insert(objectp); -} - -void LLSelectMgr::highlightObjectAndFamily(LLViewerObject* objectp) -{ - if (!objectp) - { - return; - } - - LLViewerObject* root_obj = (LLViewerObject*)objectp->getRoot(); - - highlightObjectOnly(root_obj); - - LLViewerObject::const_child_list_t& child_list = root_obj->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) - { - LLViewerObject* child = *iter; - highlightObjectOnly(child); - } -} - -// Note that this ignores the "select owned only" flag -// It's also more efficient than calling the single-object version over and over. -void LLSelectMgr::highlightObjectAndFamily(const std::vector& objects) -{ - for (std::vector::const_iterator iter1 = objects.begin(); - iter1 != objects.end(); ++iter1) - { - LLViewerObject* object = *iter1; - - if (!object) - { - continue; - } - if (object->getPCode() != LL_PCODE_VOLUME) - { - continue; - } - - LLViewerObject* root = (LLViewerObject*)object->getRoot(); - mRectSelectedObjects.insert(root); - - LLViewerObject::const_child_list_t& child_list = root->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter2 = child_list.begin(); - iter2 != child_list.end(); iter2++) - { - LLViewerObject* child = *iter2; - mRectSelectedObjects.insert(child); - } - } -} - -void LLSelectMgr::unhighlightObjectOnly(LLViewerObject* objectp) -{ - if (!objectp || (objectp->getPCode() != LL_PCODE_VOLUME)) - { - return; - } - - mRectSelectedObjects.erase(objectp); -} - -void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp) -{ - if (!objectp) - { - return; - } - - LLViewerObject* root_obj = (LLViewerObject*)objectp->getRoot(); - - unhighlightObjectOnly(root_obj); - - LLViewerObject::const_child_list_t& child_list = root_obj->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) - { - LLViewerObject* child = *iter; - unhighlightObjectOnly(child); - } -} - - -void LLSelectMgr::unhighlightAll() -{ - mRectSelectedObjects.clear(); - mHighlightedObjects->deleteAllNodes(); -} - -LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects() -{ - if (!mHighlightedObjects->getNumNodes()) - { - return NULL; - } - - //clear primary object - mSelectedObjects->mPrimaryObject = NULL; - - for (LLObjectSelection::iterator iter = getHighlightedObjects()->begin(); - iter != getHighlightedObjects()->end(); ) - { - LLObjectSelection::iterator curiter = iter++; - - LLSelectNode *nodep = *curiter; - LLViewerObject* objectp = nodep->getObject(); - - if (!canSelectObject(objectp)) - { - continue; - } - - // already selected - if (objectp->isSelected()) - { - continue; - } - - LLSelectNode* new_nodep = new LLSelectNode(*nodep); - mSelectedObjects->addNode(new_nodep); - - // flag this object as selected - objectp->setSelected(TRUE); - - mSelectedObjects->mSelectType = getSelectTypeForObject(objectp); - - // request properties on root objects - if (objectp->isRootEdit()) - { - requestObjectPropertiesFamily(objectp); - } - } - - // pack up messages to let sim know these objects are selected - sendSelect(); - unhighlightAll(); - updateSelectionCenter(); - saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); - updatePointAt(); - - if (mSelectedObjects->getObjectCount()) - { - gEditMenuHandler = this; - } - - return mSelectedObjects; -} - -void LLSelectMgr::deselectHighlightedObjects() -{ - BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); - for (std::set >::iterator iter = mRectSelectedObjects.begin(); - iter != mRectSelectedObjects.end(); iter++) - { - LLViewerObject *objectp = *iter; - if (!select_linked_set) - { - deselectObjectOnly(objectp); - } - else - { - LLViewerObject* root_object = (LLViewerObject*)objectp->getRoot(); - if (root_object->isSelected()) - { - deselectObjectAndFamily(root_object); - } - } - } - - unhighlightAll(); -} - -void LLSelectMgr::addGridObject(LLViewerObject* objectp) -{ - LLSelectNode* nodep = new LLSelectNode(objectp, FALSE); - mGridObjects.addNodeAtEnd(nodep); - - LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) - { - LLViewerObject* child = *iter; - nodep = new LLSelectNode(child, FALSE); - mGridObjects.addNodeAtEnd(nodep); - } -} - -void LLSelectMgr::clearGridObjects() -{ - mGridObjects.deleteAllNodes(); -} - -void LLSelectMgr::setGridMode(EGridMode mode) -{ - mGridMode = mode; - gSavedSettings.setS32("GridMode", mode); - updateSelectionCenter(); - mGridValid = FALSE; -} - -void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale) -{ - mGridObjects.cleanupNodes(); - - LLViewerObject* first_grid_object = mGridObjects.getFirstObject(); - - if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount()) - { - //LLViewerObject* root = getSelectedParentObject(mSelectedObjects->getFirstObject()); - LLBBox bbox = mSavedSelectionBBox; - mGridOrigin = mSavedSelectionBBox.getCenterAgent(); - mGridScale = mSavedSelectionBBox.getExtentLocal() * 0.5f; - - // DEV-12570 Just taking the saved selection box rotation prevents - // wild rotations of linked sets while in local grid mode - //if(mSelectedObjects->getObjectCount() < 2 || !root || root->mDrawable.isNull()) - { - mGridRotation = mSavedSelectionBBox.getRotation(); - } - /*else //set to the root object - { - mGridRotation = root->getRenderRotation(); - }*/ - } - else if (mGridMode == GRID_MODE_REF_OBJECT && first_grid_object && first_grid_object->mDrawable.notNull()) - { - mGridRotation = first_grid_object->getRenderRotation(); - LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition(); - - LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX); - LLVector3 max_extents(-F32_MAX, -F32_MAX, -F32_MAX); - BOOL grid_changed = FALSE; - for (LLObjectSelection::iterator iter = mGridObjects.begin(); - iter != mGridObjects.end(); ++iter) - { - LLViewerObject* object = (*iter)->getObject(); - LLDrawable* drawable = object->mDrawable; - if (drawable) - { - const LLVector3* ext = drawable->getSpatialExtents(); - update_min_max(min_extents, max_extents, ext[0]); - update_min_max(min_extents, max_extents, ext[1]); - grid_changed = TRUE; - } - } - if (grid_changed) - { - mGridOrigin = lerp(min_extents, max_extents, 0.5f); - LLDrawable* drawable = first_grid_object->mDrawable; - if (drawable && drawable->isActive()) - { - mGridOrigin = mGridOrigin * first_grid_object->getRenderMatrix(); - } - mGridScale = (max_extents - min_extents) * 0.5f; - } - } - else // GRID_MODE_WORLD or just plain default - { - const BOOL non_root_ok = TRUE; - LLViewerObject* first_object = mSelectedObjects->getFirstRootObject(non_root_ok); - - mGridOrigin.clearVec(); - mGridRotation.loadIdentity(); - - mSelectedObjects->mSelectType = getSelectTypeForObject( first_object ); - - switch (mSelectedObjects->mSelectType) - { - case SELECT_TYPE_ATTACHMENT: - if (first_object && first_object->getRootEdit()->mDrawable.notNull()) - { - // this means this object *has* to be an attachment - LLXform* attachment_point_xform = first_object->getRootEdit()->mDrawable->mXform.getParent(); - if(attachment_point_xform) { - mGridOrigin = attachment_point_xform->getWorldPosition(); - mGridRotation = attachment_point_xform->getWorldRotation(); - } - mGridScale = LLVector3(1.f, 1.f, 1.f) * gSavedSettings.getF32("GridResolution"); - } - break; - case SELECT_TYPE_HUD: - // use HUD-scaled grid - mGridScale = LLVector3(0.25f, 0.25f, 0.25f); - break; - case SELECT_TYPE_WORLD: - mGridScale = LLVector3(1.f, 1.f, 1.f) * gSavedSettings.getF32("GridResolution"); - break; - } - } - llassert(mGridOrigin.isFinite()); - - origin = mGridOrigin; - rotation = mGridRotation; - scale = mGridScale; - mGridValid = TRUE; -} - -//----------------------------------------------------------------------------- -// remove() - an array of objects -//----------------------------------------------------------------------------- - -void LLSelectMgr::remove(std::vector& objects) -{ - for (std::vector::iterator iter = objects.begin(); - iter != objects.end(); ++iter) - { - LLViewerObject* objectp = *iter; - LLSelectNode* nodep = mSelectedObjects->findNode(objectp); - if (nodep) - { - objectp->setSelected(FALSE); - mSelectedObjects->removeNode(nodep); - nodep = NULL; - } - } - updateSelectionCenter(); - dialog_refresh_all(); -} - - -//----------------------------------------------------------------------------- -// remove() - a single object -//----------------------------------------------------------------------------- -void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable) -{ - // get object node (and verify it is in the selected list) - LLSelectNode *nodep = mSelectedObjects->findNode(objectp); - if (!nodep) - { - return; - } - - // if face = all, remove object from list - if ((objectp->getNumTEs() <= 0) || (te == SELECT_ALL_TES)) - { - // Remove all faces (or the object doesn't have faces) so remove the node - mSelectedObjects->removeNode(nodep); - nodep = NULL; - objectp->setSelected( FALSE ); - } - else if (0 <= te && te < SELECT_MAX_TES) - { - // ...valid face, check to see if it was on - if (nodep->isTESelected(te)) - { - nodep->selectTE(te, FALSE); - } - else - { - llerrs << "LLSelectMgr::remove - tried to remove TE " << te << " that wasn't selected" << llendl; - return; - } - - // ...check to see if this operation turned off all faces - BOOL found = FALSE; - for (S32 i = 0; i < nodep->getObject()->getNumTEs(); i++) - { - found = found || nodep->isTESelected(i); - } - - // ...all faces now turned off, so remove - if (!found) - { - mSelectedObjects->removeNode(nodep); - nodep = NULL; - objectp->setSelected( FALSE ); - // *FIXME: Doesn't update simulator that object is no longer selected - } - } - else - { - // ...out of range face - llerrs << "LLSelectMgr::remove - TE " << te << " out of range" << llendl; - } - - updateSelectionCenter(); - dialog_refresh_all(); -} - - -//----------------------------------------------------------------------------- -// removeAll() -//----------------------------------------------------------------------------- -void LLSelectMgr::removeAll() -{ - for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); - iter != mSelectedObjects->end(); iter++ ) - { - LLViewerObject *objectp = (*iter)->getObject(); - objectp->setSelected( FALSE ); - } - - mSelectedObjects->deleteAllNodes(); - - updateSelectionCenter(); - dialog_refresh_all(); -} - -//----------------------------------------------------------------------------- -// promoteSelectionToRoot() -//----------------------------------------------------------------------------- -void LLSelectMgr::promoteSelectionToRoot() -{ - std::set selection_set; - - BOOL selection_changed = FALSE; - - for (LLObjectSelection::iterator iter = getSelection()->begin(); - iter != getSelection()->end(); ) - { - LLObjectSelection::iterator curiter = iter++; - LLSelectNode* nodep = *curiter; - LLViewerObject* object = nodep->getObject(); - - if (nodep->mIndividualSelection) - { - selection_changed = TRUE; - } - - LLViewerObject* parentp = object; - while(parentp->getParent() && !(parentp->isRootEdit() || parentp->isJointChild())) - { - parentp = (LLViewerObject*)parentp->getParent(); - } - - selection_set.insert(parentp); - } - - if (selection_changed) - { - deselectAll(); - - std::set::iterator set_iter; - for (set_iter = selection_set.begin(); set_iter != selection_set.end(); ++set_iter) - { - selectObjectAndFamily(*set_iter); - } - } -} - -//----------------------------------------------------------------------------- -// demoteSelectionToIndividuals() -//----------------------------------------------------------------------------- -void LLSelectMgr::demoteSelectionToIndividuals() -{ - std::vector objects; - - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++) - { - LLViewerObject* object = (*iter)->getObject(); - object->addThisAndNonJointChildren(objects); - } - - if (!objects.empty()) - { - deselectAll(); - for (std::vector::iterator iter = objects.begin(); - iter != objects.end(); ++iter) - { - LLViewerObject* objectp = *iter; - selectObjectOnly(objectp); - } - } -} - -//----------------------------------------------------------------------------- -// dump() -//----------------------------------------------------------------------------- -void LLSelectMgr::dump() -{ - llinfos << "Selection Manager: " << mSelectedObjects->getNumNodes() << " items" << llendl; - - llinfos << "TE mode " << mTEMode << llendl; - - S32 count = 0; - for (LLObjectSelection::iterator iter = getSelection()->begin(); - iter != getSelection()->end(); iter++ ) - { - LLViewerObject* objectp = (*iter)->getObject(); - llinfos << "Object " << count << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl; - llinfos << " hasLSL " << objectp->flagScripted() << llendl; - llinfos << " hasTouch " << objectp->flagHandleTouch() << llendl; - llinfos << " hasMoney " << objectp->flagTakesMoney() << llendl; - llinfos << " getposition " << objectp->getPosition() << llendl; - llinfos << " getpositionAgent " << objectp->getPositionAgent() << llendl; - llinfos << " getpositionRegion " << objectp->getPositionRegion() << llendl; - llinfos << " getpositionGlobal " << objectp->getPositionGlobal() << llendl; - LLDrawable* drawablep = objectp->mDrawable; - llinfos << " " << (drawablep&& drawablep->isVisible() ? "visible" : "invisible") << llendl; - llinfos << " " << (drawablep&& drawablep->isState(LLDrawable::FORCE_INVISIBLE) ? "force_invisible" : "") << llendl; - count++; - } - - // Face iterator - for (LLObjectSelection::iterator iter = getSelection()->begin(); - iter != getSelection()->end(); iter++ ) - { - LLSelectNode* node = *iter; - LLViewerObject* objectp = node->getObject(); - if (!objectp) - continue; - for (S32 te = 0; te < objectp->getNumTEs(); ++te ) - { - if (node->isTESelected(te)) - { - llinfos << "Object " << objectp << " te " << te << llendl; - } - } - } - - llinfos << mHighlightedObjects->getNumNodes() << " objects currently highlighted." << llendl; - - llinfos << "Center global " << mSelectionCenterGlobal << llendl; -} - -//----------------------------------------------------------------------------- -// cleanup() -//----------------------------------------------------------------------------- -void LLSelectMgr::cleanup() -{ - mSilhouetteImagep = NULL; -} - - -//--------------------------------------------------------------------------- -// Manipulate properties of selected objects -//--------------------------------------------------------------------------- - -struct LLSelectMgrSendFunctor : public LLSelectedObjectFunctor -{ - virtual bool apply(LLViewerObject* object) - { - if (object->permModify()) - { - object->sendTEUpdate(); - } - return true; - } -}; - -//----------------------------------------------------------------------------- -// selectionSetImage() -//----------------------------------------------------------------------------- -// *TODO: re-arch texture applying out of lltooldraganddrop -void LLSelectMgr::selectionSetImage(const LLUUID& imageid) -{ - // First for (no copy) textures and multiple object selection - LLViewerInventoryItem* item = gInventory.getItem(imageid); - // fffff - /* - // - if(item - && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) - && (mSelectedObjects->getNumNodes() > 1) ) - { - llwarns << "Attempted to apply no-copy texture to multiple objects" - << llendl; - return; - } - // - */ - // - - struct f : public LLSelectedTEFunctor - { - LLViewerInventoryItem* mItem; - LLUUID mImageID; - f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mImageID(id) {} - bool apply(LLViewerObject* objectp, S32 te) - { - if (mItem) - { - if (te == -1) // all faces - { - LLToolDragAndDrop::dropTextureAllFaces(objectp, - mItem, - LLToolDragAndDrop::SOURCE_AGENT, - LLUUID::null); - } - else // one face - { - LLToolDragAndDrop::dropTextureOneFace(objectp, - te, - mItem, - LLToolDragAndDrop::SOURCE_AGENT, - LLUUID::null); - } - } - else // not an inventory item - { - // Texture picker defaults aren't inventory items - // * Don't need to worry about permissions for them - // * Can just apply the texture and be done with it. - objectp->setTEImage(te, gImageList.getImage(mImageID, TRUE, FALSE)); - } - return true; - } - } setfunc(item, imageid); - getSelection()->applyToTEs(&setfunc); - - struct g : public LLSelectedObjectFunctor - { - LLViewerInventoryItem* mItem; - g(LLViewerInventoryItem* item) : mItem(item) {} - virtual bool apply(LLViewerObject* object) - { - if (!mItem) - { - object->sendTEUpdate(); - // 1 particle effect per object - // - if(!gSavedSettings.getBOOL("DisablePointAtAndBeam")) - { - // - LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject(gAgent.getAvatarObject()); - effectp->setTargetObject(object); - effectp->setDuration(LL_HUD_DUR_SHORT); - effectp->setColor(LLColor4U(gAgent.getEffectColor())); - // - } - // - } - return true; - } - } sendfunc(item); - getSelection()->applyToObjects(&sendfunc); -} - -//----------------------------------------------------------------------------- -// selectionSetColor() -//----------------------------------------------------------------------------- -void LLSelectMgr::selectionSetColor(const LLColor4 &color) -{ - struct f : public LLSelectedTEFunctor - { - LLColor4 mColor; - f(const LLColor4& c) : mColor(c) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - object->setTEColor(te, mColor); - } - return true; - } - } setfunc(color); - getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); -} - -//----------------------------------------------------------------------------- -// selectionSetColorOnly() -//----------------------------------------------------------------------------- -void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color) -{ - struct f : public LLSelectedTEFunctor - { - LLColor4 mColor; - f(const LLColor4& c) : mColor(c) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - LLColor4 prev_color = object->getTE(te)->getColor(); - mColor.mV[VALPHA] = prev_color.mV[VALPHA]; - // update viewer side color in anticipation of update from simulator - object->setTEColor(te, mColor); - } - return true; - } - } setfunc(color); - getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); -} - -//----------------------------------------------------------------------------- -// selectionSetAlphaOnly() -//----------------------------------------------------------------------------- -void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha) -{ - struct f : public LLSelectedTEFunctor - { - F32 mAlpha; - f(const F32& a) : mAlpha(a) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - LLColor4 prev_color = object->getTE(te)->getColor(); - prev_color.mV[VALPHA] = mAlpha; - // update viewer side color in anticipation of update from simulator - object->setTEColor(te, prev_color); - } - return true; - } - } setfunc(alpha); - getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); -} - -void LLSelectMgr::selectionRevertColors() -{ - struct f : public LLSelectedTEFunctor - { - LLObjectSelectionHandle mSelectedObjects; - f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - LLSelectNode* nodep = mSelectedObjects->findNode(object); - if (nodep && te < (S32)nodep->mSavedColors.size()) - { - LLColor4 color = nodep->mSavedColors[te]; - // update viewer side color in anticipation of update from simulator - object->setTEColor(te, color); - } - } - return true; - } - } setfunc(mSelectedObjects); - getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); -} - -BOOL LLSelectMgr::selectionRevertTextures() -{ - struct f : public LLSelectedTEFunctor - { - LLObjectSelectionHandle mSelectedObjects; - f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - LLSelectNode* nodep = mSelectedObjects->findNode(object); - if (nodep && te < (S32)nodep->mSavedTextures.size()) - { - LLUUID id = nodep->mSavedTextures[te]; - // update textures on viewer side - if (id.isNull()) - { - // this was probably a no-copy texture, leave image as-is - return FALSE; - } - else - { - object->setTEImage(te, gImageList.getImage(id)); - } - } - } - return true; - } - } setfunc(mSelectedObjects); - BOOL revert_successful = getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); - - return revert_successful; -} - -void LLSelectMgr::selectionSetBumpmap(U8 bumpmap) -{ - struct f : public LLSelectedTEFunctor - { - U8 mBump; - f(const U8& b) : mBump(b) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - // update viewer side color in anticipation of update from simulator - object->setTEBumpmap(te, mBump); - } - return true; - } - } setfunc(bumpmap); - getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); -} - -void LLSelectMgr::selectionSetTexGen(U8 texgen) -{ - struct f : public LLSelectedTEFunctor - { - U8 mTexgen; - f(const U8& t) : mTexgen(t) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - // update viewer side color in anticipation of update from simulator - object->setTETexGen(te, mTexgen); - } - return true; - } - } setfunc(texgen); - getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); -} - - -void LLSelectMgr::selectionSetShiny(U8 shiny) -{ - struct f : public LLSelectedTEFunctor - { - U8 mShiny; - f(const U8& t) : mShiny(t) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - // update viewer side color in anticipation of update from simulator - object->setTEShiny(te, mShiny); - } - return true; - } - } setfunc(shiny); - getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); -} - -void LLSelectMgr::selectionSetFullbright(U8 fullbright) -{ - struct f : public LLSelectedTEFunctor - { - U8 mFullbright; - f(const U8& t) : mFullbright(t) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - // update viewer side color in anticipation of update from simulator - object->setTEFullbright(te, mFullbright); - } - return true; - } - } setfunc(fullbright); - getSelection()->applyToTEs(&setfunc); - - struct g : public LLSelectedObjectFunctor - { - U8 mFullbright; - g(const U8& t) : mFullbright(t) {} - virtual bool apply(LLViewerObject* object) - { - if (object->permModify()) - { - object->sendTEUpdate(); - if (mFullbright) - { - U8 material = object->getMaterial(); - U8 mcode = material & LL_MCODE_MASK; - if (mcode == LL_MCODE_LIGHT) - { - mcode = LL_MCODE_GLASS; - material = (material & ~LL_MCODE_MASK) | mcode; - object->setMaterial(material); - object->sendMaterialUpdate(); - } - } - } - return true; - } - } sendfunc(fullbright); - getSelection()->applyToObjects(&sendfunc); -} - -void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string& media_url) -{ - U8 media_flags = LLTextureEntry::MF_NONE; - if (media_type == LLViewerObject::MEDIA_TYPE_WEB_PAGE) - { - media_flags = LLTextureEntry::MF_HAS_MEDIA; - } - - struct f : public LLSelectedTEFunctor - { - U8 mMediaFlags; - f(const U8& t) : mMediaFlags(t) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - // update viewer side color in anticipation of update from simulator - object->setTEMediaFlags(te, mMediaFlags); - } - return true; - } - } setfunc(media_flags); - getSelection()->applyToTEs(&setfunc); - - struct g : public LLSelectedObjectFunctor - { - U8 media_type; - const std::string& media_url ; - g(U8 a, const std::string& b) : media_type(a), media_url(b) {} - virtual bool apply(LLViewerObject* object) - { - if (object->permModify()) - { - object->sendTEUpdate(); - object->setMediaType(media_type); - object->setMediaURL(media_url); - } - return true; - } - } sendfunc(media_type, media_url); - getSelection()->applyToObjects(&sendfunc); -} - -void LLSelectMgr::selectionSetGlow(F32 glow) -{ - struct f1 : public LLSelectedTEFunctor - { - F32 mGlow; - f1(F32 glow) : mGlow(glow) {}; - bool apply(LLViewerObject* object, S32 face) - { - if (object->permModify()) - { - // update viewer side color in anticipation of update from simulator - object->setTEGlow(face, mGlow); - } - return true; - } - } func1(glow); - mSelectedObjects->applyToTEs( &func1 ); - - struct f2 : public LLSelectedObjectFunctor - { - virtual bool apply(LLViewerObject* object) - { - if (object->permModify()) - { - object->sendTEUpdate(); - } - return true; - } - } func2; - mSelectedObjects->applyToObjects( &func2 ); -} - - -//----------------------------------------------------------------------------- -// findObjectPermissions() -//----------------------------------------------------------------------------- -LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object) -{ - for (LLObjectSelection::valid_iterator iter = getSelection()->valid_begin(); - iter != getSelection()->valid_end(); iter++ ) - { - LLSelectNode* nodep = *iter; - if (nodep->getObject() == object) - { - return nodep->mPermissions; - } - } - - return NULL; -} - - -//----------------------------------------------------------------------------- -// selectionGetGlow() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectionGetGlow(F32 *glow) -{ - BOOL identical; - F32 lglow = 0.f; - struct f1 : public LLSelectedTEGetFunctor - { - F32 get(LLViewerObject* object, S32 face) - { - return object->getTE(face)->getGlow(); - } - } func; - identical = mSelectedObjects->getSelectedTEValue( &func, lglow ); - - *glow = lglow; - return identical; -} - -//----------------------------------------------------------------------------- -// selectionSetMaterial() -//----------------------------------------------------------------------------- -void LLSelectMgr::selectionSetMaterial(U8 material) -{ - struct f : public LLSelectedObjectFunctor - { - U8 mMaterial; - f(const U8& t) : mMaterial(t) {} - virtual bool apply(LLViewerObject* object) - { - if (object->permModify()) - { - U8 cur_material = object->getMaterial(); - U8 material = mMaterial | (cur_material & ~LL_MCODE_MASK); - object->setMaterial(material); - object->sendMaterialUpdate(); - } - return true; - } - } sendfunc(material); - getSelection()->applyToObjects(&sendfunc); -} - -// TRUE if all selected objects have this PCode -BOOL LLSelectMgr::selectionAllPCode(LLPCode code) -{ - struct f : public LLSelectedObjectFunctor - { - LLPCode mCode; - f(const LLPCode& t) : mCode(t) {} - virtual bool apply(LLViewerObject* object) - { - if (object->getPCode() != mCode) - { - return FALSE; - } - return true; - } - } func(code); - BOOL res = getSelection()->applyToObjects(&func); - return res; -} - -bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out) -{ - LLViewerObject *object = mSelectedObjects->getFirstRootObject(); - if (!object) return FALSE; - - bool include_in_search = object->getIncludeInSearch(); - - bool identical = true; - - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++) - { - LLViewerObject* object = (*iter)->getObject(); - - if ( include_in_search != object->getIncludeInSearch()) - { - identical = false; - break; - } - } - - *include_in_search_out = include_in_search; - return identical; -} - -void LLSelectMgr::selectionSetIncludeInSearch(bool include_in_search) -{ - LLViewerObject* object = NULL; - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++) - { - object = (*iter)->getObject(); - object->setIncludeInSearch(include_in_search); - } - sendListToRegions( - "ObjectIncludeInSearch", - packAgentAndSessionID, - packObjectIncludeInSearch, - &include_in_search, - SEND_ONLY_ROOTS); -} - -BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action) -{ - LLViewerObject *object = mSelectedObjects->getFirstObject(); - if (!object) - { - return FALSE; - } - - U8 action = object->getClickAction(); - *out_action = action; - - struct f : public LLSelectedObjectFunctor - { - U8 mAction; - f(const U8& t) : mAction(t) {} - virtual bool apply(LLViewerObject* object) - { - if ( mAction != object->getClickAction()) - { - return false; - } - return true; - } - } func(action); - BOOL res = getSelection()->applyToObjects(&func); - return res; -} - -void LLSelectMgr::selectionSetClickAction(U8 action) -{ - struct f : public LLSelectedObjectFunctor - { - U8 mAction; - f(const U8& t) : mAction(t) {} - virtual bool apply(LLViewerObject* object) - { - object->setClickAction(mAction); - return true; - } - } func(action); - getSelection()->applyToObjects(&func); - - sendListToRegions("ObjectClickAction", - packAgentAndSessionID, - packObjectClickAction, - &action, - SEND_INDIVIDUALS); -} - - -//----------------------------------------------------------------------------- -// godlike requests -//----------------------------------------------------------------------------- - -typedef std::pair godlike_request_t; - -void LLSelectMgr::sendGodlikeRequest(const std::string& request, const std::string& param) -{ - // If the agent is neither godlike nor an estate owner, the server - // will reject the request. - std::string message_type; - if (gAgent.isGodlike()) - { - message_type = "GodlikeMessage"; - } - else - { - message_type = "EstateOwnerMessage"; - } - - godlike_request_t data(request, param); - if(!mSelectedObjects->getRootObjectCount()) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessage(message_type.c_str()); - LLSelectMgr::packGodlikeHead(&data); - gAgent.sendReliableMessage(); - } - else - { - sendListToRegions(message_type, packGodlikeHead, packObjectIDAsParam, &data, SEND_ONLY_ROOTS); - } -} - -void LLSelectMgr::packGodlikeHead(void* user_data) -{ - LLMessageSystem* msg = gMessageSystem; - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUID("TransactionID", LLUUID::null); - godlike_request_t* data = (godlike_request_t*)user_data; - msg->nextBlock("MethodData"); - msg->addString("Method", data->first); - msg->addUUID("Invoice", LLUUID::null); - - // The parameters used to be restricted to either string or - // integer. This mimics that behavior under the new 'string-only' - // parameter list by not packing a string if there wasn't one - // specified. The object ids will be packed in the - // packObjectIDAsParam() method. - if(data->second.size() > 0) - { - msg->nextBlock("ParamList"); - msg->addString("Parameter", data->second); - } -} - -// static -void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *) -{ - std::string buf = llformat("%u", node->getObject()->getLocalID()); - gMessageSystem->nextBlock("ParamList"); - gMessageSystem->addString("Parameter", buf); -} - -//----------------------------------------------------------------------------- -// Rotation options -//----------------------------------------------------------------------------- -void LLSelectMgr::selectionResetRotation() -{ - struct f : public LLSelectedObjectFunctor - { - virtual bool apply(LLViewerObject* object) - { - LLQuaternion identity(0.f, 0.f, 0.f, 1.f); - object->setRotation(identity); - if (object->mDrawable.notNull()) - { - gPipeline.markMoved(object->mDrawable, TRUE); - } - object->sendRotationUpdate(); - return true; - } - } func; - getSelection()->applyToRootObjects(&func); -} - -void LLSelectMgr::selectionRotateAroundZ(F32 degrees) -{ - LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) ); - struct f : public LLSelectedObjectFunctor - { - LLQuaternion mRot; - f(const LLQuaternion& rot) : mRot(rot) {} - virtual bool apply(LLViewerObject* object) - { - object->setRotation( object->getRotationEdit() * mRot ); - if (object->mDrawable.notNull()) - { - gPipeline.markMoved(object->mDrawable, TRUE); - } - object->sendRotationUpdate(); - return true; - } - } func(rot); - getSelection()->applyToRootObjects(&func); -} - - -//----------------------------------------------------------------------------- -// selectionTexScaleAutofit() -//----------------------------------------------------------------------------- -void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter) -{ - struct f : public LLSelectedTEFunctor - { - F32 mRepeatsPerMeter; - f(const F32& t) : mRepeatsPerMeter(t) {} - bool apply(LLViewerObject* object, S32 te) - { - - if (object->permModify()) - { - // Compute S,T to axis mapping - U32 s_axis, t_axis; - if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis)) - { - return TRUE; - } - - F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter; - F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter; - - object->setTEScale(te, new_s, new_t); - } - return true; - } - } setfunc(repeats_per_meter); - getSelection()->applyToTEs(&setfunc); - - LLSelectMgrSendFunctor sendfunc; - getSelection()->applyToObjects(&sendfunc); -} - - - -// Called at the end of a scale operation, this adjusts the textures to attempt to -// maintain a constant repeats per meter. -// BUG: Only works for flex boxes. -//----------------------------------------------------------------------------- -// adjustTexturesByScale() -//----------------------------------------------------------------------------- -void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch) -{ - for (LLObjectSelection::iterator iter = getSelection()->begin(); - iter != getSelection()->end(); iter++) - { - LLSelectNode* selectNode = *iter; - LLViewerObject* object = selectNode->getObject(); - - if (!object) - { - continue; - } - - if (!object->permModify()) - { - continue; - } - - if (object->getNumTEs() == 0) - { - continue; - } - - BOOL send = FALSE; - - for (U8 te_num = 0; te_num < object->getNumTEs(); te_num++) - { - const LLTextureEntry* tep = object->getTE(te_num); - - BOOL planar = tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR; - if (planar == stretch) - { - // Figure out how S,T changed with scale operation - U32 s_axis, t_axis; - if (!LLPrimitive::getTESTAxes(te_num, &s_axis, &t_axis)) - { - continue; - } - - LLVector3 scale_ratio = selectNode->mTextureScaleRatios[te_num]; - LLVector3 object_scale = object->getScale(); - - // Apply new scale to face - if (planar) - { - object->setTEScale(te_num, 1.f/object_scale.mV[s_axis]*scale_ratio.mV[s_axis], - 1.f/object_scale.mV[t_axis]*scale_ratio.mV[t_axis]); - } - else - { - object->setTEScale(te_num, scale_ratio.mV[s_axis]*object_scale.mV[s_axis], - scale_ratio.mV[t_axis]*object_scale.mV[t_axis]); - } - send = send_to_sim; - } - } - - if (send) - { - object->sendTEUpdate(); - } - } -} - -//----------------------------------------------------------------------------- -// selectGetAllRootsValid() -// Returns TRUE if the viewer has information on all selected objects -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetAllRootsValid() -{ - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); ++iter ) - { - LLSelectNode* node = *iter; - if( !node->mValid ) - { - return FALSE; - } - } - return TRUE; -} - - -//----------------------------------------------------------------------------- -// selectGetAllValid() -// Returns TRUE if the viewer has information on all selected objects -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetAllValid() -{ - for (LLObjectSelection::iterator iter = getSelection()->begin(); - iter != getSelection()->end(); ++iter ) - { - LLSelectNode* node = *iter; - if( !node->mValid ) - { - return FALSE; - } - } - return TRUE; -} - - -//----------------------------------------------------------------------------- -// selectGetModify() - return TRUE if current agent can modify all -// selected objects. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetModify() -{ - for (LLObjectSelection::iterator iter = getSelection()->begin(); - iter != getSelection()->end(); iter++ ) - { - LLSelectNode* node = *iter; - LLViewerObject* object = node->getObject(); - if( !object || !node->mValid ) - { - return FALSE; - } - if( !object->permModify() ) - { - return FALSE; - } - } - return TRUE; -} - -//----------------------------------------------------------------------------- -// selectGetRootsModify() - return TRUE if current agent can modify all -// selected root objects. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetRootsModify() -{ - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - LLViewerObject* object = node->getObject(); - if( !node->mValid ) - { - return FALSE; - } - if( !object->permModify() ) - { - return FALSE; - } - } - - return TRUE; -} - - -//----------------------------------------------------------------------------- -// selectGetRootsTransfer() - return TRUE if current agent can transfer all -// selected root objects. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetRootsTransfer() -{ - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - LLViewerObject* object = node->getObject(); - if( !node->mValid ) - { - return FALSE; - } - if(!object->permTransfer()) - { - return FALSE; - } - } - return TRUE; -} - -//----------------------------------------------------------------------------- -// selectGetRootsCopy() - return TRUE if current agent can copy all -// selected root objects. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetRootsCopy() -{ - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - LLViewerObject* object = node->getObject(); - if( !node->mValid ) - { - return FALSE; - } - if(!object->permCopy()) - { - return FALSE; - } - } - return TRUE; -} - -//----------------------------------------------------------------------------- -// selectGetCreator() -// Creator information only applies to root objects. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name) -{ - BOOL identical = TRUE; - BOOL first = TRUE; - LLUUID first_id; - for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); - iter != getSelection()->root_object_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - - if (first) - { - first_id = node->mPermissions->getCreator(); - first = FALSE; - } - else - { - if ( !(first_id == node->mPermissions->getCreator() ) ) - { - identical = FALSE; - break; - } - } - } - if (first_id.isNull()) - { - return FALSE; - } - - result_id = first_id; - - if (identical) - { - gCacheName->getFullName(first_id, name); - } - else - { - name.assign( "(multiple)" ); - } - - return identical; -} - - -//----------------------------------------------------------------------------- -// selectGetOwner() -// Owner information only applies to roots. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name) -{ - BOOL identical = TRUE; - BOOL first = TRUE; - BOOL first_group_owned = FALSE; - LLUUID first_id; - for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); - iter != getSelection()->root_object_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - - if (first) - { - node->mPermissions->getOwnership(first_id, first_group_owned); - first = FALSE; - } - else - { - LLUUID owner_id; - BOOL is_group_owned = FALSE; - if (!(node->mPermissions->getOwnership(owner_id, is_group_owned)) - || owner_id != first_id || is_group_owned != first_group_owned) - { - identical = FALSE; - break; - } - } - } - if (first_id.isNull()) - { - return FALSE; - } - - result_id = first_id; - - if (identical) - { - BOOL public_owner = (first_id.isNull() && !first_group_owned); - if (first_group_owned) - { - name.assign( "(Group Owned)"); - } - else if(!public_owner) - { - gCacheName->getFullName(first_id, name); - } - else - { - name.assign("Public"); - } - } - else - { - name.assign( "(multiple)" ); - } - - return identical; -} - - -//----------------------------------------------------------------------------- -// selectGetLastOwner() -// Owner information only applies to roots. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name) -{ - BOOL identical = TRUE; - BOOL first = TRUE; - LLUUID first_id; - for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); - iter != getSelection()->root_object_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - - if (first) - { - first_id = node->mPermissions->getLastOwner(); - first = FALSE; - } - else - { - if ( !(first_id == node->mPermissions->getLastOwner() ) ) - { - identical = FALSE; - break; - } - } - } - if (first_id.isNull()) - { - return FALSE; - } - - result_id = first_id; - - if (identical) - { - BOOL public_owner = (first_id.isNull()); - if(!public_owner) - { - gCacheName->getFullName(first_id, name); - } - else - { - name.assign("Public or Group"); - } - } - else - { - name.assign( "" ); - } - - return identical; -} - - -//----------------------------------------------------------------------------- -// selectGetGroup() -// Group information only applies to roots. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id) -{ - BOOL identical = TRUE; - BOOL first = TRUE; - LLUUID first_id; - for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); - iter != getSelection()->root_object_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - - if (first) - { - first_id = node->mPermissions->getGroup(); - first = FALSE; - } - else - { - if ( !(first_id == node->mPermissions->getGroup() ) ) - { - identical = FALSE; - break; - } - } - } - - result_id = first_id; - - return identical; -} - -//----------------------------------------------------------------------------- -// selectIsGroupOwned() -// Only operates on root nodes. -// Returns TRUE if all have valid data and they are all group owned. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectIsGroupOwned() -{ - BOOL found_one = FALSE; - for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); - iter != getSelection()->root_object_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - found_one = TRUE; - if (!node->mPermissions->isGroupOwned()) - { - return FALSE; - } - } - return found_one ? TRUE : FALSE; -} - -//----------------------------------------------------------------------------- -// selectGetPerm() -// Only operates on root nodes. -// Returns TRUE if all have valid data. -// mask_on has bits set to TRUE where all permissions are TRUE -// mask_off has bits set to TRUE where all permissions are FALSE -// if a bit is off both in mask_on and mask_off, the values differ within -// the selection. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off) -{ - U32 mask; - U32 mask_and = 0xffffffff; - U32 mask_or = 0x00000000; - BOOL all_valid = FALSE; - - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++) - { - LLSelectNode* node = *iter; - - if (!node->mValid) - { - all_valid = FALSE; - break; - } - - all_valid = TRUE; - - switch( which_perm ) - { - case PERM_BASE: - mask = node->mPermissions->getMaskBase(); - break; - case PERM_OWNER: - mask = node->mPermissions->getMaskOwner(); - break; - case PERM_GROUP: - mask = node->mPermissions->getMaskGroup(); - break; - case PERM_EVERYONE: - mask = node->mPermissions->getMaskEveryone(); - break; - case PERM_NEXT_OWNER: - mask = node->mPermissions->getMaskNextOwner(); - break; - default: - mask = 0x0; - break; - } - mask_and &= mask; - mask_or |= mask; - } - - if (all_valid) - { - // ...TRUE through all ANDs means all TRUE - *mask_on = mask_and; - - // ...FALSE through all ORs means all FALSE - *mask_off = ~mask_or; - return TRUE; - } - else - { - *mask_on = 0; - *mask_off = 0; - return FALSE; - } -} - - - -BOOL LLSelectMgr::selectGetOwnershipCost(S32* out_cost) -{ - return mSelectedObjects->getOwnershipCost(*out_cost); -} - -BOOL LLSelectMgr::selectGetPermissions(LLPermissions& result_perm) -{ - BOOL first = TRUE; - LLPermissions perm; - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - - if (first) - { - perm = *(node->mPermissions); - first = FALSE; - } - else - { - perm.accumulate(*(node->mPermissions)); - } - } - - result_perm = perm; - - return TRUE; -} - - -void LLSelectMgr::selectDelete() -{ - S32 deleteable_count = 0; - - BOOL locked_but_deleteable_object = FALSE; - BOOL no_copy_but_deleteable_object = FALSE; - BOOL all_owned_by_you = TRUE; - - for (LLObjectSelection::iterator iter = getSelection()->begin(); - iter != getSelection()->end(); iter++) - { - LLViewerObject* obj = (*iter)->getObject(); - - if( obj->isAttachment() ) - { - continue; - } - - deleteable_count++; - - // Check to see if you can delete objects which are locked. - if(!obj->permMove()) - { - locked_but_deleteable_object = TRUE; - } - if(!obj->permCopy()) - { - no_copy_but_deleteable_object = TRUE; - } - if(!obj->permYouOwner()) - { - all_owned_by_you = FALSE; - } - } - - if( 0 == deleteable_count ) - { - make_ui_sound("UISndInvalidOp"); - return; - } - - LLNotification::Params params("ConfirmObjectDeleteLock"); - params.functor(boost::bind(&LLSelectMgr::confirmDelete, _1, _2, getSelection())); - - if(locked_but_deleteable_object || - no_copy_but_deleteable_object || - !all_owned_by_you) - { - // convert any transient pie-menu selections to full selection so this operation - // has some context - // NOTE: if user cancels delete operation, this will potentially leave objects selected outside of build mode - // but this is ok, if not ideal - convertTransient(); - - //This is messy, but needed to get all english our of the UI. - if(locked_but_deleteable_object && !no_copy_but_deleteable_object && all_owned_by_you) - { - //Locked only - params.name("ConfirmObjectDeleteLock"); - } - else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you) - { - //No Copy only - params.name("ConfirmObjectDeleteNoCopy"); - } - else if(!locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you) - { - //not owned only - params.name("ConfirmObjectDeleteNoOwn"); - } - else if(locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you) - { - //locked and no copy - params.name("ConfirmObjectDeleteLockNoCopy"); - } - else if(locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you) - { - //locked and not owned - params.name("ConfirmObjectDeleteLockNoOwn"); - } - else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && !all_owned_by_you) - { - //no copy and not owned - params.name("ConfirmObjectDeleteNoCopyNoOwn"); - } - else - { - //locked, no copy and not owned - params.name("ConfirmObjectDeleteLockNoCopyNoOwn"); - } - - LLNotifications::instance().add(params); - } - else - { - LLNotifications::instance().forceResponse(params, 0); - } -} - -// static -bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - if (!handle->getObjectCount()) - { - llwarns << "Nothing to delete!" << llendl; - return false; - } - - switch(option) - { - case 0: - { - // TODO: Make sure you have delete permissions on all of them. - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); - // attempt to derez into the trash. - LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id); - LLSelectMgr::getInstance()->sendListToRegions("DeRezObject", - packDeRezHeader, - packObjectLocalID, - (void*)info, - SEND_ONLY_ROOTS); - // VEFFECT: Delete Object - one effect for all deletes - if(!gSavedSettings.getBOOL("DisablePointAtAndBeam")) - { - if (LLSelectMgr::getInstance()->mSelectedObjects->mSelectType != SELECT_TYPE_HUD) - { - LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); - effectp->setPositionGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal() ); - effectp->setColor(LLColor4U(gAgent.getEffectColor())); - F32 duration = 0.5f; - duration += LLSelectMgr::getInstance()->mSelectedObjects->getObjectCount() / 64.f; - effectp->setDuration(duration); - } - } - - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); - - // Keep track of how many objects have been deleted. - F64 obj_delete_count = LLViewerStats::getInstance()->getStat(LLViewerStats::ST_OBJECT_DELETE_COUNT); - obj_delete_count += LLSelectMgr::getInstance()->mSelectedObjects->getObjectCount(); - LLViewerStats::getInstance()->setStat(LLViewerStats::ST_OBJECT_DELETE_COUNT, obj_delete_count ); - } - break; - case 1: - default: - break; - } - return false; -} - - -void LLSelectMgr::selectForceDelete() -{ - sendListToRegions( - "ObjectDelete", - packDeleteHeader, - packObjectLocalID, - (void*)TRUE, - SEND_ONLY_ROOTS); -} - -void LLSelectMgr::selectGetAggregateSaleInfo(U32 &num_for_sale, - BOOL &is_for_sale_mixed, - BOOL &is_sale_price_mixed, - S32 &total_sale_price, - S32 &individual_sale_price) -{ - num_for_sale = 0; - is_for_sale_mixed = FALSE; - is_sale_price_mixed = FALSE; - total_sale_price = 0; - individual_sale_price = 0; - - - // Empty set. - if (getSelection()->root_begin() == getSelection()->root_end()) - return; - - LLSelectNode *node = *(getSelection()->root_begin()); - const BOOL first_node_for_sale = node->mSaleInfo.isForSale(); - const S32 first_node_sale_price = node->mSaleInfo.getSalePrice(); - - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++) - { - LLSelectNode* node = *iter; - const BOOL node_for_sale = node->mSaleInfo.isForSale(); - const S32 node_sale_price = node->mSaleInfo.getSalePrice(); - - // Set mixed if the fields don't match the first node's fields. - if (node_for_sale != first_node_for_sale) - is_for_sale_mixed = TRUE; - if (node_sale_price != first_node_sale_price) - is_sale_price_mixed = TRUE; - - if (node_for_sale) - { - total_sale_price += node_sale_price; - num_for_sale ++; - } - } - - individual_sale_price = first_node_sale_price; - if (is_for_sale_mixed) - { - is_sale_price_mixed = TRUE; - individual_sale_price = 0; - } -} - -// returns TRUE if all nodes are valid. method also stores an -// accumulated sale info. -BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& result_sale_info) -{ - BOOL first = TRUE; - LLSaleInfo sale_info; - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - - if (first) - { - sale_info = node->mSaleInfo; - first = FALSE; - } - else - { - sale_info.accumulate(node->mSaleInfo); - } - } - - result_sale_info = sale_info; - - return TRUE; -} - -BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& result_perm) -{ - BOOL first = TRUE; - LLAggregatePermissions perm; - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - - if (first) - { - perm = node->mAggregatePerm; - first = FALSE; - } - else - { - perm.aggregate(node->mAggregatePerm); - } - } - - result_perm = perm; - - return TRUE; -} - -BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& result_perm) -{ - BOOL first = TRUE; - LLAggregatePermissions perm; - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mValid) - { - return FALSE; - } - - LLAggregatePermissions t_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm; - if (first) - { - perm = t_perm; - first = FALSE; - } - else - { - perm.aggregate(t_perm); - } - } - - result_perm = perm; - - return TRUE; -} - - -//-------------------------------------------------------------------- -// Duplicate objects -//-------------------------------------------------------------------- - -// JC - If this doesn't work right, duplicate the selection list -// before doing anything, do a deselect, then send the duplicate -// messages. -struct LLDuplicateData -{ - LLVector3 offset; - U32 flags; -}; - -void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy) -{ - if (mSelectedObjects->isAttachment()) - { - //RN: do not duplicate attachments - make_ui_sound("UISndInvalidOp"); - return; - } - LLDuplicateData data; - - data.offset = offset; - data.flags = (select_copy ? FLAGS_CREATE_SELECTED : 0x0); - - sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS); - - if (select_copy) - { - // the new copy will be coming in selected - deselectAll(); - } - else - { - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - node->mDuplicated = TRUE; - node->mDuplicatePos = node->getObject()->getPositionGlobal(); - node->mDuplicateRot = node->getObject()->getRotation(); - } - } -} - -void LLSelectMgr::repeatDuplicate() -{ - if (mSelectedObjects->isAttachment()) - { - //RN: do not duplicate attachments - make_ui_sound("UISndInvalidOp"); - return; - } - - std::vector non_duplicated_objects; - - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (!node->mDuplicated) - { - non_duplicated_objects.push_back(node->getObject()); - } - } - - // make sure only previously duplicated objects are selected - for (std::vector::iterator iter = non_duplicated_objects.begin(); - iter != non_duplicated_objects.end(); ++iter) - { - LLViewerObject* objectp = *iter; - deselectObjectAndFamily(objectp); - } - - // duplicate objects in place - LLDuplicateData data; - - data.offset = LLVector3::zero; - data.flags = 0x0; - - sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS); - - // move current selection based on delta from duplication position and update duplication position - for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); - iter != getSelection()->root_end(); iter++ ) - { - LLSelectNode* node = *iter; - if (node->mDuplicated) - { - LLQuaternion cur_rot = node->getObject()->getRotation(); - LLQuaternion rot_delta = (~node->mDuplicateRot * cur_rot); - LLQuaternion new_rot = cur_rot * rot_delta; - LLVector3d cur_pos = node->getObject()->getPositionGlobal(); - LLVector3d new_pos = cur_pos + ((cur_pos - node->mDuplicatePos) * rot_delta); - - node->mDuplicatePos = node->getObject()->getPositionGlobal(); - node->mDuplicateRot = node->getObject()->getRotation(); - node->getObject()->setPositionGlobal(new_pos); - node->getObject()->setRotation(new_rot); - } - } - - sendMultipleUpdate(UPD_ROTATION | UPD_POSITION); -} - -// static -void LLSelectMgr::packDuplicate( LLSelectNode* node, void *duplicate_data ) -{ - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID()); -} - - -//-------------------------------------------------------------------- -// Duplicate On Ray -//-------------------------------------------------------------------- - -// Duplicates the selected objects, but places the copy along a cast -// ray. -struct LLDuplicateOnRayData -{ - LLVector3 mRayStartRegion; - LLVector3 mRayEndRegion; - BOOL mBypassRaycast; - BOOL mRayEndIsIntersection; - LLUUID mRayTargetID; - BOOL mCopyCenters; - BOOL mCopyRotates; - U32 mFlags; -}; - -void LLSelectMgr::selectDuplicateOnRay(const LLVector3 &ray_start_region, - const LLVector3 &ray_end_region, - BOOL bypass_raycast, - BOOL ray_end_is_intersection, - const LLUUID &ray_target_id, - BOOL copy_centers, - BOOL copy_rotates, - BOOL select_copy) -{ - if (mSelectedObjects->isAttachment()) - { - // do not duplicate attachments - make_ui_sound("UISndInvalidOp"); - return; - } - - LLDuplicateOnRayData data; - - data.mRayStartRegion = ray_start_region; - data.mRayEndRegion = ray_end_region; - data.mBypassRaycast = bypass_raycast; - data.mRayEndIsIntersection = ray_end_is_intersection; - data.mRayTargetID = ray_target_id; - data.mCopyCenters = copy_centers; - data.mCopyRotates = copy_rotates; - data.mFlags = (select_copy ? FLAGS_CREATE_SELECTED : 0x0); - - sendListToRegions("ObjectDuplicateOnRay", - packDuplicateOnRayHead, packObjectLocalID, &data, SEND_ONLY_ROOTS); - - if (select_copy) - { - // the new copy will be coming in selected - deselectAll(); - } -} - -// static -void LLSelectMgr::packDuplicateOnRayHead(void *user_data) -{ - LLMessageSystem *msg = gMessageSystem; - LLDuplicateOnRayData *data = (LLDuplicateOnRayData *)user_data; - - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID() ); - msg->addVector3Fast(_PREHASH_RayStart, data->mRayStartRegion ); - msg->addVector3Fast(_PREHASH_RayEnd, data->mRayEndRegion ); - msg->addBOOLFast(_PREHASH_BypassRaycast, data->mBypassRaycast ); - msg->addBOOLFast(_PREHASH_RayEndIsIntersection, data->mRayEndIsIntersection ); - msg->addBOOLFast(_PREHASH_CopyCenters, data->mCopyCenters ); - msg->addBOOLFast(_PREHASH_CopyRotates, data->mCopyRotates ); - msg->addUUIDFast(_PREHASH_RayTargetID, data->mRayTargetID ); - msg->addU32Fast(_PREHASH_DuplicateFlags, data->mFlags ); -} - - - -//------------------------------------------------------------------------ -// Object position, scale, rotation update, all-in-one -//------------------------------------------------------------------------ - -void LLSelectMgr::sendMultipleUpdate(U32 type) -{ - if (type == UPD_NONE) return; - // send individual updates when selecting textures or individual objects - ESendType send_type = (!gSavedSettings.getBOOL("EditLinkedParts") && !getTEMode()) ? SEND_ONLY_ROOTS : SEND_ROOTS_FIRST; - if (send_type == SEND_ONLY_ROOTS) - { - // tell simulator to apply to whole linked sets - type |= UPD_LINKED_SETS; - } - - sendListToRegions( - "MultipleObjectUpdate", - packAgentAndSessionID, - packMultipleUpdate, - &type, - send_type); -} - -// static -void LLSelectMgr::packMultipleUpdate(LLSelectNode* node, void *user_data) -{ - LLViewerObject* object = node->getObject(); - U32 *type32 = (U32 *)user_data; - U8 type = (U8)*type32; - U8 data[256]; - - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() ); - gMessageSystem->addU8Fast(_PREHASH_Type, type ); - - S32 offset = 0; - - // JC: You MUST pack the data in this order. The receiving - // routine process_multiple_update_message on simulator will - // extract them in this order. - - if (type & UPD_POSITION) - { - htonmemcpy(&data[offset], &(object->getPosition().mV), MVT_LLVector3, 12); - offset += 12; - } - if (type & UPD_ROTATION) - { - LLQuaternion quat = object->getRotation(); - LLVector3 vec = quat.packToVector3(); - htonmemcpy(&data[offset], &(vec.mV), MVT_LLQuaternion, 12); - offset += 12; - } - if (type & UPD_SCALE) - { - //llinfos << "Sending object scale " << object->getScale() << llendl; - htonmemcpy(&data[offset], &(object->getScale().mV), MVT_LLVector3, 12); - offset += 12; - } - gMessageSystem->addBinaryDataFast(_PREHASH_Data, data, offset); -} - -//------------------------------------------------------------------------ -// Ownership -//------------------------------------------------------------------------ -struct LLOwnerData -{ - LLUUID owner_id; - LLUUID group_id; - BOOL override; -}; - -void LLSelectMgr::sendOwner(const LLUUID& owner_id, - const LLUUID& group_id, - BOOL override) -{ - LLOwnerData data; - - data.owner_id = owner_id; - data.group_id = group_id; - data.override = override; - - sendListToRegions("ObjectOwner", packOwnerHead, packObjectLocalID, &data, SEND_ONLY_ROOTS); -} - -// static -void LLSelectMgr::packOwnerHead(void *user_data) -{ - LLOwnerData *data = (LLOwnerData *)user_data; - - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - gMessageSystem->nextBlockFast(_PREHASH_HeaderData); - gMessageSystem->addBOOLFast(_PREHASH_Override, data->override); - gMessageSystem->addUUIDFast(_PREHASH_OwnerID, data->owner_id); - gMessageSystem->addUUIDFast(_PREHASH_GroupID, data->group_id); -} - -//------------------------------------------------------------------------ -// Group -//------------------------------------------------------------------------ - -void LLSelectMgr::sendGroup(const LLUUID& group_id) -{ - LLUUID local_group_id(group_id); - sendListToRegions("ObjectGroup", packAgentAndSessionAndGroupID, packObjectLocalID, &local_group_id, SEND_ONLY_ROOTS); -} - - -//------------------------------------------------------------------------ -// Buy -//------------------------------------------------------------------------ - -struct LLBuyData -{ - std::vector mObjectsSent; - LLUUID mCategoryID; - LLSaleInfo mSaleInfo; -}; - -// *NOTE: does not work for multiple object buy, which UI does not -// currently support sale info is used for verification only, if it -// doesn't match region info then sale is canceled Need to get sale -// info -as displayed in the UI- for every item. -void LLSelectMgr::sendBuy(const LLUUID& buyer_id, const LLUUID& category_id, const LLSaleInfo sale_info) -{ - LLBuyData buy; - buy.mCategoryID = category_id; - buy.mSaleInfo = sale_info; - sendListToRegions("ObjectBuy", packAgentGroupAndCatID, packBuyObjectIDs, &buy, SEND_ONLY_ROOTS); -} - -// static -void LLSelectMgr::packBuyObjectIDs(LLSelectNode* node, void* data) -{ - LLBuyData* buy = (LLBuyData*)data; - - LLViewerObject* object = node->getObject(); - if (std::find(buy->mObjectsSent.begin(), buy->mObjectsSent.end(), object) == buy->mObjectsSent.end()) - { - buy->mObjectsSent.push_back(object); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() ); - gMessageSystem->addU8Fast(_PREHASH_SaleType, buy->mSaleInfo.getSaleType()); - gMessageSystem->addS32Fast(_PREHASH_SalePrice, buy->mSaleInfo.getSalePrice()); - } -} - -//------------------------------------------------------------------------ -// Permissions -//------------------------------------------------------------------------ - -struct LLPermData -{ - U8 mField; - BOOL mSet; - U32 mMask; - BOOL mOverride; -}; - -// TODO: Make this able to fail elegantly. -void LLSelectMgr::selectionSetObjectPermissions(U8 field, - BOOL set, - U32 mask, - BOOL override) -{ - LLPermData data; - - data.mField = field; - data.mSet = set; - data.mMask = mask; - data.mOverride = override; - - sendListToRegions("ObjectPermissions", packPermissionsHead, packPermissions, &data, SEND_ONLY_ROOTS); -} - -void LLSelectMgr::packPermissionsHead(void* user_data) -{ - LLPermData* data = (LLPermData*)user_data; - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_HeaderData); - gMessageSystem->addBOOLFast(_PREHASH_Override, data->mOverride); -} - - -// Now that you've added a bunch of objects, send a select message -// on the entire list for efficiency. -/* -void LLSelectMgr::sendSelect() -{ - llerrs << "Not implemented" << llendl; -} -*/ - -void LLSelectMgr::deselectAll() -{ - if (!mSelectedObjects->getNumNodes()) - { - return; - } - - // Zap the angular velocity, as the sim will set it to zero - for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); - iter != mSelectedObjects->end(); iter++ ) - { - LLViewerObject *objectp = (*iter)->getObject(); - objectp->setAngularVelocity( 0,0,0 ); - objectp->setVelocity( 0,0,0 ); - } - - sendListToRegions( - "ObjectDeselect", - packAgentAndSessionID, - packObjectLocalID, - NULL, - SEND_INDIVIDUALS); - - removeAll(); - - mLastSentSelectionCenterGlobal.clearVec(); - - updatePointAt(); -} - -void LLSelectMgr::deselectAllForStandingUp() -{ - /* - This function is similar deselectAll() except for the first if statement - which was removed. This is needed as a workaround for DEV-2854 - */ - - // Zap the angular velocity, as the sim will set it to zero - for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); - iter != mSelectedObjects->end(); iter++ ) - { - LLViewerObject *objectp = (*iter)->getObject(); - objectp->setAngularVelocity( 0,0,0 ); - objectp->setVelocity( 0,0,0 ); - } - - sendListToRegions( - "ObjectDeselect", - packAgentAndSessionID, - packObjectLocalID, - NULL, - SEND_INDIVIDUALS); - - removeAll(); - - mLastSentSelectionCenterGlobal.clearVec(); - - updatePointAt(); -} - -void LLSelectMgr::deselectUnused() -{ - // no more outstanding references to this selection - if (mSelectedObjects->getNumRefs() == 1) - { - deselectAll(); - } -} - - -void LLSelectMgr::convertTransient() -{ - LLObjectSelection::iterator node_it; - for (node_it = mSelectedObjects->begin(); node_it != mSelectedObjects->end(); ++node_it) - { - LLSelectNode *nodep = *node_it; - nodep->setTransient(FALSE); - } -} - - -void LLSelectMgr::deselectAllIfTooFar() -{ - if (mSelectedObjects->isEmpty() || mSelectedObjects->mSelectType == SELECT_TYPE_HUD) - { - return; - } - -// [RLVa:KB] - Checked: 2010-01-02 (RLVa-1.1.0l) | Modified: RLVa-1.1.0l -#ifdef RLV_EXTENSION_CMD_INTERACT - // [Fall-back code] Don't allow an active selection (except for HUD attachments - see above) when @interact=n restricted - if (gRlvHandler.hasBehaviour(RLV_BHVR_INTERACT)) - { - deselectAll(); - return; - } -#endif // RLV_EXTENSION_CMD_INTERACT -// [/RLVa:KB] - - // HACK: Don't deselect when we're navigating to rate an object's - // owner or creator. JC - if (gPieObject->getVisible() || gPieRate->getVisible() ) - { - return; - } - - LLVector3d selectionCenter = getSelectionCenterGlobal(); - -// if (gSavedSettings.getBOOL("LimitSelectDistance") -// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f - BOOL fRlvFartouch = gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH) && gFloaterTools->getVisible(); - if ( (gSavedSettings.getBOOL("LimitSelectDistance") || (fRlvFartouch) ) -// [/RLVa:KB] - && (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar()) - && !mSelectedObjects->isAttachment() - && !selectionCenter.isExactlyZero()) - { -// F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance"); -// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f - F32 deselect_dist = (!fRlvFartouch) ? gSavedSettings.getF32("MaxSelectDistance") : 1.5f; -// [/RLVa:KB] - F32 deselect_dist_sq = deselect_dist * deselect_dist; - - LLVector3d select_delta = gAgent.getPositionGlobal() - selectionCenter; - F32 select_dist_sq = (F32) select_delta.magVecSquared(); - - if (select_dist_sq > deselect_dist_sq) - { - if (gDebugSelectMgr) - { - llinfos << "Selection manager: auto-deselecting, select_dist = " << fsqrtf(select_dist_sq) << llendl; - llinfos << "agent pos global = " << gAgent.getPositionGlobal() << llendl; - llinfos << "selection pos global = " << selectionCenter << llendl; - } - - deselectAll(); - } - } -} - -void LLSelectMgr::selectionSetObjectName(const std::string& name) -{ - // we only work correctly if 1 object is selected. - if(mSelectedObjects->getRootObjectCount() == 1) - { - sendListToRegions("ObjectName", - packAgentAndSessionID, - packObjectName, - (void*)(new std::string(name)), - SEND_ONLY_ROOTS); - } - else if(mSelectedObjects->getObjectCount() == 1) - { - sendListToRegions("ObjectName", - packAgentAndSessionID, - packObjectName, - (void*)(new std::string(name)), - SEND_INDIVIDUALS); - } -} - -void LLSelectMgr::selectionSetObjectDescription(const std::string& desc) -{ - // we only work correctly if 1 object is selected. - if(mSelectedObjects->getRootObjectCount() == 1) - { - sendListToRegions("ObjectDescription", - packAgentAndSessionID, - packObjectDescription, - (void*)(new std::string(desc)), - SEND_ONLY_ROOTS); - } - else if(mSelectedObjects->getObjectCount() == 1) - { - sendListToRegions("ObjectDescription", - packAgentAndSessionID, - packObjectDescription, - (void*)(new std::string(desc)), - SEND_INDIVIDUALS); - } -} - -void LLSelectMgr::selectionSetObjectCategory(const LLCategory& category) -{ - // for now, we only want to be able to set one root category at - // a time. - if(mSelectedObjects->getRootObjectCount() != 1) return; - sendListToRegions("ObjectCategory", - packAgentAndSessionID, - packObjectCategory, - (void*)(&category), - SEND_ONLY_ROOTS); -} - -void LLSelectMgr::selectionSetObjectSaleInfo(const LLSaleInfo& sale_info) -{ - sendListToRegions("ObjectSaleInfo", - packAgentAndSessionID, - packObjectSaleInfo, - (void*)(&sale_info), - SEND_ONLY_ROOTS); -} - -//---------------------------------------------------------------------- -// Attachments -//---------------------------------------------------------------------- - -void LLSelectMgr::sendAttach(U8 attachment_point) -{ - LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject(); - - if (!attach_object || !isAgentAvatarValid() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD) - { - return; - } - - BOOL build_mode = LLToolMgr::getInstance()->inEdit(); - // Special case: Attach to default location for this object. - if (0 == attachment_point || - get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, (S32)attachment_point, (LLViewerJointAttachment*)NULL)) - { - if (attachment_point != 0 && gHippoGridManager->getConnectedGrid()->supportsInvLinks()) - { - // If we know the attachment point then we got here by clicking an - // "Attach to..." context menu item, so we should add, not replace. - attachment_point |= ATTACHMENT_ADD; - } - - sendListToRegions( - "ObjectAttach", - packAgentIDAndSessionAndAttachment, - packObjectIDAndRotation, - &attachment_point, - SEND_ONLY_ROOTS ); - if (!build_mode) - { - deselectAll(); - } - } -} - -void LLSelectMgr::sendDetach() -{ - if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD) - { - return; - } - - sendListToRegions( - "ObjectDetach", - packAgentAndSessionID, - packObjectLocalID, - NULL, - SEND_ONLY_ROOTS ); -} - - -void LLSelectMgr::sendDropAttachment() -{ - if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD) - { - return; - } - - sendListToRegions( - "ObjectDrop", - packAgentAndSessionID, - packObjectLocalID, - NULL, - SEND_ONLY_ROOTS); -} - -//---------------------------------------------------------------------- -// Links -//---------------------------------------------------------------------- - -void LLSelectMgr::sendLink() -{ - if (!mSelectedObjects->getNumNodes()) - { - return; - } - - sendListToRegions( - "ObjectLink", - packAgentAndSessionID, - packObjectLocalID, - NULL, - SEND_ONLY_ROOTS); -} - -void LLSelectMgr::sendDelink() -{ - if (!mSelectedObjects->getNumNodes()) - { - return; - } - - // Delink needs to send individuals so you can unlink a single object from - // a linked set. - sendListToRegions( - "ObjectDelink", - packAgentAndSessionID, - packObjectLocalID, - NULL, - SEND_INDIVIDUALS); -} - - -//---------------------------------------------------------------------- -// Hinges -//---------------------------------------------------------------------- - -/* -void LLSelectMgr::sendHinge(U8 type) -{ - if (!mSelectedObjects->getNumNodes()) - { - return; - } - - sendListToRegions( - "ObjectHinge", - packHingeHead, - packObjectLocalID, - &type, - SEND_ONLY_ROOTS); -} - - -void LLSelectMgr::sendDehinge() -{ - if (!mSelectedObjects->getNumNodes()) - { - return; - } - - sendListToRegions( - "ObjectDehinge", - packAgentAndSessionID, - packObjectLocalID, - NULL, - SEND_ONLY_ROOTS); -}*/ - -void LLSelectMgr::sendSelect() -{ - if (!mSelectedObjects->getNumNodes()) - { - return; - } - - sendListToRegions( - "ObjectSelect", - packAgentAndSessionID, - packObjectLocalID, - NULL, - SEND_INDIVIDUALS); -} - -// static -void LLSelectMgr::packHingeHead(void *user_data) -{ - U8 *type = (U8 *)user_data; - - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - gMessageSystem->nextBlockFast(_PREHASH_JointType); - gMessageSystem->addU8Fast(_PREHASH_Type, *type ); -} - - -void LLSelectMgr::selectionDump() -{ - struct f : public LLSelectedObjectFunctor - { - virtual bool apply(LLViewerObject* object) - { - object->dump(); - return true; - } - } func; - getSelection()->applyToObjects(&func); -} - -void LLSelectMgr::saveSelectedObjectColors() -{ - struct f : public LLSelectedNodeFunctor - { - virtual bool apply(LLSelectNode* node) - { - node->saveColors(); - return true; - } - } func; - getSelection()->applyToNodes(&func); -} - -void LLSelectMgr::saveSelectedObjectTextures() -{ - // invalidate current selection so we update saved textures - struct f : public LLSelectedNodeFunctor - { - virtual bool apply(LLSelectNode* node) - { - node->mValid = FALSE; - return true; - } - } func; - getSelection()->applyToNodes(&func); - - // request object properties message to get updated permissions data - sendSelect(); -} - - -// This routine should be called whenever a drag is initiated. -// also need to know to which simulator to send update message -void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type) -{ - if (mSelectedObjects->isEmpty()) - { - // nothing selected, so nothing to save - return; - } - - struct f : public LLSelectedNodeFunctor - { - EActionType mActionType; - f(EActionType a) : mActionType(a) {} - virtual bool apply(LLSelectNode* selectNode) - { - LLViewerObject* object = selectNode->getObject(); - if (!object) - { - return true; // skip - } - selectNode->mSavedPositionLocal = object->getPosition(); - if (object->isAttachment()) - { - if (object->isRootEdit()) - { - LLXform* parent_xform = object->mDrawable->getXform()->getParent(); - if (parent_xform) - { - selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition()); - } - else - { - selectNode->mSavedPositionGlobal = object->getPositionGlobal(); - } - } - else - { - LLViewerObject* attachment_root = (LLViewerObject*)object->getParent(); - LLXform* parent_xform = attachment_root ? attachment_root->mDrawable->getXform()->getParent() : NULL; - if (parent_xform) - { - LLVector3 root_pos = (attachment_root->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition(); - LLQuaternion root_rot = (attachment_root->getRotation() * parent_xform->getWorldRotation()); - selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * root_rot) + root_pos); - } - else - { - selectNode->mSavedPositionGlobal = object->getPositionGlobal(); - } - } - selectNode->mSavedRotation = object->getRenderRotation(); - } - else - { - selectNode->mSavedPositionGlobal = object->getPositionGlobal(); - selectNode->mSavedRotation = object->getRotationRegion(); - } - - selectNode->mSavedScale = object->getScale(); - selectNode->saveTextureScaleRatios(); - return true; - } - } func(action_type); - getSelection()->applyToNodes(&func); - - mSavedSelectionBBox = getBBoxOfSelection(); -} - -struct LLSelectMgrApplyFlags : public LLSelectedObjectFunctor -{ - LLSelectMgrApplyFlags(U32 flags, BOOL state) : mFlags(flags), mState(state) {} - U32 mFlags; - BOOL mState; - virtual bool apply(LLViewerObject* object) - { - if ( object->permModify() && // preemptive permissions check - object->isRoot() && // don't send for child objects - !object->isJointChild()) - { - object->setFlags( mFlags, mState); - } - return true; - } -}; - -void LLSelectMgr::selectionUpdatePhysics(BOOL physics) -{ - LLSelectMgrApplyFlags func( FLAGS_USE_PHYSICS, physics); - getSelection()->applyToObjects(&func); -} - -void LLSelectMgr::selectionUpdateTemporary(BOOL is_temporary) -{ - LLSelectMgrApplyFlags func( FLAGS_TEMPORARY_ON_REZ, is_temporary); - getSelection()->applyToObjects(&func); -} - -void LLSelectMgr::selectionUpdatePhantom(BOOL is_phantom) -{ - LLSelectMgrApplyFlags func( FLAGS_PHANTOM, is_phantom); - getSelection()->applyToObjects(&func); -} - -void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows) -{ - LLSelectMgrApplyFlags func( FLAGS_CAST_SHADOWS, cast_shadows); - getSelection()->applyToObjects(&func); -} - - -//---------------------------------------------------------------------- -// Helpful packing functions for sendObjectMessage() -//---------------------------------------------------------------------- - -// static -void LLSelectMgr::packAgentIDAndSessionAndAttachment( void *user_data) -{ - U8 *attachment_point = (U8*)user_data; - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->addU8Fast(_PREHASH_AttachmentPoint, *attachment_point); -} - -// static -void LLSelectMgr::packAgentID( void *user_data) -{ - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); -} - -// static -void LLSelectMgr::packAgentAndSessionID(void* user_data) -{ - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -} - -// static -void LLSelectMgr::packAgentAndGroupID(void* user_data) -{ - LLOwnerData *data = (LLOwnerData *)user_data; - - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, data->owner_id ); - gMessageSystem->addUUIDFast(_PREHASH_GroupID, data->group_id ); -} - -// static -void LLSelectMgr::packAgentAndSessionAndGroupID(void* user_data) -{ - LLUUID* group_idp = (LLUUID*) user_data; - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->addUUIDFast(_PREHASH_GroupID, *group_idp); -} - -// static -void LLSelectMgr::packDuplicateHeader(void* data) -{ - LLUUID group_id(gAgent.getGroupID()); - packAgentAndSessionAndGroupID(&group_id); - - LLDuplicateData* dup_data = (LLDuplicateData*) data; - - gMessageSystem->nextBlockFast(_PREHASH_SharedData); - gMessageSystem->addVector3Fast(_PREHASH_Offset, dup_data->offset); - gMessageSystem->addU32Fast(_PREHASH_DuplicateFlags, dup_data->flags); -} - -// static -void LLSelectMgr::packDeleteHeader(void* userdata) -{ - BOOL force = (BOOL)(intptr_t)userdata; - - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->addBOOLFast(_PREHASH_Force, force); -} - -// static -void LLSelectMgr::packAgentGroupAndCatID(void* user_data) -{ - LLBuyData* buy = (LLBuyData*)user_data; - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); - gMessageSystem->addUUIDFast(_PREHASH_CategoryID, buy->mCategoryID); -} - -//static -void LLSelectMgr::packDeRezHeader(void* user_data) -{ - LLDeRezInfo* info = (LLDeRezInfo*)user_data; - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_AgentBlock); - gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); - gMessageSystem->addU8Fast(_PREHASH_Destination, (U8)info->mDestination); - gMessageSystem->addUUIDFast(_PREHASH_DestinationID, info->mDestinationID); - LLUUID tid; - tid.generate(); - gMessageSystem->addUUIDFast(_PREHASH_TransactionID, tid); - const U8 PACKET = 1; - gMessageSystem->addU8Fast(_PREHASH_PacketCount, PACKET); - gMessageSystem->addU8Fast(_PREHASH_PacketNumber, PACKET); -} - -// static -void LLSelectMgr::packObjectID(LLSelectNode* node, void *user_data) -{ - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addUUIDFast(_PREHASH_ObjectID, node->getObject()->mID ); -} - -void LLSelectMgr::packObjectIDAndRotation(LLSelectNode* node, void *user_data) -{ - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() ); - gMessageSystem->addQuatFast(_PREHASH_Rotation, node->getObject()->getRotation()); -} - -void LLSelectMgr::packObjectClickAction(LLSelectNode* node, void *user_data) -{ - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() ); - gMessageSystem->addU8("ClickAction", node->getObject()->getClickAction()); -} - -void LLSelectMgr::packObjectIncludeInSearch(LLSelectNode* node, void *user_data) -{ - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() ); - gMessageSystem->addBOOL("IncludeInSearch", node->getObject()->getIncludeInSearch()); -} - -// static -void LLSelectMgr::packObjectLocalID(LLSelectNode* node, void *) -{ - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID()); -} - -// static -void LLSelectMgr::packObjectName(LLSelectNode* node, void* user_data) -{ - const std::string* name = (const std::string*)user_data; - if(!name->empty()) - { - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); - gMessageSystem->addStringFast(_PREHASH_Name, *name); - } - delete name; -} - -// static -void LLSelectMgr::packObjectDescription(LLSelectNode* node, void* user_data) -{ - const std::string* desc = (const std::string*)user_data; - if(!desc->empty()) - { - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); - gMessageSystem->addStringFast(_PREHASH_Description, *desc); - } -} - -// static -void LLSelectMgr::packObjectCategory(LLSelectNode* node, void* user_data) -{ - LLCategory* category = (LLCategory*)user_data; - if(!category) return; - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); - category->packMessage(gMessageSystem); -} - -// static -void LLSelectMgr::packObjectSaleInfo(LLSelectNode* node, void* user_data) -{ - LLSaleInfo* sale_info = (LLSaleInfo*)user_data; - if(!sale_info) return; - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); - sale_info->packMessage(gMessageSystem); -} - -// static -void LLSelectMgr::packPhysics(LLSelectNode* node, void *user_data) -{ -} - -// static -void LLSelectMgr::packShape(LLSelectNode* node, void *user_data) -{ -} - -// static -void LLSelectMgr::packPermissions(LLSelectNode* node, void *user_data) -{ - LLPermData *data = (LLPermData *)user_data; - - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID()); - - gMessageSystem->addU8Fast(_PREHASH_Field, data->mField); - gMessageSystem->addBOOLFast(_PREHASH_Set, data->mSet); - gMessageSystem->addU32Fast(_PREHASH_Mask, data->mMask); -} - -// Utility function to send some information to every region containing -// an object on the selection list. We want to do this to reduce the total -// number of packets sent by the viewer. -void LLSelectMgr::sendListToRegions(const std::string& message_name, - void (*pack_header)(void *user_data), - void (*pack_body)(LLSelectNode* node, void *user_data), - void *user_data, - ESendType send_type) -{ - LLSelectNode* node; - LLViewerRegion* last_region; - LLViewerRegion* current_region; - - S32 objects_sent = 0; - S32 packets_sent = 0; - S32 objects_in_this_packet = 0; - - //clear update override data (allow next update through) - struct f : public LLSelectedNodeFunctor - { - virtual bool apply(LLSelectNode* node) - { - node->mLastPositionLocal.setVec(0,0,0); - node->mLastRotation = LLQuaternion(); - node->mLastScale.setVec(0,0,0); - return true; - } - } func; - getSelection()->applyToNodes(&func); - - std::queue nodes_to_send; - - struct push_all : public LLSelectedNodeFunctor - { - std::queue& nodes_to_send; - push_all(std::queue& n) : nodes_to_send(n) {} - virtual bool apply(LLSelectNode* node) - { - if (node->getObject()) - { - nodes_to_send.push(node); - } - return true; - } - }; - struct push_some : public LLSelectedNodeFunctor - { - std::queue& nodes_to_send; - bool mRoots; - push_some(std::queue& n, bool roots) : nodes_to_send(n), mRoots(roots) {} - virtual bool apply(LLSelectNode* node) - { - if (node->getObject()) - { - BOOL is_root = node->getObject()->isRootEdit(); - if ((mRoots && is_root) || (!mRoots && !is_root)) - { - nodes_to_send.push(node); - } - } - return true; - } - }; - struct push_all pushall(nodes_to_send); - struct push_some pushroots(nodes_to_send, TRUE); - struct push_some pushnonroots(nodes_to_send, FALSE); - - switch(send_type) - { - case SEND_ONLY_ROOTS: - if(message_name == "ObjectBuy") - getSelection()->applyToRootNodes(&pushroots); - else - getSelection()->applyToRootNodes(&pushall); - - break; - case SEND_INDIVIDUALS: - getSelection()->applyToNodes(&pushall); - break; - case SEND_ROOTS_FIRST: - // first roots... - getSelection()->applyToNodes(&pushroots); - // then children... - getSelection()->applyToNodes(&pushnonroots); - break; - case SEND_CHILDREN_FIRST: - // first children... - getSelection()->applyToNodes(&pushnonroots); - // then roots... - getSelection()->applyToNodes(&pushroots); - break; - - default: - llerrs << "Bad send type " << send_type << " passed to SendListToRegions()" << llendl; - } - - // bail if nothing selected - if (nodes_to_send.empty()) - { - return; - } - - node = nodes_to_send.front(); - nodes_to_send.pop(); - - // cache last region information - current_region = node->getObject()->getRegion(); - - // Start duplicate message - // CRO: this isn't - gMessageSystem->newMessage(message_name.c_str()); - (*pack_header)(user_data); - - // For each object - while (node != NULL) - { - // remember the last region, look up the current one - last_region = current_region; - current_region = node->getObject()->getRegion(); - - // if to same simulator and message not too big - if ((current_region == last_region) - && (! gMessageSystem->isSendFull(NULL)) - && (objects_in_this_packet < MAX_OBJECTS_PER_PACKET)) - { - // add another instance of the body of the data - (*pack_body)(node, user_data); - ++objects_sent; - ++objects_in_this_packet; - - // and on to the next object - if(nodes_to_send.empty()) - { - node = NULL; - } - else - { - node = nodes_to_send.front(); - nodes_to_send.pop(); - } - } - else - { - // otherwise send current message and start new one - gMessageSystem->sendReliable( last_region->getHost()); - packets_sent++; - objects_in_this_packet = 0; - - gMessageSystem->newMessage(message_name.c_str()); - (*pack_header)(user_data); - - // don't move to the next object, we still need to add the - // body data. - } - } - - // flush messages - if (gMessageSystem->getCurrentSendTotal() > 0) - { - gMessageSystem->sendReliable( current_region->getHost()); - packets_sent++; - } - else - { - gMessageSystem->clearMessage(); - } - - // llinfos << "sendListToRegions " << message_name << " obj " << objects_sent << " pkt " << packets_sent << llendl; -} - - -// -// Network communications -// - -void LLSelectMgr::requestObjectPropertiesFamily(LLViewerObject* object) -{ - // Remember that we asked the properties of this object. - sObjectPropertiesFamilyRequests.insert(object->mID); - //llinfos << "Registered an ObjectPropertiesFamily request for object " << object->mID << llendl; - - LLMessageSystem* msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_RequestObjectPropertiesFamily); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addU32Fast(_PREHASH_RequestFlags, 0x0 ); - msg->addUUIDFast(_PREHASH_ObjectID, object->mID ); - - LLViewerRegion* regionp = object->getRegion(); - msg->sendReliable( regionp->getHost() ); -} - - -// static -void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data) -{ - S32 i; - S32 count = msg->getNumberOfBlocksFast(_PREHASH_ObjectData); - for (i = 0; i < count; i++) - { - LLUUID id; - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, id, i); - - LLUUID creator_id; - LLUUID owner_id; - LLUUID group_id; - LLUUID last_owner_id; - U64 creation_date; - LLUUID extra_id; - U32 base_mask, owner_mask, group_mask, everyone_mask, next_owner_mask; - LLSaleInfo sale_info; - LLCategory category; - LLAggregatePermissions ag_perms; - LLAggregatePermissions ag_texture_perms; - LLAggregatePermissions ag_texture_perms_owner; - - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_CreatorID, creator_id, i); - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id, i); - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_GroupID, group_id, i); - msg->getU64Fast(_PREHASH_ObjectData, _PREHASH_CreationDate, creation_date, i); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_BaseMask, base_mask, i); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_OwnerMask, owner_mask, i); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_GroupMask, group_mask, i); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_EveryoneMask, everyone_mask, i); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_NextOwnerMask, next_owner_mask, i); - sale_info.unpackMultiMessage(msg, _PREHASH_ObjectData, i); - - ag_perms.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePerms, i); - ag_texture_perms.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePermTextures, i); - ag_texture_perms_owner.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePermTexturesOwner, i); - category.unpackMultiMessage(msg, _PREHASH_ObjectData, i); - - S16 inv_serial = 0; - msg->getS16Fast(_PREHASH_ObjectData, _PREHASH_InventorySerial, inv_serial, i); - - LLUUID item_id; - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ItemID, item_id, i); - LLUUID folder_id; - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FolderID, folder_id, i); - LLUUID from_task_id; - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FromTaskID, from_task_id, i); - - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id, i); - - std::string name; - msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, name, i); - std::string desc; - msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc, i); - - std::string touch_name; - msg->getStringFast(_PREHASH_ObjectData, _PREHASH_TouchName, touch_name, i); - std::string sit_name; - msg->getStringFast(_PREHASH_ObjectData, _PREHASH_SitName, sit_name, i); - - //unpack TE IDs - std::vector texture_ids; - S32 size = msg->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_TextureID); - if (size > 0) - { - S8 packed_buffer[SELECT_MAX_TES * UUID_BYTES]; - msg->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureID, packed_buffer, 0, i, SELECT_MAX_TES * UUID_BYTES); - - for (S32 buf_offset = 0; buf_offset < size; buf_offset += UUID_BYTES) - { - LLUUID tid; - memcpy(tid.mData, packed_buffer + buf_offset, UUID_BYTES); /* Flawfinder: ignore */ - texture_ids.push_back(tid); - } - } - - // Iterate through nodes at end, since it can be on both the regular AND hover list - struct f : public LLSelectedNodeFunctor - { - LLUUID mID; - f(const LLUUID& id) : mID(id) {} - virtual bool apply(LLSelectNode* node) - { - return (node->getObject() && node->getObject()->mID == mID); - } - } func(id); - LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func); - - if (node) - { - if (node->mInventorySerial != inv_serial) - { - node->getObject()->dirtyInventory(); - } - - // save texture data as soon as we get texture perms first time - if (!node->mValid) - { - BOOL can_copy = FALSE; - BOOL can_transfer = FALSE; - - LLAggregatePermissions::EValue value = LLAggregatePermissions::AP_NONE; - if(node->getObject()->permYouOwner()) - { - value = ag_texture_perms_owner.getValue(PERM_COPY); - if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL) - { - can_copy = TRUE; - } - value = ag_texture_perms_owner.getValue(PERM_TRANSFER); - if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL) - { - can_transfer = TRUE; - } - } - else - { - value = ag_texture_perms.getValue(PERM_COPY); - if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL) - { - can_copy = TRUE; - } - value = ag_texture_perms.getValue(PERM_TRANSFER); - if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL) - { - can_transfer = TRUE; - } - } - - if (can_copy && can_transfer) - { - // this should be the only place that saved textures is called - node->saveTextures(texture_ids); - } - } - - node->mValid = TRUE; - node->mPermissions->init(creator_id, owner_id, - last_owner_id, group_id); - node->mPermissions->initMasks(base_mask, owner_mask, everyone_mask, group_mask, next_owner_mask); - node->mCreationDate = creation_date; - node->mItemID = item_id; - node->mFolderID = folder_id; - node->mFromTaskID = from_task_id; - node->mName.assign(name); - node->mDescription.assign(desc); - node->mSaleInfo = sale_info; - node->mAggregatePerm = ag_perms; - node->mAggregateTexturePerm = ag_texture_perms; - node->mAggregateTexturePermOwner = ag_texture_perms_owner; - node->mCategory = category; - node->mInventorySerial = inv_serial; - node->mSitName.assign(sit_name); - node->mTouchName.assign(touch_name); - } - } - - dialog_refresh_all(); - - // silly hack to allow 'save into inventory' - if(gPopupMenuView->getVisible()) - { - gPopupMenuView->setItemEnabled(SAVE_INTO_INVENTORY, - enable_save_into_inventory(NULL)); - } - - // hack for left-click buy object - LLToolPie::selectionPropertiesReceived(); -} - -// static -void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** user_data) -{ - U32 request_flags; - LLUUID id; - LLUUID creator_id; - LLUUID owner_id; - LLUUID group_id; - LLUUID extra_id; - U32 base_mask, owner_mask, group_mask, everyone_mask, next_owner_mask; - LLSaleInfo sale_info; - LLCategory category; - - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_RequestFlags, request_flags ); - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, id ); - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id ); - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_GroupID, group_id ); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_BaseMask, base_mask ); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_OwnerMask, owner_mask ); - msg->getU32Fast(_PREHASH_ObjectData,_PREHASH_GroupMask, group_mask ); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_EveryoneMask, everyone_mask ); - msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_NextOwnerMask, next_owner_mask); - sale_info.unpackMessage(msg, _PREHASH_ObjectData); - category.unpackMessage(msg, _PREHASH_ObjectData); - - LLUUID last_owner_id; - msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id ); - - // unpack name & desc - std::string name; - msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, name); - - std::string desc; - msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc); - - //llinfos << "Got ObjectPropertiesFamily reply for object " << id << llendl; - if(sObjectPropertiesFamilyRequests.count(id) != 0 ) - { - // Send to export floaters - //LLFloaterExport::receiveObjectProperties(id, name, desc); - // We got the reply, so remove the object from the list of pending requests - sObjectPropertiesFamilyRequests.erase(id); - } - - // the reporter widget askes the server for info about picked objects - if (request_flags & (COMPLAINT_REPORT_REQUEST | BUG_REPORT_REQUEST)) - { - EReportType report_type = (COMPLAINT_REPORT_REQUEST & request_flags) ? COMPLAINT_REPORT : BUG_REPORT; - LLFloaterReporter *reporterp = LLFloaterReporter::getReporter(report_type); - if (reporterp) - { - std::string fullname; - gCacheName->getFullName(owner_id, fullname); - reporterp->setPickedObjectProperties(name, fullname, owner_id); - } - } - else if (request_flags & OBJECT_PAY_REQUEST) - { - // check if the owner of the paid object is muted - LLMuteList::getInstance()->autoRemove(owner_id, LLMuteList::AR_MONEY); - } - - // Now look through all of the hovered nodes - struct f : public LLSelectedNodeFunctor - { - LLUUID mID; - f(const LLUUID& id) : mID(id) {} - virtual bool apply(LLSelectNode* node) - { - return (node->getObject() && node->getObject()->mID == mID); - } - } func(id); - LLSelectNode* node = LLSelectMgr::getInstance()->getHoverObjects()->getFirstNode(&func); - - if (node) - { - node->mValid = TRUE; - node->mPermissions->init(LLUUID::null, owner_id, - last_owner_id, group_id); - node->mPermissions->initMasks(base_mask, owner_mask, everyone_mask, group_mask, next_owner_mask); - node->mSaleInfo = sale_info; - node->mCategory = category; - node->mName.assign(name); - node->mDescription.assign(desc); - } - - dialog_refresh_all(); -} - - -// static -void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**) -{ - BOOL reset_list; - msg->getBOOL("Header", "ResetList", reset_list); - - if (reset_list) - { - LLSelectMgr::getInstance()->deselectAll(); - } - - LLUUID full_id; - S32 local_id; - LLViewerObject* object; - std::vector objects; - S32 i; - S32 block_count = msg->getNumberOfBlocks("Data"); - - for (i = 0; i < block_count; i++) - { - msg->getS32("Data", "LocalID", local_id, i); - - gObjectList.getUUIDFromLocal(full_id, - local_id, - msg->getSenderIP(), - msg->getSenderPort()); - object = gObjectList.findObject(full_id); - if (object) - { - objects.push_back(object); - } - } - - // Don't select, just highlight - LLSelectMgr::getInstance()->highlightObjectAndFamily(objects); -} - - -extern LLGLdouble gGLModelView[16]; - -void LLSelectMgr::updateSilhouettes() -{ - S32 num_sils_genned = 0; - - LLVector3d cameraPos = gAgent.getCameraPositionGlobal(); - F32 currentCameraZoom = gAgent.getCurrentCameraBuildOffset(); - - if (!mSilhouetteImagep) - { - mSilhouetteImagep = gImageList.getImageFromFile("silhouette.j2c", TRUE, TRUE); - } - - mHighlightedObjects->cleanupNodes(); - - if((cameraPos - mLastCameraPos).magVecSquared() > SILHOUETTE_UPDATE_THRESHOLD_SQUARED * currentCameraZoom * currentCameraZoom) - { - struct f : public LLSelectedObjectFunctor - { - virtual bool apply(LLViewerObject* object) - { - object->setChanged(LLXform::SILHOUETTE); - return true; - } - } func; - getSelection()->applyToObjects(&func); - - mLastCameraPos = gAgent.getCameraPositionGlobal(); - } - - std::vector changed_objects; - - updateSelectionSilhouette(mSelectedObjects, num_sils_genned, changed_objects); - if (mRectSelectedObjects.size() > 0) - { - //gGLSPipelineSelection.set(); - - //mSilhouetteImagep->bindTexture(); - //glAlphaFunc(GL_GREATER, sHighlightAlphaTest); - - std::set roots; - - // sync mHighlightedObjects with mRectSelectedObjects since the latter is rebuilt every frame and former - // persists from frame to frame to avoid regenerating object silhouettes - // mHighlightedObjects includes all siblings of rect selected objects - - BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); - - // generate list of roots from current object selection - for (std::set >::iterator iter = mRectSelectedObjects.begin(); - iter != mRectSelectedObjects.end(); iter++) - { - LLViewerObject *objectp = *iter; - if (select_linked_set) - { - LLViewerObject *rootp = (LLViewerObject*)objectp->getRoot(); - roots.insert(rootp); - } - else - { - roots.insert(objectp); - } - } - - // remove highlight nodes not in roots list - std::vector remove_these_nodes; - std::vector remove_these_roots; - - for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); - iter != mHighlightedObjects->end(); iter++) - { - LLSelectNode* node = *iter; - LLViewerObject* objectp = node->getObject(); - if (!objectp) - continue; - if (objectp->isRoot() || !select_linked_set) - { - if (roots.count(objectp) == 0) - { - remove_these_nodes.push_back(node); - } - else - { - remove_these_roots.push_back(objectp); - } - } - else - { - LLViewerObject* rootp = (LLViewerObject*)objectp->getRoot(); - - if (roots.count(rootp) == 0) - { - remove_these_nodes.push_back(node); - } - } - } - - // remove all highlight nodes no longer in rectangle selection - for (std::vector::iterator iter = remove_these_nodes.begin(); - iter != remove_these_nodes.end(); ++iter) - { - LLSelectNode* nodep = *iter; - mHighlightedObjects->removeNode(nodep); - } - - // remove all root objects already being highlighted - for (std::vector::iterator iter = remove_these_roots.begin(); - iter != remove_these_roots.end(); ++iter) - { - LLViewerObject* objectp = *iter; - roots.erase(objectp); - } - - // add all new objects in rectangle selection - for (std::set::iterator iter = roots.begin(); - iter != roots.end(); iter++) - { - LLViewerObject* objectp = *iter; - if (!canSelectObject(objectp)) - { - continue; - } - - LLSelectNode* rect_select_root_node = new LLSelectNode(objectp, TRUE); - rect_select_root_node->selectAllTEs(TRUE); - - if (!select_linked_set) - { - rect_select_root_node->mIndividualSelection = TRUE; - } - else - { - LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) - { - LLViewerObject* child_objectp = *iter; - - if (!canSelectObject(child_objectp)) - { - continue; - } - - LLSelectNode* rect_select_node = new LLSelectNode(child_objectp, TRUE); - rect_select_node->selectAllTEs(TRUE); - mHighlightedObjects->addNodeAtEnd(rect_select_node); - } - } - - // Add the root last, to preserve order for link operations. - mHighlightedObjects->addNodeAtEnd(rect_select_root_node); - } - - num_sils_genned = 0; - - // render silhouettes for highlighted objects - //BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL); - for (S32 pass = 0; pass < 2; pass++) - { - for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); - iter != mHighlightedObjects->end(); iter++) - { - LLSelectNode* node = *iter; - LLViewerObject* objectp = node->getObject(); - if (!objectp) - continue; - - // do roots first, then children so that root flags are cleared ASAP - BOOL roots_only = (pass == 0); - BOOL is_root = objectp->isRootEdit(); - if (roots_only != is_root) - { - continue; - } - - if (!node->mSilhouetteExists - || objectp->isChanged(LLXform::SILHOUETTE) - || (objectp->getParent() && objectp->getParent()->isChanged(LLXform::SILHOUETTE))) - { - if (num_sils_genned++ < MAX_SILS_PER_FRAME) - { - generateSilhouette(node, LLViewerCamera::getInstance()->getOrigin()); - changed_objects.push_back(objectp); - } - else if (objectp->isAttachment() && objectp->getRootEdit()->mDrawable.notNull()) - { - //RN: hack for orthogonal projection of HUD attachments - LLViewerJointAttachment* attachment_pt = (LLViewerJointAttachment*)objectp->getRootEdit()->mDrawable->getParent(); - if (attachment_pt && attachment_pt->getIsHUDAttachment()) - { - LLVector3 camera_pos = LLVector3(-10000.f, 0.f, 0.f); - generateSilhouette(node, camera_pos); - } - } - } - //LLColor4 highlight_color; - // - //if (subtracting_from_selection) - //{ - // node->renderOneSilhouette(LLColor4::red); - //} - //else if (!objectp->isSelected()) - //{ - // highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor; - // node->renderOneSilhouette(highlight_color); - //} - } - } - //mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D); - } - else - { - mHighlightedObjects->deleteAllNodes(); - } - - for (std::vector::iterator iter = changed_objects.begin(); - iter != changed_objects.end(); ++iter) - { - // clear flags after traversing node list (as child objects need to refer to parent flags, etc) - LLViewerObject* objectp = *iter; - objectp->clearChanged(LLXform::MOVED | LLXform::SILHOUETTE); - } - - //gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); -} - -void LLSelectMgr::updateSelectionSilhouette(LLObjectSelectionHandle object_handle, S32& num_sils_genned, std::vector& changed_objects) -{ - if (object_handle->getNumNodes()) - { - //gGLSPipelineSelection.set(); - - //mSilhouetteImagep->bindTexture(); - //glAlphaFunc(GL_GREATER, sHighlightAlphaTest); - - for (S32 pass = 0; pass < 2; pass++) - { - for (LLObjectSelection::iterator iter = object_handle->begin(); - iter != object_handle->end(); iter++) - { - LLSelectNode* node = *iter; - LLViewerObject* objectp = node->getObject(); - if (!objectp) - continue; - // do roots first, then children so that root flags are cleared ASAP - BOOL roots_only = (pass == 0); - BOOL is_root = (objectp->isRootEdit()); - if (roots_only != is_root || objectp->mDrawable.isNull()) - { - continue; - } - - if (!node->mSilhouetteExists - || objectp->isChanged(LLXform::SILHOUETTE) - || (objectp->getParent() && objectp->getParent()->isChanged(LLXform::SILHOUETTE))) - { - if (num_sils_genned++ < MAX_SILS_PER_FRAME)// && objectp->mDrawable->isVisible()) - { - generateSilhouette(node, LLViewerCamera::getInstance()->getOrigin()); - changed_objects.push_back(objectp); - } - else if (objectp->isAttachment() && objectp->getRootEdit() && objectp->getRootEdit()->mDrawable.notNull()) - { - //RN: hack for orthogonal projection of HUD attachments - LLViewerJointAttachment* attachment_pt = (LLViewerJointAttachment*)objectp->getRootEdit()->mDrawable->getParent(); - if (attachment_pt && attachment_pt->getIsHUDAttachment()) - { - LLVector3 camera_pos = LLVector3(-10000.f, 0.f, 0.f); - generateSilhouette(node, camera_pos); - } - } - } - } - } - } -} -void LLSelectMgr::renderSilhouettes(BOOL for_hud) -{ - if (!mRenderSilhouettes || !LLSelectMgr::sRenderSelectionHighlights) - { - return; - } - - gGL.getTexUnit(0)->bind(mSilhouetteImagep.get()); - LLGLSPipelineSelection gls_select; - gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); - LLGLEnable blend(GL_BLEND); - LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - - if (isAgentAvatarValid() && for_hud) - { - LLVOAvatar* avatar = gAgent.getAvatarObject(); - LLBBox hud_bbox = avatar->getHUDBBox(); - - F32 cur_zoom = gAgent.mHUDCurZoom; - - // set up transform to encompass bounding box of HUD - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f); - glOrtho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame - glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f); - glScalef(cur_zoom, cur_zoom, cur_zoom); - } - if (mSelectedObjects->getNumNodes()) - { - LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID(); - - // - //for (S32 pass = 0; pass < 2; pass++) - //{ - // - for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); - iter != mSelectedObjects->end(); iter++) - { - LLSelectNode* node = *iter; - LLViewerObject* objectp = node->getObject(); - if (!objectp) - continue; - if (objectp->isHUDAttachment() != for_hud) - { - continue; - } - if(objectp->getID() == inspect_item_id) - { - node->renderOneSilhouette(sHighlightInspectColor); - } - else if (node->isTransient()) - { - BOOL oldHidden = LLSelectMgr::sRenderHiddenSelections; - LLSelectMgr::sRenderHiddenSelections = FALSE; - node->renderOneSilhouette(sContextSilhouetteColor); - LLSelectMgr::sRenderHiddenSelections = oldHidden; - } - else if (objectp->isRootEdit()) - { - node->renderOneSilhouette(sSilhouetteParentColor); - } - else - { - node->renderOneSilhouette(sSilhouetteChildColor); - } - } - // - //} - // - } - - if (mHighlightedObjects->getNumNodes()) - { - // render silhouettes for highlighted objects - BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL); - for (S32 pass = 0; pass < 2; pass++) - { - for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); - iter != mHighlightedObjects->end(); iter++) - { - LLSelectNode* node = *iter; - LLViewerObject* objectp = node->getObject(); - if (!objectp) - continue; - if (objectp->isHUDAttachment() != for_hud) - { - continue; - } - - if (subtracting_from_selection) - { - node->renderOneSilhouette(LLColor4::red); - } - else if (!objectp->isSelected()) - { - LLColor4 highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor; - node->renderOneSilhouette(highlight_color); - } - } - } - } - - if (isAgentAvatarValid() && for_hud) - { - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - stop_glerror(); - } - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); -} - -void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) -{ - LLViewerObject* objectp = nodep->getObject(); - - if (objectp && objectp->getPCode() == LL_PCODE_VOLUME) - { - ((LLVOVolume*)objectp)->generateSilhouette(nodep, view_point); - } -} - -// -// Utility classes -// -LLSelectNode::LLSelectNode(LLViewerObject* object, BOOL glow) -: mObject(object), - mIndividualSelection(FALSE), - mTransient(FALSE), - mValid(FALSE), - mPermissions(new LLPermissions()), - mInventorySerial(0), - mSilhouetteExists(FALSE), - mDuplicated(FALSE), - mTESelectMask(0), - mLastTESelected(0), - mName(LLStringUtil::null), - mDescription(LLStringUtil::null), - mTouchName(LLStringUtil::null), - mSitName(LLStringUtil::null), - mCreationDate(0) -{ - selectAllTEs(FALSE); - saveColors(); -} - -LLSelectNode::LLSelectNode(const LLSelectNode& nodep) -{ - mTESelectMask = nodep.mTESelectMask; - mLastTESelected = nodep.mLastTESelected; - - mIndividualSelection = nodep.mIndividualSelection; - - mValid = nodep.mValid; - mTransient = nodep.mTransient; - mPermissions = new LLPermissions(*nodep.mPermissions); - mSaleInfo = nodep.mSaleInfo;; - mAggregatePerm = nodep.mAggregatePerm; - mAggregateTexturePerm = nodep.mAggregateTexturePerm; - mAggregateTexturePermOwner = nodep.mAggregateTexturePermOwner; - mName = nodep.mName; - mDescription = nodep.mDescription; - mCategory = nodep.mCategory; - mInventorySerial = 0; - mSavedPositionLocal = nodep.mSavedPositionLocal; - mSavedPositionGlobal = nodep.mSavedPositionGlobal; - mSavedScale = nodep.mSavedScale; - mSavedRotation = nodep.mSavedRotation; - mDuplicated = nodep.mDuplicated; - mDuplicatePos = nodep.mDuplicatePos; - mDuplicateRot = nodep.mDuplicateRot; - mItemID = nodep.mItemID; - mFolderID = nodep.mFolderID; - mFromTaskID = nodep.mFromTaskID; - mTouchName = nodep.mTouchName; - mSitName = nodep.mSitName; - mCreationDate = nodep.mCreationDate; - - mSilhouetteVertices = nodep.mSilhouetteVertices; - mSilhouetteNormals = nodep.mSilhouetteNormals; - mSilhouetteSegments = nodep.mSilhouetteSegments; - mSilhouetteExists = nodep.mSilhouetteExists; - mObject = nodep.mObject; - - std::vector::const_iterator color_iter; - mSavedColors.clear(); - for (color_iter = nodep.mSavedColors.begin(); color_iter != nodep.mSavedColors.end(); ++color_iter) - { - mSavedColors.push_back(*color_iter); - } - - saveTextures(nodep.mSavedTextures); -} - -LLSelectNode::~LLSelectNode() -{ - delete mPermissions; - mPermissions = NULL; -} - -void LLSelectNode::selectAllTEs(BOOL b) -{ - mTESelectMask = b ? TE_SELECT_MASK_ALL : 0x0; - mLastTESelected = 0; -} - -void LLSelectNode::selectTE(S32 te_index, BOOL selected) -{ - if (te_index < 0 || te_index >= SELECT_MAX_TES) - { - return; - } - if (selected) - { - mTESelectMask |= (0x1 << te_index); - } - else - { - mTESelectMask &= ~(0x1 << te_index); - } - mLastTESelected = te_index; -} - -BOOL LLSelectNode::isTESelected(S32 te_index) -{ - if (te_index < 0 || te_index >= mObject->getNumTEs()) - { - return FALSE; - } - return (mTESelectMask & (0x1 << te_index)) != 0; -} - -S32 LLSelectNode::getLastSelectedTE() -{ - if (!isTESelected(mLastTESelected)) - { - return -1; - } - return mLastTESelected; -} - -LLViewerObject* LLSelectNode::getObject() -{ - if (!mObject) - { - return NULL; - } - else if (mObject->isDead()) - { - mObject = NULL; - } - return mObject; -} - -void LLSelectNode::setObject(LLViewerObject* object) -{ - mObject = object; -} - -void LLSelectNode::saveColors() -{ - if (mObject.notNull()) - { - mSavedColors.clear(); - for (S32 i = 0; i < mObject->getNumTEs(); i++) - { - const LLTextureEntry* tep = mObject->getTE(i); - mSavedColors.push_back(tep->getColor()); - } - } -} - -void LLSelectNode::saveTextures(const std::vector& textures) -{ - if (mObject.notNull()) - { - mSavedTextures.clear(); - - for (std::vector::const_iterator texture_it = textures.begin(); - texture_it != textures.end(); ++texture_it) - { - mSavedTextures.push_back(*texture_it); - } - } -} - -void LLSelectNode::saveTextureScaleRatios() -{ - mTextureScaleRatios.clear(); - if (mObject.notNull()) - { - for (U8 i = 0; i < mObject->getNumTEs(); i++) - { - F32 s,t; - const LLTextureEntry* tep = mObject->getTE(i); - tep->getScale(&s,&t); - U32 s_axis = 0; - U32 t_axis = 0; - - LLPrimitive::getTESTAxes(i, &s_axis, &t_axis); - - LLVector3 v; - LLVector3 scale = mObject->getScale(); - - if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR) - { - v.mV[s_axis] = s*scale.mV[s_axis]; - v.mV[t_axis] = t*scale.mV[t_axis]; - } - else - { - v.mV[s_axis] = s/scale.mV[s_axis]; - v.mV[t_axis] = t/scale.mV[t_axis]; - } - - mTextureScaleRatios.push_back(v); - } - } -} - - -// This implementation should be similar to LLTask::allowOperationOnTask -BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const -{ - // Extract ownership. - BOOL object_is_group_owned = FALSE; - LLUUID object_owner_id; - mPermissions->getOwnership(object_owner_id, object_is_group_owned); - - // Operations on invalid or public objects is not allowed. - if (!mObject || (mObject->isDead()) || !mPermissions->isOwned()) - { - return FALSE; - } - - // The transfer permissions can never be given through proxy. - if (PERM_TRANSFER == op) - { - // The owner of an agent-owned object can transfer to themselves. - if ( !object_is_group_owned - && (gAgent.getID() == object_owner_id) ) - { - return TRUE; - } - else - { - // Otherwise check aggregate permissions. - return mObject->permTransfer(); - } - } - - if (PERM_MOVE == op - || PERM_MODIFY == op) - { - // only owners can move or modify their attachments - // no proxy allowed. - if (mObject->isAttachment() && object_owner_id != gAgent.getID()) - { - return FALSE; - } - } - - // Calculate proxy_agent_id and group_id to use for permissions checks. - // proxy_agent_id may be set to the object owner through group powers. - // group_id can only be set to the object's group, if the agent is in that group. - LLUUID group_id = LLUUID::null; - LLUUID proxy_agent_id = gAgent.getID(); - - // Gods can always operate. - if (gAgent.isGodlike()) - { - return TRUE; - } - - // Check if the agent is in the same group as the object. - LLUUID object_group_id = mPermissions->getGroup(); - if (object_group_id.notNull() && - gAgent.isInGroup(object_group_id)) - { - // Assume the object's group during this operation. - group_id = object_group_id; - } - - // Only allow proxy powers for PERM_COPY if the actual agent can - // receive the item (ie has PERM_TRANSFER permissions). - // NOTE: op == PERM_TRANSFER has already been handled, but if - // that ever changes we need to BLOCK proxy powers for PERM_TRANSFER. DK 03/28/06 - if (PERM_COPY != op || mPermissions->allowTransferTo(gAgent.getID())) - { - // Check if the agent can assume ownership through group proxy or agent-granted proxy. - if ( ( object_is_group_owned - && gAgent.hasPowerInGroup(object_owner_id, group_proxy_power)) - // Only allow proxy for move, modify, and copy. - || ( (PERM_MOVE == op || PERM_MODIFY == op || PERM_COPY == op) - && (!object_is_group_owned - && gAgent.isGrantedProxy(*mPermissions)))) - { - // This agent is able to assume the ownership role for this operation. - proxy_agent_id = object_owner_id; - } - } - - // We now have max ownership information. - if (PERM_OWNER == op) - { - // This this was just a check for ownership, we can now return the answer. - return (proxy_agent_id == object_owner_id ? TRUE : FALSE); - } - - // check permissions to see if the agent can operate - return (mPermissions->allowOperationBy(op, proxy_agent_id, group_id)); -} - -//----------------------------------------------------------------------------- -// renderOneSilhouette() -//----------------------------------------------------------------------------- -void LLSelectNode::renderOneSilhouette(const LLColor4 &color) -{ - LLViewerObject* objectp = getObject(); - if (!objectp) - { - return; - } - - LLDrawable* drawable = objectp->mDrawable; - if(!drawable) - { - return; - } - - if (!mSilhouetteExists) - { - return; - } - - BOOL is_hud_object = objectp->isHUDAttachment(); - - if (mSilhouetteVertices.size() == 0 || mSilhouetteNormals.size() != mSilhouetteVertices.size()) - { - return; - } - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - if (!is_hud_object) - { - glLoadIdentity(); - glMultMatrixd(gGLModelView); - } - - - if (drawable->isActive()) - { - glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix); - } - - LLVolume *volume = objectp->getVolume(); - if (volume) - { - F32 silhouette_thickness; - if (isAgentAvatarValid() && is_hud_object) - { - silhouette_thickness = LLSelectMgr::sHighlightThickness / gAgent.mHUDCurZoom; - } - else - { - LLVector3 view_vector = LLViewerCamera::getInstance()->getOrigin() - objectp->getRenderPosition(); - silhouette_thickness = view_vector.magVec() * LLSelectMgr::sHighlightThickness * (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV()); - } - F32 animationTime = (F32)LLFrameTimer::getElapsedSeconds(); - - F32 u_coord = fmod(animationTime * LLSelectMgr::sHighlightUAnim, 1.f); - F32 v_coord = 1.f - fmod(animationTime * LLSelectMgr::sHighlightVAnim, 1.f); - F32 u_divisor = 1.f / ((F32)(mSilhouetteVertices.size() - 1)); - - if (LLSelectMgr::sRenderHiddenSelections) // && gFloaterTools && gFloaterTools->getVisible()) - { - gGL.flush(); - gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE); - LLGLEnable fog(GL_FOG); - glFogi(GL_FOG_MODE, GL_LINEAR); - float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec(); - LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgent.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0); - glFogf(GL_FOG_START, d); - glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV()))); - glFogfv(GL_FOG_COLOR, fogCol.mV); - - LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL); - gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); - gGL.begin(LLRender::LINES); - { - S32 i = 0; - for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++) - { - for(; i < mSilhouetteSegments[seg_num]; i++) - { - u_coord += u_divisor * LLSelectMgr::sHighlightUScale; - - gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); - gGL.texCoord2f( u_coord, v_coord ); - gGL.vertex3fv( mSilhouetteVertices[i].mV ); - } - } - } - gGL.end(); - u_coord = fmod(animationTime * LLSelectMgr::sHighlightUAnim, 1.f); - } - - gGL.flush(); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - gGL.begin(LLRender::TRIANGLES); - { - S32 i = 0; - for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++) - { - S32 first_i = i; - LLVector3 v; - LLVector2 t; - - for(; i < mSilhouetteSegments[seg_num]; i++) - { - - if (i == first_i) { - LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness; - vert += mSilhouetteVertices[i]; - - gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha); - gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale ); - gGL.vertex3fv( vert.mV ); - - u_coord += u_divisor * LLSelectMgr::sHighlightUScale; - - gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2); - gGL.texCoord2f( u_coord, v_coord ); - gGL.vertex3fv( mSilhouetteVertices[i].mV ); - - v = mSilhouetteVertices[i]; - t = LLVector2(u_coord, v_coord); - } - else { - LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness; - vert += mSilhouetteVertices[i]; - - gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha); - gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale ); - gGL.vertex3fv( vert.mV ); - gGL.vertex3fv( vert.mV ); - - gGL.texCoord2fv(t.mV); - u_coord += u_divisor * LLSelectMgr::sHighlightUScale; - gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2); - gGL.vertex3fv(v.mV); - gGL.texCoord2f( u_coord, v_coord ); - gGL.vertex3fv( mSilhouetteVertices[i].mV ); - - } - } - } - } - gGL.end(); - gGL.flush(); - } - glPopMatrix(); -} - -// -// Utility Functions -// - -// Update everyone who cares about the selection list -void dialog_refresh_all() -{ - if (gNoRender) - { - return; - } - - //could refresh selected object info in toolbar here - - gFloaterTools->dirty(); - - if( gPieObject->getVisible() ) - { - gPieObject->arrange(); - } - - if( gPieAttachment->getVisible() ) - { - gPieAttachment->arrange(); - } - - LLFloaterProperties::dirtyAll(); - LLFloaterInspect::dirty(); -} - -S32 get_family_count(LLViewerObject *parent) -{ - if (!parent) - { - llwarns << "Trying to get_family_count on null parent!" << llendl; - } - S32 count = 1; // for this object - LLViewerObject::const_child_list_t& child_list = parent->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) - { - LLViewerObject* child = *iter; - - if (!child) - { - llwarns << "Family object has NULL child! Show Doug." << llendl; - } - else if (child->isDead()) - { - llwarns << "Family object has dead child object. Show Doug." << llendl; - } - else - { - if (LLSelectMgr::getInstance()->canSelectObject(child)) - { - count += get_family_count( child ); - } - } - } - return count; -} - -//----------------------------------------------------------------------------- -// updateSelectionCenter -//----------------------------------------------------------------------------- -void LLSelectMgr::updateSelectionCenter() -{ - const F32 MOVE_SELECTION_THRESHOLD = 1.f; // Movement threshold in meters for updating selection - // center (tractor beam) - - //override any object updates received - //for selected objects - overrideObjectUpdates(); - - LLViewerObject* object = mSelectedObjects->getFirstObject(); - if (!object) - { - // nothing selected, probably grabbing - // Ignore by setting to avatar origin. - mSelectionCenterGlobal.clearVec(); - mShowSelection = FALSE; - mSelectionBBox = LLBBox(); - mPauseRequest = NULL; - resetAgentHUDZoom(); - - } - else - { - mSelectedObjects->mSelectType = getSelectTypeForObject(object); - - if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) - { - mPauseRequest = gAgent.getAvatarObject()->requestPause(); - } - else - { - mPauseRequest = NULL; - } - - if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && isAgentAvatarValid()) - { - // reset hud ZOOM - gAgent.mHUDTargetZoom = 1.f; - gAgent.mHUDCurZoom = 1.f; - } - - mShowSelection = FALSE; - LLBBox bbox; - - // have stuff selected - LLVector3d select_center; - // keep a list of jointed objects for showing the joint HUDEffects - - // Initialize the bounding box to the root prim, so the BBox orientation - // matches the root prim's (affecting the orientation of the manipulators). - bbox.addBBoxAgent( (mSelectedObjects->getFirstRootObject(TRUE))->getBoundingBoxAgent() ); - - std::vector < LLViewerObject *> jointed_objects; - - for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); - iter != mSelectedObjects->end(); iter++) - { - LLSelectNode* node = *iter; - LLViewerObject* object = node->getObject(); - if (!object) - continue; - LLViewerObject *myAvatar = gAgent.getAvatarObject(); - LLViewerObject *root = object->getRootEdit(); - if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment - !root->isChild(myAvatar) && // not the object you're sitting on - !object->isAvatar()) // not another avatar - { - mShowSelection = TRUE; - } - - bbox.addBBoxAgent( object->getBoundingBoxAgent() ); - - if (object->isJointChild()) - { - jointed_objects.push_back(object); - } - } - - LLVector3 bbox_center_agent = bbox.getCenterAgent(); - mSelectionCenterGlobal = gAgent.getPosGlobalFromAgent(bbox_center_agent); - mSelectionBBox = bbox; - - } - - if ( !(gAgentID == LLUUID::null)) - { - LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); - if (mShowSelection) - { - LLVector3d select_center_global; - - if( tool->isEditing() ) - { - select_center_global = tool->getEditingPointGlobal(); - } - else - { - select_center_global = mSelectionCenterGlobal; - } - - // Send selection center if moved beyond threshold (used to animate tractor beam) - LLVector3d diff; - diff = select_center_global - mLastSentSelectionCenterGlobal; - - if ( diff.magVecSquared() > MOVE_SELECTION_THRESHOLD*MOVE_SELECTION_THRESHOLD ) - { - // Transmit updated selection center - mLastSentSelectionCenterGlobal = select_center_global; - } - } - } - - // give up edit menu if no objects selected - if (gEditMenuHandler == this && mSelectedObjects->getObjectCount() == 0) - { - gEditMenuHandler = NULL; - } -} - -void LLSelectMgr::updatePointAt() -{ - if (mShowSelection) - { - if (mSelectedObjects->getObjectCount()) - { - LLVector3 select_offset; - const LLPickInfo& pick = gViewerWindow->getLastPick(); - LLViewerObject *click_object = pick.getObject(); - if (click_object && click_object->isSelected()) - { - // clicked on another object in our selection group, use that as target - select_offset.setVec(pick.mObjectOffset); - select_offset.rotVec(~click_object->getRenderRotation()); - - gAgent.setPointAt(POINTAT_TARGET_SELECT, click_object, select_offset); - gAgent.setLookAt(LOOKAT_TARGET_SELECT, click_object, select_offset); - } - else - { - // didn't click on an object this time, revert to pointing at center of first object - gAgent.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); - gAgent.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); - } - } - else - { - gAgent.setPointAt(POINTAT_TARGET_CLEAR); - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); - } - } - else - { - gAgent.setPointAt(POINTAT_TARGET_CLEAR); - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); - } -} - -//----------------------------------------------------------------------------- -// getBBoxOfSelection() -//----------------------------------------------------------------------------- -LLBBox LLSelectMgr::getBBoxOfSelection() const -{ - return mSelectionBBox; -} - - -//----------------------------------------------------------------------------- -// canUndo() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::canUndo() const -{ - return const_cast(this)->mSelectedObjects->getFirstEditableObject() != NULL; // HACK: casting away constness - MG -} - -//----------------------------------------------------------------------------- -// undo() -//----------------------------------------------------------------------------- -void LLSelectMgr::undo() -{ - BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); - LLUUID group_id(gAgent.getGroupID()); - sendListToRegions("Undo", packAgentAndSessionAndGroupID, packObjectID, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST); -} - -//----------------------------------------------------------------------------- -// canRedo() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::canRedo() const -{ - return const_cast(this)->mSelectedObjects->getFirstEditableObject() != NULL; // HACK: casting away constness - MG -} - -//----------------------------------------------------------------------------- -// redo() -//----------------------------------------------------------------------------- -void LLSelectMgr::redo() -{ - BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); - LLUUID group_id(gAgent.getGroupID()); - sendListToRegions("Redo", packAgentAndSessionAndGroupID, packObjectID, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST); -} - -//----------------------------------------------------------------------------- -// canDoDelete() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::canDoDelete() const -{ - bool can_delete = false; - // This function is "logically const" - it does not change state in - // a way visible outside the selection manager. - LLSelectMgr* self = const_cast(this); - LLViewerObject* obj = self->mSelectedObjects->getFirstDeleteableObject(); - // Note: Can only delete root objects (see getFirstDeleteableObject() for more info) - if (obj!= NULL) - { - // all the faces needs to be selected - if(self->mSelectedObjects->contains(obj,SELECT_ALL_TES )) - { - can_delete = true; - } - } - - return can_delete; -} - -//----------------------------------------------------------------------------- -// doDelete() -//----------------------------------------------------------------------------- -void LLSelectMgr::doDelete() -{ - selectDelete(); -} - -//----------------------------------------------------------------------------- -// canDeselect() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::canDeselect() const -{ - return !mSelectedObjects->isEmpty(); -} - -//----------------------------------------------------------------------------- -// deselect() -//----------------------------------------------------------------------------- -void LLSelectMgr::deselect() -{ - deselectAll(); -} -//----------------------------------------------------------------------------- -// canDuplicate() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::canDuplicate() const -{ - return const_cast(this)->mSelectedObjects->getFirstCopyableObject() != NULL; // HACK: casting away constness - MG -} -//----------------------------------------------------------------------------- -// duplicate() -//----------------------------------------------------------------------------- -void LLSelectMgr::duplicate() -{ - LLVector3 offset(0.5f, 0.5f, 0.f); - selectDuplicate(offset, TRUE); -} - -ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object) -{ - if (!object) - { - return SELECT_TYPE_WORLD; - } - if (object->isHUDAttachment()) - { - return SELECT_TYPE_HUD; - } - else if (object->isAttachment()) - { - return SELECT_TYPE_ATTACHMENT; - } - else - { - return SELECT_TYPE_WORLD; - } -} - -void LLSelectMgr::validateSelection() -{ - struct f : public LLSelectedObjectFunctor - { - virtual bool apply(LLViewerObject* object) - { - if (!LLSelectMgr::getInstance()->canSelectObject(object)) - { - LLSelectMgr::getInstance()->deselectObjectOnly(object); - } - return true; - } - } func; - getSelection()->applyToObjects(&func); -} - -BOOL LLSelectMgr::canSelectObject(LLViewerObject* object) -{ - // Never select dead objects - if (!object || object->isDead()) - { - return FALSE; - } - - if (mForceSelection) - { - return TRUE; - } - - if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !object->permYouOwner()) || - (gSavedSettings.getBOOL("SelectMovableOnly") && !object->permMove())) - { - // only select my own objects - return FALSE; - } - - // Can't select orphans - if (object->isOrphaned()) return FALSE; - - // Can't select avatars - if (object->isAvatar()) return FALSE; - - // Can't select land - if (object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) return FALSE; - - // - //ESelectType selection_type = getSelectTypeForObject(object); - //if (mSelectedObjects->getObjectCount() > 0 && mSelectedObjects->mSelectType != selection_type) return FALSE; - // - - return TRUE; -} - -BOOL LLSelectMgr::setForceSelection(BOOL force) -{ - std::swap(mForceSelection,force); - return force; -} - -void LLSelectMgr::resetAgentHUDZoom() -{ - gAgent.mHUDTargetZoom = 1.f; - gAgent.mHUDCurZoom = 1.f; -} - -void LLSelectMgr::getAgentHUDZoom(F32 &target_zoom, F32 ¤t_zoom) const -{ - target_zoom = gAgent.mHUDTargetZoom; - current_zoom = gAgent.mHUDCurZoom; -} - -void LLSelectMgr::setAgentHUDZoom(F32 target_zoom, F32 current_zoom) -{ - gAgent.mHUDTargetZoom = target_zoom; - gAgent.mHUDCurZoom = current_zoom; -} - -LLObjectSelection::LLObjectSelection() : - LLRefCount(), - mSelectType(SELECT_TYPE_WORLD) -{ -} - -LLObjectSelection::~LLObjectSelection() -{ - deleteAllNodes(); -} - -void LLObjectSelection::cleanupNodes() -{ - for (list_t::iterator iter = mList.begin(); iter != mList.end(); ) - { - list_t::iterator curiter = iter++; - LLSelectNode* node = *curiter; - if (node->getObject() == NULL || node->getObject()->isDead()) - { - mList.erase(curiter); - delete node; - } - } -} - -void LLObjectSelection::updateEffects() -{ -} - -S32 LLObjectSelection::getNumNodes() -{ - return mList.size(); -} - -void LLObjectSelection::addNode(LLSelectNode *nodep) -{ - llassert_always(nodep->getObject() && !nodep->getObject()->isDead()); - mList.push_front(nodep); - mSelectNodeMap[nodep->getObject()] = nodep; -} - -void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep) -{ - llassert_always(nodep->getObject() && !nodep->getObject()->isDead()); - mList.push_back(nodep); - mSelectNodeMap[nodep->getObject()] = nodep; -} - -void LLObjectSelection::moveNodeToFront(LLSelectNode *nodep) -{ - mList.remove(nodep); - mList.push_front(nodep); -} - -void LLObjectSelection::removeNode(LLSelectNode *nodep) -{ - mSelectNodeMap.erase(nodep->getObject()); - if (nodep->getObject() == mPrimaryObject) - { - mPrimaryObject = NULL; - } - nodep->setObject(NULL); // Will get erased in cleanupNodes() - mList.remove(nodep); -} - -void LLObjectSelection::deleteAllNodes() -{ - std::for_each(mList.begin(), mList.end(), DeletePointer()); - mList.clear(); - mSelectNodeMap.clear(); - mPrimaryObject = NULL; -} - -LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp) -{ - std::map, LLSelectNode*>::iterator found_it = mSelectNodeMap.find(objectp); - if (found_it != mSelectNodeMap.end()) - { - return found_it->second; - } - return NULL; -} - -//----------------------------------------------------------------------------- -// isEmpty() -//----------------------------------------------------------------------------- -BOOL LLObjectSelection::isEmpty() const -{ - return (mList.size() == 0); -} - -//----------------------------------------------------------------------------- -// getOwnershipCost() -//----------------------------------------------------------------------------- -BOOL LLObjectSelection::getOwnershipCost(S32 &cost) -{ - S32 count = getObjectCount(); - cost = count * OWNERSHIP_COST_PER_OBJECT; - return (count > 0); -} - - -//----------------------------------------------------------------------------- -// getObjectCount() - returns number of non null objects -//----------------------------------------------------------------------------- -S32 LLObjectSelection::getObjectCount() -{ - cleanupNodes(); - S32 count = mList.size(); - return count; -} - - -//----------------------------------------------------------------------------- -// getTECount() -//----------------------------------------------------------------------------- -S32 LLObjectSelection::getTECount() -{ - S32 count = 0; - for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++) - { - LLSelectNode* node = *iter; - LLViewerObject* object = node->getObject(); - if (!object) - continue; - S32 num_tes = object->getNumTEs(); - for (S32 te = 0; te < num_tes; te++) - { - if (node->isTESelected(te)) - { - ++count; - } - } - } - return count; -} - -//----------------------------------------------------------------------------- -// getRootObjectCount() -//----------------------------------------------------------------------------- -S32 LLObjectSelection::getRootObjectCount() -{ - S32 count = 0; - for (LLObjectSelection::root_iterator iter = root_begin(); iter != root_end(); iter++) - { - ++count; - } - return count; -} - -bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func) -{ - bool result = true; - for (iterator iter = begin(); iter != end(); ) - { - iterator nextiter = iter++; - LLViewerObject* object = (*nextiter)->getObject(); - if (!object) - continue; - bool r = func->apply(object); - result = result && r; - } - return result; -} - -bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly) -{ - bool result = firstonly ? false : true; - for (root_iterator iter = root_begin(); iter != root_end(); ) - { - root_iterator nextiter = iter++; - LLViewerObject* object = (*nextiter)->getObject(); - if (!object) - continue; - bool r = func->apply(object); - if (firstonly && r) - return true; - else - result = result && r; - } - return result; -} - -bool LLObjectSelection::applyToTEs(LLSelectedTEFunctor* func, bool firstonly) -{ - bool result = firstonly ? false : true; - for (iterator iter = begin(); iter != end(); ) - { - iterator nextiter = iter++; - LLSelectNode* node = *nextiter; - LLViewerObject* object = (*nextiter)->getObject(); - if (!object) - continue; - S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces()); // avatars have TEs but no faces - for (S32 te = 0; te < num_tes; ++te) - { - if (node->isTESelected(te)) - { - bool r = func->apply(object, te); - if (firstonly && r) - return true; - else - result = result && r; - } - } - } - return result; -} - -bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func, bool firstonly) -{ - bool result = firstonly ? false : true; - for (iterator iter = begin(); iter != end(); ) - { - iterator nextiter = iter++; - LLSelectNode* node = *nextiter; - bool r = func->apply(node); - if (firstonly && r) - return true; - else - result = result && r; - } - return result; -} - -bool LLObjectSelection::applyToRootNodes(LLSelectedNodeFunctor *func, bool firstonly) -{ - bool result = firstonly ? false : true; - for (root_iterator iter = root_begin(); iter != root_end(); ) - { - root_iterator nextiter = iter++; - LLSelectNode* node = *nextiter; - bool r = func->apply(node); - if (firstonly && r) - return true; - else - result = result && r; - } - return result; -} - -//----------------------------------------------------------------------------- -// contains() -//----------------------------------------------------------------------------- -BOOL LLObjectSelection::contains(LLViewerObject* object) -{ - return findNode(object) != NULL; -} - - -//----------------------------------------------------------------------------- -// contains() -//----------------------------------------------------------------------------- -BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te) -{ - if (te == SELECT_ALL_TES) - { - // ...all faces - for (LLObjectSelection::iterator iter = begin(); - iter != end(); iter++) - { - LLSelectNode* nodep = *iter; - if (nodep->getObject() == object) - { - // Optimization - if (nodep->getTESelectMask() == TE_SELECT_MASK_ALL) - { - return TRUE; - } - - BOOL all_selected = TRUE; - for (S32 i = 0; i < object->getNumTEs(); i++) - { - all_selected = all_selected && nodep->isTESelected(i); - } - return all_selected; - } - } - return FALSE; - } - else - { - // ...one face - for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++) - { - LLSelectNode* nodep = *iter; - if (nodep->getObject() == object && nodep->isTESelected(te)) - { - return TRUE; - } - } - return FALSE; - } -} - -// returns TRUE is any node is currenly worn as an attachment -BOOL LLObjectSelection::isAttachment() -{ - return (mSelectType == SELECT_TYPE_ATTACHMENT || mSelectType == SELECT_TYPE_HUD); -} - -//----------------------------------------------------------------------------- -// getSelectedParentObject() -//----------------------------------------------------------------------------- -LLViewerObject* getSelectedParentObject(LLViewerObject *object) -{ - LLViewerObject *parent; - while (object && (parent = (LLViewerObject*)object->getParent())) - { - if (parent->isSelected()) - { - object = parent; - } - else - { - break; - } - } - return object; -} - -//----------------------------------------------------------------------------- -// getFirstNode -//----------------------------------------------------------------------------- -LLSelectNode* LLObjectSelection::getFirstNode(LLSelectedNodeFunctor* func) -{ - for (iterator iter = begin(); iter != end(); ++iter) - { - LLSelectNode* node = *iter; - if (func == NULL || func->apply(node)) - { - return node; - } - } - return NULL; -} - -LLSelectNode* LLObjectSelection::getFirstRootNode(LLSelectedNodeFunctor* func, BOOL non_root_ok) -{ - for (root_iterator iter = root_begin(); iter != root_end(); ++iter) - { - LLSelectNode* node = *iter; - if (func == NULL || func->apply(node)) - { - return node; - } - } - if (non_root_ok) - { - // Get non root - return getFirstNode(func); - } - return NULL; -} - - -//----------------------------------------------------------------------------- -// getFirstSelectedObject -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstSelectedObject(LLSelectedNodeFunctor* func, BOOL get_parent) -{ - LLSelectNode* res = getFirstNode(func); - if (res && get_parent) - { - return getSelectedParentObject(res->getObject()); - } - else if (res) - { - return res->getObject(); - } - return NULL; -} - -//----------------------------------------------------------------------------- -// getFirstObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstObject() -{ - LLSelectNode* res = getFirstNode(NULL); - return res ? res->getObject() : NULL; -} - -//----------------------------------------------------------------------------- -// getFirstRootObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstRootObject(BOOL non_root_ok) -{ - LLSelectNode* res = getFirstRootNode(NULL, non_root_ok); - return res ? res->getObject() : NULL; -} - -//----------------------------------------------------------------------------- -// getFirstMoveableNode() -//----------------------------------------------------------------------------- -LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root_first) -{ - struct f : public LLSelectedNodeFunctor - { - bool apply(LLSelectNode* node) - { - LLViewerObject* obj = node->getObject(); - return obj && obj->permMove(); - } - } func; - LLSelectNode* res = get_root_first ? getFirstRootNode(&func, TRUE) : getFirstNode(&func); - return res; -} - -//----------------------------------------------------------------------------- -// getFirstCopyableObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_parent) -{ - struct f : public LLSelectedNodeFunctor - { - bool apply(LLSelectNode* node) - { - LLViewerObject* obj = node->getObject(); - return obj && obj->permCopy() && !obj->isAttachment(); - } - } func; - return getFirstSelectedObject(&func, get_parent); -} - -//----------------------------------------------------------------------------- -// getFirstDeleteableObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstDeleteableObject() -{ - //RN: don't currently support deletion of child objects, as that requires separating them first - // then derezzing to trash - - struct f : public LLSelectedNodeFunctor - { - bool apply(LLSelectNode* node) - { - LLViewerObject* obj = node->getObject(); - // you can delete an object if you are the owner - // or you have permission to modify it. - if( obj && ( (obj->permModify()) || - (obj->permYouOwner()) || - (!obj->permAnyOwner()) )) // public - { - if( !obj->isAttachment() ) - { - return true; - } - } - return false; - } - } func; - LLSelectNode* node = getFirstNode(&func); - return node ? node->getObject() : NULL; -} - -//----------------------------------------------------------------------------- -// getFirstEditableObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_parent) -{ - struct f : public LLSelectedNodeFunctor - { - bool apply(LLSelectNode* node) - { - LLViewerObject* obj = node->getObject(); - return obj && obj->permModify(); - } - } func; - return getFirstSelectedObject(&func, get_parent); -} - -//----------------------------------------------------------------------------- -// getFirstMoveableObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_parent) -{ - struct f : public LLSelectedNodeFunctor - { - bool apply(LLSelectNode* node) - { - LLViewerObject* obj = node->getObject(); - return obj && obj->permMove(); - } - } func; - return getFirstSelectedObject(&func, get_parent); -} - -//----------------------------------------------------------------------------- -// Position + Rotation update methods called from LLViewerJoystick -//----------------------------------------------------------------------------- -bool LLSelectMgr::selectionMove(const LLVector3& displ, - F32 roll, F32 pitch, F32 yaw, U32 update_type) -{ - if (update_type == UPD_NONE) - { - return false; - } - - LLVector3 displ_global; - bool update_success = true; - bool update_position = update_type & UPD_POSITION; - bool update_rotation = update_type & UPD_ROTATION; - const bool noedit_linked_parts = !gSavedSettings.getBOOL("EditLinkedParts"); - - if (update_position) - { - // calculate the distance of the object closest to the camera origin - F32 min_dist = 1e+30f; - LLVector3 obj_pos; - for (LLObjectSelection::root_iterator it = getSelection()->root_begin(); - it != getSelection()->root_end(); ++it) - { - obj_pos = (*it)->getObject()->getPositionEdit(); - - F32 obj_dist = dist_vec(obj_pos, LLViewerCamera::getInstance()->getOrigin()); - if (obj_dist < min_dist) - { - min_dist = obj_dist; - } - } - - // factor the distance inside the displacement vector. This will get us - // equally visible movements for both close and far away selections. - min_dist = sqrt(min_dist) / 2; - displ_global.setVec(displ.mV[0]*min_dist, - displ.mV[1]*min_dist, - displ.mV[2]*min_dist); - - // equates to: Displ_global = Displ * M_cam_axes_in_global_frame - displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global); - } - - LLQuaternion new_rot; - if (update_rotation) - { - // let's calculate the rotation around each camera axes - LLQuaternion qx(roll, LLViewerCamera::getInstance()->getAtAxis()); - LLQuaternion qy(pitch, LLViewerCamera::getInstance()->getLeftAxis()); - LLQuaternion qz(yaw, LLViewerCamera::getInstance()->getUpAxis()); - new_rot.setQuat(qx * qy * qz); - } - - LLViewerObject *obj; - S32 obj_count = getSelection()->getObjectCount(); - for (LLObjectSelection::root_iterator it = getSelection()->root_begin(); - it != getSelection()->root_end(); ++it ) - { - obj = (*it)->getObject(); - bool enable_pos = false, enable_rot = false; - bool perm_move = obj->permMove(); - bool perm_mod = obj->permModify(); - - LLVector3d sel_center(getSelectionCenterGlobal()); - - if (update_rotation) - { - enable_rot = perm_move - && ((perm_mod && !obj->isAttachment()) || noedit_linked_parts); - - if (enable_rot) - { - int children_count = obj->getChildren().size(); - if (obj_count > 1 && children_count > 0) - { - // for linked sets, rotate around the group center - const LLVector3 t(obj->getPositionGlobal() - sel_center); - - // Ra = T x R x T^-1 - LLMatrix4 mt; mt.setTranslation(t); - const LLMatrix4 mnew_rot(new_rot); - LLMatrix4 mt_1; mt_1.setTranslation(-t); - mt *= mnew_rot; - mt *= mt_1; - - // Rfin = Rcur * Ra - obj->setRotation(obj->getRotationEdit() * mt.quaternion()); - displ_global += mt.getTranslation(); - } - else - { - obj->setRotation(obj->getRotationEdit() * new_rot); - } - } - else - { - update_success = false; - } - } - - if (update_position) - { - // establish if object can be moved or not - enable_pos = perm_move && !obj->isAttachment() - && (perm_mod || noedit_linked_parts); - - if (enable_pos) - { - obj->setPosition(obj->getPositionEdit() + displ_global); - } - else - { - update_success = false; - } - } - - if (enable_pos && enable_rot && obj->mDrawable.notNull()) - { - gPipeline.markMoved(obj->mDrawable, TRUE); - } - } - - if (update_position && update_success && obj_count > 1) - { - updateSelectionCenter(); - } - - return update_success; -} - -void LLSelectMgr::sendSelectionMove() -{ - LLSelectNode *node = mSelectedObjects->getFirstRootNode(); - if (node == NULL) - { - return; - } - - //saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); - - U32 update_type = UPD_POSITION | UPD_ROTATION; - LLViewerRegion *last_region, *curr_region = node->getObject()->getRegion(); - S32 objects_in_this_packet = 0; - - // apply to linked objects if unable to select their individual parts - if (!gSavedSettings.getBOOL("EditLinkedParts") && !getTEMode()) - { - // tell simulator to apply to whole linked sets - update_type |= UPD_LINKED_SETS; - } - - // prepare first bulk message - gMessageSystem->newMessage("MultipleObjectUpdate"); - packAgentAndSessionID(&update_type); - - LLViewerObject *obj = NULL; - for (LLObjectSelection::root_iterator it = getSelection()->root_begin(); - it != getSelection()->root_end(); ++it) - { - obj = (*it)->getObject(); - - // note: following code adapted from sendListToRegions() (@3924) - last_region = curr_region; - curr_region = obj->getRegion(); - - // if not simulator or message too big - if (curr_region != last_region - || gMessageSystem->isSendFull(NULL) - || objects_in_this_packet >= MAX_OBJECTS_PER_PACKET) - { - // send sim the current message and start new one - gMessageSystem->sendReliable(last_region->getHost()); - objects_in_this_packet = 0; - gMessageSystem->newMessage("MultipleObjectUpdate"); - packAgentAndSessionID(&update_type); - } - - // add another instance of the body of data - packMultipleUpdate(*it, &update_type); - ++objects_in_this_packet; - } - - // flush remaining messages - if (gMessageSystem->getCurrentSendTotal() > 0) - { - gMessageSystem->sendReliable(curr_region->getHost()); - } - else - { - gMessageSystem->clearMessage(); - } - - //saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); -} +/** + * @file llselectmgr.cpp + * @brief A manager for selected objects and faces. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +// file include +#include "llselectmgr.h" + +// library includes +#include "llcachename.h" +#include "lldbstrings.h" +#include "lleconomy.h" +#include "llgl.h" +#include "llrender.h" +#include "llpermissions.h" +#include "llpermissionsflags.h" +#include "llundo.h" +#include "lluuid.h" +#include "llvolume.h" +#include "message.h" +#include "object_flags.h" +#include "llquaternion.h" + +// viewer includes +#include "llagent.h" +#include "llviewerwindow.h" +#include "lldrawable.h" +#include "llfloaterinspect.h" +#include "llfloaterproperties.h" +#include "llfloaterreporter.h" +#include "llfloatertools.h" +#include "llframetimer.h" +#include "llfocusmgr.h" +#include "llhudeffecttrail.h" +#include "llhudmanager.h" +#include "llinventorymodel.h" +#include "llmenugl.h" +#include "llmutelist.h" +#include "llstatusbar.h" +#include "llsurface.h" +#include "lltool.h" +#include "lltooldraganddrop.h" +#include "lltoolmgr.h" +#include "lltoolpie.h" +#include "llui.h" +#include "llviewercamera.h" +#include "llviewercontrol.h" +#include "llviewertexturelist.h" +#include "llviewermedia.h" +#include "llviewermediafocus.h" +#include "llviewermenu.h" +#include "llviewerobject.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llviewerstats.h" +#include "llvoavatar.h" +#include "llvovolume.h" +#include "pipeline.h" + +#include "llglheaders.h" +#include "hippogridmanager.h" + +// [RLVa:KB] +#include "rlvhandler.h" +// [/RLVa:KB] + +#include "llglheaders.h" + +LLViewerObject* getSelectedParentObject(LLViewerObject *object) ; +// +// Consts +// + +const S32 NUM_SELECTION_UNDO_ENTRIES = 200; +const F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f; +const S32 OWNERSHIP_COST_PER_OBJECT = 10; // Must be the same as economy_constants.price_object_claim in the database. +const S32 MAX_ACTION_QUEUE_SIZE = 20; +const S32 MAX_SILS_PER_FRAME = 50; +const S32 MAX_OBJECTS_PER_PACKET = 254; +const S32 TE_SELECT_MASK_ALL = 0xFFFFFFFF; + +// +// Globals +// + +BOOL gDebugSelectMgr = FALSE; + +BOOL gHideSelectedObjects = FALSE; +BOOL gAllowSelectAvatar = FALSE; + +BOOL LLSelectMgr::sRectSelectInclusive = TRUE; +BOOL LLSelectMgr::sRenderSelectionHighlights = TRUE; +BOOL LLSelectMgr::sRenderHiddenSelections = TRUE; +BOOL LLSelectMgr::sRenderLightRadius = FALSE; +F32 LLSelectMgr::sHighlightThickness = 0.f; +F32 LLSelectMgr::sHighlightUScale = 0.f; +F32 LLSelectMgr::sHighlightVScale = 0.f; +F32 LLSelectMgr::sHighlightAlpha = 0.f; +F32 LLSelectMgr::sHighlightAlphaTest = 0.f; +F32 LLSelectMgr::sHighlightUAnim = 0.f; +F32 LLSelectMgr::sHighlightVAnim = 0.f; +LLColor4 LLSelectMgr::sSilhouetteParentColor; +LLColor4 LLSelectMgr::sSilhouetteChildColor; +LLColor4 LLSelectMgr::sHighlightInspectColor; +LLColor4 LLSelectMgr::sHighlightParentColor; +LLColor4 LLSelectMgr::sHighlightChildColor; +LLColor4 LLSelectMgr::sContextSilhouetteColor; +std::set LLSelectMgr::sObjectPropertiesFamilyRequests; + +static LLObjectSelection *get_null_object_selection(); +template<> + const LLSafeHandle::NullFunc + LLSafeHandle::sNullFunc = get_null_object_selection; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// struct LLDeRezInfo +// +// Used to keep track of important derez info. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +struct LLDeRezInfo +{ + EDeRezDestination mDestination; + LLUUID mDestinationID; + LLDeRezInfo(EDeRezDestination dest, const LLUUID& dest_id) : + mDestination(dest), mDestinationID(dest_id) {} +}; + +// +// Imports +// + + +static LLPointer sNullSelection; + +// +// Functions +// + +void LLSelectMgr::cleanupGlobals() +{ + sNullSelection = NULL; + LLSelectMgr::getInstance()->clearSelections(); +} + +LLObjectSelection *get_null_object_selection() +{ + if (sNullSelection.isNull()) + { + sNullSelection = new LLObjectSelection; + } + return sNullSelection; +} + + +//----------------------------------------------------------------------------- +// LLSelectMgr() +//----------------------------------------------------------------------------- +LLSelectMgr::LLSelectMgr() +{ + mTEMode = FALSE; + mLastCameraPos.clearVec(); + + sHighlightThickness = gSavedSettings.getF32("SelectionHighlightThickness"); + sHighlightUScale = gSavedSettings.getF32("SelectionHighlightUScale"); + sHighlightVScale = gSavedSettings.getF32("SelectionHighlightVScale"); + sHighlightAlpha = gSavedSettings.getF32("SelectionHighlightAlpha"); + sHighlightAlphaTest = gSavedSettings.getF32("SelectionHighlightAlphaTest"); + sHighlightUAnim = gSavedSettings.getF32("SelectionHighlightUAnim"); + sHighlightVAnim = gSavedSettings.getF32("SelectionHighlightVAnim"); + + sSilhouetteParentColor = gColors.getColor("SilhouetteParentColor"); + sSilhouetteChildColor = gColors.getColor("SilhouetteChildColor"); + sHighlightParentColor = gColors.getColor("HighlightParentColor"); + sHighlightChildColor = gColors.getColor("HighlightChildColor"); + sHighlightInspectColor = gColors.getColor("HighlightInspectColor"); + sContextSilhouetteColor = gColors.getColor("ContextSilhouetteColor")*0.5f; + + sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius"); + + mRenderSilhouettes = TRUE; + + mGridMode = GRID_MODE_WORLD; + gSavedSettings.setS32("GridMode", (S32)GRID_MODE_WORLD); + mGridValid = FALSE; + + mSelectedObjects = new LLObjectSelection(); + mHoverObjects = new LLObjectSelection(); + mHighlightedObjects = new LLObjectSelection(); + + mForceSelection = FALSE; + mShowSelection = FALSE; +} + + +//----------------------------------------------------------------------------- +// ~LLSelectMgr() +//----------------------------------------------------------------------------- +LLSelectMgr::~LLSelectMgr() +{ + clearSelections(); +} + +void LLSelectMgr::clearSelections() +{ + mHoverObjects->deleteAllNodes(); + mSelectedObjects->deleteAllNodes(); + mHighlightedObjects->deleteAllNodes(); + mRectSelectedObjects.clear(); + mGridObjects.deleteAllNodes(); +} + +void LLSelectMgr::update() +{ + mSelectedObjects->cleanupNodes(); +} + +void LLSelectMgr::updateEffects() +{ + //keep reference grid objects active + struct f : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + LLDrawable* drawable = object->mDrawable; + if (drawable) + { + gPipeline.markMoved(drawable); + } + return true; + } + } func; + mGridObjects.applyToObjects(&func); + + if (mEffectsTimer.getElapsedTimeF32() > 1.f) + { + mSelectedObjects->updateEffects(); + mEffectsTimer.reset(); + } +} + +void LLSelectMgr::overrideObjectUpdates() +{ + //override any position updates from simulator on objects being edited + struct f : public LLSelectedNodeFunctor + { + virtual bool apply(LLSelectNode* selectNode) + { + LLViewerObject* object = selectNode->getObject(); + if (object && object->permMove()) + { + if (!selectNode->mLastPositionLocal.isExactlyZero()) + { + object->setPosition(selectNode->mLastPositionLocal); + } + if (selectNode->mLastRotation != LLQuaternion()) + { + object->setRotation(selectNode->mLastRotation); + } + if (!selectNode->mLastScale.isExactlyZero()) + { + object->setScale(selectNode->mLastScale); + } + } + return true; + } + } func; + getSelection()->applyToNodes(&func); +} + +//----------------------------------------------------------------------------- +// Select just the object, not any other group members. +//----------------------------------------------------------------------------- +LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face) +{ + llassert( object ); + + //remember primary object + mSelectedObjects->mPrimaryObject = object; + + // Don't add an object that is already in the list + if (object->isSelected() ) { + // make sure point at position is updated + updatePointAt(); + gEditMenuHandler = this; + return NULL; + } + + if (!canSelectObject(object)) + { + //make_ui_sound("UISndInvalidOp"); + return NULL; + } + + // llinfos << "Adding object to selected object list" << llendl; + + // Place it in the list and tag it. + // This will refresh dialogs. + addAsIndividual(object, face); + + // Stop the object from moving (this anticipates changes on the + // simulator in LLTask::userSelect) + // *FIX: shouldn't zero out these either + object->setVelocity(LLVector3::zero); + object->setAcceleration(LLVector3::zero); + //object->setAngularVelocity(LLVector3::zero); + object->resetRot(); + + // Always send to simulator, so you get a copy of the + // permissions structure back. + gMessageSystem->newMessageFast(_PREHASH_ObjectSelect); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() ); + LLViewerRegion* regionp = object->getRegion(); + gMessageSystem->sendReliable( regionp->getHost()); + + updatePointAt(); + updateSelectionCenter(); + saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); + + // have selection manager handle edit menu immediately after + // user selects an object + if (mSelectedObjects->getObjectCount()) + { + gEditMenuHandler = this; + } + + return mSelectedObjects; +} + +//----------------------------------------------------------------------------- +// Select the object, parents and children. +//----------------------------------------------------------------------------- +LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end) +{ + llassert( obj ); + + //remember primary object + mSelectedObjects->mPrimaryObject = obj; + + // This may be incorrect if things weren't family selected before... - djs 07/08/02 + // Don't add an object that is already in the list + if (obj->isSelected() ) + { + // make sure pointat position is updated + updatePointAt(); + gEditMenuHandler = this; + return NULL; + } + + if (!canSelectObject(obj)) + { + //make_ui_sound("UISndInvalidOp"); + return NULL; + } + + // Since we're selecting a family, start at the root, but + // don't include an avatar. + LLViewerObject* root = obj; + + while(!root->isAvatar() && root->getParent() && !root->isJointChild()) + { + LLViewerObject* parent = (LLViewerObject*)root->getParent(); + if (parent->isAvatar()) + { + break; + } + root = parent; + } + + // Collect all of the objects + std::vector objects; + + root->addThisAndNonJointChildren(objects); + addAsFamily(objects, add_to_end); + + updateSelectionCenter(); + saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); + updatePointAt(); + + dialog_refresh_all(); + + // Always send to simulator, so you get a copy of the permissions + // structure back. + sendSelect(); + + // Stop the object from moving (this anticipates changes on the + // simulator in LLTask::userSelect) + root->setVelocity(LLVector3::zero); + root->setAcceleration(LLVector3::zero); + //root->setAngularVelocity(LLVector3::zero); + root->resetRot(); + + // leave component mode + if (gSavedSettings.getBOOL("EditLinkedParts")) + { + gSavedSettings.setBOOL("EditLinkedParts", FALSE); + promoteSelectionToRoot(); + } + + // have selection manager handle edit menu immediately after + // user selects an object + if (mSelectedObjects->getObjectCount()) + { + gEditMenuHandler = this; + } + + return mSelectedObjects; +} + +//----------------------------------------------------------------------------- +// Select the object, parents and children. +//----------------------------------------------------------------------------- +LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const std::vector& object_list, + BOOL send_to_sim) +{ + // Collect all of the objects, children included + std::vector objects; + + //clear primary object (no primary object) + mSelectedObjects->mPrimaryObject = NULL; + + if (object_list.size() < 1) + { + return NULL; + } + + // NOTE -- we add the objects in REVERSE ORDER + // to preserve the order in the mSelectedObjects list + for (std::vector::const_reverse_iterator riter = object_list.rbegin(); + riter != object_list.rend(); ++riter) + { + LLViewerObject *object = *riter; + + llassert( object ); + + if (!canSelectObject(object)) continue; + + object->addThisAndNonJointChildren(objects); + addAsFamily(objects); + + // Stop the object from moving (this anticipates changes on the + // simulator in LLTask::userSelect) + object->setVelocity(LLVector3::zero); + object->setAcceleration(LLVector3::zero); + //object->setAngularVelocity(LLVector3::zero); + object->resetRot(); + } + + updateSelectionCenter(); + saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); + updatePointAt(); + dialog_refresh_all(); + + // Almost always send to simulator, so you get a copy of the permissions + // structure back. + // JC: The one case where you don't want to do this is if you're selecting + // all the objects on a sim. + if (send_to_sim) + { + sendSelect(); + } + + // leave component mode + if (gSavedSettings.getBOOL("EditLinkedParts")) + { + gSavedSettings.setBOOL("EditLinkedParts", FALSE); + promoteSelectionToRoot(); + } + + // have selection manager handle edit menu immediately after + // user selects an object + if (mSelectedObjects->getObjectCount()) + { + gEditMenuHandler = this; + } + + return mSelectedObjects; +} + +// Use for when the simulator kills an object. This version also +// handles informing the current tool of the object's deletion. +// +// Caller needs to call dialog_refresh_all if necessary. +BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id) +{ + BOOL object_found = FALSE; + LLTool *tool = NULL; + if (!gNoRender) + { + tool = LLToolMgr::getInstance()->getCurrentTool(); + + // It's possible that the tool is editing an object that is not selected + LLViewerObject* tool_editing_object = tool->getEditingObject(); + if( tool_editing_object && tool_editing_object->mID == id) + { + tool->stopEditing(); + object_found = TRUE; + } + } + + // Iterate through selected objects list and kill the object + if( !object_found ) + { + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); ) + { + LLObjectSelection::iterator curiter = iter++; + LLViewerObject* object = (*curiter)->getObject(); + if (object->mID == id) + { + if (tool) + { + tool->stopEditing(); + } + + // lose the selection, don't tell simulator, it knows + deselectObjectAndFamily(object, FALSE); + object_found = TRUE; + break; // must break here, may have removed multiple objects from list + } + else if (object->isAvatar() && object->getParent() && ((LLViewerObject*)object->getParent())->mID == id) + { + // It's possible the item being removed has an avatar sitting on it + // So remove the avatar that is sitting on the object. + deselectObjectAndFamily(object, FALSE); + break; // must break here, may have removed multiple objects from list + } + } + } + + return object_found; +} + +void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim, BOOL include_entire_object) +{ + // bail if nothing selected or if object wasn't selected in the first place + if(!object) return; + if(!object->isSelected()) return; + + // Collect all of the objects, and remove them + std::vector objects; + + if (include_entire_object) + { + // Since we're selecting a family, start at the root, but + // don't include an avatar. + LLViewerObject* root = object; + + while(!root->isAvatar() && root->getParent() && !root->isJointChild()) + { + LLViewerObject* parent = (LLViewerObject*)root->getParent(); + if (parent->isAvatar()) + { + break; + } + root = parent; + } + + object = root; + } + else + { + object = (LLViewerObject*)object->getRoot(); + } + + object->addThisAndAllChildren(objects); + remove(objects); + + if (!send_to_sim) return; + + //----------------------------------------------------------- + // Inform simulator of deselection + //----------------------------------------------------------- + LLViewerRegion* regionp = object->getRegion(); + + BOOL start_new_message = TRUE; + S32 select_count = 0; + + LLMessageSystem* msg = gMessageSystem; + for (U32 i = 0; i < objects.size(); i++) + { + if (start_new_message) + { + msg->newMessageFast(_PREHASH_ObjectDeselect); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + select_count++; + start_new_message = FALSE; + } + + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addU32Fast(_PREHASH_ObjectLocalID, (objects[i])->getLocalID()); + select_count++; + + // Zap the angular velocity, as the sim will set it to zero + objects[i]->setAngularVelocity( 0,0,0 ); + objects[i]->setVelocity( 0,0,0 ); + + if(msg->isSendFull(NULL) || select_count >= MAX_OBJECTS_PER_PACKET) + { + msg->sendReliable(regionp->getHost() ); + select_count = 0; + start_new_message = TRUE; + } + } + + if (!start_new_message) + { + msg->sendReliable(regionp->getHost() ); + } + + updatePointAt(); + updateSelectionCenter(); +} + +void LLSelectMgr::deselectObjectOnly(LLViewerObject* object, BOOL send_to_sim) +{ + // bail if nothing selected or if object wasn't selected in the first place + if (!object) return; + if (!object->isSelected() ) return; + + // Zap the angular velocity, as the sim will set it to zero + object->setAngularVelocity( 0,0,0 ); + object->setVelocity( 0,0,0 ); + + if (send_to_sim) + { + LLViewerRegion* region = object->getRegion(); + gMessageSystem->newMessageFast(_PREHASH_ObjectDeselect); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() ); + gMessageSystem->sendReliable(region->getHost()); + } + + // This will refresh dialogs. + remove( object ); + + updatePointAt(); + updateSelectionCenter(); +} + + +//----------------------------------------------------------------------------- +// addAsFamily +//----------------------------------------------------------------------------- + +void LLSelectMgr::addAsFamily(std::vector& objects, BOOL add_to_end) +{ + for (std::vector::iterator iter = objects.begin(); + iter != objects.end(); ++iter) + { + LLViewerObject* objectp = *iter; + + // Can't select yourself + if (objectp->mID == gAgentID + && !gAllowSelectAvatar) + { + continue; + } + + if (!objectp->isSelected()) + { + LLSelectNode *nodep = new LLSelectNode(objectp, TRUE); + if (add_to_end) + { + mSelectedObjects->addNodeAtEnd(nodep); + } + else + { + mSelectedObjects->addNode(nodep); + } + objectp->setSelected(TRUE); + + if (objectp->getNumTEs() > 0) + { + nodep->selectAllTEs(TRUE); + } + else + { + // object has no faces, so don't mess with faces + } + } + else + { + // we want this object to be selected for real + // so clear transient flag + LLSelectNode* select_node = mSelectedObjects->findNode(objectp); + if (select_node) + { + select_node->setTransient(FALSE); + } + } + } + saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); +} + +//----------------------------------------------------------------------------- +// addAsIndividual() - a single object, face, etc +//----------------------------------------------------------------------------- +void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoable) +{ + // check to see if object is already in list + LLSelectNode *nodep = mSelectedObjects->findNode(objectp); + + // if not in list, add it + if (!nodep) + { + nodep = new LLSelectNode(objectp, TRUE); + mSelectedObjects->addNode(nodep); + llassert_always(nodep->getObject()); + } + else + { + // make this a full-fledged selection + nodep->setTransient(FALSE); + // Move it to the front of the list + mSelectedObjects->moveNodeToFront(nodep); + } + + // Make sure the object is tagged as selected + objectp->setSelected( TRUE ); + + // And make sure we don't consider it as part of a family + nodep->mIndividualSelection = TRUE; + + // Handle face selection + if (objectp->getNumTEs() <= 0) + { + // object has no faces, so don't do anything + } + else if (face == SELECT_ALL_TES) + { + nodep->selectAllTEs(TRUE); + } + else if (0 <= face && face < SELECT_MAX_TES) + { + nodep->selectTE(face, TRUE); + } + else + { + llerrs << "LLSelectMgr::add face " << face << " out-of-range" << llendl; + return; + } + + saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); + updateSelectionCenter(); + dialog_refresh_all(); +} + + +LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32 face) +{ + if (!objectp) + { + mHoverObjects->deleteAllNodes(); + return NULL; + } + + // Can't select yourself + if (objectp->mID == gAgentID) + { + mHoverObjects->deleteAllNodes(); + return NULL; + } + + // Can't select land + if (objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) + { + mHoverObjects->deleteAllNodes(); + return NULL; + } + + mHoverObjects->mPrimaryObject = objectp; + + objectp = objectp->getRootEdit(); + + // is the requested object the same as the existing hover object root? + // NOTE: there is only ever one linked set in mHoverObjects + if (mHoverObjects->getFirstRootObject() != objectp) + { + + // Collect all of the objects + std::vector objects; + objectp = objectp->getRootEdit(); + objectp->addThisAndNonJointChildren(objects); + + mHoverObjects->deleteAllNodes(); + for (std::vector::iterator iter = objects.begin(); + iter != objects.end(); ++iter) + { + LLViewerObject* cur_objectp = *iter; + LLSelectNode* nodep = new LLSelectNode(cur_objectp, FALSE); + nodep->selectTE(face, TRUE); + mHoverObjects->addNodeAtEnd(nodep); + } + + requestObjectPropertiesFamily(objectp); + } + + return mHoverObjects; +} + +LLSelectNode *LLSelectMgr::getHoverNode() +{ + return getHoverObjects()->getFirstRootNode(); +} + +void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp) +{ + if (!objectp) + { + return; + } + + if (objectp->getPCode() != LL_PCODE_VOLUME) + { + return; + } + + if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !objectp->permYouOwner()) || + (gSavedSettings.getBOOL("SelectMovableOnly") && !objectp->permMove())) + { + // only select my own objects + return; + } + + mRectSelectedObjects.insert(objectp); +} + +void LLSelectMgr::highlightObjectAndFamily(LLViewerObject* objectp) +{ + if (!objectp) + { + return; + } + + LLViewerObject* root_obj = (LLViewerObject*)objectp->getRoot(); + + highlightObjectOnly(root_obj); + + LLViewerObject::const_child_list_t& child_list = root_obj->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) + { + LLViewerObject* child = *iter; + highlightObjectOnly(child); + } +} + +// Note that this ignores the "select owned only" flag +// It's also more efficient than calling the single-object version over and over. +void LLSelectMgr::highlightObjectAndFamily(const std::vector& objects) +{ + for (std::vector::const_iterator iter1 = objects.begin(); + iter1 != objects.end(); ++iter1) + { + LLViewerObject* object = *iter1; + + if (!object) + { + continue; + } + if (object->getPCode() != LL_PCODE_VOLUME) + { + continue; + } + + LLViewerObject* root = (LLViewerObject*)object->getRoot(); + mRectSelectedObjects.insert(root); + + LLViewerObject::const_child_list_t& child_list = root->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter2 = child_list.begin(); + iter2 != child_list.end(); iter2++) + { + LLViewerObject* child = *iter2; + mRectSelectedObjects.insert(child); + } + } +} + +void LLSelectMgr::unhighlightObjectOnly(LLViewerObject* objectp) +{ + if (!objectp || (objectp->getPCode() != LL_PCODE_VOLUME)) + { + return; + } + + mRectSelectedObjects.erase(objectp); +} + +void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp) +{ + if (!objectp) + { + return; + } + + LLViewerObject* root_obj = (LLViewerObject*)objectp->getRoot(); + + unhighlightObjectOnly(root_obj); + + LLViewerObject::const_child_list_t& child_list = root_obj->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) + { + LLViewerObject* child = *iter; + unhighlightObjectOnly(child); + } +} + + +void LLSelectMgr::unhighlightAll() +{ + mRectSelectedObjects.clear(); + mHighlightedObjects->deleteAllNodes(); +} + +LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects() +{ + if (!mHighlightedObjects->getNumNodes()) + { + return NULL; + } + + //clear primary object + mSelectedObjects->mPrimaryObject = NULL; + + for (LLObjectSelection::iterator iter = getHighlightedObjects()->begin(); + iter != getHighlightedObjects()->end(); ) + { + LLObjectSelection::iterator curiter = iter++; + + LLSelectNode *nodep = *curiter; + LLViewerObject* objectp = nodep->getObject(); + + if (!canSelectObject(objectp)) + { + continue; + } + + // already selected + if (objectp->isSelected()) + { + continue; + } + + LLSelectNode* new_nodep = new LLSelectNode(*nodep); + mSelectedObjects->addNode(new_nodep); + + // flag this object as selected + objectp->setSelected(TRUE); + + mSelectedObjects->mSelectType = getSelectTypeForObject(objectp); + + // request properties on root objects + if (objectp->isRootEdit()) + { + requestObjectPropertiesFamily(objectp); + } + } + + // pack up messages to let sim know these objects are selected + sendSelect(); + unhighlightAll(); + updateSelectionCenter(); + saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); + updatePointAt(); + + if (mSelectedObjects->getObjectCount()) + { + gEditMenuHandler = this; + } + + return mSelectedObjects; +} + +void LLSelectMgr::deselectHighlightedObjects() +{ + BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); + for (std::set >::iterator iter = mRectSelectedObjects.begin(); + iter != mRectSelectedObjects.end(); iter++) + { + LLViewerObject *objectp = *iter; + if (!select_linked_set) + { + deselectObjectOnly(objectp); + } + else + { + LLViewerObject* root_object = (LLViewerObject*)objectp->getRoot(); + if (root_object->isSelected()) + { + deselectObjectAndFamily(root_object); + } + } + } + + unhighlightAll(); +} + +void LLSelectMgr::addGridObject(LLViewerObject* objectp) +{ + LLSelectNode* nodep = new LLSelectNode(objectp, FALSE); + mGridObjects.addNodeAtEnd(nodep); + + LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) + { + LLViewerObject* child = *iter; + nodep = new LLSelectNode(child, FALSE); + mGridObjects.addNodeAtEnd(nodep); + } +} + +void LLSelectMgr::clearGridObjects() +{ + mGridObjects.deleteAllNodes(); +} + +void LLSelectMgr::setGridMode(EGridMode mode) +{ + mGridMode = mode; + gSavedSettings.setS32("GridMode", mode); + updateSelectionCenter(); + mGridValid = FALSE; +} + +void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale) +{ + mGridObjects.cleanupNodes(); + + LLViewerObject* first_grid_object = mGridObjects.getFirstObject(); + + if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount()) + { + //LLViewerObject* root = getSelectedParentObject(mSelectedObjects->getFirstObject()); + LLBBox bbox = mSavedSelectionBBox; + mGridOrigin = mSavedSelectionBBox.getCenterAgent(); + mGridScale = mSavedSelectionBBox.getExtentLocal() * 0.5f; + + // DEV-12570 Just taking the saved selection box rotation prevents + // wild rotations of linked sets while in local grid mode + //if(mSelectedObjects->getObjectCount() < 2 || !root || root->mDrawable.isNull()) + { + mGridRotation = mSavedSelectionBBox.getRotation(); + } + /*else //set to the root object + { + mGridRotation = root->getRenderRotation(); + }*/ + } + else if (mGridMode == GRID_MODE_REF_OBJECT && first_grid_object && first_grid_object->mDrawable.notNull()) + { + mGridRotation = first_grid_object->getRenderRotation(); + LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition(); + + LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX); + LLVector3 max_extents(-F32_MAX, -F32_MAX, -F32_MAX); + BOOL grid_changed = FALSE; + for (LLObjectSelection::iterator iter = mGridObjects.begin(); + iter != mGridObjects.end(); ++iter) + { + LLViewerObject* object = (*iter)->getObject(); + LLDrawable* drawable = object->mDrawable; + if (drawable) + { + const LLVector3* ext = drawable->getSpatialExtents(); + update_min_max(min_extents, max_extents, ext[0]); + update_min_max(min_extents, max_extents, ext[1]); + grid_changed = TRUE; + } + } + if (grid_changed) + { + mGridOrigin = lerp(min_extents, max_extents, 0.5f); + LLDrawable* drawable = first_grid_object->mDrawable; + if (drawable && drawable->isActive()) + { + mGridOrigin = mGridOrigin * first_grid_object->getRenderMatrix(); + } + mGridScale = (max_extents - min_extents) * 0.5f; + } + } + else // GRID_MODE_WORLD or just plain default + { + const BOOL non_root_ok = TRUE; + LLViewerObject* first_object = mSelectedObjects->getFirstRootObject(non_root_ok); + + mGridOrigin.clearVec(); + mGridRotation.loadIdentity(); + + mSelectedObjects->mSelectType = getSelectTypeForObject( first_object ); + + switch (mSelectedObjects->mSelectType) + { + case SELECT_TYPE_ATTACHMENT: + if (first_object && first_object->getRootEdit()->mDrawable.notNull()) + { + // this means this object *has* to be an attachment + LLXform* attachment_point_xform = first_object->getRootEdit()->mDrawable->mXform.getParent(); + if(attachment_point_xform) { + mGridOrigin = attachment_point_xform->getWorldPosition(); + mGridRotation = attachment_point_xform->getWorldRotation(); + } + mGridScale = LLVector3(1.f, 1.f, 1.f) * gSavedSettings.getF32("GridResolution"); + } + break; + case SELECT_TYPE_HUD: + // use HUD-scaled grid + mGridScale = LLVector3(0.25f, 0.25f, 0.25f); + break; + case SELECT_TYPE_WORLD: + mGridScale = LLVector3(1.f, 1.f, 1.f) * gSavedSettings.getF32("GridResolution"); + break; + } + } + llassert(mGridOrigin.isFinite()); + + origin = mGridOrigin; + rotation = mGridRotation; + scale = mGridScale; + mGridValid = TRUE; +} + +//----------------------------------------------------------------------------- +// remove() - an array of objects +//----------------------------------------------------------------------------- + +void LLSelectMgr::remove(std::vector& objects) +{ + for (std::vector::iterator iter = objects.begin(); + iter != objects.end(); ++iter) + { + LLViewerObject* objectp = *iter; + LLSelectNode* nodep = mSelectedObjects->findNode(objectp); + if (nodep) + { + objectp->setSelected(FALSE); + mSelectedObjects->removeNode(nodep); + nodep = NULL; + } + } + updateSelectionCenter(); + dialog_refresh_all(); +} + + +//----------------------------------------------------------------------------- +// remove() - a single object +//----------------------------------------------------------------------------- +void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable) +{ + // get object node (and verify it is in the selected list) + LLSelectNode *nodep = mSelectedObjects->findNode(objectp); + if (!nodep) + { + return; + } + + // if face = all, remove object from list + if ((objectp->getNumTEs() <= 0) || (te == SELECT_ALL_TES)) + { + // Remove all faces (or the object doesn't have faces) so remove the node + mSelectedObjects->removeNode(nodep); + nodep = NULL; + objectp->setSelected( FALSE ); + } + else if (0 <= te && te < SELECT_MAX_TES) + { + // ...valid face, check to see if it was on + if (nodep->isTESelected(te)) + { + nodep->selectTE(te, FALSE); + } + else + { + llerrs << "LLSelectMgr::remove - tried to remove TE " << te << " that wasn't selected" << llendl; + return; + } + + // ...check to see if this operation turned off all faces + BOOL found = FALSE; + for (S32 i = 0; i < nodep->getObject()->getNumTEs(); i++) + { + found = found || nodep->isTESelected(i); + } + + // ...all faces now turned off, so remove + if (!found) + { + mSelectedObjects->removeNode(nodep); + nodep = NULL; + objectp->setSelected( FALSE ); + // *FIXME: Doesn't update simulator that object is no longer selected + } + } + else + { + // ...out of range face + llerrs << "LLSelectMgr::remove - TE " << te << " out of range" << llendl; + } + + updateSelectionCenter(); + dialog_refresh_all(); +} + + +//----------------------------------------------------------------------------- +// removeAll() +//----------------------------------------------------------------------------- +void LLSelectMgr::removeAll() +{ + for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); + iter != mSelectedObjects->end(); iter++ ) + { + LLViewerObject *objectp = (*iter)->getObject(); + objectp->setSelected( FALSE ); + } + + mSelectedObjects->deleteAllNodes(); + + updateSelectionCenter(); + dialog_refresh_all(); +} + +//----------------------------------------------------------------------------- +// promoteSelectionToRoot() +//----------------------------------------------------------------------------- +void LLSelectMgr::promoteSelectionToRoot() +{ + std::set selection_set; + + BOOL selection_changed = FALSE; + + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); ) + { + LLObjectSelection::iterator curiter = iter++; + LLSelectNode* nodep = *curiter; + LLViewerObject* object = nodep->getObject(); + + if (nodep->mIndividualSelection) + { + selection_changed = TRUE; + } + + LLViewerObject* parentp = object; + while(parentp->getParent() && !(parentp->isRootEdit() || parentp->isJointChild())) + { + parentp = (LLViewerObject*)parentp->getParent(); + } + + selection_set.insert(parentp); + } + + if (selection_changed) + { + deselectAll(); + + std::set::iterator set_iter; + for (set_iter = selection_set.begin(); set_iter != selection_set.end(); ++set_iter) + { + selectObjectAndFamily(*set_iter); + } + } +} + +//----------------------------------------------------------------------------- +// demoteSelectionToIndividuals() +//----------------------------------------------------------------------------- +void LLSelectMgr::demoteSelectionToIndividuals() +{ + std::vector objects; + + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++) + { + LLViewerObject* object = (*iter)->getObject(); + object->addThisAndNonJointChildren(objects); + } + + if (!objects.empty()) + { + deselectAll(); + for (std::vector::iterator iter = objects.begin(); + iter != objects.end(); ++iter) + { + LLViewerObject* objectp = *iter; + selectObjectOnly(objectp); + } + } +} + +//----------------------------------------------------------------------------- +// dump() +//----------------------------------------------------------------------------- +void LLSelectMgr::dump() +{ + llinfos << "Selection Manager: " << mSelectedObjects->getNumNodes() << " items" << llendl; + + llinfos << "TE mode " << mTEMode << llendl; + + S32 count = 0; + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); iter++ ) + { + LLViewerObject* objectp = (*iter)->getObject(); + llinfos << "Object " << count << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl; + llinfos << " hasLSL " << objectp->flagScripted() << llendl; + llinfos << " hasTouch " << objectp->flagHandleTouch() << llendl; + llinfos << " hasMoney " << objectp->flagTakesMoney() << llendl; + llinfos << " getposition " << objectp->getPosition() << llendl; + llinfos << " getpositionAgent " << objectp->getPositionAgent() << llendl; + llinfos << " getpositionRegion " << objectp->getPositionRegion() << llendl; + llinfos << " getpositionGlobal " << objectp->getPositionGlobal() << llendl; + LLDrawable* drawablep = objectp->mDrawable; + llinfos << " " << (drawablep&& drawablep->isVisible() ? "visible" : "invisible") << llendl; + llinfos << " " << (drawablep&& drawablep->isState(LLDrawable::FORCE_INVISIBLE) ? "force_invisible" : "") << llendl; + count++; + } + + // Face iterator + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); iter++ ) + { + LLSelectNode* node = *iter; + LLViewerObject* objectp = node->getObject(); + if (!objectp) + continue; + for (S32 te = 0; te < objectp->getNumTEs(); ++te ) + { + if (node->isTESelected(te)) + { + llinfos << "Object " << objectp << " te " << te << llendl; + } + } + } + + llinfos << mHighlightedObjects->getNumNodes() << " objects currently highlighted." << llendl; + + llinfos << "Center global " << mSelectionCenterGlobal << llendl; +} + +//----------------------------------------------------------------------------- +// cleanup() +//----------------------------------------------------------------------------- +void LLSelectMgr::cleanup() +{ + mSilhouetteImagep = NULL; +} + + +//--------------------------------------------------------------------------- +// Manipulate properties of selected objects +//--------------------------------------------------------------------------- + +struct LLSelectMgrSendFunctor : public LLSelectedObjectFunctor +{ + virtual bool apply(LLViewerObject* object) + { + if (object->permModify()) + { + object->sendTEUpdate(); + } + return true; + } +}; + +//----------------------------------------------------------------------------- +// selectionSetImage() +//----------------------------------------------------------------------------- +// *TODO: re-arch texture applying out of lltooldraganddrop +void LLSelectMgr::selectionSetImage(const LLUUID& imageid) +{ + // First for (no copy) textures and multiple object selection + LLViewerInventoryItem* item = gInventory.getItem(imageid); + // fffff + /* + // + if(item + && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) + && (mSelectedObjects->getNumNodes() > 1) ) + { + llwarns << "Attempted to apply no-copy texture to multiple objects" + << llendl; + return; + } + // + */ + // + + struct f : public LLSelectedTEFunctor + { + LLViewerInventoryItem* mItem; + LLUUID mImageID; + f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mImageID(id) {} + bool apply(LLViewerObject* objectp, S32 te) + { + if (mItem) + { + if (te == -1) // all faces + { + LLToolDragAndDrop::dropTextureAllFaces(objectp, + mItem, + LLToolDragAndDrop::SOURCE_AGENT, + LLUUID::null); + } + else // one face + { + LLToolDragAndDrop::dropTextureOneFace(objectp, + te, + mItem, + LLToolDragAndDrop::SOURCE_AGENT, + LLUUID::null); + } + } + else // not an inventory item + { + // Texture picker defaults aren't inventory items + // * Don't need to worry about permissions for them + // * Can just apply the texture and be done with it. + objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + } + return true; + } + } setfunc(item, imageid); + getSelection()->applyToTEs(&setfunc); + + struct g : public LLSelectedObjectFunctor + { + LLViewerInventoryItem* mItem; + g(LLViewerInventoryItem* item) : mItem(item) {} + virtual bool apply(LLViewerObject* object) + { + if (!mItem) + { + object->sendTEUpdate(); + // 1 particle effect per object + // + if(!gSavedSettings.getBOOL("DisablePointAtAndBeam")) + { + // + LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); + effectp->setSourceObject(gAgent.getAvatarObject()); + effectp->setTargetObject(object); + effectp->setDuration(LL_HUD_DUR_SHORT); + effectp->setColor(LLColor4U(gAgent.getEffectColor())); + // + } + // + } + return true; + } + } sendfunc(item); + getSelection()->applyToObjects(&sendfunc); +} + +//----------------------------------------------------------------------------- +// selectionSetColor() +//----------------------------------------------------------------------------- +void LLSelectMgr::selectionSetColor(const LLColor4 &color) +{ + struct f : public LLSelectedTEFunctor + { + LLColor4 mColor; + f(const LLColor4& c) : mColor(c) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + object->setTEColor(te, mColor); + } + return true; + } + } setfunc(color); + getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); +} + +//----------------------------------------------------------------------------- +// selectionSetColorOnly() +//----------------------------------------------------------------------------- +void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color) +{ + struct f : public LLSelectedTEFunctor + { + LLColor4 mColor; + f(const LLColor4& c) : mColor(c) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + LLColor4 prev_color = object->getTE(te)->getColor(); + mColor.mV[VALPHA] = prev_color.mV[VALPHA]; + // update viewer side color in anticipation of update from simulator + object->setTEColor(te, mColor); + } + return true; + } + } setfunc(color); + getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); +} + +//----------------------------------------------------------------------------- +// selectionSetAlphaOnly() +//----------------------------------------------------------------------------- +void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha) +{ + struct f : public LLSelectedTEFunctor + { + F32 mAlpha; + f(const F32& a) : mAlpha(a) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + LLColor4 prev_color = object->getTE(te)->getColor(); + prev_color.mV[VALPHA] = mAlpha; + // update viewer side color in anticipation of update from simulator + object->setTEColor(te, prev_color); + } + return true; + } + } setfunc(alpha); + getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); +} + +void LLSelectMgr::selectionRevertColors() +{ + struct f : public LLSelectedTEFunctor + { + LLObjectSelectionHandle mSelectedObjects; + f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + LLSelectNode* nodep = mSelectedObjects->findNode(object); + if (nodep && te < (S32)nodep->mSavedColors.size()) + { + LLColor4 color = nodep->mSavedColors[te]; + // update viewer side color in anticipation of update from simulator + object->setTEColor(te, color); + } + } + return true; + } + } setfunc(mSelectedObjects); + getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); +} + +BOOL LLSelectMgr::selectionRevertTextures() +{ + struct f : public LLSelectedTEFunctor + { + LLObjectSelectionHandle mSelectedObjects; + f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + LLSelectNode* nodep = mSelectedObjects->findNode(object); + if (nodep && te < (S32)nodep->mSavedTextures.size()) + { + LLUUID id = nodep->mSavedTextures[te]; + // update textures on viewer side + if (id.isNull()) + { + // this was probably a no-copy texture, leave image as-is + return FALSE; + } + else + { + object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + } + } + } + return true; + } + } setfunc(mSelectedObjects); + BOOL revert_successful = getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); + + return revert_successful; +} + +void LLSelectMgr::selectionSetBumpmap(U8 bumpmap) +{ + struct f : public LLSelectedTEFunctor + { + U8 mBump; + f(const U8& b) : mBump(b) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // update viewer side color in anticipation of update from simulator + object->setTEBumpmap(te, mBump); + } + return true; + } + } setfunc(bumpmap); + getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); +} + +void LLSelectMgr::selectionSetTexGen(U8 texgen) +{ + struct f : public LLSelectedTEFunctor + { + U8 mTexgen; + f(const U8& t) : mTexgen(t) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // update viewer side color in anticipation of update from simulator + object->setTETexGen(te, mTexgen); + } + return true; + } + } setfunc(texgen); + getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); +} + + +void LLSelectMgr::selectionSetShiny(U8 shiny) +{ + struct f : public LLSelectedTEFunctor + { + U8 mShiny; + f(const U8& t) : mShiny(t) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // update viewer side color in anticipation of update from simulator + object->setTEShiny(te, mShiny); + } + return true; + } + } setfunc(shiny); + getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); +} + +void LLSelectMgr::selectionSetFullbright(U8 fullbright) +{ + struct f : public LLSelectedTEFunctor + { + U8 mFullbright; + f(const U8& t) : mFullbright(t) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // update viewer side color in anticipation of update from simulator + object->setTEFullbright(te, mFullbright); + } + return true; + } + } setfunc(fullbright); + getSelection()->applyToTEs(&setfunc); + + struct g : public LLSelectedObjectFunctor + { + U8 mFullbright; + g(const U8& t) : mFullbright(t) {} + virtual bool apply(LLViewerObject* object) + { + if (object->permModify()) + { + object->sendTEUpdate(); + if (mFullbright) + { + U8 material = object->getMaterial(); + U8 mcode = material & LL_MCODE_MASK; + if (mcode == LL_MCODE_LIGHT) + { + mcode = LL_MCODE_GLASS; + material = (material & ~LL_MCODE_MASK) | mcode; + object->setMaterial(material); + object->sendMaterialUpdate(); + } + } + } + return true; + } + } sendfunc(fullbright); + getSelection()->applyToObjects(&sendfunc); +} + +void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string& media_url) +{ + U8 media_flags = LLTextureEntry::MF_NONE; + if (media_type == LLViewerObject::MEDIA_TYPE_WEB_PAGE) + { + media_flags = LLTextureEntry::MF_HAS_MEDIA; + } + + struct f : public LLSelectedTEFunctor + { + U8 mMediaFlags; + f(const U8& t) : mMediaFlags(t) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // update viewer side color in anticipation of update from simulator + object->setTEMediaFlags(te, mMediaFlags); + } + return true; + } + } setfunc(media_flags); + getSelection()->applyToTEs(&setfunc); + + struct g : public LLSelectedObjectFunctor + { + U8 media_type; + const std::string& media_url ; + g(U8 a, const std::string& b) : media_type(a), media_url(b) {} + virtual bool apply(LLViewerObject* object) + { + if (object->permModify()) + { + object->sendTEUpdate(); + object->setMediaType(media_type); + object->setMediaURL(media_url); + } + return true; + } + } sendfunc(media_type, media_url); + getSelection()->applyToObjects(&sendfunc); +} + +void LLSelectMgr::selectionSetGlow(F32 glow) +{ + struct f1 : public LLSelectedTEFunctor + { + F32 mGlow; + f1(F32 glow) : mGlow(glow) {}; + bool apply(LLViewerObject* object, S32 face) + { + if (object->permModify()) + { + // update viewer side color in anticipation of update from simulator + object->setTEGlow(face, mGlow); + } + return true; + } + } func1(glow); + mSelectedObjects->applyToTEs( &func1 ); + + struct f2 : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + if (object->permModify()) + { + object->sendTEUpdate(); + } + return true; + } + } func2; + mSelectedObjects->applyToObjects( &func2 ); +} + + +//----------------------------------------------------------------------------- +// findObjectPermissions() +//----------------------------------------------------------------------------- +LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object) +{ + for (LLObjectSelection::valid_iterator iter = getSelection()->valid_begin(); + iter != getSelection()->valid_end(); iter++ ) + { + LLSelectNode* nodep = *iter; + if (nodep->getObject() == object) + { + return nodep->mPermissions; + } + } + + return NULL; +} + + +//----------------------------------------------------------------------------- +// selectionGetGlow() +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectionGetGlow(F32 *glow) +{ + BOOL identical; + F32 lglow = 0.f; + struct f1 : public LLSelectedTEGetFunctor + { + F32 get(LLViewerObject* object, S32 face) + { + return object->getTE(face)->getGlow(); + } + } func; + identical = mSelectedObjects->getSelectedTEValue( &func, lglow ); + + *glow = lglow; + return identical; +} + +//----------------------------------------------------------------------------- +// selectionSetMaterial() +//----------------------------------------------------------------------------- +void LLSelectMgr::selectionSetMaterial(U8 material) +{ + struct f : public LLSelectedObjectFunctor + { + U8 mMaterial; + f(const U8& t) : mMaterial(t) {} + virtual bool apply(LLViewerObject* object) + { + if (object->permModify()) + { + U8 cur_material = object->getMaterial(); + U8 material = mMaterial | (cur_material & ~LL_MCODE_MASK); + object->setMaterial(material); + object->sendMaterialUpdate(); + } + return true; + } + } sendfunc(material); + getSelection()->applyToObjects(&sendfunc); +} + +// TRUE if all selected objects have this PCode +BOOL LLSelectMgr::selectionAllPCode(LLPCode code) +{ + struct f : public LLSelectedObjectFunctor + { + LLPCode mCode; + f(const LLPCode& t) : mCode(t) {} + virtual bool apply(LLViewerObject* object) + { + if (object->getPCode() != mCode) + { + return FALSE; + } + return true; + } + } func(code); + BOOL res = getSelection()->applyToObjects(&func); + return res; +} + +bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out) +{ + LLViewerObject *object = mSelectedObjects->getFirstRootObject(); + if (!object) return FALSE; + + bool include_in_search = object->getIncludeInSearch(); + + bool identical = true; + + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++) + { + LLViewerObject* object = (*iter)->getObject(); + + if ( include_in_search != object->getIncludeInSearch()) + { + identical = false; + break; + } + } + + *include_in_search_out = include_in_search; + return identical; +} + +void LLSelectMgr::selectionSetIncludeInSearch(bool include_in_search) +{ + LLViewerObject* object = NULL; + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++) + { + object = (*iter)->getObject(); + object->setIncludeInSearch(include_in_search); + } + sendListToRegions( + "ObjectIncludeInSearch", + packAgentAndSessionID, + packObjectIncludeInSearch, + &include_in_search, + SEND_ONLY_ROOTS); +} + +BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action) +{ + LLViewerObject *object = mSelectedObjects->getFirstObject(); + if (!object) + { + return FALSE; + } + + U8 action = object->getClickAction(); + *out_action = action; + + struct f : public LLSelectedObjectFunctor + { + U8 mAction; + f(const U8& t) : mAction(t) {} + virtual bool apply(LLViewerObject* object) + { + if ( mAction != object->getClickAction()) + { + return false; + } + return true; + } + } func(action); + BOOL res = getSelection()->applyToObjects(&func); + return res; +} + +void LLSelectMgr::selectionSetClickAction(U8 action) +{ + struct f : public LLSelectedObjectFunctor + { + U8 mAction; + f(const U8& t) : mAction(t) {} + virtual bool apply(LLViewerObject* object) + { + object->setClickAction(mAction); + return true; + } + } func(action); + getSelection()->applyToObjects(&func); + + sendListToRegions("ObjectClickAction", + packAgentAndSessionID, + packObjectClickAction, + &action, + SEND_INDIVIDUALS); +} + + +//----------------------------------------------------------------------------- +// godlike requests +//----------------------------------------------------------------------------- + +typedef std::pair godlike_request_t; + +void LLSelectMgr::sendGodlikeRequest(const std::string& request, const std::string& param) +{ + // If the agent is neither godlike nor an estate owner, the server + // will reject the request. + std::string message_type; + if (gAgent.isGodlike()) + { + message_type = "GodlikeMessage"; + } + else + { + message_type = "EstateOwnerMessage"; + } + + godlike_request_t data(request, param); + if(!mSelectedObjects->getRootObjectCount()) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessage(message_type.c_str()); + LLSelectMgr::packGodlikeHead(&data); + gAgent.sendReliableMessage(); + } + else + { + sendListToRegions(message_type, packGodlikeHead, packObjectIDAsParam, &data, SEND_ONLY_ROOTS); + } +} + +void LLSelectMgr::packGodlikeHead(void* user_data) +{ + LLMessageSystem* msg = gMessageSystem; + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUID("TransactionID", LLUUID::null); + godlike_request_t* data = (godlike_request_t*)user_data; + msg->nextBlock("MethodData"); + msg->addString("Method", data->first); + msg->addUUID("Invoice", LLUUID::null); + + // The parameters used to be restricted to either string or + // integer. This mimics that behavior under the new 'string-only' + // parameter list by not packing a string if there wasn't one + // specified. The object ids will be packed in the + // packObjectIDAsParam() method. + if(data->second.size() > 0) + { + msg->nextBlock("ParamList"); + msg->addString("Parameter", data->second); + } +} + +// static +void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *) +{ + std::string buf = llformat("%u", node->getObject()->getLocalID()); + gMessageSystem->nextBlock("ParamList"); + gMessageSystem->addString("Parameter", buf); +} + +//----------------------------------------------------------------------------- +// Rotation options +//----------------------------------------------------------------------------- +void LLSelectMgr::selectionResetRotation() +{ + struct f : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + LLQuaternion identity(0.f, 0.f, 0.f, 1.f); + object->setRotation(identity); + if (object->mDrawable.notNull()) + { + gPipeline.markMoved(object->mDrawable, TRUE); + } + object->sendRotationUpdate(); + return true; + } + } func; + getSelection()->applyToRootObjects(&func); +} + +void LLSelectMgr::selectionRotateAroundZ(F32 degrees) +{ + LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) ); + struct f : public LLSelectedObjectFunctor + { + LLQuaternion mRot; + f(const LLQuaternion& rot) : mRot(rot) {} + virtual bool apply(LLViewerObject* object) + { + object->setRotation( object->getRotationEdit() * mRot ); + if (object->mDrawable.notNull()) + { + gPipeline.markMoved(object->mDrawable, TRUE); + } + object->sendRotationUpdate(); + return true; + } + } func(rot); + getSelection()->applyToRootObjects(&func); +} + + +//----------------------------------------------------------------------------- +// selectionTexScaleAutofit() +//----------------------------------------------------------------------------- +void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter) +{ + struct f : public LLSelectedTEFunctor + { + F32 mRepeatsPerMeter; + f(const F32& t) : mRepeatsPerMeter(t) {} + bool apply(LLViewerObject* object, S32 te) + { + + if (object->permModify()) + { + // Compute S,T to axis mapping + U32 s_axis, t_axis; + if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis)) + { + return TRUE; + } + + F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter; + F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter; + + object->setTEScale(te, new_s, new_t); + } + return true; + } + } setfunc(repeats_per_meter); + getSelection()->applyToTEs(&setfunc); + + LLSelectMgrSendFunctor sendfunc; + getSelection()->applyToObjects(&sendfunc); +} + + + +// Called at the end of a scale operation, this adjusts the textures to attempt to +// maintain a constant repeats per meter. +// BUG: Only works for flex boxes. +//----------------------------------------------------------------------------- +// adjustTexturesByScale() +//----------------------------------------------------------------------------- +void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch) +{ + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); iter++) + { + LLSelectNode* selectNode = *iter; + LLViewerObject* object = selectNode->getObject(); + + if (!object) + { + continue; + } + + if (!object->permModify()) + { + continue; + } + + if (object->getNumTEs() == 0) + { + continue; + } + + BOOL send = FALSE; + + for (U8 te_num = 0; te_num < object->getNumTEs(); te_num++) + { + const LLTextureEntry* tep = object->getTE(te_num); + + BOOL planar = tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR; + if (planar == stretch) + { + // Figure out how S,T changed with scale operation + U32 s_axis, t_axis; + if (!LLPrimitive::getTESTAxes(te_num, &s_axis, &t_axis)) + { + continue; + } + + LLVector3 scale_ratio = selectNode->mTextureScaleRatios[te_num]; + LLVector3 object_scale = object->getScale(); + + // Apply new scale to face + if (planar) + { + object->setTEScale(te_num, 1.f/object_scale.mV[s_axis]*scale_ratio.mV[s_axis], + 1.f/object_scale.mV[t_axis]*scale_ratio.mV[t_axis]); + } + else + { + object->setTEScale(te_num, scale_ratio.mV[s_axis]*object_scale.mV[s_axis], + scale_ratio.mV[t_axis]*object_scale.mV[t_axis]); + } + send = send_to_sim; + } + } + + if (send) + { + object->sendTEUpdate(); + } + } +} + +//----------------------------------------------------------------------------- +// selectGetAllRootsValid() +// Returns TRUE if the viewer has information on all selected objects +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetAllRootsValid() +{ + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); ++iter ) + { + LLSelectNode* node = *iter; + if( !node->mValid ) + { + return FALSE; + } + } + return TRUE; +} + + +//----------------------------------------------------------------------------- +// selectGetAllValid() +// Returns TRUE if the viewer has information on all selected objects +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetAllValid() +{ + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); ++iter ) + { + LLSelectNode* node = *iter; + if( !node->mValid ) + { + return FALSE; + } + } + return TRUE; +} + + +//----------------------------------------------------------------------------- +// selectGetModify() - return TRUE if current agent can modify all +// selected objects. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetModify() +{ + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); iter++ ) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if( !object || !node->mValid ) + { + return FALSE; + } + if( !object->permModify() ) + { + return FALSE; + } + } + return TRUE; +} + +//----------------------------------------------------------------------------- +// selectGetRootsModify() - return TRUE if current agent can modify all +// selected root objects. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetRootsModify() +{ + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if( !node->mValid ) + { + return FALSE; + } + if( !object->permModify() ) + { + return FALSE; + } + } + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// selectGetRootsTransfer() - return TRUE if current agent can transfer all +// selected root objects. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetRootsTransfer() +{ + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if( !node->mValid ) + { + return FALSE; + } + if(!object->permTransfer()) + { + return FALSE; + } + } + return TRUE; +} + +//----------------------------------------------------------------------------- +// selectGetRootsCopy() - return TRUE if current agent can copy all +// selected root objects. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetRootsCopy() +{ + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if( !node->mValid ) + { + return FALSE; + } + if(!object->permCopy()) + { + return FALSE; + } + } + return TRUE; +} + +//----------------------------------------------------------------------------- +// selectGetCreator() +// Creator information only applies to root objects. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name) +{ + BOOL identical = TRUE; + BOOL first = TRUE; + LLUUID first_id; + for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); + iter != getSelection()->root_object_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + + if (first) + { + first_id = node->mPermissions->getCreator(); + first = FALSE; + } + else + { + if ( !(first_id == node->mPermissions->getCreator() ) ) + { + identical = FALSE; + break; + } + } + } + if (first_id.isNull()) + { + return FALSE; + } + + result_id = first_id; + + if (identical) + { + gCacheName->getFullName(first_id, name); + } + else + { + name.assign( "(multiple)" ); + } + + return identical; +} + + +//----------------------------------------------------------------------------- +// selectGetOwner() +// Owner information only applies to roots. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name) +{ + BOOL identical = TRUE; + BOOL first = TRUE; + BOOL first_group_owned = FALSE; + LLUUID first_id; + for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); + iter != getSelection()->root_object_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + + if (first) + { + node->mPermissions->getOwnership(first_id, first_group_owned); + first = FALSE; + } + else + { + LLUUID owner_id; + BOOL is_group_owned = FALSE; + if (!(node->mPermissions->getOwnership(owner_id, is_group_owned)) + || owner_id != first_id || is_group_owned != first_group_owned) + { + identical = FALSE; + break; + } + } + } + if (first_id.isNull()) + { + return FALSE; + } + + result_id = first_id; + + if (identical) + { + BOOL public_owner = (first_id.isNull() && !first_group_owned); + if (first_group_owned) + { + name.assign( "(Group Owned)"); + } + else if(!public_owner) + { + gCacheName->getFullName(first_id, name); + } + else + { + name.assign("Public"); + } + } + else + { + name.assign( "(multiple)" ); + } + + return identical; +} + + +//----------------------------------------------------------------------------- +// selectGetLastOwner() +// Owner information only applies to roots. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name) +{ + BOOL identical = TRUE; + BOOL first = TRUE; + LLUUID first_id; + for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); + iter != getSelection()->root_object_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + + if (first) + { + first_id = node->mPermissions->getLastOwner(); + first = FALSE; + } + else + { + if ( !(first_id == node->mPermissions->getLastOwner() ) ) + { + identical = FALSE; + break; + } + } + } + if (first_id.isNull()) + { + return FALSE; + } + + result_id = first_id; + + if (identical) + { + BOOL public_owner = (first_id.isNull()); + if(!public_owner) + { + gCacheName->getFullName(first_id, name); + } + else + { + name.assign("Public or Group"); + } + } + else + { + name.assign( "" ); + } + + return identical; +} + + +//----------------------------------------------------------------------------- +// selectGetGroup() +// Group information only applies to roots. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id) +{ + BOOL identical = TRUE; + BOOL first = TRUE; + LLUUID first_id; + for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); + iter != getSelection()->root_object_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + + if (first) + { + first_id = node->mPermissions->getGroup(); + first = FALSE; + } + else + { + if ( !(first_id == node->mPermissions->getGroup() ) ) + { + identical = FALSE; + break; + } + } + } + + result_id = first_id; + + return identical; +} + +//----------------------------------------------------------------------------- +// selectIsGroupOwned() +// Only operates on root nodes. +// Returns TRUE if all have valid data and they are all group owned. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectIsGroupOwned() +{ + BOOL found_one = FALSE; + for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); + iter != getSelection()->root_object_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + found_one = TRUE; + if (!node->mPermissions->isGroupOwned()) + { + return FALSE; + } + } + return found_one ? TRUE : FALSE; +} + +//----------------------------------------------------------------------------- +// selectGetPerm() +// Only operates on root nodes. +// Returns TRUE if all have valid data. +// mask_on has bits set to TRUE where all permissions are TRUE +// mask_off has bits set to TRUE where all permissions are FALSE +// if a bit is off both in mask_on and mask_off, the values differ within +// the selection. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off) +{ + U32 mask; + U32 mask_and = 0xffffffff; + U32 mask_or = 0x00000000; + BOOL all_valid = FALSE; + + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++) + { + LLSelectNode* node = *iter; + + if (!node->mValid) + { + all_valid = FALSE; + break; + } + + all_valid = TRUE; + + switch( which_perm ) + { + case PERM_BASE: + mask = node->mPermissions->getMaskBase(); + break; + case PERM_OWNER: + mask = node->mPermissions->getMaskOwner(); + break; + case PERM_GROUP: + mask = node->mPermissions->getMaskGroup(); + break; + case PERM_EVERYONE: + mask = node->mPermissions->getMaskEveryone(); + break; + case PERM_NEXT_OWNER: + mask = node->mPermissions->getMaskNextOwner(); + break; + default: + mask = 0x0; + break; + } + mask_and &= mask; + mask_or |= mask; + } + + if (all_valid) + { + // ...TRUE through all ANDs means all TRUE + *mask_on = mask_and; + + // ...FALSE through all ORs means all FALSE + *mask_off = ~mask_or; + return TRUE; + } + else + { + *mask_on = 0; + *mask_off = 0; + return FALSE; + } +} + + + +BOOL LLSelectMgr::selectGetOwnershipCost(S32* out_cost) +{ + return mSelectedObjects->getOwnershipCost(*out_cost); +} + +BOOL LLSelectMgr::selectGetPermissions(LLPermissions& result_perm) +{ + BOOL first = TRUE; + LLPermissions perm; + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + + if (first) + { + perm = *(node->mPermissions); + first = FALSE; + } + else + { + perm.accumulate(*(node->mPermissions)); + } + } + + result_perm = perm; + + return TRUE; +} + + +void LLSelectMgr::selectDelete() +{ + S32 deleteable_count = 0; + + BOOL locked_but_deleteable_object = FALSE; + BOOL no_copy_but_deleteable_object = FALSE; + BOOL all_owned_by_you = TRUE; + + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); iter++) + { + LLViewerObject* obj = (*iter)->getObject(); + + if( obj->isAttachment() ) + { + continue; + } + + deleteable_count++; + + // Check to see if you can delete objects which are locked. + if(!obj->permMove()) + { + locked_but_deleteable_object = TRUE; + } + if(!obj->permCopy()) + { + no_copy_but_deleteable_object = TRUE; + } + if(!obj->permYouOwner()) + { + all_owned_by_you = FALSE; + } + } + + if( 0 == deleteable_count ) + { + make_ui_sound("UISndInvalidOp"); + return; + } + + LLNotification::Params params("ConfirmObjectDeleteLock"); + params.functor(boost::bind(&LLSelectMgr::confirmDelete, _1, _2, getSelection())); + + if(locked_but_deleteable_object || + no_copy_but_deleteable_object || + !all_owned_by_you) + { + // convert any transient pie-menu selections to full selection so this operation + // has some context + // NOTE: if user cancels delete operation, this will potentially leave objects selected outside of build mode + // but this is ok, if not ideal + convertTransient(); + + //This is messy, but needed to get all english our of the UI. + if(locked_but_deleteable_object && !no_copy_but_deleteable_object && all_owned_by_you) + { + //Locked only + params.name("ConfirmObjectDeleteLock"); + } + else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you) + { + //No Copy only + params.name("ConfirmObjectDeleteNoCopy"); + } + else if(!locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you) + { + //not owned only + params.name("ConfirmObjectDeleteNoOwn"); + } + else if(locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you) + { + //locked and no copy + params.name("ConfirmObjectDeleteLockNoCopy"); + } + else if(locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you) + { + //locked and not owned + params.name("ConfirmObjectDeleteLockNoOwn"); + } + else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && !all_owned_by_you) + { + //no copy and not owned + params.name("ConfirmObjectDeleteNoCopyNoOwn"); + } + else + { + //locked, no copy and not owned + params.name("ConfirmObjectDeleteLockNoCopyNoOwn"); + } + + LLNotifications::instance().add(params); + } + else + { + LLNotifications::instance().forceResponse(params, 0); + } +} + +// static +bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + if (!handle->getObjectCount()) + { + llwarns << "Nothing to delete!" << llendl; + return false; + } + + switch(option) + { + case 0: + { + // TODO: Make sure you have delete permissions on all of them. + LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + // attempt to derez into the trash. + LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id); + LLSelectMgr::getInstance()->sendListToRegions("DeRezObject", + packDeRezHeader, + packObjectLocalID, + (void*)info, + SEND_ONLY_ROOTS); + // VEFFECT: Delete Object - one effect for all deletes + if(!gSavedSettings.getBOOL("DisablePointAtAndBeam")) + { + if (LLSelectMgr::getInstance()->mSelectedObjects->mSelectType != SELECT_TYPE_HUD) + { + LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); + effectp->setPositionGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal() ); + effectp->setColor(LLColor4U(gAgent.getEffectColor())); + F32 duration = 0.5f; + duration += LLSelectMgr::getInstance()->mSelectedObjects->getObjectCount() / 64.f; + effectp->setDuration(duration); + } + } + + gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + + // Keep track of how many objects have been deleted. + F64 obj_delete_count = LLViewerStats::getInstance()->getStat(LLViewerStats::ST_OBJECT_DELETE_COUNT); + obj_delete_count += LLSelectMgr::getInstance()->mSelectedObjects->getObjectCount(); + LLViewerStats::getInstance()->setStat(LLViewerStats::ST_OBJECT_DELETE_COUNT, obj_delete_count ); + } + break; + case 1: + default: + break; + } + return false; +} + + +void LLSelectMgr::selectForceDelete() +{ + sendListToRegions( + "ObjectDelete", + packDeleteHeader, + packObjectLocalID, + (void*)TRUE, + SEND_ONLY_ROOTS); +} + +void LLSelectMgr::selectGetAggregateSaleInfo(U32 &num_for_sale, + BOOL &is_for_sale_mixed, + BOOL &is_sale_price_mixed, + S32 &total_sale_price, + S32 &individual_sale_price) +{ + num_for_sale = 0; + is_for_sale_mixed = FALSE; + is_sale_price_mixed = FALSE; + total_sale_price = 0; + individual_sale_price = 0; + + + // Empty set. + if (getSelection()->root_begin() == getSelection()->root_end()) + return; + + LLSelectNode *node = *(getSelection()->root_begin()); + const BOOL first_node_for_sale = node->mSaleInfo.isForSale(); + const S32 first_node_sale_price = node->mSaleInfo.getSalePrice(); + + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++) + { + LLSelectNode* node = *iter; + const BOOL node_for_sale = node->mSaleInfo.isForSale(); + const S32 node_sale_price = node->mSaleInfo.getSalePrice(); + + // Set mixed if the fields don't match the first node's fields. + if (node_for_sale != first_node_for_sale) + is_for_sale_mixed = TRUE; + if (node_sale_price != first_node_sale_price) + is_sale_price_mixed = TRUE; + + if (node_for_sale) + { + total_sale_price += node_sale_price; + num_for_sale ++; + } + } + + individual_sale_price = first_node_sale_price; + if (is_for_sale_mixed) + { + is_sale_price_mixed = TRUE; + individual_sale_price = 0; + } +} + +// returns TRUE if all nodes are valid. method also stores an +// accumulated sale info. +BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& result_sale_info) +{ + BOOL first = TRUE; + LLSaleInfo sale_info; + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + + if (first) + { + sale_info = node->mSaleInfo; + first = FALSE; + } + else + { + sale_info.accumulate(node->mSaleInfo); + } + } + + result_sale_info = sale_info; + + return TRUE; +} + +BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& result_perm) +{ + BOOL first = TRUE; + LLAggregatePermissions perm; + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + + if (first) + { + perm = node->mAggregatePerm; + first = FALSE; + } + else + { + perm.aggregate(node->mAggregatePerm); + } + } + + result_perm = perm; + + return TRUE; +} + +BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& result_perm) +{ + BOOL first = TRUE; + LLAggregatePermissions perm; + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mValid) + { + return FALSE; + } + + LLAggregatePermissions t_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm; + if (first) + { + perm = t_perm; + first = FALSE; + } + else + { + perm.aggregate(t_perm); + } + } + + result_perm = perm; + + return TRUE; +} + + +//-------------------------------------------------------------------- +// Duplicate objects +//-------------------------------------------------------------------- + +// JC - If this doesn't work right, duplicate the selection list +// before doing anything, do a deselect, then send the duplicate +// messages. +struct LLDuplicateData +{ + LLVector3 offset; + U32 flags; +}; + +void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy) +{ + if (mSelectedObjects->isAttachment()) + { + //RN: do not duplicate attachments + make_ui_sound("UISndInvalidOp"); + return; + } + LLDuplicateData data; + + data.offset = offset; + data.flags = (select_copy ? FLAGS_CREATE_SELECTED : 0x0); + + sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS); + + if (select_copy) + { + // the new copy will be coming in selected + deselectAll(); + } + else + { + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + node->mDuplicated = TRUE; + node->mDuplicatePos = node->getObject()->getPositionGlobal(); + node->mDuplicateRot = node->getObject()->getRotation(); + } + } +} + +void LLSelectMgr::repeatDuplicate() +{ + if (mSelectedObjects->isAttachment()) + { + //RN: do not duplicate attachments + make_ui_sound("UISndInvalidOp"); + return; + } + + std::vector non_duplicated_objects; + + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (!node->mDuplicated) + { + non_duplicated_objects.push_back(node->getObject()); + } + } + + // make sure only previously duplicated objects are selected + for (std::vector::iterator iter = non_duplicated_objects.begin(); + iter != non_duplicated_objects.end(); ++iter) + { + LLViewerObject* objectp = *iter; + deselectObjectAndFamily(objectp); + } + + // duplicate objects in place + LLDuplicateData data; + + data.offset = LLVector3::zero; + data.flags = 0x0; + + sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS); + + // move current selection based on delta from duplication position and update duplication position + for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); + iter != getSelection()->root_end(); iter++ ) + { + LLSelectNode* node = *iter; + if (node->mDuplicated) + { + LLQuaternion cur_rot = node->getObject()->getRotation(); + LLQuaternion rot_delta = (~node->mDuplicateRot * cur_rot); + LLQuaternion new_rot = cur_rot * rot_delta; + LLVector3d cur_pos = node->getObject()->getPositionGlobal(); + LLVector3d new_pos = cur_pos + ((cur_pos - node->mDuplicatePos) * rot_delta); + + node->mDuplicatePos = node->getObject()->getPositionGlobal(); + node->mDuplicateRot = node->getObject()->getRotation(); + node->getObject()->setPositionGlobal(new_pos); + node->getObject()->setRotation(new_rot); + } + } + + sendMultipleUpdate(UPD_ROTATION | UPD_POSITION); +} + +// static +void LLSelectMgr::packDuplicate( LLSelectNode* node, void *duplicate_data ) +{ + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID()); +} + + +//-------------------------------------------------------------------- +// Duplicate On Ray +//-------------------------------------------------------------------- + +// Duplicates the selected objects, but places the copy along a cast +// ray. +struct LLDuplicateOnRayData +{ + LLVector3 mRayStartRegion; + LLVector3 mRayEndRegion; + BOOL mBypassRaycast; + BOOL mRayEndIsIntersection; + LLUUID mRayTargetID; + BOOL mCopyCenters; + BOOL mCopyRotates; + U32 mFlags; +}; + +void LLSelectMgr::selectDuplicateOnRay(const LLVector3 &ray_start_region, + const LLVector3 &ray_end_region, + BOOL bypass_raycast, + BOOL ray_end_is_intersection, + const LLUUID &ray_target_id, + BOOL copy_centers, + BOOL copy_rotates, + BOOL select_copy) +{ + if (mSelectedObjects->isAttachment()) + { + // do not duplicate attachments + make_ui_sound("UISndInvalidOp"); + return; + } + + LLDuplicateOnRayData data; + + data.mRayStartRegion = ray_start_region; + data.mRayEndRegion = ray_end_region; + data.mBypassRaycast = bypass_raycast; + data.mRayEndIsIntersection = ray_end_is_intersection; + data.mRayTargetID = ray_target_id; + data.mCopyCenters = copy_centers; + data.mCopyRotates = copy_rotates; + data.mFlags = (select_copy ? FLAGS_CREATE_SELECTED : 0x0); + + sendListToRegions("ObjectDuplicateOnRay", + packDuplicateOnRayHead, packObjectLocalID, &data, SEND_ONLY_ROOTS); + + if (select_copy) + { + // the new copy will be coming in selected + deselectAll(); + } +} + +// static +void LLSelectMgr::packDuplicateOnRayHead(void *user_data) +{ + LLMessageSystem *msg = gMessageSystem; + LLDuplicateOnRayData *data = (LLDuplicateOnRayData *)user_data; + + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); + msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID() ); + msg->addVector3Fast(_PREHASH_RayStart, data->mRayStartRegion ); + msg->addVector3Fast(_PREHASH_RayEnd, data->mRayEndRegion ); + msg->addBOOLFast(_PREHASH_BypassRaycast, data->mBypassRaycast ); + msg->addBOOLFast(_PREHASH_RayEndIsIntersection, data->mRayEndIsIntersection ); + msg->addBOOLFast(_PREHASH_CopyCenters, data->mCopyCenters ); + msg->addBOOLFast(_PREHASH_CopyRotates, data->mCopyRotates ); + msg->addUUIDFast(_PREHASH_RayTargetID, data->mRayTargetID ); + msg->addU32Fast(_PREHASH_DuplicateFlags, data->mFlags ); +} + + + +//------------------------------------------------------------------------ +// Object position, scale, rotation update, all-in-one +//------------------------------------------------------------------------ + +void LLSelectMgr::sendMultipleUpdate(U32 type) +{ + if (type == UPD_NONE) return; + // send individual updates when selecting textures or individual objects + ESendType send_type = (!gSavedSettings.getBOOL("EditLinkedParts") && !getTEMode()) ? SEND_ONLY_ROOTS : SEND_ROOTS_FIRST; + if (send_type == SEND_ONLY_ROOTS) + { + // tell simulator to apply to whole linked sets + type |= UPD_LINKED_SETS; + } + + sendListToRegions( + "MultipleObjectUpdate", + packAgentAndSessionID, + packMultipleUpdate, + &type, + send_type); +} + +// static +void LLSelectMgr::packMultipleUpdate(LLSelectNode* node, void *user_data) +{ + LLViewerObject* object = node->getObject(); + U32 *type32 = (U32 *)user_data; + U8 type = (U8)*type32; + U8 data[256]; + + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() ); + gMessageSystem->addU8Fast(_PREHASH_Type, type ); + + S32 offset = 0; + + // JC: You MUST pack the data in this order. The receiving + // routine process_multiple_update_message on simulator will + // extract them in this order. + + if (type & UPD_POSITION) + { + htonmemcpy(&data[offset], &(object->getPosition().mV), MVT_LLVector3, 12); + offset += 12; + } + if (type & UPD_ROTATION) + { + LLQuaternion quat = object->getRotation(); + LLVector3 vec = quat.packToVector3(); + htonmemcpy(&data[offset], &(vec.mV), MVT_LLQuaternion, 12); + offset += 12; + } + if (type & UPD_SCALE) + { + //llinfos << "Sending object scale " << object->getScale() << llendl; + htonmemcpy(&data[offset], &(object->getScale().mV), MVT_LLVector3, 12); + offset += 12; + } + gMessageSystem->addBinaryDataFast(_PREHASH_Data, data, offset); +} + +//------------------------------------------------------------------------ +// Ownership +//------------------------------------------------------------------------ +struct LLOwnerData +{ + LLUUID owner_id; + LLUUID group_id; + BOOL override; +}; + +void LLSelectMgr::sendOwner(const LLUUID& owner_id, + const LLUUID& group_id, + BOOL override) +{ + LLOwnerData data; + + data.owner_id = owner_id; + data.group_id = group_id; + data.override = override; + + sendListToRegions("ObjectOwner", packOwnerHead, packObjectLocalID, &data, SEND_ONLY_ROOTS); +} + +// static +void LLSelectMgr::packOwnerHead(void *user_data) +{ + LLOwnerData *data = (LLOwnerData *)user_data; + + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); + gMessageSystem->nextBlockFast(_PREHASH_HeaderData); + gMessageSystem->addBOOLFast(_PREHASH_Override, data->override); + gMessageSystem->addUUIDFast(_PREHASH_OwnerID, data->owner_id); + gMessageSystem->addUUIDFast(_PREHASH_GroupID, data->group_id); +} + +//------------------------------------------------------------------------ +// Group +//------------------------------------------------------------------------ + +void LLSelectMgr::sendGroup(const LLUUID& group_id) +{ + LLUUID local_group_id(group_id); + sendListToRegions("ObjectGroup", packAgentAndSessionAndGroupID, packObjectLocalID, &local_group_id, SEND_ONLY_ROOTS); +} + + +//------------------------------------------------------------------------ +// Buy +//------------------------------------------------------------------------ + +struct LLBuyData +{ + std::vector mObjectsSent; + LLUUID mCategoryID; + LLSaleInfo mSaleInfo; +}; + +// *NOTE: does not work for multiple object buy, which UI does not +// currently support sale info is used for verification only, if it +// doesn't match region info then sale is canceled Need to get sale +// info -as displayed in the UI- for every item. +void LLSelectMgr::sendBuy(const LLUUID& buyer_id, const LLUUID& category_id, const LLSaleInfo sale_info) +{ + LLBuyData buy; + buy.mCategoryID = category_id; + buy.mSaleInfo = sale_info; + sendListToRegions("ObjectBuy", packAgentGroupAndCatID, packBuyObjectIDs, &buy, SEND_ONLY_ROOTS); +} + +// static +void LLSelectMgr::packBuyObjectIDs(LLSelectNode* node, void* data) +{ + LLBuyData* buy = (LLBuyData*)data; + + LLViewerObject* object = node->getObject(); + if (std::find(buy->mObjectsSent.begin(), buy->mObjectsSent.end(), object) == buy->mObjectsSent.end()) + { + buy->mObjectsSent.push_back(object); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() ); + gMessageSystem->addU8Fast(_PREHASH_SaleType, buy->mSaleInfo.getSaleType()); + gMessageSystem->addS32Fast(_PREHASH_SalePrice, buy->mSaleInfo.getSalePrice()); + } +} + +//------------------------------------------------------------------------ +// Permissions +//------------------------------------------------------------------------ + +struct LLPermData +{ + U8 mField; + BOOL mSet; + U32 mMask; + BOOL mOverride; +}; + +// TODO: Make this able to fail elegantly. +void LLSelectMgr::selectionSetObjectPermissions(U8 field, + BOOL set, + U32 mask, + BOOL override) +{ + LLPermData data; + + data.mField = field; + data.mSet = set; + data.mMask = mask; + data.mOverride = override; + + sendListToRegions("ObjectPermissions", packPermissionsHead, packPermissions, &data, SEND_ONLY_ROOTS); +} + +void LLSelectMgr::packPermissionsHead(void* user_data) +{ + LLPermData* data = (LLPermData*)user_data; + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_HeaderData); + gMessageSystem->addBOOLFast(_PREHASH_Override, data->mOverride); +} + + +// Now that you've added a bunch of objects, send a select message +// on the entire list for efficiency. +/* +void LLSelectMgr::sendSelect() +{ + llerrs << "Not implemented" << llendl; +} +*/ + +void LLSelectMgr::deselectAll() +{ + if (!mSelectedObjects->getNumNodes()) + { + return; + } + + // Zap the angular velocity, as the sim will set it to zero + for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); + iter != mSelectedObjects->end(); iter++ ) + { + LLViewerObject *objectp = (*iter)->getObject(); + objectp->setAngularVelocity( 0,0,0 ); + objectp->setVelocity( 0,0,0 ); + } + + sendListToRegions( + "ObjectDeselect", + packAgentAndSessionID, + packObjectLocalID, + NULL, + SEND_INDIVIDUALS); + + removeAll(); + + mLastSentSelectionCenterGlobal.clearVec(); + + updatePointAt(); +} + +void LLSelectMgr::deselectAllForStandingUp() +{ + /* + This function is similar deselectAll() except for the first if statement + which was removed. This is needed as a workaround for DEV-2854 + */ + + // Zap the angular velocity, as the sim will set it to zero + for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); + iter != mSelectedObjects->end(); iter++ ) + { + LLViewerObject *objectp = (*iter)->getObject(); + objectp->setAngularVelocity( 0,0,0 ); + objectp->setVelocity( 0,0,0 ); + } + + sendListToRegions( + "ObjectDeselect", + packAgentAndSessionID, + packObjectLocalID, + NULL, + SEND_INDIVIDUALS); + + removeAll(); + + mLastSentSelectionCenterGlobal.clearVec(); + + updatePointAt(); +} + +void LLSelectMgr::deselectUnused() +{ + // no more outstanding references to this selection + if (mSelectedObjects->getNumRefs() == 1) + { + deselectAll(); + } +} + + +void LLSelectMgr::convertTransient() +{ + LLObjectSelection::iterator node_it; + for (node_it = mSelectedObjects->begin(); node_it != mSelectedObjects->end(); ++node_it) + { + LLSelectNode *nodep = *node_it; + nodep->setTransient(FALSE); + } +} + + +void LLSelectMgr::deselectAllIfTooFar() +{ + if (mSelectedObjects->isEmpty() || mSelectedObjects->mSelectType == SELECT_TYPE_HUD) + { + return; + } + +// [RLVa:KB] - Checked: 2010-01-02 (RLVa-1.1.0l) | Modified: RLVa-1.1.0l +#ifdef RLV_EXTENSION_CMD_INTERACT + // [Fall-back code] Don't allow an active selection (except for HUD attachments - see above) when @interact=n restricted + if (gRlvHandler.hasBehaviour(RLV_BHVR_INTERACT)) + { + deselectAll(); + return; + } +#endif // RLV_EXTENSION_CMD_INTERACT +// [/RLVa:KB] + + // HACK: Don't deselect when we're navigating to rate an object's + // owner or creator. JC + if (gPieObject->getVisible() || gPieRate->getVisible() ) + { + return; + } + + LLVector3d selectionCenter = getSelectionCenterGlobal(); + +// if (gSavedSettings.getBOOL("LimitSelectDistance") +// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f + BOOL fRlvFartouch = gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH) && gFloaterTools->getVisible(); + if ( (gSavedSettings.getBOOL("LimitSelectDistance") || (fRlvFartouch) ) +// [/RLVa:KB] + && (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar()) + && !mSelectedObjects->isAttachment() + && !selectionCenter.isExactlyZero()) + { +// F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance"); +// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f + F32 deselect_dist = (!fRlvFartouch) ? gSavedSettings.getF32("MaxSelectDistance") : 1.5f; +// [/RLVa:KB] + F32 deselect_dist_sq = deselect_dist * deselect_dist; + + LLVector3d select_delta = gAgent.getPositionGlobal() - selectionCenter; + F32 select_dist_sq = (F32) select_delta.magVecSquared(); + + if (select_dist_sq > deselect_dist_sq) + { + if (gDebugSelectMgr) + { + llinfos << "Selection manager: auto-deselecting, select_dist = " << fsqrtf(select_dist_sq) << llendl; + llinfos << "agent pos global = " << gAgent.getPositionGlobal() << llendl; + llinfos << "selection pos global = " << selectionCenter << llendl; + } + + deselectAll(); + } + } +} + +void LLSelectMgr::selectionSetObjectName(const std::string& name) +{ + // we only work correctly if 1 object is selected. + if(mSelectedObjects->getRootObjectCount() == 1) + { + sendListToRegions("ObjectName", + packAgentAndSessionID, + packObjectName, + (void*)(new std::string(name)), + SEND_ONLY_ROOTS); + } + else if(mSelectedObjects->getObjectCount() == 1) + { + sendListToRegions("ObjectName", + packAgentAndSessionID, + packObjectName, + (void*)(new std::string(name)), + SEND_INDIVIDUALS); + } +} + +void LLSelectMgr::selectionSetObjectDescription(const std::string& desc) +{ + // we only work correctly if 1 object is selected. + if(mSelectedObjects->getRootObjectCount() == 1) + { + sendListToRegions("ObjectDescription", + packAgentAndSessionID, + packObjectDescription, + (void*)(new std::string(desc)), + SEND_ONLY_ROOTS); + } + else if(mSelectedObjects->getObjectCount() == 1) + { + sendListToRegions("ObjectDescription", + packAgentAndSessionID, + packObjectDescription, + (void*)(new std::string(desc)), + SEND_INDIVIDUALS); + } +} + +void LLSelectMgr::selectionSetObjectCategory(const LLCategory& category) +{ + // for now, we only want to be able to set one root category at + // a time. + if(mSelectedObjects->getRootObjectCount() != 1) return; + sendListToRegions("ObjectCategory", + packAgentAndSessionID, + packObjectCategory, + (void*)(&category), + SEND_ONLY_ROOTS); +} + +void LLSelectMgr::selectionSetObjectSaleInfo(const LLSaleInfo& sale_info) +{ + sendListToRegions("ObjectSaleInfo", + packAgentAndSessionID, + packObjectSaleInfo, + (void*)(&sale_info), + SEND_ONLY_ROOTS); +} + +//---------------------------------------------------------------------- +// Attachments +//---------------------------------------------------------------------- + +void LLSelectMgr::sendAttach(U8 attachment_point) +{ + LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject(); + + if (!attach_object || !isAgentAvatarValid() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD) + { + return; + } + + BOOL build_mode = LLToolMgr::getInstance()->inEdit(); + // Special case: Attach to default location for this object. + if (0 == attachment_point || + get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, (S32)attachment_point, (LLViewerJointAttachment*)NULL)) + { + if (attachment_point != 0 && gHippoGridManager->getConnectedGrid()->supportsInvLinks()) + { + // If we know the attachment point then we got here by clicking an + // "Attach to..." context menu item, so we should add, not replace. + attachment_point |= ATTACHMENT_ADD; + } + + sendListToRegions( + "ObjectAttach", + packAgentIDAndSessionAndAttachment, + packObjectIDAndRotation, + &attachment_point, + SEND_ONLY_ROOTS ); + if (!build_mode) + { + deselectAll(); + } + } +} + +void LLSelectMgr::sendDetach() +{ + if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD) + { + return; + } + + sendListToRegions( + "ObjectDetach", + packAgentAndSessionID, + packObjectLocalID, + NULL, + SEND_ONLY_ROOTS ); +} + + +void LLSelectMgr::sendDropAttachment() +{ + if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD) + { + return; + } + + sendListToRegions( + "ObjectDrop", + packAgentAndSessionID, + packObjectLocalID, + NULL, + SEND_ONLY_ROOTS); +} + +//---------------------------------------------------------------------- +// Links +//---------------------------------------------------------------------- + +void LLSelectMgr::sendLink() +{ + if (!mSelectedObjects->getNumNodes()) + { + return; + } + + sendListToRegions( + "ObjectLink", + packAgentAndSessionID, + packObjectLocalID, + NULL, + SEND_ONLY_ROOTS); +} + +void LLSelectMgr::sendDelink() +{ + if (!mSelectedObjects->getNumNodes()) + { + return; + } + + // Delink needs to send individuals so you can unlink a single object from + // a linked set. + sendListToRegions( + "ObjectDelink", + packAgentAndSessionID, + packObjectLocalID, + NULL, + SEND_INDIVIDUALS); +} + + +//---------------------------------------------------------------------- +// Hinges +//---------------------------------------------------------------------- + +/* +void LLSelectMgr::sendHinge(U8 type) +{ + if (!mSelectedObjects->getNumNodes()) + { + return; + } + + sendListToRegions( + "ObjectHinge", + packHingeHead, + packObjectLocalID, + &type, + SEND_ONLY_ROOTS); +} + + +void LLSelectMgr::sendDehinge() +{ + if (!mSelectedObjects->getNumNodes()) + { + return; + } + + sendListToRegions( + "ObjectDehinge", + packAgentAndSessionID, + packObjectLocalID, + NULL, + SEND_ONLY_ROOTS); +}*/ + +void LLSelectMgr::sendSelect() +{ + if (!mSelectedObjects->getNumNodes()) + { + return; + } + + sendListToRegions( + "ObjectSelect", + packAgentAndSessionID, + packObjectLocalID, + NULL, + SEND_INDIVIDUALS); +} + +// static +void LLSelectMgr::packHingeHead(void *user_data) +{ + U8 *type = (U8 *)user_data; + + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); + gMessageSystem->nextBlockFast(_PREHASH_JointType); + gMessageSystem->addU8Fast(_PREHASH_Type, *type ); +} + + +void LLSelectMgr::selectionDump() +{ + struct f : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + object->dump(); + return true; + } + } func; + getSelection()->applyToObjects(&func); +} + +void LLSelectMgr::saveSelectedObjectColors() +{ + struct f : public LLSelectedNodeFunctor + { + virtual bool apply(LLSelectNode* node) + { + node->saveColors(); + return true; + } + } func; + getSelection()->applyToNodes(&func); +} + +void LLSelectMgr::saveSelectedObjectTextures() +{ + // invalidate current selection so we update saved textures + struct f : public LLSelectedNodeFunctor + { + virtual bool apply(LLSelectNode* node) + { + node->mValid = FALSE; + return true; + } + } func; + getSelection()->applyToNodes(&func); + + // request object properties message to get updated permissions data + sendSelect(); +} + + +// This routine should be called whenever a drag is initiated. +// also need to know to which simulator to send update message +void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type) +{ + if (mSelectedObjects->isEmpty()) + { + // nothing selected, so nothing to save + return; + } + + struct f : public LLSelectedNodeFunctor + { + EActionType mActionType; + f(EActionType a) : mActionType(a) {} + virtual bool apply(LLSelectNode* selectNode) + { + LLViewerObject* object = selectNode->getObject(); + if (!object) + { + return true; // skip + } + selectNode->mSavedPositionLocal = object->getPosition(); + if (object->isAttachment()) + { + if (object->isRootEdit()) + { + LLXform* parent_xform = object->mDrawable->getXform()->getParent(); + if (parent_xform) + { + selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition()); + } + else + { + selectNode->mSavedPositionGlobal = object->getPositionGlobal(); + } + } + else + { + LLViewerObject* attachment_root = (LLViewerObject*)object->getParent(); + LLXform* parent_xform = attachment_root ? attachment_root->mDrawable->getXform()->getParent() : NULL; + if (parent_xform) + { + LLVector3 root_pos = (attachment_root->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition(); + LLQuaternion root_rot = (attachment_root->getRotation() * parent_xform->getWorldRotation()); + selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * root_rot) + root_pos); + } + else + { + selectNode->mSavedPositionGlobal = object->getPositionGlobal(); + } + } + selectNode->mSavedRotation = object->getRenderRotation(); + } + else + { + selectNode->mSavedPositionGlobal = object->getPositionGlobal(); + selectNode->mSavedRotation = object->getRotationRegion(); + } + + selectNode->mSavedScale = object->getScale(); + selectNode->saveTextureScaleRatios(); + return true; + } + } func(action_type); + getSelection()->applyToNodes(&func); + + mSavedSelectionBBox = getBBoxOfSelection(); +} + +struct LLSelectMgrApplyFlags : public LLSelectedObjectFunctor +{ + LLSelectMgrApplyFlags(U32 flags, BOOL state) : mFlags(flags), mState(state) {} + U32 mFlags; + BOOL mState; + virtual bool apply(LLViewerObject* object) + { + if ( object->permModify() && // preemptive permissions check + object->isRoot() && // don't send for child objects + !object->isJointChild()) + { + object->setFlags( mFlags, mState); + } + return true; + } +}; + +void LLSelectMgr::selectionUpdatePhysics(BOOL physics) +{ + LLSelectMgrApplyFlags func( FLAGS_USE_PHYSICS, physics); + getSelection()->applyToObjects(&func); +} + +void LLSelectMgr::selectionUpdateTemporary(BOOL is_temporary) +{ + LLSelectMgrApplyFlags func( FLAGS_TEMPORARY_ON_REZ, is_temporary); + getSelection()->applyToObjects(&func); +} + +void LLSelectMgr::selectionUpdatePhantom(BOOL is_phantom) +{ + LLSelectMgrApplyFlags func( FLAGS_PHANTOM, is_phantom); + getSelection()->applyToObjects(&func); +} + +void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows) +{ + LLSelectMgrApplyFlags func( FLAGS_CAST_SHADOWS, cast_shadows); + getSelection()->applyToObjects(&func); +} + + +//---------------------------------------------------------------------- +// Helpful packing functions for sendObjectMessage() +//---------------------------------------------------------------------- + +// static +void LLSelectMgr::packAgentIDAndSessionAndAttachment( void *user_data) +{ + U8 *attachment_point = (U8*)user_data; + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->addU8Fast(_PREHASH_AttachmentPoint, *attachment_point); +} + +// static +void LLSelectMgr::packAgentID( void *user_data) +{ + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); +} + +// static +void LLSelectMgr::packAgentAndSessionID(void* user_data) +{ + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +} + +// static +void LLSelectMgr::packAgentAndGroupID(void* user_data) +{ + LLOwnerData *data = (LLOwnerData *)user_data; + + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, data->owner_id ); + gMessageSystem->addUUIDFast(_PREHASH_GroupID, data->group_id ); +} + +// static +void LLSelectMgr::packAgentAndSessionAndGroupID(void* user_data) +{ + LLUUID* group_idp = (LLUUID*) user_data; + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->addUUIDFast(_PREHASH_GroupID, *group_idp); +} + +// static +void LLSelectMgr::packDuplicateHeader(void* data) +{ + LLUUID group_id(gAgent.getGroupID()); + packAgentAndSessionAndGroupID(&group_id); + + LLDuplicateData* dup_data = (LLDuplicateData*) data; + + gMessageSystem->nextBlockFast(_PREHASH_SharedData); + gMessageSystem->addVector3Fast(_PREHASH_Offset, dup_data->offset); + gMessageSystem->addU32Fast(_PREHASH_DuplicateFlags, dup_data->flags); +} + +// static +void LLSelectMgr::packDeleteHeader(void* userdata) +{ + BOOL force = (BOOL)(intptr_t)userdata; + + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->addBOOLFast(_PREHASH_Force, force); +} + +// static +void LLSelectMgr::packAgentGroupAndCatID(void* user_data) +{ + LLBuyData* buy = (LLBuyData*)user_data; + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); + gMessageSystem->addUUIDFast(_PREHASH_CategoryID, buy->mCategoryID); +} + +//static +void LLSelectMgr::packDeRezHeader(void* user_data) +{ + LLDeRezInfo* info = (LLDeRezInfo*)user_data; + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_AgentBlock); + gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); + gMessageSystem->addU8Fast(_PREHASH_Destination, (U8)info->mDestination); + gMessageSystem->addUUIDFast(_PREHASH_DestinationID, info->mDestinationID); + LLUUID tid; + tid.generate(); + gMessageSystem->addUUIDFast(_PREHASH_TransactionID, tid); + const U8 PACKET = 1; + gMessageSystem->addU8Fast(_PREHASH_PacketCount, PACKET); + gMessageSystem->addU8Fast(_PREHASH_PacketNumber, PACKET); +} + +// static +void LLSelectMgr::packObjectID(LLSelectNode* node, void *user_data) +{ + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addUUIDFast(_PREHASH_ObjectID, node->getObject()->mID ); +} + +void LLSelectMgr::packObjectIDAndRotation(LLSelectNode* node, void *user_data) +{ + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() ); + gMessageSystem->addQuatFast(_PREHASH_Rotation, node->getObject()->getRotation()); +} + +void LLSelectMgr::packObjectClickAction(LLSelectNode* node, void *user_data) +{ + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() ); + gMessageSystem->addU8("ClickAction", node->getObject()->getClickAction()); +} + +void LLSelectMgr::packObjectIncludeInSearch(LLSelectNode* node, void *user_data) +{ + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() ); + gMessageSystem->addBOOL("IncludeInSearch", node->getObject()->getIncludeInSearch()); +} + +// static +void LLSelectMgr::packObjectLocalID(LLSelectNode* node, void *) +{ + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID()); +} + +// static +void LLSelectMgr::packObjectName(LLSelectNode* node, void* user_data) +{ + const std::string* name = (const std::string*)user_data; + if(!name->empty()) + { + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); + gMessageSystem->addStringFast(_PREHASH_Name, *name); + } + delete name; +} + +// static +void LLSelectMgr::packObjectDescription(LLSelectNode* node, void* user_data) +{ + const std::string* desc = (const std::string*)user_data; + if(!desc->empty()) + { + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); + gMessageSystem->addStringFast(_PREHASH_Description, *desc); + } +} + +// static +void LLSelectMgr::packObjectCategory(LLSelectNode* node, void* user_data) +{ + LLCategory* category = (LLCategory*)user_data; + if(!category) return; + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); + category->packMessage(gMessageSystem); +} + +// static +void LLSelectMgr::packObjectSaleInfo(LLSelectNode* node, void* user_data) +{ + LLSaleInfo* sale_info = (LLSaleInfo*)user_data; + if(!sale_info) return; + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); + sale_info->packMessage(gMessageSystem); +} + +// static +void LLSelectMgr::packPhysics(LLSelectNode* node, void *user_data) +{ +} + +// static +void LLSelectMgr::packShape(LLSelectNode* node, void *user_data) +{ +} + +// static +void LLSelectMgr::packPermissions(LLSelectNode* node, void *user_data) +{ + LLPermData *data = (LLPermData *)user_data; + + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID()); + + gMessageSystem->addU8Fast(_PREHASH_Field, data->mField); + gMessageSystem->addBOOLFast(_PREHASH_Set, data->mSet); + gMessageSystem->addU32Fast(_PREHASH_Mask, data->mMask); +} + +// Utility function to send some information to every region containing +// an object on the selection list. We want to do this to reduce the total +// number of packets sent by the viewer. +void LLSelectMgr::sendListToRegions(const std::string& message_name, + void (*pack_header)(void *user_data), + void (*pack_body)(LLSelectNode* node, void *user_data), + void *user_data, + ESendType send_type) +{ + LLSelectNode* node; + LLViewerRegion* last_region; + LLViewerRegion* current_region; + + S32 objects_sent = 0; + S32 packets_sent = 0; + S32 objects_in_this_packet = 0; + + //clear update override data (allow next update through) + struct f : public LLSelectedNodeFunctor + { + virtual bool apply(LLSelectNode* node) + { + node->mLastPositionLocal.setVec(0,0,0); + node->mLastRotation = LLQuaternion(); + node->mLastScale.setVec(0,0,0); + return true; + } + } func; + getSelection()->applyToNodes(&func); + + std::queue nodes_to_send; + + struct push_all : public LLSelectedNodeFunctor + { + std::queue& nodes_to_send; + push_all(std::queue& n) : nodes_to_send(n) {} + virtual bool apply(LLSelectNode* node) + { + if (node->getObject()) + { + nodes_to_send.push(node); + } + return true; + } + }; + struct push_some : public LLSelectedNodeFunctor + { + std::queue& nodes_to_send; + bool mRoots; + push_some(std::queue& n, bool roots) : nodes_to_send(n), mRoots(roots) {} + virtual bool apply(LLSelectNode* node) + { + if (node->getObject()) + { + BOOL is_root = node->getObject()->isRootEdit(); + if ((mRoots && is_root) || (!mRoots && !is_root)) + { + nodes_to_send.push(node); + } + } + return true; + } + }; + struct push_all pushall(nodes_to_send); + struct push_some pushroots(nodes_to_send, TRUE); + struct push_some pushnonroots(nodes_to_send, FALSE); + + switch(send_type) + { + case SEND_ONLY_ROOTS: + if(message_name == "ObjectBuy") + getSelection()->applyToRootNodes(&pushroots); + else + getSelection()->applyToRootNodes(&pushall); + + break; + case SEND_INDIVIDUALS: + getSelection()->applyToNodes(&pushall); + break; + case SEND_ROOTS_FIRST: + // first roots... + getSelection()->applyToNodes(&pushroots); + // then children... + getSelection()->applyToNodes(&pushnonroots); + break; + case SEND_CHILDREN_FIRST: + // first children... + getSelection()->applyToNodes(&pushnonroots); + // then roots... + getSelection()->applyToNodes(&pushroots); + break; + + default: + llerrs << "Bad send type " << send_type << " passed to SendListToRegions()" << llendl; + } + + // bail if nothing selected + if (nodes_to_send.empty()) + { + return; + } + + node = nodes_to_send.front(); + nodes_to_send.pop(); + + // cache last region information + current_region = node->getObject()->getRegion(); + + // Start duplicate message + // CRO: this isn't + gMessageSystem->newMessage(message_name.c_str()); + (*pack_header)(user_data); + + // For each object + while (node != NULL) + { + // remember the last region, look up the current one + last_region = current_region; + current_region = node->getObject()->getRegion(); + + // if to same simulator and message not too big + if ((current_region == last_region) + && (! gMessageSystem->isSendFull(NULL)) + && (objects_in_this_packet < MAX_OBJECTS_PER_PACKET)) + { + // add another instance of the body of the data + (*pack_body)(node, user_data); + ++objects_sent; + ++objects_in_this_packet; + + // and on to the next object + if(nodes_to_send.empty()) + { + node = NULL; + } + else + { + node = nodes_to_send.front(); + nodes_to_send.pop(); + } + } + else + { + // otherwise send current message and start new one + gMessageSystem->sendReliable( last_region->getHost()); + packets_sent++; + objects_in_this_packet = 0; + + gMessageSystem->newMessage(message_name.c_str()); + (*pack_header)(user_data); + + // don't move to the next object, we still need to add the + // body data. + } + } + + // flush messages + if (gMessageSystem->getCurrentSendTotal() > 0) + { + gMessageSystem->sendReliable( current_region->getHost()); + packets_sent++; + } + else + { + gMessageSystem->clearMessage(); + } + + // llinfos << "sendListToRegions " << message_name << " obj " << objects_sent << " pkt " << packets_sent << llendl; +} + + +// +// Network communications +// + +void LLSelectMgr::requestObjectPropertiesFamily(LLViewerObject* object) +{ + // Remember that we asked the properties of this object. + sObjectPropertiesFamilyRequests.insert(object->mID); + //llinfos << "Registered an ObjectPropertiesFamily request for object " << object->mID << llendl; + + LLMessageSystem* msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_RequestObjectPropertiesFamily); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addU32Fast(_PREHASH_RequestFlags, 0x0 ); + msg->addUUIDFast(_PREHASH_ObjectID, object->mID ); + + LLViewerRegion* regionp = object->getRegion(); + msg->sendReliable( regionp->getHost() ); +} + + +// static +void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data) +{ + S32 i; + S32 count = msg->getNumberOfBlocksFast(_PREHASH_ObjectData); + for (i = 0; i < count; i++) + { + LLUUID id; + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, id, i); + + LLUUID creator_id; + LLUUID owner_id; + LLUUID group_id; + LLUUID last_owner_id; + U64 creation_date; + LLUUID extra_id; + U32 base_mask, owner_mask, group_mask, everyone_mask, next_owner_mask; + LLSaleInfo sale_info; + LLCategory category; + LLAggregatePermissions ag_perms; + LLAggregatePermissions ag_texture_perms; + LLAggregatePermissions ag_texture_perms_owner; + + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_CreatorID, creator_id, i); + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id, i); + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_GroupID, group_id, i); + msg->getU64Fast(_PREHASH_ObjectData, _PREHASH_CreationDate, creation_date, i); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_BaseMask, base_mask, i); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_OwnerMask, owner_mask, i); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_GroupMask, group_mask, i); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_EveryoneMask, everyone_mask, i); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_NextOwnerMask, next_owner_mask, i); + sale_info.unpackMultiMessage(msg, _PREHASH_ObjectData, i); + + ag_perms.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePerms, i); + ag_texture_perms.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePermTextures, i); + ag_texture_perms_owner.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePermTexturesOwner, i); + category.unpackMultiMessage(msg, _PREHASH_ObjectData, i); + + S16 inv_serial = 0; + msg->getS16Fast(_PREHASH_ObjectData, _PREHASH_InventorySerial, inv_serial, i); + + LLUUID item_id; + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ItemID, item_id, i); + LLUUID folder_id; + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FolderID, folder_id, i); + LLUUID from_task_id; + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FromTaskID, from_task_id, i); + + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id, i); + + std::string name; + msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, name, i); + std::string desc; + msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc, i); + + std::string touch_name; + msg->getStringFast(_PREHASH_ObjectData, _PREHASH_TouchName, touch_name, i); + std::string sit_name; + msg->getStringFast(_PREHASH_ObjectData, _PREHASH_SitName, sit_name, i); + + //unpack TE IDs + std::vector texture_ids; + S32 size = msg->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_TextureID); + if (size > 0) + { + S8 packed_buffer[SELECT_MAX_TES * UUID_BYTES]; + msg->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureID, packed_buffer, 0, i, SELECT_MAX_TES * UUID_BYTES); + + for (S32 buf_offset = 0; buf_offset < size; buf_offset += UUID_BYTES) + { + LLUUID tid; + memcpy(tid.mData, packed_buffer + buf_offset, UUID_BYTES); /* Flawfinder: ignore */ + texture_ids.push_back(tid); + } + } + + // Iterate through nodes at end, since it can be on both the regular AND hover list + struct f : public LLSelectedNodeFunctor + { + LLUUID mID; + f(const LLUUID& id) : mID(id) {} + virtual bool apply(LLSelectNode* node) + { + return (node->getObject() && node->getObject()->mID == mID); + } + } func(id); + LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func); + + if (node) + { + if (node->mInventorySerial != inv_serial) + { + node->getObject()->dirtyInventory(); + } + + // save texture data as soon as we get texture perms first time + if (!node->mValid) + { + BOOL can_copy = FALSE; + BOOL can_transfer = FALSE; + + LLAggregatePermissions::EValue value = LLAggregatePermissions::AP_NONE; + if(node->getObject()->permYouOwner()) + { + value = ag_texture_perms_owner.getValue(PERM_COPY); + if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL) + { + can_copy = TRUE; + } + value = ag_texture_perms_owner.getValue(PERM_TRANSFER); + if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL) + { + can_transfer = TRUE; + } + } + else + { + value = ag_texture_perms.getValue(PERM_COPY); + if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL) + { + can_copy = TRUE; + } + value = ag_texture_perms.getValue(PERM_TRANSFER); + if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL) + { + can_transfer = TRUE; + } + } + + if (can_copy && can_transfer) + { + // this should be the only place that saved textures is called + node->saveTextures(texture_ids); + } + } + + node->mValid = TRUE; + node->mPermissions->init(creator_id, owner_id, + last_owner_id, group_id); + node->mPermissions->initMasks(base_mask, owner_mask, everyone_mask, group_mask, next_owner_mask); + node->mCreationDate = creation_date; + node->mItemID = item_id; + node->mFolderID = folder_id; + node->mFromTaskID = from_task_id; + node->mName.assign(name); + node->mDescription.assign(desc); + node->mSaleInfo = sale_info; + node->mAggregatePerm = ag_perms; + node->mAggregateTexturePerm = ag_texture_perms; + node->mAggregateTexturePermOwner = ag_texture_perms_owner; + node->mCategory = category; + node->mInventorySerial = inv_serial; + node->mSitName.assign(sit_name); + node->mTouchName.assign(touch_name); + } + } + + dialog_refresh_all(); + + // silly hack to allow 'save into inventory' + if(gPopupMenuView->getVisible()) + { + gPopupMenuView->setItemEnabled(SAVE_INTO_INVENTORY, + enable_save_into_inventory(NULL)); + } + + // hack for left-click buy object + LLToolPie::selectionPropertiesReceived(); +} + +// static +void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** user_data) +{ + U32 request_flags; + LLUUID id; + LLUUID creator_id; + LLUUID owner_id; + LLUUID group_id; + LLUUID extra_id; + U32 base_mask, owner_mask, group_mask, everyone_mask, next_owner_mask; + LLSaleInfo sale_info; + LLCategory category; + + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_RequestFlags, request_flags ); + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, id ); + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id ); + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_GroupID, group_id ); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_BaseMask, base_mask ); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_OwnerMask, owner_mask ); + msg->getU32Fast(_PREHASH_ObjectData,_PREHASH_GroupMask, group_mask ); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_EveryoneMask, everyone_mask ); + msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_NextOwnerMask, next_owner_mask); + sale_info.unpackMessage(msg, _PREHASH_ObjectData); + category.unpackMessage(msg, _PREHASH_ObjectData); + + LLUUID last_owner_id; + msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id ); + + // unpack name & desc + std::string name; + msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, name); + + std::string desc; + msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc); + + //llinfos << "Got ObjectPropertiesFamily reply for object " << id << llendl; + if(sObjectPropertiesFamilyRequests.count(id) != 0 ) + { + // Send to export floaters + //LLFloaterExport::receiveObjectProperties(id, name, desc); + // We got the reply, so remove the object from the list of pending requests + sObjectPropertiesFamilyRequests.erase(id); + } + + // the reporter widget askes the server for info about picked objects + if (request_flags & (COMPLAINT_REPORT_REQUEST | BUG_REPORT_REQUEST)) + { + EReportType report_type = (COMPLAINT_REPORT_REQUEST & request_flags) ? COMPLAINT_REPORT : BUG_REPORT; + LLFloaterReporter *reporterp = LLFloaterReporter::getReporter(report_type); + if (reporterp) + { + std::string fullname; + gCacheName->getFullName(owner_id, fullname); + reporterp->setPickedObjectProperties(name, fullname, owner_id); + } + } + else if (request_flags & OBJECT_PAY_REQUEST) + { + // check if the owner of the paid object is muted + LLMuteList::getInstance()->autoRemove(owner_id, LLMuteList::AR_MONEY); + } + + // Now look through all of the hovered nodes + struct f : public LLSelectedNodeFunctor + { + LLUUID mID; + f(const LLUUID& id) : mID(id) {} + virtual bool apply(LLSelectNode* node) + { + return (node->getObject() && node->getObject()->mID == mID); + } + } func(id); + LLSelectNode* node = LLSelectMgr::getInstance()->getHoverObjects()->getFirstNode(&func); + + if (node) + { + node->mValid = TRUE; + node->mPermissions->init(LLUUID::null, owner_id, + last_owner_id, group_id); + node->mPermissions->initMasks(base_mask, owner_mask, everyone_mask, group_mask, next_owner_mask); + node->mSaleInfo = sale_info; + node->mCategory = category; + node->mName.assign(name); + node->mDescription.assign(desc); + } + + dialog_refresh_all(); +} + + +// static +void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**) +{ + BOOL reset_list; + msg->getBOOL("Header", "ResetList", reset_list); + + if (reset_list) + { + LLSelectMgr::getInstance()->deselectAll(); + } + + LLUUID full_id; + S32 local_id; + LLViewerObject* object; + std::vector objects; + S32 i; + S32 block_count = msg->getNumberOfBlocks("Data"); + + for (i = 0; i < block_count; i++) + { + msg->getS32("Data", "LocalID", local_id, i); + + gObjectList.getUUIDFromLocal(full_id, + local_id, + msg->getSenderIP(), + msg->getSenderPort()); + object = gObjectList.findObject(full_id); + if (object) + { + objects.push_back(object); + } + } + + // Don't select, just highlight + LLSelectMgr::getInstance()->highlightObjectAndFamily(objects); +} + + +extern LLGLdouble gGLModelView[16]; + +void LLSelectMgr::updateSilhouettes() +{ + S32 num_sils_genned = 0; + + LLVector3d cameraPos = gAgent.getCameraPositionGlobal(); + F32 currentCameraZoom = gAgent.getCurrentCameraBuildOffset(); + + if (!mSilhouetteImagep) + { + mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, LLViewerTexture::BOOST_UI); + } + + mHighlightedObjects->cleanupNodes(); + + if((cameraPos - mLastCameraPos).magVecSquared() > SILHOUETTE_UPDATE_THRESHOLD_SQUARED * currentCameraZoom * currentCameraZoom) + { + struct f : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + object->setChanged(LLXform::SILHOUETTE); + return true; + } + } func; + getSelection()->applyToObjects(&func); + + mLastCameraPos = gAgent.getCameraPositionGlobal(); + } + + std::vector changed_objects; + + updateSelectionSilhouette(mSelectedObjects, num_sils_genned, changed_objects); + if (mRectSelectedObjects.size() > 0) + { + //gGLSPipelineSelection.set(); + + //mSilhouetteImagep->bindTexture(); + //glAlphaFunc(GL_GREATER, sHighlightAlphaTest); + + std::set roots; + + // sync mHighlightedObjects with mRectSelectedObjects since the latter is rebuilt every frame and former + // persists from frame to frame to avoid regenerating object silhouettes + // mHighlightedObjects includes all siblings of rect selected objects + + BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); + + // generate list of roots from current object selection + for (std::set >::iterator iter = mRectSelectedObjects.begin(); + iter != mRectSelectedObjects.end(); iter++) + { + LLViewerObject *objectp = *iter; + if (select_linked_set) + { + LLViewerObject *rootp = (LLViewerObject*)objectp->getRoot(); + roots.insert(rootp); + } + else + { + roots.insert(objectp); + } + } + + // remove highlight nodes not in roots list + std::vector remove_these_nodes; + std::vector remove_these_roots; + + for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); + iter != mHighlightedObjects->end(); iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* objectp = node->getObject(); + if (!objectp) + continue; + if (objectp->isRoot() || !select_linked_set) + { + if (roots.count(objectp) == 0) + { + remove_these_nodes.push_back(node); + } + else + { + remove_these_roots.push_back(objectp); + } + } + else + { + LLViewerObject* rootp = (LLViewerObject*)objectp->getRoot(); + + if (roots.count(rootp) == 0) + { + remove_these_nodes.push_back(node); + } + } + } + + // remove all highlight nodes no longer in rectangle selection + for (std::vector::iterator iter = remove_these_nodes.begin(); + iter != remove_these_nodes.end(); ++iter) + { + LLSelectNode* nodep = *iter; + mHighlightedObjects->removeNode(nodep); + } + + // remove all root objects already being highlighted + for (std::vector::iterator iter = remove_these_roots.begin(); + iter != remove_these_roots.end(); ++iter) + { + LLViewerObject* objectp = *iter; + roots.erase(objectp); + } + + // add all new objects in rectangle selection + for (std::set::iterator iter = roots.begin(); + iter != roots.end(); iter++) + { + LLViewerObject* objectp = *iter; + if (!canSelectObject(objectp)) + { + continue; + } + + LLSelectNode* rect_select_root_node = new LLSelectNode(objectp, TRUE); + rect_select_root_node->selectAllTEs(TRUE); + + if (!select_linked_set) + { + rect_select_root_node->mIndividualSelection = TRUE; + } + else + { + LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) + { + LLViewerObject* child_objectp = *iter; + + if (!canSelectObject(child_objectp)) + { + continue; + } + + LLSelectNode* rect_select_node = new LLSelectNode(child_objectp, TRUE); + rect_select_node->selectAllTEs(TRUE); + mHighlightedObjects->addNodeAtEnd(rect_select_node); + } + } + + // Add the root last, to preserve order for link operations. + mHighlightedObjects->addNodeAtEnd(rect_select_root_node); + } + + num_sils_genned = 0; + + // render silhouettes for highlighted objects + //BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL); + for (S32 pass = 0; pass < 2; pass++) + { + for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); + iter != mHighlightedObjects->end(); iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* objectp = node->getObject(); + if (!objectp) + continue; + + // do roots first, then children so that root flags are cleared ASAP + BOOL roots_only = (pass == 0); + BOOL is_root = objectp->isRootEdit(); + if (roots_only != is_root) + { + continue; + } + + if (!node->mSilhouetteExists + || objectp->isChanged(LLXform::SILHOUETTE) + || (objectp->getParent() && objectp->getParent()->isChanged(LLXform::SILHOUETTE))) + { + if (num_sils_genned++ < MAX_SILS_PER_FRAME) + { + generateSilhouette(node, LLViewerCamera::getInstance()->getOrigin()); + changed_objects.push_back(objectp); + } + else if (objectp->isAttachment() && objectp->getRootEdit()->mDrawable.notNull()) + { + //RN: hack for orthogonal projection of HUD attachments + LLViewerJointAttachment* attachment_pt = (LLViewerJointAttachment*)objectp->getRootEdit()->mDrawable->getParent(); + if (attachment_pt && attachment_pt->getIsHUDAttachment()) + { + LLVector3 camera_pos = LLVector3(-10000.f, 0.f, 0.f); + generateSilhouette(node, camera_pos); + } + } + } + //LLColor4 highlight_color; + // + //if (subtracting_from_selection) + //{ + // node->renderOneSilhouette(LLColor4::red); + //} + //else if (!objectp->isSelected()) + //{ + // highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor; + // node->renderOneSilhouette(highlight_color); + //} + } + } + //mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D); + } + else + { + mHighlightedObjects->deleteAllNodes(); + } + + for (std::vector::iterator iter = changed_objects.begin(); + iter != changed_objects.end(); ++iter) + { + // clear flags after traversing node list (as child objects need to refer to parent flags, etc) + LLViewerObject* objectp = *iter; + objectp->clearChanged(LLXform::MOVED | LLXform::SILHOUETTE); + } + + //gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +} + +void LLSelectMgr::updateSelectionSilhouette(LLObjectSelectionHandle object_handle, S32& num_sils_genned, std::vector& changed_objects) +{ + if (object_handle->getNumNodes()) + { + //gGLSPipelineSelection.set(); + + //mSilhouetteImagep->bindTexture(); + //glAlphaFunc(GL_GREATER, sHighlightAlphaTest); + + for (S32 pass = 0; pass < 2; pass++) + { + for (LLObjectSelection::iterator iter = object_handle->begin(); + iter != object_handle->end(); iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* objectp = node->getObject(); + if (!objectp) + continue; + // do roots first, then children so that root flags are cleared ASAP + BOOL roots_only = (pass == 0); + BOOL is_root = (objectp->isRootEdit()); + if (roots_only != is_root || objectp->mDrawable.isNull()) + { + continue; + } + + if (!node->mSilhouetteExists + || objectp->isChanged(LLXform::SILHOUETTE) + || (objectp->getParent() && objectp->getParent()->isChanged(LLXform::SILHOUETTE))) + { + if (num_sils_genned++ < MAX_SILS_PER_FRAME)// && objectp->mDrawable->isVisible()) + { + generateSilhouette(node, LLViewerCamera::getInstance()->getOrigin()); + changed_objects.push_back(objectp); + } + else if (objectp->isAttachment() && objectp->getRootEdit() && objectp->getRootEdit()->mDrawable.notNull()) + { + //RN: hack for orthogonal projection of HUD attachments + LLViewerJointAttachment* attachment_pt = (LLViewerJointAttachment*)objectp->getRootEdit()->mDrawable->getParent(); + if (attachment_pt && attachment_pt->getIsHUDAttachment()) + { + LLVector3 camera_pos = LLVector3(-10000.f, 0.f, 0.f); + generateSilhouette(node, camera_pos); + } + } + } + } + } + } +} +void LLSelectMgr::renderSilhouettes(BOOL for_hud) +{ + if (!mRenderSilhouettes || !LLSelectMgr::sRenderSelectionHighlights) + { + return; + } + + gGL.getTexUnit(0)->bind(mSilhouetteImagep.get()); + LLGLSPipelineSelection gls_select; + gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); + LLGLEnable blend(GL_BLEND); + LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); + + if (isAgentAvatarValid() && for_hud) + { + LLVOAvatar* avatar = gAgent.getAvatarObject(); + LLBBox hud_bbox = avatar->getHUDBBox(); + + F32 cur_zoom = gAgent.mHUDCurZoom; + + // set up transform to encompass bounding box of HUD + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f); + glOrtho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame + glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f); + glScalef(cur_zoom, cur_zoom, cur_zoom); + } + if (mSelectedObjects->getNumNodes()) + { + LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID(); + + // + //for (S32 pass = 0; pass < 2; pass++) + //{ + // + for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); + iter != mSelectedObjects->end(); iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* objectp = node->getObject(); + if (!objectp) + continue; + if (objectp->isHUDAttachment() != for_hud) + { + continue; + } + if(objectp->getID() == inspect_item_id) + { + node->renderOneSilhouette(sHighlightInspectColor); + } + else if (node->isTransient()) + { + BOOL oldHidden = LLSelectMgr::sRenderHiddenSelections; + LLSelectMgr::sRenderHiddenSelections = FALSE; + node->renderOneSilhouette(sContextSilhouetteColor); + LLSelectMgr::sRenderHiddenSelections = oldHidden; + } + else if (objectp->isRootEdit()) + { + node->renderOneSilhouette(sSilhouetteParentColor); + } + else + { + node->renderOneSilhouette(sSilhouetteChildColor); + } + } + // + //} + // + } + + if (mHighlightedObjects->getNumNodes()) + { + // render silhouettes for highlighted objects + BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL); + for (S32 pass = 0; pass < 2; pass++) + { + for (LLObjectSelection::iterator iter = mHighlightedObjects->begin(); + iter != mHighlightedObjects->end(); iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* objectp = node->getObject(); + if (!objectp) + continue; + if (objectp->isHUDAttachment() != for_hud) + { + continue; + } + + if (subtracting_from_selection) + { + node->renderOneSilhouette(LLColor4::red); + } + else if (!objectp->isSelected()) + { + LLColor4 highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor; + node->renderOneSilhouette(highlight_color); + } + } + } + } + + if (isAgentAvatarValid() && for_hud) + { + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + stop_glerror(); + } + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +} + +void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) +{ + LLViewerObject* objectp = nodep->getObject(); + + if (objectp && objectp->getPCode() == LL_PCODE_VOLUME) + { + ((LLVOVolume*)objectp)->generateSilhouette(nodep, view_point); + } +} + +// +// Utility classes +// +LLSelectNode::LLSelectNode(LLViewerObject* object, BOOL glow) +: mObject(object), + mIndividualSelection(FALSE), + mTransient(FALSE), + mValid(FALSE), + mPermissions(new LLPermissions()), + mInventorySerial(0), + mSilhouetteExists(FALSE), + mDuplicated(FALSE), + mTESelectMask(0), + mLastTESelected(0), + mName(LLStringUtil::null), + mDescription(LLStringUtil::null), + mTouchName(LLStringUtil::null), + mSitName(LLStringUtil::null), + mCreationDate(0) +{ + selectAllTEs(FALSE); + saveColors(); +} + +LLSelectNode::LLSelectNode(const LLSelectNode& nodep) +{ + mTESelectMask = nodep.mTESelectMask; + mLastTESelected = nodep.mLastTESelected; + + mIndividualSelection = nodep.mIndividualSelection; + + mValid = nodep.mValid; + mTransient = nodep.mTransient; + mPermissions = new LLPermissions(*nodep.mPermissions); + mSaleInfo = nodep.mSaleInfo;; + mAggregatePerm = nodep.mAggregatePerm; + mAggregateTexturePerm = nodep.mAggregateTexturePerm; + mAggregateTexturePermOwner = nodep.mAggregateTexturePermOwner; + mName = nodep.mName; + mDescription = nodep.mDescription; + mCategory = nodep.mCategory; + mInventorySerial = 0; + mSavedPositionLocal = nodep.mSavedPositionLocal; + mSavedPositionGlobal = nodep.mSavedPositionGlobal; + mSavedScale = nodep.mSavedScale; + mSavedRotation = nodep.mSavedRotation; + mDuplicated = nodep.mDuplicated; + mDuplicatePos = nodep.mDuplicatePos; + mDuplicateRot = nodep.mDuplicateRot; + mItemID = nodep.mItemID; + mFolderID = nodep.mFolderID; + mFromTaskID = nodep.mFromTaskID; + mTouchName = nodep.mTouchName; + mSitName = nodep.mSitName; + mCreationDate = nodep.mCreationDate; + + mSilhouetteVertices = nodep.mSilhouetteVertices; + mSilhouetteNormals = nodep.mSilhouetteNormals; + mSilhouetteSegments = nodep.mSilhouetteSegments; + mSilhouetteExists = nodep.mSilhouetteExists; + mObject = nodep.mObject; + + std::vector::const_iterator color_iter; + mSavedColors.clear(); + for (color_iter = nodep.mSavedColors.begin(); color_iter != nodep.mSavedColors.end(); ++color_iter) + { + mSavedColors.push_back(*color_iter); + } + + saveTextures(nodep.mSavedTextures); +} + +LLSelectNode::~LLSelectNode() +{ + delete mPermissions; + mPermissions = NULL; +} + +void LLSelectNode::selectAllTEs(BOOL b) +{ + mTESelectMask = b ? TE_SELECT_MASK_ALL : 0x0; + mLastTESelected = 0; +} + +void LLSelectNode::selectTE(S32 te_index, BOOL selected) +{ + if (te_index < 0 || te_index >= SELECT_MAX_TES) + { + return; + } + if (selected) + { + mTESelectMask |= (0x1 << te_index); + } + else + { + mTESelectMask &= ~(0x1 << te_index); + } + mLastTESelected = te_index; +} + +BOOL LLSelectNode::isTESelected(S32 te_index) +{ + if (te_index < 0 || te_index >= mObject->getNumTEs()) + { + return FALSE; + } + return (mTESelectMask & (0x1 << te_index)) != 0; +} + +S32 LLSelectNode::getLastSelectedTE() +{ + if (!isTESelected(mLastTESelected)) + { + return -1; + } + return mLastTESelected; +} + +LLViewerObject* LLSelectNode::getObject() +{ + if (!mObject) + { + return NULL; + } + else if (mObject->isDead()) + { + mObject = NULL; + } + return mObject; +} + +void LLSelectNode::setObject(LLViewerObject* object) +{ + mObject = object; +} + +void LLSelectNode::saveColors() +{ + if (mObject.notNull()) + { + mSavedColors.clear(); + for (S32 i = 0; i < mObject->getNumTEs(); i++) + { + const LLTextureEntry* tep = mObject->getTE(i); + mSavedColors.push_back(tep->getColor()); + } + } +} + +void LLSelectNode::saveTextures(const std::vector& textures) +{ + if (mObject.notNull()) + { + mSavedTextures.clear(); + + for (std::vector::const_iterator texture_it = textures.begin(); + texture_it != textures.end(); ++texture_it) + { + mSavedTextures.push_back(*texture_it); + } + } +} + +void LLSelectNode::saveTextureScaleRatios() +{ + mTextureScaleRatios.clear(); + if (mObject.notNull()) + { + for (U8 i = 0; i < mObject->getNumTEs(); i++) + { + F32 s,t; + const LLTextureEntry* tep = mObject->getTE(i); + tep->getScale(&s,&t); + U32 s_axis = 0; + U32 t_axis = 0; + + LLPrimitive::getTESTAxes(i, &s_axis, &t_axis); + + LLVector3 v; + LLVector3 scale = mObject->getScale(); + + if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR) + { + v.mV[s_axis] = s*scale.mV[s_axis]; + v.mV[t_axis] = t*scale.mV[t_axis]; + } + else + { + v.mV[s_axis] = s/scale.mV[s_axis]; + v.mV[t_axis] = t/scale.mV[t_axis]; + } + + mTextureScaleRatios.push_back(v); + } + } +} + + +// This implementation should be similar to LLTask::allowOperationOnTask +BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const +{ + // Extract ownership. + BOOL object_is_group_owned = FALSE; + LLUUID object_owner_id; + mPermissions->getOwnership(object_owner_id, object_is_group_owned); + + // Operations on invalid or public objects is not allowed. + if (!mObject || (mObject->isDead()) || !mPermissions->isOwned()) + { + return FALSE; + } + + // The transfer permissions can never be given through proxy. + if (PERM_TRANSFER == op) + { + // The owner of an agent-owned object can transfer to themselves. + if ( !object_is_group_owned + && (gAgent.getID() == object_owner_id) ) + { + return TRUE; + } + else + { + // Otherwise check aggregate permissions. + return mObject->permTransfer(); + } + } + + if (PERM_MOVE == op + || PERM_MODIFY == op) + { + // only owners can move or modify their attachments + // no proxy allowed. + if (mObject->isAttachment() && object_owner_id != gAgent.getID()) + { + return FALSE; + } + } + + // Calculate proxy_agent_id and group_id to use for permissions checks. + // proxy_agent_id may be set to the object owner through group powers. + // group_id can only be set to the object's group, if the agent is in that group. + LLUUID group_id = LLUUID::null; + LLUUID proxy_agent_id = gAgent.getID(); + + // Gods can always operate. + if (gAgent.isGodlike()) + { + return TRUE; + } + + // Check if the agent is in the same group as the object. + LLUUID object_group_id = mPermissions->getGroup(); + if (object_group_id.notNull() && + gAgent.isInGroup(object_group_id)) + { + // Assume the object's group during this operation. + group_id = object_group_id; + } + + // Only allow proxy powers for PERM_COPY if the actual agent can + // receive the item (ie has PERM_TRANSFER permissions). + // NOTE: op == PERM_TRANSFER has already been handled, but if + // that ever changes we need to BLOCK proxy powers for PERM_TRANSFER. DK 03/28/06 + if (PERM_COPY != op || mPermissions->allowTransferTo(gAgent.getID())) + { + // Check if the agent can assume ownership through group proxy or agent-granted proxy. + if ( ( object_is_group_owned + && gAgent.hasPowerInGroup(object_owner_id, group_proxy_power)) + // Only allow proxy for move, modify, and copy. + || ( (PERM_MOVE == op || PERM_MODIFY == op || PERM_COPY == op) + && (!object_is_group_owned + && gAgent.isGrantedProxy(*mPermissions)))) + { + // This agent is able to assume the ownership role for this operation. + proxy_agent_id = object_owner_id; + } + } + + // We now have max ownership information. + if (PERM_OWNER == op) + { + // This this was just a check for ownership, we can now return the answer. + return (proxy_agent_id == object_owner_id ? TRUE : FALSE); + } + + // check permissions to see if the agent can operate + return (mPermissions->allowOperationBy(op, proxy_agent_id, group_id)); +} + +//----------------------------------------------------------------------------- +// renderOneSilhouette() +//----------------------------------------------------------------------------- +void LLSelectNode::renderOneSilhouette(const LLColor4 &color) +{ + LLViewerObject* objectp = getObject(); + if (!objectp) + { + return; + } + + LLDrawable* drawable = objectp->mDrawable; + if(!drawable) + { + return; + } + + if (!mSilhouetteExists) + { + return; + } + + BOOL is_hud_object = objectp->isHUDAttachment(); + + if (mSilhouetteVertices.size() == 0 || mSilhouetteNormals.size() != mSilhouetteVertices.size()) + { + return; + } + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + if (!is_hud_object) + { + glLoadIdentity(); + glMultMatrixd(gGLModelView); + } + + + if (drawable->isActive()) + { + glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix); + } + + LLVolume *volume = objectp->getVolume(); + if (volume) + { + F32 silhouette_thickness; + if (isAgentAvatarValid() && is_hud_object) + { + silhouette_thickness = LLSelectMgr::sHighlightThickness / gAgent.mHUDCurZoom; + } + else + { + LLVector3 view_vector = LLViewerCamera::getInstance()->getOrigin() - objectp->getRenderPosition(); + silhouette_thickness = view_vector.magVec() * LLSelectMgr::sHighlightThickness * (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV()); + } + F32 animationTime = (F32)LLFrameTimer::getElapsedSeconds(); + + F32 u_coord = fmod(animationTime * LLSelectMgr::sHighlightUAnim, 1.f); + F32 v_coord = 1.f - fmod(animationTime * LLSelectMgr::sHighlightVAnim, 1.f); + F32 u_divisor = 1.f / ((F32)(mSilhouetteVertices.size() - 1)); + + if (LLSelectMgr::sRenderHiddenSelections) // && gFloaterTools && gFloaterTools->getVisible()) + { + gGL.flush(); + gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE); + LLGLEnable fog(GL_FOG); + glFogi(GL_FOG_MODE, GL_LINEAR); + float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec(); + LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgent.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0); + glFogf(GL_FOG_START, d); + glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV()))); + glFogfv(GL_FOG_COLOR, fogCol.mV); + + LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL); + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); + gGL.begin(LLRender::LINES); + { + S32 i = 0; + for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++) + { + for(; i < mSilhouetteSegments[seg_num]; i++) + { + u_coord += u_divisor * LLSelectMgr::sHighlightUScale; + + gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); + gGL.texCoord2f( u_coord, v_coord ); + gGL.vertex3fv( mSilhouetteVertices[i].mV ); + } + } + } + gGL.end(); + u_coord = fmod(animationTime * LLSelectMgr::sHighlightUAnim, 1.f); + } + + gGL.flush(); + gGL.setSceneBlendType(LLRender::BT_ALPHA); + gGL.begin(LLRender::TRIANGLES); + { + S32 i = 0; + for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++) + { + S32 first_i = i; + LLVector3 v; + LLVector2 t; + + for(; i < mSilhouetteSegments[seg_num]; i++) + { + + if (i == first_i) { + LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness; + vert += mSilhouetteVertices[i]; + + gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha); + gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale ); + gGL.vertex3fv( vert.mV ); + + u_coord += u_divisor * LLSelectMgr::sHighlightUScale; + + gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2); + gGL.texCoord2f( u_coord, v_coord ); + gGL.vertex3fv( mSilhouetteVertices[i].mV ); + + v = mSilhouetteVertices[i]; + t = LLVector2(u_coord, v_coord); + } + else { + LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness; + vert += mSilhouetteVertices[i]; + + gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha); + gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale ); + gGL.vertex3fv( vert.mV ); + gGL.vertex3fv( vert.mV ); + + gGL.texCoord2fv(t.mV); + u_coord += u_divisor * LLSelectMgr::sHighlightUScale; + gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2); + gGL.vertex3fv(v.mV); + gGL.texCoord2f( u_coord, v_coord ); + gGL.vertex3fv( mSilhouetteVertices[i].mV ); + + } + } + } + } + gGL.end(); + gGL.flush(); + } + glPopMatrix(); +} + +// +// Utility Functions +// + +// Update everyone who cares about the selection list +void dialog_refresh_all() +{ + if (gNoRender) + { + return; + } + + //could refresh selected object info in toolbar here + + gFloaterTools->dirty(); + + if( gPieObject->getVisible() ) + { + gPieObject->arrange(); + } + + if( gPieAttachment->getVisible() ) + { + gPieAttachment->arrange(); + } + + LLFloaterProperties::dirtyAll(); + LLFloaterInspect::dirty(); +} + +S32 get_family_count(LLViewerObject *parent) +{ + if (!parent) + { + llwarns << "Trying to get_family_count on null parent!" << llendl; + } + S32 count = 1; // for this object + LLViewerObject::const_child_list_t& child_list = parent->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) + { + LLViewerObject* child = *iter; + + if (!child) + { + llwarns << "Family object has NULL child! Show Doug." << llendl; + } + else if (child->isDead()) + { + llwarns << "Family object has dead child object. Show Doug." << llendl; + } + else + { + if (LLSelectMgr::getInstance()->canSelectObject(child)) + { + count += get_family_count( child ); + } + } + } + return count; +} + +//----------------------------------------------------------------------------- +// updateSelectionCenter +//----------------------------------------------------------------------------- +void LLSelectMgr::updateSelectionCenter() +{ + const F32 MOVE_SELECTION_THRESHOLD = 1.f; // Movement threshold in meters for updating selection + // center (tractor beam) + + //override any object updates received + //for selected objects + overrideObjectUpdates(); + + LLViewerObject* object = mSelectedObjects->getFirstObject(); + if (!object) + { + // nothing selected, probably grabbing + // Ignore by setting to avatar origin. + mSelectionCenterGlobal.clearVec(); + mShowSelection = FALSE; + mSelectionBBox = LLBBox(); + mPauseRequest = NULL; + resetAgentHUDZoom(); + + } + else + { + mSelectedObjects->mSelectType = getSelectTypeForObject(object); + + if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) + { + mPauseRequest = gAgent.getAvatarObject()->requestPause(); + } + else + { + mPauseRequest = NULL; + } + + if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && isAgentAvatarValid()) + { + // reset hud ZOOM + gAgent.mHUDTargetZoom = 1.f; + gAgent.mHUDCurZoom = 1.f; + } + + mShowSelection = FALSE; + LLBBox bbox; + + // have stuff selected + LLVector3d select_center; + // keep a list of jointed objects for showing the joint HUDEffects + + // Initialize the bounding box to the root prim, so the BBox orientation + // matches the root prim's (affecting the orientation of the manipulators). + bbox.addBBoxAgent( (mSelectedObjects->getFirstRootObject(TRUE))->getBoundingBoxAgent() ); + + std::vector < LLViewerObject *> jointed_objects; + + for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); + iter != mSelectedObjects->end(); iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if (!object) + continue; + LLViewerObject *myAvatar = gAgent.getAvatarObject(); + LLViewerObject *root = object->getRootEdit(); + if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment + !root->isChild(myAvatar) && // not the object you're sitting on + !object->isAvatar()) // not another avatar + { + mShowSelection = TRUE; + } + + bbox.addBBoxAgent( object->getBoundingBoxAgent() ); + + if (object->isJointChild()) + { + jointed_objects.push_back(object); + } + } + + LLVector3 bbox_center_agent = bbox.getCenterAgent(); + mSelectionCenterGlobal = gAgent.getPosGlobalFromAgent(bbox_center_agent); + mSelectionBBox = bbox; + + } + + if ( !(gAgentID == LLUUID::null)) + { + LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); + if (mShowSelection) + { + LLVector3d select_center_global; + + if( tool->isEditing() ) + { + select_center_global = tool->getEditingPointGlobal(); + } + else + { + select_center_global = mSelectionCenterGlobal; + } + + // Send selection center if moved beyond threshold (used to animate tractor beam) + LLVector3d diff; + diff = select_center_global - mLastSentSelectionCenterGlobal; + + if ( diff.magVecSquared() > MOVE_SELECTION_THRESHOLD*MOVE_SELECTION_THRESHOLD ) + { + // Transmit updated selection center + mLastSentSelectionCenterGlobal = select_center_global; + } + } + } + + // give up edit menu if no objects selected + if (gEditMenuHandler == this && mSelectedObjects->getObjectCount() == 0) + { + gEditMenuHandler = NULL; + } +} + +void LLSelectMgr::updatePointAt() +{ + if (mShowSelection) + { + if (mSelectedObjects->getObjectCount()) + { + LLVector3 select_offset; + const LLPickInfo& pick = gViewerWindow->getLastPick(); + LLViewerObject *click_object = pick.getObject(); + if (click_object && click_object->isSelected()) + { + // clicked on another object in our selection group, use that as target + select_offset.setVec(pick.mObjectOffset); + select_offset.rotVec(~click_object->getRenderRotation()); + + gAgent.setPointAt(POINTAT_TARGET_SELECT, click_object, select_offset); + gAgent.setLookAt(LOOKAT_TARGET_SELECT, click_object, select_offset); + } + else + { + // didn't click on an object this time, revert to pointing at center of first object + gAgent.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); + gAgent.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); + } + } + else + { + gAgent.setPointAt(POINTAT_TARGET_CLEAR); + gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + } + } + else + { + gAgent.setPointAt(POINTAT_TARGET_CLEAR); + gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + } +} + +//----------------------------------------------------------------------------- +// getBBoxOfSelection() +//----------------------------------------------------------------------------- +LLBBox LLSelectMgr::getBBoxOfSelection() const +{ + return mSelectionBBox; +} + + +//----------------------------------------------------------------------------- +// canUndo() +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::canUndo() const +{ + return const_cast(this)->mSelectedObjects->getFirstEditableObject() != NULL; // HACK: casting away constness - MG +} + +//----------------------------------------------------------------------------- +// undo() +//----------------------------------------------------------------------------- +void LLSelectMgr::undo() +{ + BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); + LLUUID group_id(gAgent.getGroupID()); + sendListToRegions("Undo", packAgentAndSessionAndGroupID, packObjectID, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST); +} + +//----------------------------------------------------------------------------- +// canRedo() +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::canRedo() const +{ + return const_cast(this)->mSelectedObjects->getFirstEditableObject() != NULL; // HACK: casting away constness - MG +} + +//----------------------------------------------------------------------------- +// redo() +//----------------------------------------------------------------------------- +void LLSelectMgr::redo() +{ + BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); + LLUUID group_id(gAgent.getGroupID()); + sendListToRegions("Redo", packAgentAndSessionAndGroupID, packObjectID, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST); +} + +//----------------------------------------------------------------------------- +// canDoDelete() +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::canDoDelete() const +{ + bool can_delete = false; + // This function is "logically const" - it does not change state in + // a way visible outside the selection manager. + LLSelectMgr* self = const_cast(this); + LLViewerObject* obj = self->mSelectedObjects->getFirstDeleteableObject(); + // Note: Can only delete root objects (see getFirstDeleteableObject() for more info) + if (obj!= NULL) + { + // all the faces needs to be selected + if(self->mSelectedObjects->contains(obj,SELECT_ALL_TES )) + { + can_delete = true; + } + } + + return can_delete; +} + +//----------------------------------------------------------------------------- +// doDelete() +//----------------------------------------------------------------------------- +void LLSelectMgr::doDelete() +{ + selectDelete(); +} + +//----------------------------------------------------------------------------- +// canDeselect() +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::canDeselect() const +{ + return !mSelectedObjects->isEmpty(); +} + +//----------------------------------------------------------------------------- +// deselect() +//----------------------------------------------------------------------------- +void LLSelectMgr::deselect() +{ + deselectAll(); +} +//----------------------------------------------------------------------------- +// canDuplicate() +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::canDuplicate() const +{ + return const_cast(this)->mSelectedObjects->getFirstCopyableObject() != NULL; // HACK: casting away constness - MG +} +//----------------------------------------------------------------------------- +// duplicate() +//----------------------------------------------------------------------------- +void LLSelectMgr::duplicate() +{ + LLVector3 offset(0.5f, 0.5f, 0.f); + selectDuplicate(offset, TRUE); +} + +ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object) +{ + if (!object) + { + return SELECT_TYPE_WORLD; + } + if (object->isHUDAttachment()) + { + return SELECT_TYPE_HUD; + } + else if (object->isAttachment()) + { + return SELECT_TYPE_ATTACHMENT; + } + else + { + return SELECT_TYPE_WORLD; + } +} + +void LLSelectMgr::validateSelection() +{ + struct f : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + if (!LLSelectMgr::getInstance()->canSelectObject(object)) + { + LLSelectMgr::getInstance()->deselectObjectOnly(object); + } + return true; + } + } func; + getSelection()->applyToObjects(&func); +} + +BOOL LLSelectMgr::canSelectObject(LLViewerObject* object) +{ + // Never select dead objects + if (!object || object->isDead()) + { + return FALSE; + } + + if (mForceSelection) + { + return TRUE; + } + + if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !object->permYouOwner()) || + (gSavedSettings.getBOOL("SelectMovableOnly") && !object->permMove())) + { + // only select my own objects + return FALSE; + } + + // Can't select orphans + if (object->isOrphaned()) return FALSE; + + // Can't select avatars + if (object->isAvatar()) return FALSE; + + // Can't select land + if (object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) return FALSE; + + // + //ESelectType selection_type = getSelectTypeForObject(object); + //if (mSelectedObjects->getObjectCount() > 0 && mSelectedObjects->mSelectType != selection_type) return FALSE; + // + + return TRUE; +} + +BOOL LLSelectMgr::setForceSelection(BOOL force) +{ + std::swap(mForceSelection,force); + return force; +} + +void LLSelectMgr::resetAgentHUDZoom() +{ + gAgent.mHUDTargetZoom = 1.f; + gAgent.mHUDCurZoom = 1.f; +} + +void LLSelectMgr::getAgentHUDZoom(F32 &target_zoom, F32 ¤t_zoom) const +{ + target_zoom = gAgent.mHUDTargetZoom; + current_zoom = gAgent.mHUDCurZoom; +} + +void LLSelectMgr::setAgentHUDZoom(F32 target_zoom, F32 current_zoom) +{ + gAgent.mHUDTargetZoom = target_zoom; + gAgent.mHUDCurZoom = current_zoom; +} + +LLObjectSelection::LLObjectSelection() : + LLRefCount(), + mSelectType(SELECT_TYPE_WORLD) +{ +} + +LLObjectSelection::~LLObjectSelection() +{ + deleteAllNodes(); +} + +void LLObjectSelection::cleanupNodes() +{ + for (list_t::iterator iter = mList.begin(); iter != mList.end(); ) + { + list_t::iterator curiter = iter++; + LLSelectNode* node = *curiter; + if (node->getObject() == NULL || node->getObject()->isDead()) + { + mList.erase(curiter); + delete node; + } + } +} + +void LLObjectSelection::updateEffects() +{ +} + +S32 LLObjectSelection::getNumNodes() +{ + return mList.size(); +} + +void LLObjectSelection::addNode(LLSelectNode *nodep) +{ + llassert_always(nodep->getObject() && !nodep->getObject()->isDead()); + mList.push_front(nodep); + mSelectNodeMap[nodep->getObject()] = nodep; +} + +void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep) +{ + llassert_always(nodep->getObject() && !nodep->getObject()->isDead()); + mList.push_back(nodep); + mSelectNodeMap[nodep->getObject()] = nodep; +} + +void LLObjectSelection::moveNodeToFront(LLSelectNode *nodep) +{ + mList.remove(nodep); + mList.push_front(nodep); +} + +void LLObjectSelection::removeNode(LLSelectNode *nodep) +{ + mSelectNodeMap.erase(nodep->getObject()); + if (nodep->getObject() == mPrimaryObject) + { + mPrimaryObject = NULL; + } + nodep->setObject(NULL); // Will get erased in cleanupNodes() + mList.remove(nodep); +} + +void LLObjectSelection::deleteAllNodes() +{ + std::for_each(mList.begin(), mList.end(), DeletePointer()); + mList.clear(); + mSelectNodeMap.clear(); + mPrimaryObject = NULL; +} + +LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp) +{ + std::map, LLSelectNode*>::iterator found_it = mSelectNodeMap.find(objectp); + if (found_it != mSelectNodeMap.end()) + { + return found_it->second; + } + return NULL; +} + +//----------------------------------------------------------------------------- +// isEmpty() +//----------------------------------------------------------------------------- +BOOL LLObjectSelection::isEmpty() const +{ + return (mList.size() == 0); +} + +//----------------------------------------------------------------------------- +// getOwnershipCost() +//----------------------------------------------------------------------------- +BOOL LLObjectSelection::getOwnershipCost(S32 &cost) +{ + S32 count = getObjectCount(); + cost = count * OWNERSHIP_COST_PER_OBJECT; + return (count > 0); +} + + +//----------------------------------------------------------------------------- +// getObjectCount() - returns number of non null objects +//----------------------------------------------------------------------------- +S32 LLObjectSelection::getObjectCount() +{ + cleanupNodes(); + S32 count = mList.size(); + return count; +} + + +//----------------------------------------------------------------------------- +// getTECount() +//----------------------------------------------------------------------------- +S32 LLObjectSelection::getTECount() +{ + S32 count = 0; + for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if (!object) + continue; + S32 num_tes = object->getNumTEs(); + for (S32 te = 0; te < num_tes; te++) + { + if (node->isTESelected(te)) + { + ++count; + } + } + } + return count; +} + +//----------------------------------------------------------------------------- +// getRootObjectCount() +//----------------------------------------------------------------------------- +S32 LLObjectSelection::getRootObjectCount() +{ + S32 count = 0; + for (LLObjectSelection::root_iterator iter = root_begin(); iter != root_end(); iter++) + { + ++count; + } + return count; +} + +bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func) +{ + bool result = true; + for (iterator iter = begin(); iter != end(); ) + { + iterator nextiter = iter++; + LLViewerObject* object = (*nextiter)->getObject(); + if (!object) + continue; + bool r = func->apply(object); + result = result && r; + } + return result; +} + +bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly) +{ + bool result = firstonly ? false : true; + for (root_iterator iter = root_begin(); iter != root_end(); ) + { + root_iterator nextiter = iter++; + LLViewerObject* object = (*nextiter)->getObject(); + if (!object) + continue; + bool r = func->apply(object); + if (firstonly && r) + return true; + else + result = result && r; + } + return result; +} + +bool LLObjectSelection::applyToTEs(LLSelectedTEFunctor* func, bool firstonly) +{ + bool result = firstonly ? false : true; + for (iterator iter = begin(); iter != end(); ) + { + iterator nextiter = iter++; + LLSelectNode* node = *nextiter; + LLViewerObject* object = (*nextiter)->getObject(); + if (!object) + continue; + S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces()); // avatars have TEs but no faces + for (S32 te = 0; te < num_tes; ++te) + { + if (node->isTESelected(te)) + { + bool r = func->apply(object, te); + if (firstonly && r) + return true; + else + result = result && r; + } + } + } + return result; +} + +bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func, bool firstonly) +{ + bool result = firstonly ? false : true; + for (iterator iter = begin(); iter != end(); ) + { + iterator nextiter = iter++; + LLSelectNode* node = *nextiter; + bool r = func->apply(node); + if (firstonly && r) + return true; + else + result = result && r; + } + return result; +} + +bool LLObjectSelection::applyToRootNodes(LLSelectedNodeFunctor *func, bool firstonly) +{ + bool result = firstonly ? false : true; + for (root_iterator iter = root_begin(); iter != root_end(); ) + { + root_iterator nextiter = iter++; + LLSelectNode* node = *nextiter; + bool r = func->apply(node); + if (firstonly && r) + return true; + else + result = result && r; + } + return result; +} + +//----------------------------------------------------------------------------- +// contains() +//----------------------------------------------------------------------------- +BOOL LLObjectSelection::contains(LLViewerObject* object) +{ + return findNode(object) != NULL; +} + + +//----------------------------------------------------------------------------- +// contains() +//----------------------------------------------------------------------------- +BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te) +{ + if (te == SELECT_ALL_TES) + { + // ...all faces + for (LLObjectSelection::iterator iter = begin(); + iter != end(); iter++) + { + LLSelectNode* nodep = *iter; + if (nodep->getObject() == object) + { + // Optimization + if (nodep->getTESelectMask() == TE_SELECT_MASK_ALL) + { + return TRUE; + } + + BOOL all_selected = TRUE; + for (S32 i = 0; i < object->getNumTEs(); i++) + { + all_selected = all_selected && nodep->isTESelected(i); + } + return all_selected; + } + } + return FALSE; + } + else + { + // ...one face + for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++) + { + LLSelectNode* nodep = *iter; + if (nodep->getObject() == object && nodep->isTESelected(te)) + { + return TRUE; + } + } + return FALSE; + } +} + +// returns TRUE is any node is currenly worn as an attachment +BOOL LLObjectSelection::isAttachment() +{ + return (mSelectType == SELECT_TYPE_ATTACHMENT || mSelectType == SELECT_TYPE_HUD); +} + +//----------------------------------------------------------------------------- +// getSelectedParentObject() +//----------------------------------------------------------------------------- +LLViewerObject* getSelectedParentObject(LLViewerObject *object) +{ + LLViewerObject *parent; + while (object && (parent = (LLViewerObject*)object->getParent())) + { + if (parent->isSelected()) + { + object = parent; + } + else + { + break; + } + } + return object; +} + +//----------------------------------------------------------------------------- +// getFirstNode +//----------------------------------------------------------------------------- +LLSelectNode* LLObjectSelection::getFirstNode(LLSelectedNodeFunctor* func) +{ + for (iterator iter = begin(); iter != end(); ++iter) + { + LLSelectNode* node = *iter; + if (func == NULL || func->apply(node)) + { + return node; + } + } + return NULL; +} + +LLSelectNode* LLObjectSelection::getFirstRootNode(LLSelectedNodeFunctor* func, BOOL non_root_ok) +{ + for (root_iterator iter = root_begin(); iter != root_end(); ++iter) + { + LLSelectNode* node = *iter; + if (func == NULL || func->apply(node)) + { + return node; + } + } + if (non_root_ok) + { + // Get non root + return getFirstNode(func); + } + return NULL; +} + + +//----------------------------------------------------------------------------- +// getFirstSelectedObject +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstSelectedObject(LLSelectedNodeFunctor* func, BOOL get_parent) +{ + LLSelectNode* res = getFirstNode(func); + if (res && get_parent) + { + return getSelectedParentObject(res->getObject()); + } + else if (res) + { + return res->getObject(); + } + return NULL; +} + +//----------------------------------------------------------------------------- +// getFirstObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstObject() +{ + LLSelectNode* res = getFirstNode(NULL); + return res ? res->getObject() : NULL; +} + +//----------------------------------------------------------------------------- +// getFirstRootObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstRootObject(BOOL non_root_ok) +{ + LLSelectNode* res = getFirstRootNode(NULL, non_root_ok); + return res ? res->getObject() : NULL; +} + +//----------------------------------------------------------------------------- +// getFirstMoveableNode() +//----------------------------------------------------------------------------- +LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root_first) +{ + struct f : public LLSelectedNodeFunctor + { + bool apply(LLSelectNode* node) + { + LLViewerObject* obj = node->getObject(); + return obj && obj->permMove(); + } + } func; + LLSelectNode* res = get_root_first ? getFirstRootNode(&func, TRUE) : getFirstNode(&func); + return res; +} + +//----------------------------------------------------------------------------- +// getFirstCopyableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_parent) +{ + struct f : public LLSelectedNodeFunctor + { + bool apply(LLSelectNode* node) + { + LLViewerObject* obj = node->getObject(); + return obj && obj->permCopy() && !obj->isAttachment(); + } + } func; + return getFirstSelectedObject(&func, get_parent); +} + +//----------------------------------------------------------------------------- +// getFirstDeleteableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstDeleteableObject() +{ + //RN: don't currently support deletion of child objects, as that requires separating them first + // then derezzing to trash + + struct f : public LLSelectedNodeFunctor + { + bool apply(LLSelectNode* node) + { + LLViewerObject* obj = node->getObject(); + // you can delete an object if you are the owner + // or you have permission to modify it. + if( obj && ( (obj->permModify()) || + (obj->permYouOwner()) || + (!obj->permAnyOwner()) )) // public + { + if( !obj->isAttachment() ) + { + return true; + } + } + return false; + } + } func; + LLSelectNode* node = getFirstNode(&func); + return node ? node->getObject() : NULL; +} + +//----------------------------------------------------------------------------- +// getFirstEditableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_parent) +{ + struct f : public LLSelectedNodeFunctor + { + bool apply(LLSelectNode* node) + { + LLViewerObject* obj = node->getObject(); + return obj && obj->permModify(); + } + } func; + return getFirstSelectedObject(&func, get_parent); +} + +//----------------------------------------------------------------------------- +// getFirstMoveableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_parent) +{ + struct f : public LLSelectedNodeFunctor + { + bool apply(LLSelectNode* node) + { + LLViewerObject* obj = node->getObject(); + return obj && obj->permMove(); + } + } func; + return getFirstSelectedObject(&func, get_parent); +} + +//----------------------------------------------------------------------------- +// Position + Rotation update methods called from LLViewerJoystick +//----------------------------------------------------------------------------- +bool LLSelectMgr::selectionMove(const LLVector3& displ, + F32 roll, F32 pitch, F32 yaw, U32 update_type) +{ + if (update_type == UPD_NONE) + { + return false; + } + + LLVector3 displ_global; + bool update_success = true; + bool update_position = update_type & UPD_POSITION; + bool update_rotation = update_type & UPD_ROTATION; + const bool noedit_linked_parts = !gSavedSettings.getBOOL("EditLinkedParts"); + + if (update_position) + { + // calculate the distance of the object closest to the camera origin + F32 min_dist = 1e+30f; + LLVector3 obj_pos; + for (LLObjectSelection::root_iterator it = getSelection()->root_begin(); + it != getSelection()->root_end(); ++it) + { + obj_pos = (*it)->getObject()->getPositionEdit(); + + F32 obj_dist = dist_vec(obj_pos, LLViewerCamera::getInstance()->getOrigin()); + if (obj_dist < min_dist) + { + min_dist = obj_dist; + } + } + + // factor the distance inside the displacement vector. This will get us + // equally visible movements for both close and far away selections. + min_dist = sqrt(min_dist) / 2; + displ_global.setVec(displ.mV[0]*min_dist, + displ.mV[1]*min_dist, + displ.mV[2]*min_dist); + + // equates to: Displ_global = Displ * M_cam_axes_in_global_frame + displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global); + } + + LLQuaternion new_rot; + if (update_rotation) + { + // let's calculate the rotation around each camera axes + LLQuaternion qx(roll, LLViewerCamera::getInstance()->getAtAxis()); + LLQuaternion qy(pitch, LLViewerCamera::getInstance()->getLeftAxis()); + LLQuaternion qz(yaw, LLViewerCamera::getInstance()->getUpAxis()); + new_rot.setQuat(qx * qy * qz); + } + + LLViewerObject *obj; + S32 obj_count = getSelection()->getObjectCount(); + for (LLObjectSelection::root_iterator it = getSelection()->root_begin(); + it != getSelection()->root_end(); ++it ) + { + obj = (*it)->getObject(); + bool enable_pos = false, enable_rot = false; + bool perm_move = obj->permMove(); + bool perm_mod = obj->permModify(); + + LLVector3d sel_center(getSelectionCenterGlobal()); + + if (update_rotation) + { + enable_rot = perm_move + && ((perm_mod && !obj->isAttachment()) || noedit_linked_parts); + + if (enable_rot) + { + int children_count = obj->getChildren().size(); + if (obj_count > 1 && children_count > 0) + { + // for linked sets, rotate around the group center + const LLVector3 t(obj->getPositionGlobal() - sel_center); + + // Ra = T x R x T^-1 + LLMatrix4 mt; mt.setTranslation(t); + const LLMatrix4 mnew_rot(new_rot); + LLMatrix4 mt_1; mt_1.setTranslation(-t); + mt *= mnew_rot; + mt *= mt_1; + + // Rfin = Rcur * Ra + obj->setRotation(obj->getRotationEdit() * mt.quaternion()); + displ_global += mt.getTranslation(); + } + else + { + obj->setRotation(obj->getRotationEdit() * new_rot); + } + } + else + { + update_success = false; + } + } + + if (update_position) + { + // establish if object can be moved or not + enable_pos = perm_move && !obj->isAttachment() + && (perm_mod || noedit_linked_parts); + + if (enable_pos) + { + obj->setPosition(obj->getPositionEdit() + displ_global); + } + else + { + update_success = false; + } + } + + if (enable_pos && enable_rot && obj->mDrawable.notNull()) + { + gPipeline.markMoved(obj->mDrawable, TRUE); + } + } + + if (update_position && update_success && obj_count > 1) + { + updateSelectionCenter(); + } + + return update_success; +} + +void LLSelectMgr::sendSelectionMove() +{ + LLSelectNode *node = mSelectedObjects->getFirstRootNode(); + if (node == NULL) + { + return; + } + + //saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); + + U32 update_type = UPD_POSITION | UPD_ROTATION; + LLViewerRegion *last_region, *curr_region = node->getObject()->getRegion(); + S32 objects_in_this_packet = 0; + + // apply to linked objects if unable to select their individual parts + if (!gSavedSettings.getBOOL("EditLinkedParts") && !getTEMode()) + { + // tell simulator to apply to whole linked sets + update_type |= UPD_LINKED_SETS; + } + + // prepare first bulk message + gMessageSystem->newMessage("MultipleObjectUpdate"); + packAgentAndSessionID(&update_type); + + LLViewerObject *obj = NULL; + for (LLObjectSelection::root_iterator it = getSelection()->root_begin(); + it != getSelection()->root_end(); ++it) + { + obj = (*it)->getObject(); + + // note: following code adapted from sendListToRegions() (@3924) + last_region = curr_region; + curr_region = obj->getRegion(); + + // if not simulator or message too big + if (curr_region != last_region + || gMessageSystem->isSendFull(NULL) + || objects_in_this_packet >= MAX_OBJECTS_PER_PACKET) + { + // send sim the current message and start new one + gMessageSystem->sendReliable(last_region->getHost()); + objects_in_this_packet = 0; + gMessageSystem->newMessage("MultipleObjectUpdate"); + packAgentAndSessionID(&update_type); + } + + // add another instance of the body of data + packMultipleUpdate(*it, &update_type); + ++objects_in_this_packet; + } + + // flush remaining messages + if (gMessageSystem->getCurrentSendTotal() > 0) + { + gMessageSystem->sendReliable(curr_region->getHost()); + } + else + { + gMessageSystem->clearMessage(); + } + + //saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); +} diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 6278049ae..1ebe341bf 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -53,7 +53,7 @@ #include "boost/iterator/filter_iterator.hpp" class LLMessageSystem; -class LLViewerImage; +class LLViewerTexture; class LLViewerObject; class LLColor4; class LLVector3; @@ -252,7 +252,7 @@ public: return (object != NULL) && node->mValid && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild()); } }; - typedef boost::filter_iterator valid_root_iterator; + typedef boost::filter_iterator valid_root_iterator; valid_root_iterator valid_root_begin() { return valid_root_iterator(mList.begin(), mList.end()); } valid_root_iterator valid_root_end() { return valid_root_iterator(mList.end(), mList.end()); } @@ -691,7 +691,7 @@ private: static bool confirmDelete(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle); private: - LLPointer mSilhouetteImagep; + LLPointer mSilhouetteImagep; LLObjectSelectionHandle mSelectedObjects; LLObjectSelectionHandle mHoverObjects; LLObjectSelectionHandle mHighlightedObjects; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 5f3e91545..b9b9adafb 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2616,7 +2616,7 @@ void renderTexturePriority(LLDrawable* drawable) LLGLDisable blend(GL_BLEND); - //LLViewerImage* imagep = facep->getTexture(); + //LLViewerTexture* imagep = facep->getTexture(); //if (imagep) { @@ -2645,7 +2645,7 @@ void renderTexturePriority(LLDrawable* drawable) /*S32 boost = imagep->getBoostLevel(); if (boost) { - F32 t = (F32) boost / (F32) (LLViewerImage::BOOST_MAX_LEVEL-1); + F32 t = (F32) boost / (F32) (LLViewerTexture::BOOST_MAX_LEVEL-1); LLVector4 col = lerp(boost_cold, boost_hot, t); LLGLEnable blend_on(GL_BLEND); gGL.blendFunc(GL_SRC_ALPHA, GL_ONE); @@ -3269,7 +3269,7 @@ LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector3& start, con } LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, - LLViewerImage* texture, LLVertexBuffer* buffer, + LLViewerTexture* texture, LLVertexBuffer* buffer, BOOL fullbright, U8 bump, BOOL particle, F32 part_size) : mVertexBuffer(buffer), diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 5b7ce8863..abf58a79b 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -67,12 +67,12 @@ protected: public: LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, - LLViewerImage* image, LLVertexBuffer* buffer, + LLViewerTexture* image, LLVertexBuffer* buffer, BOOL fullbright = FALSE, U8 bump = 0, BOOL particle = FALSE, F32 part_size = 0); LLPointer mVertexBuffer; - LLPointer mTexture; + LLPointer mTexture; LLColor4U mGlowColor; S32 mDebugColor; const LLMatrix4* mTextureMatrix; @@ -164,7 +164,7 @@ public: typedef std::vector > drawmap_elem_t; typedef std::map draw_map_t; typedef std::vector > buffer_list_t; - typedef std::map, buffer_list_t> buffer_texture_map_t; + typedef std::map, buffer_list_t> buffer_texture_map_t; typedef std::map buffer_map_t; typedef LLOctreeListener BaseType; diff --git a/indra/newview/llsprite.cpp b/indra/newview/llsprite.cpp index 893ed2229..dce4e9d14 100644 --- a/indra/newview/llsprite.cpp +++ b/indra/newview/llsprite.cpp @@ -48,7 +48,7 @@ #include "lldrawable.h" #include "llface.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" LLVector3 LLSprite::sCameraUp(0.0f,0.0f,1.0f); LLVector3 LLSprite::sCameraRight(1.0f,0.0f,0.0f); diff --git a/indra/newview/llsprite.h b/indra/newview/llsprite.h index 28f4ec5d0..eefe2a238 100644 --- a/indra/newview/llsprite.h +++ b/indra/newview/llsprite.h @@ -40,7 +40,7 @@ #include "v4color.h" #include "lluuid.h" #include "llgl.h" -#include "llviewerimage.h" +#include "llviewertexture.h" class LLViewerCamera; @@ -82,7 +82,7 @@ public: public: LLUUID mImageID; - LLPointer mImagep; + LLPointer mImagep; private: F32 mWidth; F32 mHeight; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 3a843e5c6..e08bc301a 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -163,7 +163,7 @@ #include "llviewerdisplay.h" #include "llviewergenericmessage.h" #include "llviewergesture.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermedia.h" #include "llviewermenu.h" #include "llviewermessage.h" @@ -210,6 +210,7 @@ // #include "llavatarnamecache.h" +#include "lgghunspell_wrapper.h" // [RLVa:KB] #include "rlvhandler.h" @@ -241,7 +242,7 @@ extern bool gLLWindEnabled; // local globals // -LLPointer gStartImageGL; +LLPointer gStartTexture; static LLHost gAgentSimHost; static BOOL gSkipOptionalUpdate = FALSE; @@ -330,7 +331,7 @@ void update_texture_fetch() LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread - gImageList.updateImages(0.10f); + gTextureList.updateImages(0.10f); } void hooked_process_sound_trigger(LLMessageSystem *msg, void **) @@ -400,7 +401,7 @@ bool idle_startup() else { // Update images? - gImageList.updateImages(0.01f); + gTextureList.updateImages(0.01f); } if ( STATE_FIRST == LLStartUp::getStartupState() ) @@ -412,6 +413,7 @@ bool idle_startup() // // Initialize stuff that doesn't need data from simulators // + glggHunSpell->initSettings(); // [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d if ( (gSavedSettings.controlExists(RLV_SETTING_MAIN)) && (gSavedSettings.getBOOL(RLV_SETTING_MAIN)) ) @@ -983,7 +985,7 @@ bool idle_startup() ); // Overwrite default user settings with user settings - LLAppViewer::instance()->loadSettingsFromDirectory("Account"); + LLAppViewer::instance()->loadSettingsFromDirectory(AIReadAccess(gSettings), "Account"); // Need to set the LastLogoff time here if we don't have one. LastLogoff is used for "Recent Items" calculation // and startup time is close enough if we don't have a real value. @@ -1888,6 +1890,10 @@ bool idle_startup() gLLWindEnabled = gSavedSettings.getBOOL("WindEnabled"); set_startup_status(0.40f, LLTrans::getString("LoginInitializingWorld"), gAgent.mMOTD); + + // Initialize the rest of the world. + gViewerWindow->initWorldUI_postLogin(); + display_startup(); // We should have an agent id by this point. llassert(!(gAgentID == LLUUID::null)); @@ -1903,7 +1909,7 @@ bool idle_startup() // // Initialize classes w/graphics stuff. // - gImageList.doPrefetchImages(); + gTextureList.doPrefetchImages(); LLSurface::initClasses(); LLFace::initClass(); @@ -2162,7 +2168,7 @@ bool idle_startup() F32 frac = (F32)i / (F32)DECODE_TIME_SEC; set_startup_status(0.45f + frac*0.1f, LLTrans::getString("LoginDecodingImages"), gAgent.mMOTD); display_startup(); - gImageList.decodeAllImages(1.f); + gTextureList.decodeAllImages(1.f); } LLStartUp::setStartupState( STATE_WORLD_WAIT ); @@ -3403,8 +3409,8 @@ void pass_processObjectPropertiesFamily(LLMessageSystem *msg, void**) void register_viewer_callbacks(LLMessageSystem* msg) { msg->setHandlerFuncFast(_PREHASH_LayerData, process_layer_data ); - msg->setHandlerFuncFast(_PREHASH_ImageData, LLViewerImageList::receiveImageHeader ); - msg->setHandlerFuncFast(_PREHASH_ImagePacket, LLViewerImageList::receiveImagePacket ); + msg->setHandlerFuncFast(_PREHASH_ImageData, LLViewerTextureList::receiveImageHeader ); + msg->setHandlerFuncFast(_PREHASH_ImagePacket, LLViewerTextureList::receiveImagePacket ); msg->setHandlerFuncFast(_PREHASH_ObjectUpdate, process_object_update ); msg->setHandlerFunc("ObjectUpdateCompressed", process_compressed_object_update ); msg->setHandlerFunc("ObjectUpdateCached", process_cached_object_update ); @@ -3535,7 +3541,7 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFunc("TeleportFailed", process_teleport_failed, NULL); msg->setHandlerFunc("TeleportLocal", process_teleport_local, NULL); - msg->setHandlerFunc("ImageNotInDatabase", LLViewerImageList::processImageNotInDatabase, NULL); + msg->setHandlerFunc("ImageNotInDatabase", LLViewerTextureList::processImageNotInDatabase, NULL); msg->setHandlerFuncFast(_PREHASH_GroupMembersReply, LLGroupMgr::processGroupMembersReply); @@ -3676,9 +3682,9 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, // location_id = 1 => home position void init_start_screen(S32 location_id) { - if (gStartImageGL.notNull()) + if (gStartTexture.notNull()) { - gStartImageGL = NULL; + gStartTexture = NULL; LL_INFOS("AppInit") << "re-initializing start screen" << LL_ENDL; } @@ -3710,7 +3716,6 @@ void init_start_screen(S32 location_id) return; } - gStartImageGL = new LLImageGL(FALSE); gStartImageWidth = start_image_bmp->getWidth(); gStartImageHeight = start_image_bmp->getHeight(); @@ -3718,12 +3723,12 @@ void init_start_screen(S32 location_id) if (!start_image_bmp->decode(raw, 0.0f)) { LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL; - gStartImageGL = NULL; + gStartTexture = NULL; return; } raw->expandToPowerOfTwo(); - gStartImageGL->createGLTexture(0, raw, 0, TRUE, LLViewerImageBoostLevel::OTHER); + gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ; } @@ -3731,7 +3736,7 @@ void init_start_screen(S32 location_id) void release_start_screen() { LL_DEBUGS("AppInit") << "Releasing bitmap..." << LL_ENDL; - gStartImageGL = NULL; + gStartTexture = NULL; } diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index 8f5c7b855..de0646caa 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -33,7 +33,7 @@ #ifndef LL_LLSTARTUP_H #define LL_LLSTARTUP_H -#include "llimagegl.h" +class LLViewerTexture; // functions bool idle_startup(); @@ -76,7 +76,7 @@ typedef enum { // exported symbols extern bool gAgentMovementCompleted; -extern LLPointer gStartImageGL; +extern LLPointer gStartTexture; extern std::string gInitialOutfit; extern std::string gInitialOutfitGender; // "male" or "female" diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index f75c8e314..390d4ce50 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -36,7 +36,7 @@ #include "llrender.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llpatchvertexarray.h" #include "patch_dct.h" #include "patch_code.h" @@ -47,7 +47,6 @@ #include "llappviewer.h" #include "llworld.h" #include "llviewercontrol.h" -#include "llviewerimage.h" #include "llsurfacepatch.h" #include "llvosurfacepatch.h" #include "llvowater.h" @@ -138,12 +137,10 @@ LLSurface::~LLSurface() // Don't enable this until we blitz the draw pool for it as well. -- djs if (mSTexturep) { - gImageList.deleteImage(mSTexturep); mSTexturep = NULL; } if (mWaterTexturep) { - gImageList.deleteImage(mWaterTexturep); mWaterTexturep = NULL; } } @@ -216,18 +213,18 @@ void LLSurface::create(const S32 grids_per_edge, createPatchData(); } -LLViewerImage* LLSurface::getSTexture() +LLViewerTexture* LLSurface::getSTexture() { - if (mSTexturep.notNull() && !mSTexturep->getHasGLTexture()) + if (mSTexturep.notNull() && !mSTexturep->hasGLTexture()) { createSTexture(); } return mSTexturep; } -LLViewerImage* LLSurface::getWaterTexture() +LLViewerTexture* LLSurface::getWaterTexture() { - if (mWaterTexturep.notNull() && !mWaterTexturep->getHasGLTexture()) + if (mWaterTexturep.notNull() && !mWaterTexturep->hasGLTexture()) { createWaterTexture(); } @@ -251,11 +248,10 @@ void LLSurface::createSTexture() } } - mSTexturep = new LLViewerImage(raw, FALSE); + mSTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); mSTexturep->dontDiscard(); - gGL.getTexUnit(0)->bind(mSTexturep.get()); - mSTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - gImageList.addImage(mSTexturep); + gGL.getTexUnit(0)->bind(mSTexturep); + mSTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); } } @@ -276,11 +272,11 @@ void LLSurface::createWaterTexture() *(default_texture + (i*sTextureSize/2 + j)*4 + 3) = MAX_WATER_COLOR.mV[3]; } } - mWaterTexturep = new LLViewerImage(raw, FALSE); + + mWaterTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); mWaterTexturep->dontDiscard(); - gGL.getTexUnit(0)->bind(mWaterTexturep.get()); + gGL.getTexUnit(0)->bind(mWaterTexturep); mWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - gImageList.addImage(mWaterTexturep); } } @@ -1284,7 +1280,7 @@ BOOL LLSurface::generateWaterTexture(const F32 x, const F32 y, } } - if (!mWaterTexturep->getHasGLTexture()) + if (!mWaterTexturep->hasGLTexture()) { mWaterTexturep->createGLTexture(0, raw); } diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h index 003b2f250..7e11b9a22 100644 --- a/indra/newview/llsurface.h +++ b/indra/newview/llsurface.h @@ -46,7 +46,7 @@ #include "llvowater.h" #include "llpatchvertexarray.h" -#include "llviewerimage.h" +#include "llviewertexture.h" class LLTimer; class LLUUID; @@ -133,8 +133,8 @@ public: void setWaterHeight(F32 height); F32 getWaterHeight() const; - LLViewerImage *getSTexture(); - LLViewerImage *getWaterTexture(); + LLViewerTexture *getSTexture(); + LLViewerTexture *getWaterTexture(); BOOL hasZData() const { return mHasZData; } void dirtyAllPatches(); // Use this to dirty all patches when changing terrain parameters @@ -206,8 +206,8 @@ protected: // The textures should never be directly initialized - use the setter methods! - LLPointer mSTexturep; // Texture for surface - LLPointer mWaterTexturep; // Water texture + LLPointer mSTexturep; // Texture for surface + LLPointer mWaterTexturep; // Water texture LLPointer mWaterObjp; diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 020f39ac9..3dce4b321 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -45,8 +45,8 @@ #include "lltexlayer.h" #include "llui.h" #include "llvfile.h" -#include "llviewerimagelist.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "llviewerstats.h" #include "llviewerwindow.h" @@ -74,7 +74,7 @@ LLBakedUploadData::LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSetBuffer* layerset_buffer, const LLUUID & id ) : mAvatar( avatar ), - mLayerSet( layerset ), + mTexLayerSet( layerset ), mLayerSetBuffer( layerset_buffer ), mID(id) { @@ -96,7 +96,7 @@ LLBakedUploadData::LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* owner, S32 width, S32 height) : // ORDER_LAST => must render these after the hints are created. - LLDynamicTexture( width, height, 4, LLDynamicTexture::ORDER_LAST, TRUE ), + LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ), mNeedsUpdate( TRUE ), mNeedsUpload( FALSE ), mUploadPending( FALSE ), // Not used for any logic here, just to sync sending of updates @@ -113,7 +113,7 @@ LLTexLayerSetBuffer::~LLTexLayerSetBuffer() destroyGLTexture(); for (S32 order = 0; order < ORDER_COUNT; order++) { - LLDynamicTexture::sInstances[order].erase(this); // will fail in all but one case. + LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case. } if (mTexLayerSet->mComposite == this) { @@ -122,16 +122,22 @@ LLTexLayerSetBuffer::~LLTexLayerSetBuffer() } } +//virtual +S8 LLTexLayerSetBuffer::getType() const +{ + return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ; +} + //virtual void LLTexLayerSetBuffer::restoreGLTexture() { - LLDynamicTexture::restoreGLTexture() ; + LLViewerDynamicTexture::restoreGLTexture() ; } //virtual void LLTexLayerSetBuffer::destroyGLTexture() { - LLDynamicTexture::destroyGLTexture() ; + LLViewerDynamicTexture::destroyGLTexture() ; } // static @@ -192,7 +198,7 @@ void LLTexLayerSetBuffer::pushProjection() glMatrixMode(GL_PROJECTION); gGL.pushMatrix(); glLoadIdentity(); - glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f); + glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); gGL.pushMatrix(); @@ -238,14 +244,14 @@ void LLTexLayerSetBuffer::preRender(BOOL clear_depth) pushProjection(); // keep depth buffer, we don't need to clear it - LLDynamicTexture::preRender(FALSE); + LLViewerDynamicTexture::preRender(FALSE); } void LLTexLayerSetBuffer::postRender(BOOL success) { popProjection(); - LLDynamicTexture::postRender(success); + LLViewerDynamicTexture::postRender(success); } BOOL LLTexLayerSetBuffer::render() @@ -260,7 +266,7 @@ BOOL LLTexLayerSetBuffer::render() // Composite the color data LLGLSUIDefault gls_ui; - success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mWidth, mHeight ); + success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight ); gGL.flush(); if( upload_now ) @@ -295,7 +301,7 @@ BOOL LLTexLayerSetBuffer::render() gGL.setSceneBlendType(LLRender::BT_ALPHA); // we have valid texture data now - mTexture->setGLTextureCreated(true); + mGLTexturep->setGLTextureCreated(true); mNeedsUpdate = FALSE; return success; @@ -303,7 +309,7 @@ BOOL LLTexLayerSetBuffer::render() bool LLTexLayerSetBuffer::isInitialized(void) const { - return mTexture.notNull() && mTexture->isGLTextureCreated(); + return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated(); } BOOL LLTexLayerSetBuffer::updateImmediate() @@ -323,44 +329,35 @@ BOOL LLTexLayerSetBuffer::updateImmediate() void LLTexLayerSetBuffer::readBackAndUpload() { - // pointers for storing data to upload - U8* baked_color_data = new U8[ mWidth * mHeight * 4 ]; - - glReadPixels(mOrigin.mX, mOrigin.mY, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data ); - stop_glerror(); - llinfos << "Baked " << mTexLayerSet->getBodyRegion() << llendl; LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES); - llassert( gAgent.getAvatarObject() == mTexLayerSet->getAvatar() ); - - // We won't need our caches since we're baked now. (Techically, we won't - // really be baked until this image is sent to the server and the Avatar - // Appearance message is received.) + // Don't need caches since we're baked now. (note: we won't *really* be baked + // until this image is sent to the server and the Avatar Appearance message is received.) mTexLayerSet->deleteCaches(); + // Get the COLOR information from our texture + U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ]; + glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data ); + stop_glerror(); + + // Get the MASK information from our texture LLGLSUIDefault gls_ui; - LLPointer baked_mask_image = new LLImageRaw(mWidth, mHeight, 1 ); + LLPointer baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 ); U8* baked_mask_data = baked_mask_image->getData(); - mTexLayerSet->gatherAlphaMasks(baked_mask_data, mWidth, mHeight); + mTexLayerSet->gatherAlphaMasks(baked_mask_data, mFullWidth, mFullHeight); // imdebug("lum b=8 w=%d h=%d %p", mWidth, mHeight, baked_mask_data); - // writes into baked_color_data - const char* comment_text = NULL; - S32 baked_image_components = 5; // red green blue bump clothing - LLPointer baked_image = new LLImageRaw( mWidth, mHeight, baked_image_components ); + LLPointer baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components ); U8* baked_image_data = baked_image->getData(); - - comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask - S32 i = 0; - for (S32 u = 0; u < mWidth; u++) + for (S32 u=0; u < mFullWidth; u++) { - for (S32 v = 0; v < mHeight; v++) + for (S32 v=0; v < mFullHeight; v++) { baked_image_data[5 * i + 0] = baked_color_data[4 * i + 0]; baked_image_data[5 * i + 1] = baked_color_data[4 * i + 1]; @@ -373,21 +370,19 @@ void LLTexLayerSetBuffer::readBackAndUpload() LLPointer compressedImage = new LLImageJ2C; compressedImage->setRate(0.f); - LLTransactionID tid; - LLAssetID asset_id; - tid.generate(); - asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - BOOL res = false; - if( compressedImage->encode(baked_image, comment_text)) + const char* comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // writes into baked_color_data. 5 channels (rgb, heightfield/alpha, mask) + if (compressedImage->encode(baked_image, comment_text)) { - res = LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(), - gVFS, asset_id, LLAssetType::AT_TEXTURE); - if (res) + LLTransactionID tid; + tid.generate(); + const LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + if (LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(), + gVFS, asset_id, LLAssetType::AT_TEXTURE)) { - LLPointer integrity_test = new LLImageJ2C; + // Read back the file and validate. BOOL valid = FALSE; - S32 file_size; + LLPointer integrity_test = new LLImageJ2C; + S32 file_size = 0; U8* data = LLVFile::readFile(gVFS, asset_id, LLAssetType::AT_TEXTURE, &file_size); if (data) { @@ -405,22 +400,18 @@ void LLTexLayerSetBuffer::readBackAndUpload() new LLBakedUploadData( gAgent.getAvatarObject(), this->mTexLayerSet, this, asset_id ); mUploadID = asset_id; - // upload the image - std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture"); - + // Upload the image + const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture"); if(!url.empty() - && !LLPipeline::sForceOldBakedUpload) // Toggle the debug setting UploadBakedTexOld to change between the new caps method and old method + && !LLPipeline::sForceOldBakedUpload) // toggle debug setting UploadBakedTexOld to change between the new caps method and old method { - llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl; - LLSD body = LLSD::emptyMap(); + // The responder will call LLTexLayerSetBuffer::onTextureUploadComplete() LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data)); - // Responder will call LLTexLayerSetBuffer::onTextureUploadComplete() + llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl; } else { - llinfos << "Baked texture upload via Asset Store." << llendl; - // gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE); gAssetStorage->storeAssetData(tid, LLAssetType::AT_TEXTURE, LLTexLayerSetBuffer::onTextureUploadComplete, @@ -428,23 +419,26 @@ void LLTexLayerSetBuffer::readBackAndUpload() TRUE, // temp_file TRUE, // is_priority TRUE); // store_local + llinfos << "Baked texture upload via Asset Store." << llendl; } mNeedsUpload = FALSE; } else { + // The read back and validate operation failed. Remove the uploaded file. mUploadPending = FALSE; - llinfos << "unable to create baked upload file: corrupted" << llendl; LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE); file.remove(); + llinfos << "Unable to create baked upload file (reason: corrupted)." << llendl; } } } - if (!res) + else { + // The VFS write file operation failed. mUploadPending = FALSE; - llinfos << "unable to create baked upload file" << llendl; + llinfos << "Unable to create baked upload file (reason: failed to write file)" << llendl; } delete [] baked_color_data; @@ -452,17 +446,20 @@ void LLTexLayerSetBuffer::readBackAndUpload() // static -void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* userdata, S32 result, LLExtStat ext_status) // StoreAssetData callback (not fixed) +void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, + void* userdata, + S32 result, + LLExtStat ext_status) // StoreAssetData callback (not fixed) { LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata; - LLVOAvatar* avatar = gAgent.getAvatarObject(); - - if (avatar && !avatar->isDead() && baked_upload_data && - baked_upload_data->mAvatar == avatar && // Sanity check: only the user's avatar should be uploading textures. - baked_upload_data->mLayerSet->hasComposite()) - { - LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mLayerSet->getComposite(); + if ((result == 0) && + isAgentAvatarValid() && + !gAgent.getAvatarObject()->isDead() && + (baked_upload_data->mAvatar == gAgent.getAvatarObject()) && // Sanity check: only the user's avatar should be uploading textures. + (baked_upload_data->mTexLayerSet->hasComposite())) + { + LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite(); S32 failures = layerset_buffer->mUploadFailCount; layerset_buffer->mUploadFailCount = 0; @@ -485,10 +482,10 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user if (result >= 0) { - ETextureIndex baked_te = avatar->getBakedTE(layerset_buffer->mTexLayerSet); + ETextureIndex baked_te = gAgent.getAvatarObject()->getBakedTE(layerset_buffer->mTexLayerSet); U64 now = LLFrameTimer::getTotalTime(); // Record starting time llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; - avatar->setNewBakedTexture(baked_te, uuid); + gAgent.getAvatarObject()->setNewBakedTexture(baked_te, uuid); } else { @@ -513,7 +510,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user llinfos << "Received baked texture out of date, ignored." << llendl; } - avatar->dirtyMesh(); + gAgent.getAvatarObject()->dirtyMesh(); } else { @@ -621,7 +618,6 @@ LLTexLayerSet::~LLTexLayerSet() deleteCaches(); std::for_each(mLayerList.begin(), mLayerList.end(), DeletePointer()); std::for_each(mMaskLayerList.begin(), mMaskLayerList.end(), DeletePointer()); - delete mComposite; mComposite = NULL; } @@ -726,11 +722,11 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, LLGLSNoAlphaTest gls_no_alpha_test; gGL.flush(); { - LLImageGL* image_gl = gTexStaticImageList.getImageGL(info->mStaticAlphaFileName, TRUE); - if (image_gl) + LLViewerTexture* tex = gTexStaticImageList.getTexture(info->mStaticAlphaFileName, TRUE); + if (tex) { LLGLSUIDefault gls_ui; - gGL.getTexUnit(0)->bind(image_gl); + gGL.getTexUnit(0)->bind(tex); gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_REPLACE); gl_rect_2d_simple_tex(width, height); } @@ -884,7 +880,6 @@ void LLTexLayerSet::destroyComposite() { if( mComposite ) { - delete mComposite; mComposite = NULL; } } @@ -1397,20 +1392,20 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) if( (getInfo()->mLocalTexture != -1) && !getInfo()->mUseLocalTextureAlphaOnly ) { { - LLImageGL* image_gl = NULL; - if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl ) ) + LLViewerTexture* tex = NULL; + if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &tex ) ) { if (mTexLayerSet->getAvatar()->getLocalTextureID((ETextureIndex)getInfo()->mLocalTexture) == IMG_DEFAULT_AVATAR) { - image_gl = NULL; + tex = NULL; } - if( image_gl ) + if( tex ) { LLGLDisable alpha_test(getInfo()->mWriteAllChannels ? GL_ALPHA_TEST : 0); - LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode(); + LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); - gGL.getTexUnit(0)->bind(image_gl, TRUE); + gGL.getTexUnit(0)->bind(tex, TRUE); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); gl_rect_2d_simple_tex( width, height ); @@ -1425,10 +1420,10 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) if( !getInfo()->mStaticImageFileName.empty() ) { { - LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); - if( image_gl ) + LLViewerTexture* tex = gTexStaticImageList.getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); + if( tex ) { - gGL.getTexUnit(0)->bind(image_gl, TRUE); + gGL.getTexUnit(0)->bind(tex, TRUE); gl_rect_2d_simple_tex( width, height ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -1479,11 +1474,11 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) if (!getInfo()->mStaticImageFileName.empty()) { - LLImageGL* image_gl = gTexStaticImageList.getImageGL(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); - if (image_gl) + LLViewerTexture* tex = gTexStaticImageList.getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); + if (tex) { LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(image_gl, TRUE); + gGL.getTexUnit(0)->bind(tex, TRUE); gl_rect_2d_simple_tex(width, height); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -1496,13 +1491,13 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) { if (getInfo()->mLocalTexture >=0 && getInfo()->mLocalTexture < TEX_NUM_INDICES) { - LLImageGL* image_gl = NULL; - if (mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl)) + LLViewerTexture* tex = NULL; + if (mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &tex)) { - if (image_gl) + if (tex) { LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(image_gl); + gGL.getTexUnit(0)->bind(tex); gl_rect_2d_simple_tex(width, height); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); success = TRUE; @@ -1645,16 +1640,16 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4 if( getInfo()->mLocalTexture != -1 ) { { - LLImageGL* image_gl = NULL; - if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl ) ) + LLViewerTexture* tex = NULL; + if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &tex ) ) { - if( image_gl && (image_gl->getComponents() == 4) ) + if( tex && (tex->getComponents() == 4) ) { LLGLSNoAlphaTest gls_no_alpha_test; - LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode(); + LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); - gGL.getTexUnit(0)->bind(image_gl, TRUE); + gGL.getTexUnit(0)->bind(tex, TRUE); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); gl_rect_2d_simple_tex( width, height ); @@ -1668,18 +1663,16 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4 if( !getInfo()->mStaticImageFileName.empty() ) { + LLViewerTexture* tex = gTexStaticImageList.getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); + if( tex ) { - LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); - if( image_gl ) + if( (tex->getComponents() == 4) || + ( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) { - if( (image_gl->getComponents() == 4) || - ( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) - { - LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(image_gl, TRUE); - gl_rect_2d_simple_tex( width, height ); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - } + LLGLSNoAlphaTest gls_no_alpha_test; + gGL.getTexUnit(0)->bind(tex, TRUE); + gl_rect_2d_simple_tex( width, height ); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } } } @@ -1937,12 +1930,12 @@ void LLTexLayerParamAlpha::getCacheByteCount( S32* gl_bytes ) iter != sInstances.end(); iter++ ) { LLTexLayerParamAlpha* instance = *iter; - LLImageGL* image_gl = instance->mCachedProcessedImageGL; - if( image_gl ) + LLViewerTexture* tex = instance->mCachedProcessedTexture; + if( tex ) { - S32 bytes = (S32)image_gl->getWidth() * image_gl->getHeight() * image_gl->getComponents(); + S32 bytes = (S32)tex->getWidth() * tex->getHeight() * tex->getComponents(); - if( image_gl->getHasGLTexture() ) + if( tex->hasGLTexture() ) { *gl_bytes += bytes; } @@ -1952,7 +1945,7 @@ void LLTexLayerParamAlpha::getCacheByteCount( S32* gl_bytes ) LLTexLayerParamAlpha::LLTexLayerParamAlpha( LLTexLayer* layer ) : - mCachedProcessedImageGL( NULL ), + mCachedProcessedTexture( NULL ), mTexLayer( layer ), mNeedsCreateTexture( FALSE ), mStaticImageInvalid( FALSE ), @@ -1990,7 +1983,7 @@ BOOL LLTexLayerParamAlpha::setInfo(LLTexLayerParamAlphaInfo *info) void LLTexLayerParamAlpha::deleteCaches() { mStaticImageTGA = NULL; // deletes image - mCachedProcessedImageGL = NULL; + mCachedProcessedTexture = NULL; mStaticImageRaw = NULL; mNeedsCreateTexture = FALSE; } @@ -2106,22 +2099,22 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height ) const S32 image_tga_width = mStaticImageTGA->getWidth(); const S32 image_tga_height = mStaticImageTGA->getHeight(); - if( !mCachedProcessedImageGL || - (mCachedProcessedImageGL->getWidth() != image_tga_width) || - (mCachedProcessedImageGL->getHeight() != image_tga_height) || + if( !mCachedProcessedTexture || + (mCachedProcessedTexture->getWidth() != image_tga_width) || + (mCachedProcessedTexture->getHeight() != image_tga_height) || (weight_changed) ) { // llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl; mCachedEffectiveWeight = effective_weight; - if( !mCachedProcessedImageGL ) + if( !mCachedProcessedTexture ) { - mCachedProcessedImageGL = new LLImageGL( image_tga_width, image_tga_height, 1, FALSE); + mCachedProcessedTexture = LLViewerTextureManager::getLocalTexture( image_tga_width, image_tga_height, 1, FALSE ); // We now have something in one of our caches - LLTexLayerSet::sHasCaches |= mCachedProcessedImageGL ? TRUE : FALSE; + LLTexLayerSet::sHasCaches |= mCachedProcessedTexture ? TRUE : FALSE; - mCachedProcessedImageGL->setExplicitFormat( GL_ALPHA8, GL_ALPHA ); + mCachedProcessedTexture->setExplicitFormat( GL_ALPHA8, GL_ALPHA ); } // Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed. @@ -2131,20 +2124,20 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height ) mNeedsCreateTexture = TRUE; } - if( mCachedProcessedImageGL ) + if( mCachedProcessedTexture ) { { // Create the GL texture, and then hang onto it for future use. if( mNeedsCreateTexture ) { - mCachedProcessedImageGL->createGLTexture(0, mStaticImageRaw, 0, TRUE, LLViewerImageBoostLevel::TEXLAYER_CACHE); + mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw, 0, TRUE, LLViewerTexture::BOOST_AVATAR_SELF); mNeedsCreateTexture = FALSE; - gGL.getTexUnit(0)->bind(mCachedProcessedImageGL); - mCachedProcessedImageGL->setAddressMode(LLTexUnit::TAM_CLAMP); + gGL.getTexUnit(0)->bind(mCachedProcessedTexture); + mCachedProcessedTexture->setAddressMode(LLTexUnit::TAM_CLAMP); } LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(mCachedProcessedImageGL, TRUE); + gGL.getTexUnit(0)->bind(mCachedProcessedTexture, TRUE); gl_rect_2d_simple_tex( width, height ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); stop_glerror(); @@ -2155,7 +2148,7 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height ) // (It's not really a "cache" in that case, but the logic is the same) if( !mTexLayer->getTexLayerSet()->getAvatar()->isSelf() ) { - mCachedProcessedImageGL = NULL; + mCachedProcessedTexture = NULL; } } else @@ -2509,7 +2502,7 @@ LLTexStaticImageList::~LLTexStaticImageList() deleteCachedImages(); } -void LLTexStaticImageList::dumpByteCount() +void LLTexStaticImageList::dumpByteCount() const { llinfos << "Avatar Static Textures " << "KB GL:" << (mGLBytes / 1024) << @@ -2527,7 +2520,7 @@ void LLTexStaticImageList::deleteCachedImages() //mStaticImageLists uses LLPointers, clear() will cause deletion mStaticImageListTGA.clear(); - mStaticImageListGL.clear(); + mStaticImageList.clear(); mGLBytes = 0; mTGABytes = 0; @@ -2570,19 +2563,19 @@ LLImageTGA* LLTexStaticImageList::getImageTGA(const std::string& file_name) // Returns a GL Image (without a backing ImageRaw) that contains the decoded data from a tga file named file_name. // Caches the result to speed identical subsequent requests. -LLImageGL* LLTexStaticImageList::getImageGL(const std::string& file_name, BOOL is_mask ) +LLViewerTexture* LLTexStaticImageList::getTexture(const std::string& file_name, BOOL is_mask) { - LLPointer image_gl; + LLPointer tex; const char *namekey = sImageNames.addString(file_name); - image_gl_map_t::iterator iter = mStaticImageListGL.find(namekey); - if( iter != mStaticImageListGL.end() ) + texture_map_t::const_iterator iter = mStaticImageList.find(namekey); + if( iter != mStaticImageList.end() ) { - image_gl = iter->second; + tex = iter->second; } else { - image_gl = new LLImageGL( FALSE ); + tex = LLViewerTextureManager::getLocalTexture( FALSE ); LLPointer image_raw = new LLImageRaw; if( loadImageRaw( file_name, image_raw ) ) { @@ -2590,23 +2583,23 @@ LLImageGL* LLTexStaticImageList::getImageGL(const std::string& file_name, BOOL i { // Note: these are static, unchanging images so it's ok to assume // that once an image is a mask it's always a mask. - image_gl->setExplicitFormat( GL_ALPHA8, GL_ALPHA ); + tex->setExplicitFormat( GL_ALPHA8, GL_ALPHA ); } - image_gl->createGLTexture(0, image_raw, 0, TRUE, LLViewerImageBoostLevel::OTHER); + tex->createGLTexture(0, image_raw, 0, TRUE, LLViewerTexture::LOCAL); - gGL.getTexUnit(0)->bind(image_gl); - image_gl->setAddressMode(LLTexUnit::TAM_CLAMP); + gGL.getTexUnit(0)->bind(tex); + tex->setAddressMode(LLTexUnit::TAM_CLAMP); - mStaticImageListGL [ namekey ] = image_gl; - mGLBytes += (S32)image_gl->getWidth() * image_gl->getHeight() * image_gl->getComponents(); + mStaticImageList [ namekey ] = tex; + mGLBytes += (S32)tex->getWidth() * tex->getHeight() * tex->getComponents(); } else { - image_gl = NULL; + tex = NULL; } } - return image_gl; + return tex; } // Reads a .tga file, decodes it, and puts the decoded data in image_raw. diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h index 31b175ec9..05becfd95 100644 --- a/indra/newview/lltexlayer.h +++ b/indra/newview/lltexlayer.h @@ -39,7 +39,7 @@ #include "llrect.h" #include "llstring.h" #include "lluuid.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llviewervisualparam.h" #include "llvoavatardefines.h" #include "llwearable.h" @@ -50,7 +50,7 @@ class LLTexLayerSetInfo; class LLTexLayerSet; class LLTexLayerInfo; class LLTexLayer; -class LLImageGL; +class LLViewerTexture; class LLImageTGA; class LLTexGlobalColorInfo; class LLTexLayerParamAlphaInfo; @@ -61,6 +61,7 @@ class LLPolyMesh; class LLXmlTreeNode; class LLImageRaw; class LLPolyMorphTarget; +class LLViewerTexture; class LLTextureCtrl; class LLVOAvatar; @@ -204,7 +205,7 @@ protected: // LLTexLayerSetBuffer // The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one. //----------------------------------------------------------------------------- -class LLTexLayerSetBuffer : public LLDynamicTexture +class LLTexLayerSetBuffer : public LLViewerDynamicTexture { public: LLTexLayerSetBuffer(LLTexLayerSet* owner, S32 width, S32 height); @@ -229,6 +230,7 @@ public: S32 result, LLExtStat ext_status); static void dumpTotalByteCount(); + virtual S8 getType() const ; virtual void restoreGLTexture() ; virtual void destroyGLTexture() ; @@ -284,7 +286,7 @@ public: void gatherAlphaMasks(U8 *data, S32 width, S32 height); void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components); const std::string getBodyRegion() { return mInfo->mBodyRegion; } - BOOL hasComposite() { return (mComposite != NULL); } + BOOL hasComposite() { return (mComposite.notNull()); } LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; } void setBakedTexIndex(LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; } BOOL isVisible() const { return mIsVisible; } @@ -296,7 +298,7 @@ protected: typedef std::vector layer_list_t; layer_list_t mLayerList; layer_list_t mMaskLayerList; - LLTexLayerSetBuffer* mComposite; + LLPointer mComposite; // Backlink only; don't make this an LLPointer. LLVOAvatar* mAvatar; BOOL mUpdatesEnabled; @@ -419,7 +421,7 @@ public: BOOL getMultiplyBlend() { return getInfo()->mMultiplyBlend; } protected: - LLPointer mCachedProcessedImageGL; + LLPointer mCachedProcessedTexture; LLTexLayer* mTexLayer; LLPointer mStaticImageTGA; LLPointer mStaticImageRaw; @@ -519,27 +521,25 @@ public: LLTexStaticImageList(); ~LLTexStaticImageList(); - LLImageRaw* getImageRaw( const std::string& file_name ); - LLImageGL* getImageGL( const std::string& file_name, BOOL is_mask ); - LLImageTGA* getImageTGA( const std::string& file_name ); + LLImageRaw* getImageRaw( const std::string& file_name ); + LLViewerTexture* getTexture( const std::string& file_name, BOOL is_mask ); + LLImageTGA* getImageTGA( const std::string& file_name ); - void deleteCachedImages(); - void dumpByteCount(); - -private: - BOOL loadImageRaw( const std::string& file_name, LLImageRaw* image_raw ); + void deleteCachedImages(); + void dumpByteCount() const; +protected: + BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw); private: static LLStringTable sImageNames; - typedef std::map< const char *, LLPointer > image_gl_map_t; - typedef std::map< const char *, LLPointer > image_tga_map_t; - image_gl_map_t mStaticImageListGL; - image_tga_map_t mStaticImageListTGA; - + typedef std::map > texture_map_t; + texture_map_t mStaticImageList; + typedef std::map > image_tga_map_t; + image_tga_map_t mStaticImageListTGA; public: - S32 mGLBytes; - S32 mTGABytes; + S32 mGLBytes; + S32 mTGABytes; }; // Used by LLTexLayerSetBuffer for a callback. @@ -558,7 +558,7 @@ public: LLUUID mID; LLVOAvatar* mAvatar; // just backlink, don't LLPointer - LLTexLayerSet* mLayerSet; + LLTexLayerSet* mTexLayerSet; LLTexLayerSetBuffer* mLayerSetBuffer; LLUUID mWearableAssets[WT_COUNT]; U64 mStartTime; // Used to measure time baked texture upload requires diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 1716b5c5d..c37add97a 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -743,9 +743,6 @@ void LLTextureCacheWorker::endWork(S32 param, bool aborted) LLTextureCache::LLTextureCache(bool threaded) : LLWorkerThread("TextureCache", threaded), - mWorkersMutex(NULL), - mHeaderMutex(NULL), - mListMutex(NULL), mHeaderAPRFile(NULL), mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called. mTexturesSizeTotal(0), @@ -915,10 +912,12 @@ void LLTextureCache::purgeCache(ELLPath location) if(LLFile::isdir(mTexturesDirName)) { std::string file_name = gDirUtilp->getExpandedFilename(location, entries_filename); - LLAPRFile::remove(file_name); + if(LLAPRFile::isExist(file_name)) + LLAPRFile::remove(file_name); file_name = gDirUtilp->getExpandedFilename(location, cache_filename); - LLAPRFile::remove(file_name); + if(LLAPRFile::isExist(file_name)) + LLAPRFile::remove(file_name); purgeAllTextures(true); } @@ -1424,7 +1423,7 @@ void LLTextureCache::readHeaderCache() { // Special case: cache size was reduced, need to remove entries // Note: After we prune entries, we will call this again and create the LRU - U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries; + U32 entries_to_purge = (num_entries - empty_entries) - sCacheMaxEntries; llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl; // We can exit the following loop with the given condition, since if we'd reach the end of the lru set we'd have: // purge_list.size() = lru.size() = num_entries - empty_entries = entries_to_purge + sCacheMaxEntries >= entries_to_purge @@ -1711,7 +1710,8 @@ void LLTextureCache::purgeTextureFilesTimeSliced(bool force) if (mHeaderIDMap.find(curiter->first) == mHeaderIDMap.end()) { filename = curiter->second; - LLAPRFile::remove(filename); + if(LLAPRFile::isExist(filename)) + LLAPRFile::remove(filename); } else { @@ -1963,7 +1963,7 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename, b mFreeList.insert(idx); } - if (remove_file) + if (remove_file && LLAPRFile::isExist(filename)) { LLAPRFile::remove(filename); } diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 45ec5e211..3a4b1f25e 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -143,9 +143,6 @@ protected: std::string getTextureFileName(const LLUUID& id); void addCompleted(Responder* responder, bool success); -protected: - //void setFileAPRPool(apr_pool_t* pool) { mFileAPRPool = pool ; } - private: void setDirNames(ELLPath location); void readHeaderCache(); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 4df2f6dd0..319f1cb57 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -37,13 +37,12 @@ #include "llrender.h" #include "llagent.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llcheckboxctrl.h" #include "llcombobox.h" #include "llbutton.h" #include "lldraghandle.h" #include "llfocusmgr.h" -#include "llviewerimage.h" #include "llfolderview.h" #include "llinventory.h" #include "llinventorymodel.h" @@ -187,7 +186,7 @@ public: // tag: vaa emerald local_asset_browser [end] protected: - LLPointer mTexturep; + LLPointer mTexturep; LLTextureCtrl* mOwner; LLUUID mImageAssetID; // Currently selected texture @@ -394,9 +393,9 @@ void LLFloaterTexturePicker::updateImageStats() if (mTexturep.notNull()) { //RN: have we received header data for this image? - if (mTexturep->getWidth(0) > 0 && mTexturep->getHeight(0) > 0) + if (mTexturep->getFullWidth() > 0 && mTexturep->getFullHeight() > 0) { - std::string formatted_dims = llformat("%d x %d", mTexturep->getWidth(0),mTexturep->getHeight(0)); + std::string formatted_dims = llformat("%d x %d", mTexturep->getFullWidth(),mTexturep->getFullHeight()); mResolutionLabel->setTextArg("[DIMENSIONS]", formatted_dims); } else @@ -404,6 +403,10 @@ void LLFloaterTexturePicker::updateImageStats() mResolutionLabel->setTextArg("[DIMENSIONS]", std::string("[? x ?]")); } } + else + { + mResolutionLabel->setTextArg("[DIMENSIONS]", std::string("")); + } } // virtual @@ -606,13 +609,11 @@ void LLFloaterTexturePicker::draw() mTexturep = NULL; if(mImageAssetID.notNull()) { - mTexturep = gImageList.getImage(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO); - mTexturep->setBoostLevel(LLViewerImageBoostLevel::BOOST_PREVIEW); + mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES, LLViewerTexture::BOOST_PREVIEW); } else if (!mFallbackImageName.empty()) { - mTexturep = gImageList.getImageFromFile(mFallbackImageName); - mTexturep->setBoostLevel(LLViewerImageBoostLevel::BOOST_PREVIEW); + mTexturep = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, MIPMAP_YES, LLViewerTexture::BOOST_PREVIEW); } if (mTentativeLabel) @@ -1515,14 +1516,13 @@ void LLTextureCtrl::draw() } else if (!mImageAssetID.isNull()) { - mTexturep = gImageList.getImage(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO); - mTexturep->setBoostLevel(LLViewerImageBoostLevel::BOOST_PREVIEW); + mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES,LLViewerTexture::BOOST_PREVIEW, LLViewerTexture::LOD_TEXTURE); + mTexturep->forceToSaveRawImage(0) ; } else if (!mFallbackImageName.empty()) { // Show fallback image. - mTexturep = gImageList.getImageFromFile(mFallbackImageName); - mTexturep->setBoostLevel(LLViewerImageBoostLevel::BOOST_PREVIEW); + mTexturep = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, MIPMAP_YES,LLViewerTexture::BOOST_PREVIEW, LLViewerTexture::LOD_TEXTURE); } else // mImageAssetID == LLUUID::null { @@ -1561,10 +1561,9 @@ void LLTextureCtrl::draw() // Show "Loading..." string on the top left corner while this texture is loading. // Using the discard level, do not show the string if the texture is almost but not // fully loaded. - if ( mTexturep.notNull() && - (mShowLoadingPlaceholder == TRUE) && - (mTexturep->getDiscardLevel() != 1) && - (mTexturep->getDiscardLevel() != 0)) + if (mTexturep.notNull() && + (!mTexturep->isFullyLoaded()) && + (mShowLoadingPlaceholder == TRUE)) { LLFontGL* font = LLFontGL::getFontSansSerifBig(); font->renderUTF8( @@ -1691,7 +1690,7 @@ BOOL LLToolTexEyedropper::handleMouseDown(S32 x, S32 y, MASK mask) { if( (0 <= pick.mObjectFace) && (pick.mObjectFace < hit_obj->getNumTEs()) ) { - LLViewerImage* image = hit_obj->getTEImage( pick.mObjectFace ); + LLViewerTexture* image = hit_obj->getTEImage( pick.mObjectFace ); if( image ) { if( mCallback ) diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 79c0f29ef..f5a45807a 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -45,7 +45,7 @@ class LLFloaterTexturePicker; class LLInventoryItem; class LLTextBox; class LLViewBorder; -class LLViewerImage; +class LLViewerFetchedTexture; // used for setting drag & drop callbacks. typedef BOOL (*drag_n_drop_callback)(LLUICtrl*, LLInventoryItem*, void*); @@ -170,7 +170,7 @@ private: drag_n_drop_callback mDropCallback; LLUICtrlCallback mOnCancelCallback; LLUICtrlCallback mOnSelectCallback; - LLPointer mTexturep; + LLPointer mTexturep; LLColor4 mBorderColor; LLUUID mImageItemID; LLUUID mImageAssetID; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 150a75ea8..cd74d3d73 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -47,13 +47,14 @@ #include "llimagej2c.h" #include "llimageworker.h" #include "llworkerthread.h" +#include "message.h" #include "llagent.h" #include "lltexturecache.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" -#include "llviewerimage.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" +#include "llviewerstats.h" #include "llworld.h" ////////////////////////////////////////////////////////////////////////////// @@ -148,7 +149,7 @@ public: /*virtual*/ bool deleteOK(); // called from update() (WORK THREAD) ~LLTextureFetchWorker(); - void release() { --mActiveCount; } + // void relese() { --mActiveCount; } S32 callbackHttpGet(const LLChannelDescriptors& channels, const LLIOPipe::buffer_ptr_t& buffer, @@ -166,9 +167,11 @@ public: mGetReason = reason; } - void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;} - bool getCanUseHTTP()const {return mCanUseHTTP ;} + void setCanUseHTTP(bool can_use_http) { mCanUseHTTP = can_use_http; } + bool getCanUseHTTP() const { return mCanUseHTTP; } + LLTextureFetch & getFetcher() { return *mFetcher; } + protected: LLTextureFetchWorker(LLTextureFetch* fetcher, const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, S32 discard, S32 size); @@ -250,10 +253,10 @@ private: S32 mRequestedSize; S32 mDesiredSize; S32 mFileSize; - S32 mCachedSize; - BOOL mLoaded; + S32 mCachedSize; e_request_state mSentRequest; handle_t mDecodeHandle; + BOOL mLoaded; BOOL mDecoded; BOOL mWritten; BOOL mNeedsAux; @@ -282,6 +285,9 @@ private: S32 mLastPacket; U16 mTotalPackets; U8 mImageCodec; +#if HTTP_METRICS + LLViewerAssetStats::duration_t mMetricsStartTime; +#endif }; ////////////////////////////////////////////////////////////////////////////// @@ -304,6 +310,7 @@ public: { static LLCachedControl log_to_viewer_log("LogTextureDownloadsToViewerLog",false); static LLCachedControl log_to_sim("LogTextureDownloadsToSimulator",false); + static bool log_texture_traffic = false; if (log_to_viewer_log || log_to_sim) { @@ -335,7 +342,31 @@ public: // llwarns << "CURL GET FAILED, status:" << status << " reason:" << reason << llendl; } S32 data_size = worker->callbackHttpGet(channels, buffer, partial, success); + + if(log_texture_traffic && data_size > 0) + { + LLViewerTexture* tex = LLViewerTextureManager::findTexture(mID) ; + if(tex) + { + gTotalTextureBytesPerBoostLevel[tex->getBoostLevel()] += data_size ; + } + } + mFetcher->removeFromHTTPQueue(mID, data_size); + +#if HTTP_METRICS + if (worker->mMetricsStartTime) + { + LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE, + true, + LLImageBase::TYPE_AVATAR_BAKE == worker->mType, + LLViewerAssetStatsFF::get_timestamp() - worker->mMetricsStartTime); + worker->mMetricsStartTime = 0; + } + LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE, + true, + LLImageBase::TYPE_AVATAR_BAKE == worker->mType); +#endif } else { @@ -394,7 +425,7 @@ class SGHostBlackList{ static void lock() { if (!sMutex) - sMutex = new LLMutex(0); + sMutex = new LLMutex; sMutex->lock(); } @@ -441,6 +472,232 @@ public: LLMutex* SGHostBlackList::sMutex = 0; SGHostBlackList::blacklist_t SGHostBlackList::blacklist; +#if HTTP_METRICS +// Cross-thread messaging for asset metrics. + +/** + * @brief Base class for cross-thread requests made of the fetcher + * + * I believe the intent of the LLQueuedThread class was to + * have these operations derived from LLQueuedThread::QueuedRequest + * but the texture fetcher has elected to manage the queue + * in its own manner. So these are free-standing objects which are + * managed in simple FIFO order on the mCommands queue of the + * LLTextureFetch object. + * + * What each represents is a simple command sent from an + * outside thread into the TextureFetch thread to be processed + * in order and in a timely fashion (though not an absolute + * higher priority than other operations of the thread). + * Each operation derives a new class from the base customizing + * members, constructors and the doWork() method to effect + * the command. + * + * The flow is one-directional. There are two global instances + * of the LLViewerAssetStats collector, one for the main program's + * thread pointed to by gViewerAssetStatsMain and one for the + * TextureFetch thread pointed to by gViewerAssetStatsThread1. + * Common operations has each thread recording metrics events + * into the respective collector unconcerned with locking and + * the state of any other thread. But when the agent moves into + * a different region or the metrics timer expires and a report + * needs to be sent back to the grid, messaging across threads + * is required to distribute data and perform global actions. + * In pseudo-UML, it looks like: + * + * Main Thread1 + * . . + * . . + * +-----+ . + * | AM | . + * +--+--+ . + * +-------+ | . + * | Main | +--+--+ . + * | | | SRE |---. . + * | Stats | +-----+ \ . + * | | | \ (uuid) +-----+ + * | Coll. | +--+--+ `-------->| SR | + * +-------+ | MSC | +--+--+ + * | ^ +-----+ | + * | | (uuid) / . +-----+ (uuid) + * | `--------' . | MSC |---------. + * | . +-----+ | + * | +-----+ . v + * | | TE | . +-------+ + * | +--+--+ . | Thd1 | + * | | . | | + * | +-----+ . | Stats | + * `--------->| RSC | . | | + * +--+--+ . | Coll. | + * | . +-------+ + * +--+--+ . | + * | SME |---. . | + * +-----+ \ . | + * . \ (clone) +-----+ | + * . `-------->| SM | | + * . +--+--+ | + * . | | + * . +-----+ | + * . | RSC |<--------' + * . +-----+ + * . | + * . +-----+ + * . | CP |--> HTTP POST + * . +-----+ + * . . + * . . + * + * + * Key: + * + * SRE - Set Region Enqueued. Enqueue a 'Set Region' command in + * the other thread providing the new UUID of the region. + * TFReqSetRegion carries the data. + * SR - Set Region. New region UUID is sent to the thread-local + * collector. + * SME - Send Metrics Enqueued. Enqueue a 'Send Metrics' command + * including an ownership transfer of a cloned LLViewerAssetStats. + * TFReqSendMetrics carries the data. + * SM - Send Metrics. Global metrics reporting operation. Takes + * the cloned stats from the command, merges it with the + * thread's local stats, converts to LLSD and sends it on + * to the grid. + * AM - Agent Moved. Agent has completed some sort of move to a + * new region. + * TE - Timer Expired. Metrics timer has expired (on the order + * of 10 minutes). + * CP - CURL Post + * MSC - Modify Stats Collector. State change in the thread-local + * collector. Typically a region change which affects the + * global pointers used to find the 'current stats'. + * RSC - Read Stats Collector. Extract collector data cloning it + * (i.e. deep copy) when necessary. + * + */ +class LLTextureFetch::TFRequest // : public LLQueuedThread::QueuedRequest +{ +public: + // Default ctors and assignment operator are correct. + + virtual ~TFRequest() + {} + + // Patterned after QueuedRequest's method but expected behavior + // is different. Always expected to complete on the first call + // and work dispatcher will assume the same and delete the + // request after invocation. + virtual bool doWork(LLTextureFetch * fetcher) = 0; +}; + +namespace +{ + +/** + * @brief Implements a 'Set Region' cross-thread command. + * + * When an agent moves to a new region, subsequent metrics need + * to be binned into a new or existing stats collection in 1:1 + * relationship with the region. We communicate this region + * change across the threads involved in the communication with + * this message. + * + * Corresponds to LLTextureFetch::commandSetRegion() + */ +class TFReqSetRegion : public LLTextureFetch::TFRequest +{ +public: + TFReqSetRegion(U64 region_handle) + : LLTextureFetch::TFRequest(), + mRegionHandle(region_handle) + {} + TFReqSetRegion & operator=(const TFReqSetRegion &); // Not defined + + virtual ~TFReqSetRegion() + {} + + virtual bool doWork(LLTextureFetch * fetcher); + +public: + const U64 mRegionHandle; +}; + + +/** + * @brief Implements a 'Send Metrics' cross-thread command. + * + * This is the big operation. The main thread gathers metrics + * for a period of minutes into LLViewerAssetStats and other + * objects then makes a snapshot of the data by cloning the + * collector. This command transfers the clone, along with a few + * additional arguments (UUIDs), handing ownership to the + * TextureFetch thread. It then merges its own data into the + * cloned copy, converts to LLSD and kicks off an HTTP POST of + * the resulting data to the currently active metrics collector. + * + * Corresponds to LLTextureFetch::commandSendMetrics() + */ + +#if HTTP_METRICS +class TFReqSendMetrics : public LLTextureFetch::TFRequest +{ +public: + /** + * Construct the 'Send Metrics' command to have the TextureFetch + * thread add and log metrics data. + * + * @param caps_url URL of a "ViewerMetrics" Caps target + * to receive the data. Does not have to + * be associated with a particular region. + * + * @param session_id UUID of the agent's session. + * + * @param agent_id UUID of the agent. (Being pure here...) + * + * @param main_stats Pointer to a clone of the main thread's + * LLViewerAssetStats data. Thread1 takes + * ownership of the copy and disposes of it + * when done. + */ + + TFReqSendMetrics(const std::string & caps_url, + const LLUUID & session_id, + const LLUUID & agent_id, + LLViewerAssetStats * main_stats) + : LLTextureFetch::TFRequest(), + mCapsURL(caps_url), + mSessionID(session_id), + mAgentID(agent_id), + mMainStats(main_stats) + {} + TFReqSendMetrics & operator=(const TFReqSendMetrics &); // Not defined + + virtual ~TFReqSendMetrics(); + + virtual bool doWork(LLTextureFetch * fetcher); + +public: + const std::string mCapsURL; + const LLUUID mSessionID; + const LLUUID mAgentID; + LLViewerAssetStats * mMainStats; +}; +#endif + +/* + * Examines the merged viewer metrics report and if found to be too long, + * will attempt to truncate it in some reasonable fashion. + * + * @param max_regions Limit of regions allowed in report. + * + * @param metrics Full, merged viewer metrics report. + * + * @returns If data was truncated, returns true. + */ +bool truncate_viewer_metrics(int max_regions, LLSD & metrics); + +} // end of anonymous namespace +#endif + ////////////////////////////////////////////////////////////////////////////// //static @@ -460,6 +717,11 @@ const char* LLTextureFetchWorker::sStateDescs[] = { "DONE", }; +#if HTTP_METRICS +// static +volatile bool LLTextureFetch::svMetricsDataBreak(true); // Start with a data break +#endif + // called from MAIN THREAD LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, @@ -505,11 +767,13 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mRetryAttempt(0), mActiveCount(0), mGetStatus(0), - mWorkMutex(NULL), mFirstPacket(0), mLastPacket(-1), mTotalPackets(0), mImageCodec(IMG_CODEC_INVALID) +#if HTTP_METRICS + ,mMetricsStartTime(0) +#endif { mCanUseNET = mUrl.empty() ; @@ -589,8 +853,8 @@ void LLTextureFetchWorker::setupPacketData() U32 LLTextureFetchWorker::calcWorkPriority() { -// llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerImage::maxDecodePriority()); - static const F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerImage::maxDecodePriority(); +// llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerTexture::maxDecodePriority()); + static const F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority(); mWorkPriority = llmin((U32)LLWorkerThread::PRIORITY_LOWBITS, (U32)(mImagePriority * PRIORITY_SCALE)); return mWorkPriority; } @@ -633,7 +897,7 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size) void LLTextureFetchWorker::setImagePriority(F32 priority) { -// llassert_always(priority >= 0 && priority <= LLViewerImage::maxDecodePriority()); +// llassert_always(priority >= 0 && priority <= LLViewerTexture::maxDecodePriority()); F32 delta = fabs(priority - mImagePriority); if (delta > (mImagePriority * .05f) || mState == DONE) { @@ -662,7 +926,7 @@ void LLTextureFetchWorker::startWork(S32 param) llassert(mFormattedImage.isNull()); } -#include "llviewerimagelist.h" // debug +#include "llviewertexturelist.h" // debug // Called from LLWorkerThread::processRequest() bool LLTextureFetchWorker::doWork(S32 param) @@ -756,6 +1020,7 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mUrl.compare(0, 7, "file://") == 0) { setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it + // read file from local disk std::string filename = mUrl.substr(7, std::string::npos); CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage); @@ -765,6 +1030,7 @@ bool LLTextureFetchWorker::doWork(S32 param) else if (mUrl.empty()) { setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it + CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage); mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority, offset, size, responder); @@ -885,7 +1151,7 @@ bool LLTextureFetchWorker::doWork(S32 param) } // don't return, fall through to next state } - else if (mCanUseNET && mSentRequest == UNSENT) + else if (mSentRequest == UNSENT && mCanUseNET) { // Add this to the network queue and sit here. // LLTextureFetch::update() will send off a request which will change our state @@ -894,11 +1160,32 @@ bool LLTextureFetchWorker::doWork(S32 param) mRequestedDiscard = mDesiredDiscard; mSentRequest = QUEUED; mFetcher->addToNetworkQueue(this); +#if HTTP_METRICS + if (! mMetricsStartTime) + { + mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp(); + } + LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, + false, + LLImageBase::TYPE_AVATAR_BAKE == mType); +#endif setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return false; } else { + // Shouldn't need to do anything here + //llassert_always(mFetcher->mNetworkQueue.find(mID) != mFetcher->mNetworkQueue.end()); + // Make certain this is in the network queue + //mFetcher->addToNetworkQueue(this); + //if (! mMetricsStartTime) + //{ + // mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp(); + //} + //LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, false, + // LLImageBase::TYPE_AVATAR_BAKE == mType); + //setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); return false; } } @@ -921,11 +1208,34 @@ bool LLTextureFetchWorker::doWork(S32 param) } setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); mState = DECODE_IMAGE; - mWriteToCacheState = SHOULD_WRITE ; + mWriteToCacheState = SHOULD_WRITE; + +#if HTTP_METRICS + if (mMetricsStartTime) + { + LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE, + false, + LLImageBase::TYPE_AVATAR_BAKE == mType, + LLViewerAssetStatsFF::get_timestamp() - mMetricsStartTime); + mMetricsStartTime = 0; + } + LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE, + false, + LLImageBase::TYPE_AVATAR_BAKE == mType); +#endif } else { mFetcher->addToNetworkQueue(this); // failsafe +#if HTTP_METRICS + if (! mMetricsStartTime) + { + mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp(); + } + LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, + false, + LLImageBase::TYPE_AVATAR_BAKE == mType); +#endif setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); } return false; @@ -935,17 +1245,21 @@ bool LLTextureFetchWorker::doWork(S32 param) { if(mCanUseHTTP) { - // *TODO: Integrate this with llviewerthrottle - // Note: LLViewerThrottle uses dynamic throttling which makes sense for UDP, - // but probably not for Textures. - // Set the throttle to the entire bandwidth, assuming UDP packets will get priority - // when they are needed + //NOTE: + //control the number of the http requests issued for: + //1, not openning too many file descriptors at the same time; + //2, control the traffic of http so udp gets bandwidth. + // static const S32 MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE = 32; - if ((mFetcher->getNumHTTPRequests() > MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE) || - (mFetcher->getTextureBandwidth() > mFetcher->mMaxBandwidth)) + static const S32 NUM_REQUESTS_TILL_THRESHOLDING = 2; + if((mFetcher->getNumHTTPRequests() > MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE) || + ((mFetcher->getTextureBandwidth() > mFetcher->mMaxBandwidth) && + mFetcher->getNumHTTPRequests() > NUM_REQUESTS_TILL_THRESHOLDING)) { return false ; //wait. } + + mFetcher->removeFromNetworkQueue(this, false); S32 cur_size = 0; if (mFormattedImage.notNull()) @@ -953,16 +1267,22 @@ bool LLTextureFetchWorker::doWork(S32 param) cur_size = mFormattedImage->getDataSize(); // amount of data we already have if (mFormattedImage->getDiscardLevel() == 0) { - // We already have all the data, just decode it - mLoadedDiscard = mFormattedImage->getDiscardLevel(); - mState = DECODE_IMAGE; - return false; + if(cur_size > 0) + { + // We already have all the data, just decode it + mLoadedDiscard = mFormattedImage->getDiscardLevel(); + mState = DECODE_IMAGE; + return false; + } + else + { + return true ; //abort. + } } } mRequestedSize = mDesiredSize; mRequestedDiscard = mDesiredDiscard; mRequestedSize -= cur_size; -// F32 priority = mImagePriority / (F32)LLViewerImage::maxDecodePriority(); // 0-1 S32 offset = cur_size; mBufferSize = cur_size; // This will get modified by callbackHttpGet() @@ -973,13 +1293,23 @@ bool LLTextureFetchWorker::doWork(S32 param) mGetStatus = 0; mGetReason.clear(); LL_DEBUGS("Texture") << "HTTP GET: " << mID << " Offset: " << offset - << " Bytes: " << mRequestedSize - << " Bandwidth(kbps): " << mFetcher->getTextureBandwidth() - << "/" << mFetcher->mMaxBandwidth << LL_ENDL; + << " Bytes: " << mRequestedSize + << " Bandwidth(kbps): " << mFetcher->getTextureBandwidth() << "/" << mFetcher->mMaxBandwidth + << LL_ENDL; setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); mState = WAIT_HTTP_REQ; mFetcher->addToHTTPQueue(mID); +#if HTTP_METRICS + if (! mMetricsStartTime) + { + mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp(); + } + LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, + true, + LLImageBase::TYPE_AVATAR_BAKE == mType); +#endif + // Will call callbackHttpGet when curl request completes std::vector headers; headers.push_back("Accept: image/x-j2c"); @@ -1009,23 +1339,37 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mRequestedSize < 0) { S32 max_attempts; - if (mGetStatus == HTTP_NOT_FOUND || mGetStatus == 499 || mGetStatus == HTTP_SERVICE_UNAVAILABLE) + if (mGetStatus == HTTP_NOT_FOUND || mGetStatus == 499) { mHTTPFailCount = max_attempts = 1; // Don't retry if(mGetStatus == HTTP_NOT_FOUND) llwarns << "Texture missing from server (404): " << mUrl << llendl; - else if (mGetStatus == 499) { + else if (mGetStatus == 499) + { llwarns << "No response from server (499): " << mUrl << llendl; SGHostBlackList::add(mUrl, 60.0, mGetStatus); } - else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE){ - llwarns << "Texture server busy (503): " << mUrl << LL_ENDL; - SGHostBlackList::add(mUrl, 60.0, mGetStatus); + //roll back to try UDP + if(mCanUseNET) + { + mState = INIT ; + mCanUseHTTP = false ; + setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); + return false ; } } + else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE) + { + // *TODO: Should probably introduce a timer here to delay future HTTP requsts + // for a short time (~1s) to ease server load? Ideally the server would queue + // requests instead of returning 503... we already limit the number pending. + ++mHTTPFailCount; + max_attempts = mHTTPFailCount+1; // Keep retrying + LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL; + } else { - const S32 HTTP_MAX_RETRY_COUNT = 1; + const S32 HTTP_MAX_RETRY_COUNT = 3; max_attempts = HTTP_MAX_RETRY_COUNT + 1; ++mHTTPFailCount; llinfos << "HTTP GET failed for: " << mUrl @@ -1035,15 +1379,6 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mHTTPFailCount >= max_attempts) { - if (mCanUseNET) - { - llinfos << "Falling back to SIM fetch for texture " << mID << llendl; - resetFormattedData(); - mState = INIT ; - mCanUseHTTP = false ; - setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - return false ; - } if (cur_size > 0) { // Use available data @@ -1126,10 +1461,37 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == DECODE_IMAGE) { - if (mDesiredDiscard < 0 || mFormattedImage->getDataSize() <= 0 || mLoadedDiscard < 0) + static LLCachedControl textures_decode_disabled("TextureDecodeDisabled", false); + if(textures_decode_disabled) { - // We aborted, or decode entered with invalid mFormattedImage, - // or decode entered with invalid mLoadedDiscard: don't decode. + // for debug use, don't decode + mState = DONE; + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return true; + } + + if (mDesiredDiscard < 0) + { + // We aborted, don't decode + mState = DONE; + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return true; + } + + if (mFormattedImage->getDataSize() <= 0) + { + //llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl; + + //abort, don't decode + mState = DONE; + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return true; + } + if (mLoadedDiscard < 0) + { + //llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; + + //abort, don't decode mState = DONE; setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); return true; @@ -1254,15 +1616,7 @@ bool LLTextureFetchWorker::doWork(S32 param) else { setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); - - if(mDecodedDiscard<=0) - { - return true; - } - else - { - return false; - } + return true; } } @@ -1326,9 +1680,9 @@ bool LLTextureFetchWorker::deleteOK() } } - if (haveWork() && + if ((haveWork() && // not ok to delete from these states - mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE) + ((mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE)))) { delete_ok = false; } @@ -1434,57 +1788,31 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels, LL_DEBUGS("Texture") << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << LL_ENDL; if (data_size > 0) { - bool clean_data = false; - bool done = false; - if (!partial) + // *TODO: set the formatted image data here directly to avoid the copy + mBuffer = new U8[data_size]; + buffer->readAfter(channels.in(), NULL, mBuffer, data_size); + mBufferSize += data_size; + if (data_size < mRequestedSize && mRequestedDiscard == 0) { - // we got the whole image in one go - done = true; - clean_data = true; - } - else if (data_size < mRequestedSize) - { - // we have the whole image - done = true; - } - else if (data_size == mRequestedSize) - { - if (mRequestedDiscard <= 0) - { - done = true; - } - else - { - // this is the normal case where we get the data we requested, - // but still need to request more data. - } + mHaveAllData = TRUE; } else if (data_size > mRequestedSize) { // *TODO: This shouldn't be happening any more llwarns << "data_size = " << data_size << " > requested: " << mRequestedSize << llendl; - done = true; - clean_data = true; - llassert_always(mDecodeHandle == 0); - } - - if (clean_data) - { - resetFormattedData(); // discard any previous data we had - llassert(mBufferSize == 0); - } - if (done) - { mHaveAllData = TRUE; - mRequestedDiscard = 0; + llassert_always(mDecodeHandle == 0); + mFormattedImage = NULL; // discard any previous data we had + mBufferSize = data_size; } - - // *TODO: set the formatted image data here directly to avoid the copy - mBuffer = new U8[data_size]; - buffer->readAfter(channels.in(), NULL, mBuffer, data_size); - mBufferSize += data_size; - mRequestedSize = data_size; } + else + { + // We requested data but received none (and no error), + // so presumably we have all of it + mHaveAllData = TRUE; + } + mRequestedSize = data_size; } else { @@ -1608,20 +1936,25 @@ bool LLTextureFetchWorker::writeToCacheComplete() ////////////////////////////////////////////////////////////////////////////// // public -LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded) +LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded, bool qa_mode) : LLWorkerThread("TextureFetch", threaded), mDebugCount(0), mDebugPause(FALSE), mPacketCount(0), mBadPacketCount(0), - mQueueMutex(getAPRPool()), - mNetworkQueueMutex(getAPRPool()), mTextureCache(cache), mImageDecodeThread(imagedecodethread), mTextureBandwidth(0), mHTTPTextureBits(0), + mTotalHTTPRequests(0), mCurlGetRequest(NULL) +#if HTTP_METRICS + ,mQAMode(qa_mode) +#endif { +#if HTTP_METRICS + mCurlPOSTRequestCount = 0; +#endif mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), gSavedSettings.getU32("TextureLoggingThreshold")); } @@ -1629,6 +1962,16 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image LLTextureFetch::~LLTextureFetch() { clearDeleteList() ; + +#if HTTP_METRICS + while (! mCommands.empty()) + { + TFRequest * req(mCommands.front()); + mCommands.erase(mCommands.begin()); + delete req; + } +#endif + // ~LLQueuedThread() called here } @@ -1736,9 +2079,10 @@ void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker) { // only add to the queue if in the request map // i.e. a delete has not been requested - mNetworkQueue.insert(worker->mID); + mNetworkQueue.insert(worker->mID); } - for (cancel_queue_t::iterator iter1 = mCancelQueue.begin(); iter1 != mCancelQueue.end(); ++iter1) + for (cancel_queue_t::iterator iter1 = mCancelQueue.begin(); + iter1 != mCancelQueue.end(); ++iter1) { iter1->second.erase(worker->mID); } @@ -1759,6 +2103,7 @@ void LLTextureFetch::addToHTTPQueue(const LLUUID& id) { LLMutexLock lock(&mNetworkQueueMutex); mHTTPTextureQueue.insert(id); + mTotalHTTPRequests++; } void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id, S32 received_size) @@ -1821,6 +2166,15 @@ S32 LLTextureFetch::getNumHTTPRequests() return size ; } +U32 LLTextureFetch::getTotalNumHTTPRequests() +{ + mNetworkQueueMutex.lock() ; + U32 size = mTotalHTTPRequests ; + mNetworkQueueMutex.unlock() ; + + return size ; +} + // call lockQueue() first! LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id) { @@ -1907,8 +2261,75 @@ bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority) return res; } +// +// May be called from any thread + +//virtual +S32 LLTextureFetch::getPending() +{ + S32 res; + lockData(); + { + LLMutexLock lock(&mQueueMutex); + + res = mRequestQueue.size(); +#if HTTP_METRICS + res += mCurlPOSTRequestCount; + res += mCommands.size(); +#endif + } + unlockData(); + return res; +} + +// virtual +bool LLTextureFetch::runCondition() +{ + // Caller is holding the lock on LLThread's condition variable. + + // LLQueuedThread, unlike its base class LLThread, makes this a + // private method which is unfortunate. I want to use it directly + // but I'm going to have to re-implement the logic here (or change + // declarations, which I don't want to do right now). + // + // Changes here may need to be reflected in getPending(). + +#if HTTP_METRICS + bool have_no_commands(false); + { + LLMutexLock lock(&mQueueMutex); + + have_no_commands = mCommands.empty(); + } + + bool have_no_curl_requests(0 == mCurlPOSTRequestCount); + + return ! (have_no_commands + && have_no_curl_requests + && (mRequestQueue.empty() && mIdleThread)); // From base class +#else + return !(mRequestQueue.empty() && mIdleThread); +#endif +} + ////////////////////////////////////////////////////////////////////////////// +// MAIN THREAD (unthreaded envs), WORKER THREAD (threaded envs) +void LLTextureFetch::commonUpdate() +{ +#if HTTP_METRICS + // Run a cross-thread command, if any. + cmdDoWork(); +#endif + + // Update Curl on same thread as mCurlGetRequest was constructed + S32 processed = mCurlGetRequest->process(); + if (processed > 0) + { + lldebugs << "processed: " << processed << " messages." << llendl; + } +} + // MAIN THREAD //virtual S32 LLTextureFetch::update(U32 max_time_ms) @@ -1918,7 +2339,7 @@ S32 LLTextureFetch::update(U32 max_time_ms) static const LLCachedControl max_bandwidth("ThrottleBandwidthKBPS", 2000); mMaxBandwidth = max_bandwidth; - gImageList.sTextureBits += mHTTPTextureBits; + gTextureList.sTextureBits += mHTTPTextureBits; mHTTPTextureBits = 0 ; mNetworkQueueMutex.unlock() ; @@ -1933,12 +2354,7 @@ S32 LLTextureFetch::update(U32 max_time_ms) if (!mThreaded) { - // Update Curl on same thread as mCurlGetRequest was constructed - S32 processed = mCurlGetRequest->process(); - if (processed > 0) - { - LL_DEBUGS("Texture") << "processed: " << processed << " messages." << LL_ENDL; - } + commonUpdate(); } return res; @@ -1993,12 +2409,7 @@ void LLTextureFetch::threadedUpdate() } process_timer.reset(); - // Update Curl on same thread as mCurlGetRequest was constructed - S32 processed = mCurlGetRequest->process(); - if (processed > 0) - { - LL_DEBUGS("Texture") << "processed: " << processed << " messages." << LL_ENDL; - } + commonUpdate(); #if 0 const F32 INFO_TIME = 1.0f; @@ -2449,3 +2860,278 @@ void LLTextureFetch::dump() } } +////////////////////////////////////////////////////////////////////////////// + +// cross-thread command methods + +#if HTTP_METRICS +void LLTextureFetch::commandSetRegion(U64 region_handle) +{ + TFReqSetRegion * req = new TFReqSetRegion(region_handle); + + cmdEnqueue(req); +} + +void LLTextureFetch::commandSendMetrics(const std::string & caps_url, + const LLUUID & session_id, + const LLUUID & agent_id, + LLViewerAssetStats * main_stats) +{ + TFReqSendMetrics * req = new TFReqSendMetrics(caps_url, session_id, agent_id, main_stats); + + cmdEnqueue(req); +} + +void LLTextureFetch::commandDataBreak() +{ + // The pedantically correct way to implement this is to create a command + // request object in the above fashion and enqueue it. However, this is + // simple data of an advisorial not operational nature and this case + // of shared-write access is tolerable. + + LLTextureFetch::svMetricsDataBreak = true; +} + +void LLTextureFetch::cmdEnqueue(TFRequest * req) +{ + lockQueue(); + mCommands.push_back(req); + unlockQueue(); + + unpause(); +} + +LLTextureFetch::TFRequest * LLTextureFetch::cmdDequeue() +{ + TFRequest * ret = 0; + + lockQueue(); + if (! mCommands.empty()) + { + ret = mCommands.front(); + mCommands.erase(mCommands.begin()); + } + unlockQueue(); + + return ret; +} + +void LLTextureFetch::cmdDoWork() +{ + if (mDebugPause) + { + return; // debug: don't do any work + } + + TFRequest * req = cmdDequeue(); + if (req) + { + // One request per pass should really be enough for this. + req->doWork(this); + delete req; + } +} + + +////////////////////////////////////////////////////////////////////////////// + +// Private (anonymous) class methods implementing the command scheme. + +namespace +{ + +/** + * Implements the 'Set Region' command. + * + * Thread: Thread1 (TextureFetch) + */ +bool +TFReqSetRegion::doWork(LLTextureFetch *) +{ + LLViewerAssetStatsFF::set_region_thread1(mRegionHandle); + return true; +} + + +TFReqSendMetrics::~TFReqSendMetrics() +{ + delete mMainStats; + mMainStats = 0; +} + + +/** + * Implements the 'Send Metrics' command. Takes over + * ownership of the passed LLViewerAssetStats pointer. + * + * Thread: Thread1 (TextureFetch) + */ +bool +TFReqSendMetrics::doWork(LLTextureFetch * fetcher) +{ + /* + * HTTP POST responder. Doesn't do much but tries to + * detect simple breaks in recording the metrics stream. + * + * The 'volatile' modifiers don't indicate signals, + * mmap'd memory or threads, really. They indicate that + * the referenced data is part of a pseudo-closure for + * this responder rather than being required for correct + * operation. + * + * We don't try very hard with the POST request. We give + * it one shot and that's more-or-less it. With a proper + * refactoring of the LLQueuedThread usage, these POSTs + * could be put in a request object and made more reliable. + */ + class lcl_responder : public LLCurl::Responder + { + public: + lcl_responder(LLTextureFetch * fetcher, + S32 expected_sequence, + volatile const S32 & live_sequence, + volatile bool & reporting_break, + volatile bool & reporting_started) + : LLCurl::Responder(), + mFetcher(fetcher), + mExpectedSequence(expected_sequence), + mLiveSequence(live_sequence), + mReportingBreak(reporting_break), + mReportingStarted(reporting_started) + { + mFetcher->incrCurlPOSTCount(); + } + + ~lcl_responder() + { + mFetcher->decrCurlPOSTCount(); + } + + // virtual + void error(U32 status_num, const std::string & reason) + { + if (mLiveSequence == mExpectedSequence) + { + mReportingBreak = true; + } + LL_WARNS("Texture") << "Break in metrics stream due to POST failure to metrics collection service. Reason: " + << reason << LL_ENDL; + } + + // virtual + void result(const LLSD & content) + { + if (mLiveSequence == mExpectedSequence) + { + mReportingBreak = false; + mReportingStarted = true; + } + } + + private: + LLTextureFetch * mFetcher; + S32 mExpectedSequence; + volatile const S32 & mLiveSequence; + volatile bool & mReportingBreak; + volatile bool & mReportingStarted; + + }; // class lcl_responder + + if (! gViewerAssetStatsThread1) + return true; + + static volatile bool reporting_started(false); + static volatile S32 report_sequence(0); + + // We've taken over ownership of the stats copy at this + // point. Get a working reference to it for merging here + // but leave it in 'this'. Destructor will rid us of it. + LLViewerAssetStats & main_stats = *mMainStats; + + // Merge existing stats into those from main, convert to LLSD + main_stats.merge(*gViewerAssetStatsThread1); + LLSD merged_llsd = main_stats.asLLSD(true); + + // Add some additional meta fields to the content + merged_llsd["session_id"] = mSessionID; + merged_llsd["agent_id"] = mAgentID; + merged_llsd["message"] = "ViewerAssetMetrics"; // Identifies the type of metrics + merged_llsd["sequence"] = report_sequence; // Sequence number + merged_llsd["initial"] = ! reporting_started; // Initial data from viewer + merged_llsd["break"] = LLTextureFetch::svMetricsDataBreak; // Break in data prior to this report + + // Update sequence number + if (S32_MAX == ++report_sequence) + report_sequence = 0; + + // Limit the size of the stats report if necessary. + merged_llsd["truncated"] = truncate_viewer_metrics(10, merged_llsd); + + if (! mCapsURL.empty()) + { + LLCurlRequest::headers_t headers; + fetcher->getCurlRequest().post(mCapsURL, + headers, + merged_llsd, + new lcl_responder(fetcher, + report_sequence, + report_sequence, + LLTextureFetch::svMetricsDataBreak, + reporting_started)); + } + else + { + LLTextureFetch::svMetricsDataBreak = true; + } + + // In QA mode, Metrics submode, log the result for ease of testing + if (fetcher->isQAMode()) + { + LL_INFOS("Textures") << merged_llsd << LL_ENDL; + } + + gViewerAssetStatsThread1->reset(); + + return true; +} + +bool +truncate_viewer_metrics(int max_regions, LLSD & metrics) +{ + static const LLSD::String reg_tag("regions"); + static const LLSD::String duration_tag("duration"); + + LLSD & reg_map(metrics[reg_tag]); + if (reg_map.size() <= max_regions) + { + return false; + } + + // Build map of region hashes ordered by duration + typedef std::multimap reg_ordered_list_t; + reg_ordered_list_t regions_by_duration; + + int ind(0); + LLSD::array_const_iterator it_end(reg_map.endArray()); + for (LLSD::array_const_iterator it(reg_map.beginArray()); it_end != it; ++it, ++ind) + { + LLSD::Real duration = (*it)[duration_tag].asReal(); + regions_by_duration.insert(reg_ordered_list_t::value_type(duration, ind)); + } + + // Build a replacement regions array with the longest-persistence regions + LLSD new_region(LLSD::emptyArray()); + reg_ordered_list_t::const_reverse_iterator it2_end(regions_by_duration.rend()); + reg_ordered_list_t::const_reverse_iterator it2(regions_by_duration.rbegin()); + for (int i(0); i < max_regions && it2_end != it2; ++i, ++it2) + { + new_region.append(reg_map[it2->second]); + } + reg_map = new_region; + + return true; +} + +} // end of anonymous namespace +#endif + diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index e22283f05..6b84ffcd9 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -39,13 +39,17 @@ #include "llworkerthread.h" #include "llcurl.h" #include "lltextureinfo.h" +#include "llapr.h" -class LLViewerImage; +class LLViewerTexture; class LLTextureFetchWorker; class HTTPGetResponder; class LLTextureCache; class LLImageDecodeThread; class LLHost; +#if HTTP_METRICS +class LLViewerAssetStats; +#endif // Interface class class LLTextureFetch : public LLWorkerThread @@ -54,9 +58,11 @@ class LLTextureFetch : public LLWorkerThread friend class HTTPGetResponder; public: - LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded); + LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded, bool qa_mode = false); ~LLTextureFetch(); + class TFRequest; + /*virtual*/ S32 update(U32 max_time_ms); void shutDownTextureCacheThread() ; //called in the main thread after the TextureCacheThread shuts down. void shutDownImageDecodeThread() ; //called in the main thread after the ImageDecodeThread shuts down. @@ -79,32 +85,86 @@ public: S32 getFetchState(const LLUUID& id, F32& decode_progress_p, F32& requested_priority_p, U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p, bool& can_use_http); void dump(); - S32 getNumRequests(); - S32 getNumHTTPRequests(); + S32 getNumRequests() ; + S32 getNumHTTPRequests() ; + U32 getTotalNumHTTPRequests() ; // Public for access by callbacks + S32 getPending(); void lockQueue() { mQueueMutex.lock(); } void unlockQueue() { mQueueMutex.unlock(); } LLTextureFetchWorker* getWorker(const LLUUID& id); LLTextureFetchWorker* getWorkerAfterLock(const LLUUID& id); LLTextureInfo* getTextureInfo() { return &mTextureInfo; } - + +#if HTTP_METRICS + // Commands available to other threads to control metrics gathering operations. + void commandSetRegion(U64 region_handle); + void commandSendMetrics(const std::string & caps_url, + const LLUUID & session_id, + const LLUUID & agent_id, + LLViewerAssetStats * main_stats); + void commandDataBreak(); + + LLCurlRequest & getCurlRequest() { return *mCurlGetRequest; } + + bool isQAMode() const { return mQAMode; } + + // Curl POST counter maintenance + inline void incrCurlPOSTCount() { mCurlPOSTRequestCount++; } + inline void decrCurlPOSTCount() { mCurlPOSTRequestCount--; } +#endif + protected: void addToNetworkQueue(LLTextureFetchWorker* worker); void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel); void addToHTTPQueue(const LLUUID& id); void removeFromHTTPQueue(const LLUUID& id, S32 received_size = 0); void removeRequest(LLTextureFetchWorker* worker, bool cancel); - // Called from worker thread (during doWork) - void processCurlRequests(); + + // Overrides from the LLThread tree + bool runCondition(); private: void sendRequestListToSimulators(); /*virtual*/ void startThread(void); /*virtual*/ void endThread(void); /*virtual*/ void threadedUpdate(void); + void commonUpdate(); +#if HTTP_METRICS + // Metrics command helpers + /** + * Enqueues a command request at the end of the command queue + * and wakes up the thread as needed. + * + * Takes ownership of the TFRequest object. + * + * Method locks the command queue. + */ + void cmdEnqueue(TFRequest *); + + /** + * Returns the first TFRequest object in the command queue or + * NULL if none is present. + * + * Caller acquires ownership of the object and must dispose of it. + * + * Method locks the command queue. + */ + TFRequest * cmdDequeue(); + + /** + * Processes the first command in the queue disposing of the + * request on completion. Successive calls are needed to perform + * additional commands. + * + * Method locks the command queue. + */ + void cmdDoWork(); +#endif + public: LLUUID mDebugID; S32 mDebugCount; @@ -135,6 +195,34 @@ private: LLTextureInfo mTextureInfo; U32 mHTTPTextureBits; + + //debug use + U32 mTotalHTTPRequests ; + +#if HTTP_METRICS + // Out-of-band cross-thread command queue. This command queue + // is logically tied to LLQueuedThread's list of + // QueuedRequest instances and so must be covered by the + // same locks. + typedef std::vector command_queue_t; + command_queue_t mCommands; + + // If true, modifies some behaviors that help with QA tasks. + const bool mQAMode; + + // Count of POST requests outstanding. We maintain the count + // indirectly in the CURL request responder's ctor and dtor and + // use it when determining whether or not to sleep the thread. Can't + // use the LLCurl module's request counter as it isn't thread compatible. + // *NOTE: Don't mix Atomic and static, apr_initialize must be called first. + LLAtomic32 mCurlPOSTRequestCount; + +public: + // A probabilistically-correct indicator that the current + // attempt to log metrics follows a break in the metrics stream + // reporting due to either startup or a problem POSTing data. + static volatile bool svMetricsDataBreak; +#endif }; #endif // LL_LLTEXTUREFETCH_H diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index e3f46a452..2ce0c5ff4 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -51,28 +51,29 @@ #include "lltexturefetch.h" #include "llviewercontrol.h" #include "llviewerobject.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llvovolume.h" +#include "llviewerstats.h" extern F32 texmem_lower_bound_scale; LLTextureView *gTextureView = NULL; LLTextureSizeView *gTextureSizeView = NULL; LLTextureSizeView *gTextureCategoryView = NULL; +#define HIGH_PRIORITY 100000000.f //static -std::set LLTextureView::sDebugImages; +std::set LLTextureView::sDebugImages; //////////////////////////////////////////////////////////////////////////// -static std::string title_string1a("Tex UUID Area DDis(Req) DecodePri(Fetch) [download]"); -static std::string title_string1b("Tex UUID Area DDis(Req) Fetch(DecodePri) [download]"); +static std::string title_string1a("Tex UUID Area DDis(Req) DecodePri(Fetch) [download] pk/max"); +static std::string title_string1b("Tex UUID Area DDis(Req) Fetch(DecodePri) [download] pk/max"); static std::string title_string2("State"); static std::string title_string3("Pkt Bnd"); static std::string title_string4(" W x H (Dis) Mem"); static S32 title_x1 = 0; -static S32 title_x2 = 440; +static S32 title_x2 = 460; static S32 title_x3 = title_x2 + 40; static S32 title_x4 = title_x3 + 50; static S32 texture_bar_height = 8; @@ -82,7 +83,7 @@ static S32 texture_bar_height = 8; class LLTextureBar : public LLView { public: - LLPointer mImagep; + LLPointer mImagep; S32 mHilite; public: @@ -104,8 +105,8 @@ public: { LLTextureBar* bar1p = (LLTextureBar*)i1; LLTextureBar* bar2p = (LLTextureBar*)i2; - LLViewerImage *i1p = bar1p->mImagep; - LLViewerImage *i2p = bar2p->mImagep; + LLViewerFetchedTexture *i1p = bar1p->mImagep; + LLViewerFetchedTexture *i2p = bar2p->mImagep; F32 pri1 = i1p->getDecodePriority(); // i1p->mRequestedDownloadPriority F32 pri2 = i2p->getDecodePriority(); // i2p->mRequestedDownloadPriority if (pri1 > pri2) @@ -123,10 +124,10 @@ public: { LLTextureBar* bar1p = (LLTextureBar*)i1; LLTextureBar* bar2p = (LLTextureBar*)i2; - LLViewerImage *i1p = bar1p->mImagep; - LLViewerImage *i2p = bar2p->mImagep; - U32 pri1 = i1p->mFetchPriority; - U32 pri2 = i2p->mFetchPriority; + LLViewerFetchedTexture *i1p = bar1p->mImagep; + LLViewerFetchedTexture *i2p = bar2p->mImagep; + U32 pri1 = i1p->getFetchPriority() ; + U32 pri2 = i2p->getFetchPriority() ; if (pri1 > pri2) return true; else if (pri2 > pri1) @@ -162,7 +163,7 @@ void LLTextureBar::draw() { color = LLColor4::green4; } - else if (mImagep->getBoostLevel()) + else if (mImagep->getBoostLevel() > LLViewerTexture::BOOST_NONE) { color = LLColor4::magenta; } @@ -181,7 +182,7 @@ void LLTextureBar::draw() // Various numerical stats. std::string tex_str; S32 left, right; - S32 top = 0; + S32 top = -2; S32 bottom = top + 6; LLColor4 clr; @@ -255,13 +256,15 @@ void LLTextureBar::draw() gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); // Draw the progress bar. - S32 bar_width = 100; + S32 bar_width = 125; S32 bar_left = 330; left = bar_left; right = left + bar_width; gGL.color4f(0.f, 0.f, 0.f, 0.75f); gl_rect_2d(left, top, right, bottom); + gGL.color4f(.75f, .75f, .75f, 0.75f); + gl_rect_2d(left, top, right, bottom, false); F32 data_progress = mImagep->mDownloadProgress; @@ -271,7 +274,7 @@ void LLTextureBar::draw() right = left + llfloor(data_progress * (F32)bar_width); if (right > left) { - gGL.color4f(0.f, 0.f, 1.f, 0.75f); + gGL.color4f(.75f, .75f, .75f, 0.75f); gl_rect_2d(left, top, right, bottom); } } @@ -322,10 +325,10 @@ void LLTextureBar::draw() pip_x += pip_width + pip_space; // we don't want to show bind/resident pips for textures using the default texture - if (mImagep->getHasGLTexture()) + if (mImagep->hasGLTexture()) { // Draw the bound pip - last_event = mImagep->sLastFrameTime - mImagep->mLastBindTime; + last_event = mImagep->getTimePassedSinceLastBound(); if (last_event < 1.f) { clr = mImagep->getMissed() ? LLColor4::red : LLColor4::magenta1; @@ -349,7 +352,7 @@ void LLTextureBar::draw() // draw the image size at the end { std::string num_str = llformat("%3dx%3d (%d) %7d", mImagep->getWidth(), mImagep->getHeight(), - mImagep->getDiscardLevel(), mImagep->mTextureMemory); + mImagep->getDiscardLevel(), mImagep->hasGLTexture() ? mImagep->getTextureMemory() : 0); LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, title_x4, getRect().getHeight(), color, LLFontGL::LEFT, LLFontGL::TOP); } @@ -399,15 +402,16 @@ private: void LLGLTexMemBar::draw() { - S32 bound_mem = BYTES_TO_MEGA_BYTES(LLViewerImage::sBoundTextureMemoryInBytes); - S32 max_bound_mem = LLViewerImage::sMaxBoundTextureMemInMegaBytes; - S32 total_mem = BYTES_TO_MEGA_BYTES(LLViewerImage::sTotalTextureMemoryInBytes); - S32 max_total_mem = LLViewerImage::sMaxTotalTextureMemInMegaBytes; - F32 discard_bias = LLViewerImage::sDesiredDiscardBias; + S32 bound_mem = BYTES_TO_MEGA_BYTES(LLViewerTexture::sBoundTextureMemoryInBytes); + S32 max_bound_mem = LLViewerTexture::sMaxBoundTextureMemInMegaBytes; + S32 total_mem = BYTES_TO_MEGA_BYTES(LLViewerTexture::sTotalTextureMemoryInBytes); + S32 max_total_mem = LLViewerTexture::sMaxTotalTextureMemInMegaBytes; + F32 discard_bias = LLViewerTexture::sDesiredDiscardBias; + F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ; + F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ; S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); - F32 cache_usage = ((F32)(LLAppViewer::getTextureCache()->getUsage()/1024))/1024.f; - F32 cache_max_usage = ((F32)(LLAppViewer::getTextureCache()->getMaxUsage()/1024))/1024.f; -// U32 cache_entries = LLAppViewer::getTextureCache()->getEntries(); + F32 total_texture_downloaded = (F32)gTotalTextureBytes / (1024 * 1024); + F32 total_object_downloaded = (F32)gTotalObjectBytes / (1024 * 1024); // U32 cache_max_entries = LLAppViewer::getTextureCache()->getMaxEntries(); //---------------------------------------------------------------------------- @@ -416,13 +420,14 @@ void LLGLTexMemBar::draw() LLColor4 color; std::string text; - text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB", + + text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB", total_mem, max_total_mem, bound_mem, max_bound_mem, - LLImageRaw::sGlobalRawMemory >> 20, discard_bias, - cache_usage, cache_max_usage); + LLImageRaw::sGlobalRawMemory >> 20, discard_bias, + cache_usage, cache_max_usage, total_texture_downloaded, total_object_downloaded); //, cache_entries, cache_max_entries LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, line_height*3, @@ -491,25 +496,29 @@ void LLGLTexMemBar::draw() #endif //---------------------------------------------------------------------------- - text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d RAW:%d HTP:%d BW: %.0f/%.0f", - gImageList.getNumImages(), - LLAppViewer::getTextureFetch()->getNumRequests(), - LLAppViewer::getTextureFetch()->getNumDeletes(), - LLAppViewer::getTextureFetch()->mPacketCount, - LLAppViewer::getTextureFetch()->mBadPacketCount, - LLAppViewer::getTextureCache()->getNumReads(), - LLAppViewer::getTextureCache()->getNumWrites(), + text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d RAW:%d(%d) HTP:%d DEC:%d CRE:%d ", + gTextureList.getNumImages(), + LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(), + LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount, + LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(), LLLFSThread::sLocal->getPending(), - LLAppViewer::getImageDecodeThread()->getPending(), - LLImageRaw::sRawImageCount, + LLAppViewer::getImageDecodeThread()->getPending(), + LLImageRaw::sRawImageCount, LLImageRaw::sRawImageCachedCount, LLAppViewer::getTextureFetch()->getNumHTTPRequests(), - LLAppViewer::getTextureFetch()->getTextureBandwidth(), - gSavedSettings.getF32("ThrottleBandwidthKBPS")); + LLAppViewer::getImageDecodeThread()->getPending(), + gTextureList.mCreateTextureList.size()); LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, line_height*2, text_color, LLFontGL::LEFT, LLFontGL::TOP); - left = 600; + left += LLFontGL::getFontMonospace()->getWidth(text); + F32 bandwidth = LLAppViewer::getTextureFetch()->getTextureBandwidth(); + F32 max_bandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); + color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color; + color[VALPHA] = text_color[VALPHA]; + text = llformat("BW:%.0f/%.0f",bandwidth, max_bandwidth); + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left, line_height*2, + color, LLFontGL::LEFT, LLFontGL::TOP); S32 dx1 = 0; if (LLAppViewer::getTextureFetch()->mDebugPause) @@ -642,7 +651,7 @@ LLTextureView::~LLTextureView() mGLTexMemBar = 0; } -typedef std::pair decode_pair_t; +typedef std::pair decode_pair_t; struct compare_decode_pair { bool operator()(const decode_pair_t& a, const decode_pair_t& b) @@ -672,18 +681,23 @@ void LLTextureView::draw() llinfos << "ID\tMEM\tBOOST\tPRI\tWIDTH\tHEIGHT\tDISCARD" << llendl; } - for (LLViewerImageList::image_priority_list_t::iterator iter = gImageList.mImageList.begin(); - iter != gImageList.mImageList.end(); ) + for (LLViewerTextureList::image_priority_list_t::iterator iter = gTextureList.mImageList.begin(); + iter != gTextureList.mImageList.end(); ) { - LLPointer imagep = *iter++; + LLPointer imagep = *iter++; + if(!imagep->hasFetcher()) + { + continue ; + } S32 cur_discard = imagep->getDiscardLevel(); S32 desired_discard = imagep->mDesiredDiscardLevel; if (mPrintList) { + S32 tex_mem = imagep->hasGLTexture() ? imagep->getTextureMemory() : 0 ; llinfos << imagep->getID() - << "\t" << imagep->mTextureMemory + << "\t" << tex_mem << "\t" << imagep->getBoostLevel() << "\t" << imagep->getDecodePriority() << "\t" << imagep->getWidth() @@ -710,7 +724,6 @@ void LLTextureView::draw() } #endif -#define HIGH_PRIORITY 100000000.f F32 pri; if (mOrderFetch) { @@ -734,8 +747,8 @@ void LLTextureView::draw() { struct f : public LLSelectedTEFunctor { - LLViewerImage* mImage; - f(LLViewerImage* image) : mImage(image) {} + LLViewerFetchedTexture* mImage; + f(LLViewerFetchedTexture* image) : mImage(image) {} virtual bool apply(LLViewerObject* object, S32 te) { return (mImage == object->getTEImage(te)); @@ -795,7 +808,7 @@ void LLTextureView::draw() for (display_list_t::iterator iter = display_image_list.begin(); iter != display_image_list.end(); iter++) { - LLViewerImage* imagep = iter->second; + LLViewerFetchedTexture* imagep = iter->second; S32 hilite = 0; F32 pri = iter->first; if (pri >= 1 * HIGH_PRIORITY) @@ -822,7 +835,7 @@ void LLTextureView::draw() reshape(getRect().getWidth(), getRect().getHeight(), TRUE); /* - count = gImageList.getNumImages(); + count = gTextureList.getNumImages(); std::string info_string; info_string = llformat("Global Info:\nTexture Count: %d", count); mInfoTextp->setText(info_string); @@ -844,7 +857,7 @@ void LLTextureView::draw() } -BOOL LLTextureView::addBar(LLViewerImage *imagep, S32 hilite) +BOOL LLTextureView::addBar(LLViewerFetchedTexture *imagep, S32 hilite) { llassert(imagep); @@ -1072,7 +1085,7 @@ void LLTextureSizeView::drawTextureCategoryGraph() if(mTextureSizeBar.size() == 0) { S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); - mTextureSizeBar.resize(LLImageGL::sTextureMemByCategory.size()) ; + mTextureSizeBar.resize(LLViewerTexture::getTotalNumOfCategories()) ; mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ; for(U32 i = 0 ; i < mTextureSizeBar.size() ; i++) @@ -1085,7 +1098,8 @@ void LLTextureSizeView::drawTextureCategoryGraph() F32 size_bar_scale = drawTextureCategoryDistributionGraph() ; for(U32 i = 0 ; i < mTextureSizeBar.size() ; i++) { - mTextureSizeBar[i]->setTop(LLImageGL::sTextureMemByCategory[i] >> 20, LLImageGL::sTextureMemByCategoryBound[i] >> 20, size_bar_scale) ; + U32 k = LLViewerTexture::getIndexFromCategory(i) ; + mTextureSizeBar[i]->setTop(LLImageGL::sTextureMemByCategory[k] >> 20, LLImageGL::sTextureMemByCategoryBound[k] >> 20, size_bar_scale) ; mTextureSizeBar[i]->draw() ; } LLImageGL::resetCurTexSizebar(); @@ -1146,8 +1160,8 @@ F32 LLTextureSizeView::drawTextureCategoryDistributionGraph() //------- //x axis: size label - static char category[LLViewerImageBoostLevel::MAX_GL_IMAGE_CATEGORY][4] = - {"Non", "Bak", "Av", "Cld", "Scp", "Hi", "Trn", "Slt", "Hud", "Bsf", "UI", "Pvw", "Map", "Mvs", "Slf", "Tbp", "Scr", "Fnt", "Bmp", "Dyn", "Tlc", "Mdi", "ALT", "Oth" } ; + static char category[LLViewerTexture::MAX_GL_IMAGE_CATEGORY][4] = + {"Non", "Bak", "Av", "Cld", "Scp", "Hi", "Trn", "Slt", "Hud", "Bsf", "UI", "Pvw", "Map", "Mvs", "Slf", "Loc", "Scr", "Dyn", "Mdi", "ALT", "Oth" } ; text = llformat("%s", category[0]) ; LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 12, bottom - line_height / 2, diff --git a/indra/newview/lltextureview.h b/indra/newview/lltextureview.h index e95c1526d..221e42b7a 100644 --- a/indra/newview/lltextureview.h +++ b/indra/newview/lltextureview.h @@ -35,7 +35,7 @@ #include "llcontainerview.h" -class LLViewerImage; +class LLViewerFetchedTexture; class LLTextureBar; class LLGLTexMemBar; @@ -52,12 +52,12 @@ public: /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); - static void addDebugImage(LLViewerImage* image) { sDebugImages.insert(image); } - static void removeDebugImage(LLViewerImage* image) { sDebugImages.insert(image); } + static void addDebugImage(LLViewerFetchedTexture* image) { sDebugImages.insert(image); } + static void removeDebugImage(LLViewerFetchedTexture* image) { sDebugImages.insert(image); } static void clearDebugImages() { sDebugImages.clear(); } private: - BOOL addBar(LLViewerImage *image, BOOL hilight = FALSE); + BOOL addBar(LLViewerFetchedTexture *image, BOOL hilight = FALSE); void removeAllBars(); private: @@ -73,7 +73,7 @@ private: LLGLTexMemBar* mGLTexMemBar; public: - static std::set sDebugImages; + static std::set sDebugImages; }; class LLGLTexSizeBar; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 60da41529..c14169ff4 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -57,7 +57,7 @@ #include "lltoolmgr.h" #include "lltrans.h" #include "llui.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" @@ -1172,7 +1172,7 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj, { return; } - LLViewerImage* image = gImageList.getImage(asset_id); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(asset_id); LLViewerStats::getInstance()->incStat(LLViewerStats::ST_EDIT_TEXTURE_COUNT ); S32 num_faces = hit_obj->getNumTEs(); for( S32 face = 0; face < num_faces; face++ ) @@ -1190,7 +1190,7 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj, void LLToolDragAndDrop::dropTextureOneFaceAvatar(LLVOAvatar* avatar, S32 hit_face, LLInventoryItem* item) { if (hit_face == -1) return; - LLViewerImage* image = gImageList.getImage(item->getAssetUUID()); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(item->getAssetUUID()); avatar->userSetOptionalTE( hit_face, image); } @@ -1215,7 +1215,7 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj, return; } // update viewer side image in anticipation of update from simulator - LLViewerImage* image = gImageList.getImage(asset_id); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(asset_id); LLViewerStats::getInstance()->incStat(LLViewerStats::ST_EDIT_TEXTURE_COUNT ); hit_obj->setTEImage(hit_face, image); dialog_refresh_all(); diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp index f7af01870..0aa7ba311 100644 --- a/indra/newview/lltoolgun.cpp +++ b/indra/newview/lltoolgun.cpp @@ -42,7 +42,7 @@ #include "llresmgr.h" #include "llfontgl.h" #include "llui.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewercamera.h" #include "llhudmanager.h" #include "lltoolmgr.h" diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 6e09efa7d..2fb245b37 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -59,7 +59,7 @@ #include "lltoolview.h" #include "llui.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobject.h" #include "llviewerwindow.h" #include "llvoavatar.h" @@ -82,7 +82,7 @@ LLVisualParamHint::LLVisualParamHint( LLViewerVisualParam *param, F32 param_weight) : - LLDynamicTexture(width, height, 3, LLDynamicTexture::ORDER_MIDDLE, TRUE ), + LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ), mNeedsUpdate( TRUE ), mIsVisible( FALSE ), mJointMesh( mesh ), @@ -109,6 +109,12 @@ LLVisualParamHint::~LLVisualParamHint() LLVisualParamHint::sInstances.erase( this ); } +//virtual +S8 LLVisualParamHint::getType() const +{ + return LLViewerDynamicTexture::LL_VISUAL_PARAM_HINT ; +} + //----------------------------------------------------------------------------- // static // requestHintUpdates() @@ -156,7 +162,7 @@ void LLVisualParamHint::preRender(BOOL clear_depth) avatarp->updateGeometry(avatarp->mDrawable); avatarp->updateLOD(); - LLDynamicTexture::preRender(clear_depth); + LLViewerDynamicTexture::preRender(clear_depth); } //----------------------------------------------------------------------------- @@ -170,7 +176,7 @@ BOOL LLVisualParamHint::render() glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); - glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f); + glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -178,7 +184,7 @@ BOOL LLVisualParamHint::render() LLGLSUIDefault gls_ui; //LLGLState::verify(TRUE); - mBackgroundp->draw(0, 0, mWidth, mHeight); + mBackgroundp->draw(0, 0, mFullWidth, mFullHeight); glMatrixMode(GL_PROJECTION); glPopMatrix(); @@ -225,13 +231,13 @@ BOOL LLVisualParamHint::render() gGL.flush(); - LLViewerCamera::getInstance()->setAspect((F32)mWidth / (F32)mHeight); + LLViewerCamera::getInstance()->setAspect((F32)mFullWidth / (F32)mFullHeight); LLViewerCamera::getInstance()->setOriginAndLookAt( camera_pos, // camera LLVector3(0.f, 0.f, 1.f), // up target_pos ); // point of interest - LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE); + LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); if (avatarp->mDrawable.notNull()) { @@ -245,7 +251,7 @@ BOOL LLVisualParamHint::render() } avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight); gGL.color4f(1,1,1,1); - mTexture->setGLTextureCreated(true); + mGLTexturep->setGLTextureCreated(true); return TRUE; } @@ -257,7 +263,7 @@ void LLVisualParamHint::draw() { if (!mIsVisible) return; - gGL.getTexUnit(0)->bind(getTexture()); + gGL.getTexUnit(0)->bind(this); gGL.color4f(1.f, 1.f, 1.f, 1.f); @@ -265,13 +271,13 @@ void LLVisualParamHint::draw() gGL.begin(LLRender::QUADS); { gGL.texCoord2i(0, 1); - gGL.vertex2i(0, mHeight); + gGL.vertex2i(0, mFullHeight); gGL.texCoord2i(0, 0); gGL.vertex2i(0, 0); gGL.texCoord2i(1, 0); - gGL.vertex2i(mWidth, 0); + gGL.vertex2i(mFullWidth, 0); gGL.texCoord2i(1, 1); - gGL.vertex2i(mWidth, mHeight); + gGL.vertex2i(mFullWidth, mFullHeight); } gGL.end(); @@ -281,10 +287,16 @@ void LLVisualParamHint::draw() //----------------------------------------------------------------------------- // LLVisualParamReset() //----------------------------------------------------------------------------- -LLVisualParamReset::LLVisualParamReset() : LLDynamicTexture(1, 1, 1, ORDER_RESET, FALSE) +LLVisualParamReset::LLVisualParamReset() : LLViewerDynamicTexture(1, 1, 1, ORDER_RESET, FALSE) { } +//virtual +S8 LLVisualParamReset::getType() const +{ + return LLViewerDynamicTexture::LL_VISUAL_PARAM_RESET ; +} + //----------------------------------------------------------------------------- // render() //----------------------------------------------------------------------------- diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h index 11de8160e..7b2b794df 100644 --- a/indra/newview/lltoolmorph.h +++ b/indra/newview/lltoolmorph.h @@ -42,7 +42,7 @@ #include "llstrider.h" #include "llviewervisualparam.h" #include "llframetimer.h" -#include "llviewerimage.h" +#include "llviewertexture.h" class LLViewerJointMesh; class LLPolyMesh; @@ -51,9 +51,10 @@ class LLViewerObject; //----------------------------------------------------------------------------- // LLVisualParamHint //----------------------------------------------------------------------------- -class LLVisualParamHint -: public LLDynamicTexture +class LLVisualParamHint : public LLViewerDynamicTexture { +protected: + virtual ~LLVisualParamHint(); public: LLVisualParamHint( S32 pos_x, S32 pos_y, @@ -61,7 +62,8 @@ public: LLViewerJointMesh *mesh, LLViewerVisualParam *param, F32 param_weight); - virtual ~LLVisualParamHint(); + + /*virtual*/ S8 getType() const ; BOOL needsRender(); void preRender(BOOL clear_depth); @@ -99,11 +101,14 @@ protected: }; // this class resets avatar data at the end of an update cycle -class LLVisualParamReset : public LLDynamicTexture +class LLVisualParamReset : public LLViewerDynamicTexture { +protected: + /*virtual */ ~LLVisualParamReset(){} public: LLVisualParamReset(); /*virtual */ BOOL render(); + /*virtual*/ S8 getType() const ; static BOOL sDirty; }; diff --git a/indra/newview/lltoolpipette.cpp b/indra/newview/lltoolpipette.cpp old mode 100755 new mode 100644 diff --git a/indra/newview/lltoolpipette.h b/indra/newview/lltoolpipette.h old mode 100755 new mode 100644 diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index bb3ec8e7d..dbb0d999e 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -752,10 +752,10 @@ void LLTracker::setLandmarkVisited() LLInventoryItem* i = gInventory.getItem( mTrackedLandmarkItemID ); LLViewerInventoryItem* item = (LLViewerInventoryItem*)i; if ( item - && !(item->getFlags()&LLInventoryItem::II_FLAGS_LANDMARK_VISITED)) + && !(item->getFlags()&LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED)) { U32 flags = item->getFlags(); - flags |= LLInventoryItem::II_FLAGS_LANDMARK_VISITED; + flags |= LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED; item->setFlags(flags); LLMessageSystem* msg = gMessageSystem; msg->newMessage("ChangeInventoryItemFlags"); @@ -808,7 +808,7 @@ void LLTracker::cacheLandmarkPosition() mLandmarkHasBeenVisited = FALSE; LLInventoryItem* item = gInventory.getItem(mTrackedLandmarkItemID); if ( item - && item->getFlags()&LLInventoryItem::II_FLAGS_LANDMARK_VISITED) + && item->getFlags()&LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED) { mLandmarkHasBeenVisited = TRUE; } diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index d4bb75913..501dfe29b 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -36,6 +36,7 @@ #include "lltranslate.h" #include "llui.h" #include "llversionviewer.h" +#include "llweb.h" // #include "llviewercontrol.h" @@ -79,7 +80,7 @@ void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std //static void LLTranslate::getTranslateUrl(std::string &translateUrl, const std::string &fromLang, const std::string &toLang, const std::string &mesg) { - std::string escaped_mesg = curl_escape(mesg.c_str(), mesg.size()); + std::string escaped_mesg = LLWeb::curlEscape(mesg); translateUrl = m_GoogleURL + escaped_mesg + m_GoogleLangSpec diff --git a/indra/newview/llurlhistory.cpp b/indra/newview/llurlhistory.cpp index 6930d8ac2..a93cc2ff7 100644 --- a/indra/newview/llurlhistory.cpp +++ b/indra/newview/llurlhistory.cpp @@ -74,7 +74,7 @@ bool LLURLHistory::loadFile(const std::string& filename) // static bool LLURLHistory::saveFile(const std::string& filename) { - std::string temp_str = gDirUtilp->getLindenUserDir(); + std::string temp_str = gDirUtilp->getLindenUserDir(true); if( temp_str.empty() ) { llwarns << "Can't save. No user directory set." << llendl; diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 8adbde0d5..23c9535fa 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -50,7 +50,7 @@ #include "llpanelinput.h" #include "llsky.h" #include "llvieweraudio.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerthrottle.h" #include "llviewerwindow.h" #include "llvoavatar.h" @@ -75,15 +75,16 @@ #include "llnetmap.h" #include "llrender.h" #include "llfloaterchat.h" +#include "aithreadsafe.h" #include "llviewerobjectlist.h" +#include "lldrawpoolbump.h" #include "emeraldboobutils.h" #ifdef TOGGLE_HACKED_GODLIKE_VIEWER BOOL gHackGodmode = FALSE; #endif - -std::map gSettings; +AITHREADSAFE(settings_map_type, gSettings,); LLControlGroup gSavedSettings; // saved at end of session LLControlGroup gSavedPerAccountSettings; // saved at end of session LLControlGroup gColors; // read-only @@ -121,6 +122,17 @@ static bool handleTerrainDetailChanged(const LLSD& newvalue) static bool handleSetShaderChanged(const LLSD& newvalue) { + // changing shader level may invalidate existing cached bump maps, as the shader type determines the format of the bump map it expects - clear and repopulate the bump cache + gBumpImageList.destroyGL(); + gBumpImageList.restoreGL(); + + // Changing shader also changes the terrain detail to high, reflect that change here + if (newvalue.asBoolean()) + { + // shaders enabled, set terrain detail to high + gSavedSettings.setS32("RenderTerrainDetail", 1); + } + // else, leave terrain detail as is LLViewerShaderMgr::instance()->setShaders(); return true; } @@ -184,6 +196,13 @@ static bool handleReleaseGLBufferChanged(const LLSD& newvalue) return true; } +static bool handleAnisotropicChanged(const LLSD& newvalue) +{ + LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean(); + LLImageGL::dirtyTexOptions(); + return true; +} + static bool handleVolumeLODChanged(const LLSD& newvalue) { LLVOVolume::sLODFactor = (F32) newvalue.asReal(); @@ -197,6 +216,12 @@ static bool handleAvatarLODChanged(const LLSD& newvalue) return true; } +static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue) +{ + LLVOAvatar::sLODFactor = (F32) newvalue.asReal(); + return true; +} + static bool handleAvatarMaxVisibleChanged(const LLSD& newvalue) { LLVOAvatar::sMaxVisible = (U32) newvalue.asInteger(); @@ -262,7 +287,7 @@ static bool handleMaxPartCountChanged(const LLSD& newvalue) static bool handleVideoMemoryChanged(const LLSD& newvalue) { - gImageList.updateMaxResidentTexMem(newvalue.asInteger()); + gTextureList.updateMaxResidentTexMem(newvalue.asInteger()); return true; } @@ -549,6 +574,8 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1)); gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); + gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _1)); + gSavedSettings.getControl("RenderAnisotropic")->getSignal()->connect(boost::bind(&handleAnisotropicChanged, _1)); gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _1)); gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); gSavedSettings.getControl("EnableRippleWater")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); @@ -562,6 +589,7 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _1)); gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _1)); gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _1)); + gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _1)); gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _1)); gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _1)); gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _1)); diff --git a/indra/newview/llviewercontrol.h b/indra/newview/llviewercontrol.h index 9c2e112c9..8835146ad 100644 --- a/indra/newview/llviewercontrol.h +++ b/indra/newview/llviewercontrol.h @@ -36,6 +36,7 @@ #include #include "llcontrol.h" #include "lluictrl.h" +#include "aithreadsafe.h" // Enabled this definition to compile a 'hacked' viewer that // allows a hacked godmode to be toggled on and off. @@ -48,7 +49,8 @@ extern BOOL gHackGodmode; //setting variables are declared in this function void settings_setup_listeners(); -extern std::map gSettings; +typedef std::map settings_map_type; +extern AIThreadSafe gSettings; // for the graphics settings void create_graphics_group(LLControlGroup& group); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 4998a7f9e..ab8dc18f8 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -73,7 +73,7 @@ #include "llviewershadermgr.h" #include "llfasttimer.h" #include "llfloatertools.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llfocusmgr.h" #include "llcubemap.h" #include "llviewerregion.h" @@ -87,9 +87,7 @@ #include "rlvhandler.h" // [/RLVa:KB] -extern LLPointer gStartImageGL; - -LLPointer gDisconnectedImagep = NULL; +LLPointer gDisconnectedImagep = NULL; // used to toggle renderer back on after teleport const F32 TELEPORT_RENDER_DELAY = 20.f; // Max time a teleport is allowed to take before we raise the curtain @@ -105,6 +103,7 @@ BOOL gForceRenderLandFence = FALSE; BOOL gDisplaySwapBuffers = FALSE; BOOL gDepthDirty = FALSE; BOOL gResizeScreenTexture = FALSE; +BOOL gWindowResized = FALSE; BOOL gSnapshot = FALSE; U32 gRecentFrameCount = 0; // number of 'recent' frames @@ -114,7 +113,7 @@ LLFrameTimer gRecentMemoryTime; // Rendering stuff void pre_show_depth_buffer(); void post_show_depth_buffer(); -void render_ui(F32 zoom_factor = 1.f, int subfield = 0); +void render_ui(F32 zoom_factor = 1.f, int subfield = 0, bool tiling = false); void render_hud_attachments(); void render_ui_3d(); void render_ui_2d(); @@ -141,7 +140,7 @@ void display_startup() if (frame_count++ > 1) // make sure we have rendered a frame first { - LLDynamicTexture::updateAllInstances(); + LLViewerDynamicTexture::updateAllInstances(); } LLGLState::checkStates(); @@ -167,11 +166,7 @@ void display_startup() glClear(GL_DEPTH_BUFFER_BIT); } -#if SHY_MOD //screenshot improvement void display_update_camera(bool tiling=false) -#else //shy_mod -void display_update_camera() -#endif //ignore { llpushcallstacks ; // TODO: cut draw distance down if customizing avatar? @@ -180,7 +175,6 @@ void display_update_camera() // Cut draw distance in half when customizing avatar, // but on the viewer only. F32 final_far = gAgent.mDrawDistance; -#if SHY_MOD //screenshot improvement if(tiling) //Don't animate clouds and water if tiling! { LLViewerCamera::getInstance()->setFar(final_far); @@ -188,7 +182,6 @@ void display_update_camera() LLWorld::getInstance()->setLandFarClip(final_far); return; } -#endif //shy_mod if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode()) { final_far *= 0.5f; @@ -219,6 +212,7 @@ void display_stats() { F32 fps = gRecentFrameCount / fps_log_freq; llinfos << llformat("FPS: %.02f", fps) << llendl; + llinfos << llformat("VBO: %d glVBO: %d", LLVertexBuffer::sCount, LLVertexBuffer::sGLCount) << llendl; gRecentFrameCount = 0; gRecentFPSTime.reset(); } @@ -233,18 +227,26 @@ void display_stats() } // Paint the display! -#if SHY_MOD // screenshot improvement -void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot, BOOL tiling) -#else //shy_mod -void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) -#endif //ignore +void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot, bool tiling) { LLFastTimer t(LLFastTimer::FTM_RENDER); - if (LLPipeline::sRenderDeferred) + if (gWindowResized) + { //skip render on frames where window has been resized + gGL.flush(); + glClear(GL_COLOR_BUFFER_BIT); + gViewerWindow->mWindow->swapBuffers(); + gPipeline.resizeScreenTexture(); + gResizeScreenTexture = FALSE; + gWindowResized = FALSE; + return; + } + + //Nope + /*if (LLPipeline::sRenderDeferred) { //hack to make sky show up in deferred snapshots for_snapshot = FALSE; - } + }*/ if (LLPipeline::sRenderFrameTest) { @@ -409,7 +411,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) gAgent.setTeleportState( LLAgent::TELEPORT_ARRIVING ); gAgent.setTeleportMessage( LLAgent::sTeleportProgressMessages["arriving"]); - gImageList.mForceResetTextureStats = TRUE; + gTextureList.mForceResetTextureStats = TRUE; if(!gSavedSettings.getBOOL("AscentDisableTeleportScreens"))gAgent.resetView(TRUE, TRUE); break; @@ -576,7 +578,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) { LLAppViewer::instance()->pingMainloopTimeout("Display:DynamicTextures"); LLFastTimer t(LLFastTimer::FTM_UPDATE_TEXTURES); - if (LLDynamicTexture::updateAllInstances()) + if (LLViewerDynamicTexture::updateAllInstances()) { gGL.setColorMask(true, true); glClear(GL_DEPTH_BUFFER_BIT); @@ -603,11 +605,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLGLNamePool::upkeepPools(); stop_glerror(); -#if SHY_MOD //screenshot improvement display_update_camera(tiling); -#else //shy_mod - display_update_camera(); -#endif //ignore stop_glerror(); // *TODO: merge these two methods @@ -680,7 +678,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLGLState::checkTextureChannels(); LLGLState::checkClientArrays(); - BOOL to_texture = gPipeline.canUseVertexShaders() && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderGlow && !gSnapshot)); + BOOL to_texture = gPipeline.canUseVertexShaders() && LLPipeline::sRenderGlow; LLAppViewer::instance()->pingMainloopTimeout("Display:Swap"); @@ -703,7 +701,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLGLState::checkTextureChannels(); LLGLState::checkClientArrays(); - if (!for_snapshot) + if (!for_snapshot || LLPipeline::sRenderDeferred) { if (gFrameCount > 1) { //for some reason, ATI 4800 series will error out if you @@ -739,11 +737,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } -#if SHY_MOD // screenshot improvement if (!for_snapshot || tiling) -#else //shy_mod - if (!for_snapshot) -#endif //ignore { LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery"); gPipeline.generateWaterReflection(*LLViewerCamera::getInstance()); @@ -764,14 +758,14 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) { LLFastTimer t(LLFastTimer::FTM_IMAGE_UPDATE); - LLViewerImage::updateClass(LLViewerCamera::getInstance()->getVelocityStat()->getMean(), + LLViewerTexture::updateClass(LLViewerCamera::getInstance()->getVelocityStat()->getMean(), LLViewerCamera::getInstance()->getAngularVelocityStat()->getMean()); - gBumpImageList.updateImages(); // must be called before gImageList version so that it's textures are thrown out first. + gBumpImageList.updateImages(); // must be called before gTextureList version so that it's textures are thrown out first. F32 max_image_decode_time = 0.050f*gFrameIntervalSeconds; // 50 ms/second decode time max_image_decode_time = llclamp(max_image_decode_time, 0.001f, 0.005f ); // min 1ms/frame, max 5ms/frame) - gImageList.updateImages(max_image_decode_time); + gTextureList.updateImages(max_image_decode_time); //remove dead textures from GL LLImageGL::deleteDeadTextures(); @@ -878,7 +872,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) glClearColor(0,0,0,0); gPipeline.mDeferredScreen.clear(); } - else + else if(!tiling) { gPipeline.mScreen.bindTarget(); gPipeline.mScreen.clear(); @@ -922,7 +916,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) { gPipeline.mDeferredScreen.flush(); } - else + else if(!tiling) { gPipeline.mScreen.flush(); } @@ -1136,7 +1130,7 @@ BOOL setup_hud_matrices(const LLRect& screen_region) } -void render_ui(F32 zoom_factor, int subfield) +void render_ui(F32 zoom_factor, int subfield, bool tiling) { LLGLState::checkStates(); @@ -1151,7 +1145,7 @@ void render_ui(F32 zoom_factor, int subfield) if (to_texture) { - gPipeline.renderBloom(gSnapshot, zoom_factor, subfield); + gPipeline.renderBloom(gSnapshot, zoom_factor, subfield, tiling); gPipeline.mScreen.flush(); //blit, etc. } /// We copy the frame buffer straight into a texture here, @@ -1371,12 +1365,6 @@ void render_disconnected_background() gGL.color4f(1,1,1,1); if (!gDisconnectedImagep && gDisconnected) { - //Default black image. - gDisconnectedImagep = new LLImageGL( FALSE ); - LLPointer raw = new LLImageRaw(1,1,3); - raw->clear(); - gDisconnectedImagep->createGLTexture(0, raw, 0, TRUE, LLViewerImageBoostLevel::OTHER); - llinfos << "Loading last bitmap..." << llendl; std::string temp_str; @@ -1388,7 +1376,8 @@ void render_disconnected_background() //llinfos << "Bitmap load failed" << llendl; return; } - + + LLPointer raw = new LLImageRaw; if (!image_bmp->decode(raw, 0.0f)) { llinfos << "Bitmap decode failed" << llendl; @@ -1413,8 +1402,8 @@ void render_disconnected_background() raw->expandToPowerOfTwo(); - gDisconnectedImagep->createGLTexture(0, raw, 0, TRUE, LLViewerImageBoostLevel::OTHER); - gStartImageGL = gDisconnectedImagep; + gDisconnectedImagep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE ); + gStartTexture = gDisconnectedImagep; gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } diff --git a/indra/newview/llviewerdisplay.h b/indra/newview/llviewerdisplay.h index 5c46a07a9..50a006094 100644 --- a/indra/newview/llviewerdisplay.h +++ b/indra/newview/llviewerdisplay.h @@ -38,11 +38,7 @@ class LLPostProcess; void display_startup(); void display_cleanup(); -#if SHY_MOD // screenshot improvement -void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE, BOOL tiling = FALSE); -#else //shy_mod -void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE); -#endif //ignore +void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE, bool tiling = false); extern BOOL gDisplaySwapBuffers; extern BOOL gDepthDirty; @@ -50,6 +46,7 @@ extern BOOL gTeleportDisplay; extern LLFrameTimer gTeleportDisplayTimer; extern BOOL gForceRenderLandFence; extern BOOL gResizeScreenTexture; +extern BOOL gWindowResized; extern F32 gSavedDrawDistance; #endif // LL_LLVIEWERDISPLAY_H diff --git a/indra/newview/llviewerimage.cpp b/indra/newview/llviewerimage.cpp deleted file mode 100644 index 705265274..000000000 --- a/indra/newview/llviewerimage.cpp +++ /dev/null @@ -1,1910 +0,0 @@ -/** - * @file llviewerimage.cpp - * @brief Object which handles a received image (and associated texture(s)) - * - * $LicenseInfo:firstyear=2000&license=viewergpl$ - * - * Copyright (c) 2000-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llviewerimage.h" - -// Library includes -#include "imageids.h" -#include "llmath.h" -#include "llerror.h" -#include "llgl.h" -#include "llglheaders.h" -#include "llhost.h" -#include "llimage.h" -#include "llimagebmp.h" -#include "llimagej2c.h" -#include "llimagetga.h" -#include "llmemtype.h" -#include "llstl.h" -#include "llvfile.h" -#include "llvfs.h" -#include "message.h" -#include "lltimer.h" - -// viewer includes -#include "lldrawpool.h" -#include "lltexturefetch.h" -#include "llviewerimagelist.h" -#include "llviewercontrol.h" -#include "pipeline.h" -#include "llappviewer.h" -#include "llface.h" -#include "llviewercamera.h" -#include "llvovolume.h" - -// -#include "llimagemetadatareader.h" -#include "lltexturecache.h" -// -/////////////////////////////////////////////////////////////////////////////// - -// statics -LLPointer LLViewerImage::sMissingAssetImagep = NULL; -LLPointer LLViewerImage::sWhiteImagep = NULL; -LLPointer LLViewerImage::sDefaultImagep = NULL; -LLPointer LLViewerImage::sSmokeImagep = NULL; -LLPointer LLViewerImage::sNullImagep = NULL; - -S32 LLViewerImage::sImageCount = 0; -S32 LLViewerImage::sRawCount = 0; -S32 LLViewerImage::sAuxCount = 0; -LLTimer LLViewerImage::sEvaluationTimer; -S8 LLViewerImage::sCameraMovingDiscardBias = 0 ; -F32 LLViewerImage::sDesiredDiscardBias = 0.f; -static F32 sDesiredDiscardBiasMin = -2.0f; // -max number of levels to improve image quality by -static F32 sDesiredDiscardBiasMax = 1.5f; // max number of levels to reduce image quality by -F32 LLViewerImage::sDesiredDiscardScale = 1.1f; -S32 LLViewerImage::sBoundTextureMemoryInBytes = 0; -S32 LLViewerImage::sTotalTextureMemoryInBytes = 0; -S32 LLViewerImage::sMaxBoundTextureMemInMegaBytes = 0; -S32 LLViewerImage::sMaxTotalTextureMemInMegaBytes = 0; -S32 LLViewerImage::sMaxDesiredTextureMemInBytes = 0 ; -BOOL LLViewerImage::sDontLoadVolumeTextures = FALSE; - -S32 LLViewerImage::sMaxSculptRez = 128 ; //max sculpt image size -const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64 ; -const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerImage::sMaxSculptRez * LLViewerImage::sMaxSculptRez ; -const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128 ; -S32 LLViewerImage::sMinLargeImageSize = 65536 ; //256 * 256. -S32 LLViewerImage::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA ; -BOOL LLViewerImage::sFreezeImageScalingDown = FALSE ; -//debug use -S32 LLViewerImage::sLLViewerImageCount = 0 ; - -// static -void LLViewerImage::initClass() -{ - sNullImagep = new LLImageGL(1,1,3,TRUE); - LLPointer raw = new LLImageRaw(1,1,3); - raw->clear(0x77, 0x77, 0x77, 0xFF); - sNullImagep->createGLTexture(0, raw, 0, TRUE, LLViewerImageBoostLevel::OTHER); - -#if 1 - LLPointer imagep = new LLViewerImage(IMG_DEFAULT); - sDefaultImagep = imagep; - const S32 dim = 128; - LLPointer image_raw = new LLImageRaw(dim,dim,3); - U8* data = image_raw->getData(); - for (S32 i = 0; i=(dim-border) || j>=(dim-border)) - { - *data++ = 0xff; - *data++ = 0xff; - *data++ = 0xff; - } - else -#endif - { - *data++ = 0x7f; - *data++ = 0x7f; - *data++ = 0x7f; - } - } - } - imagep->createGLTexture(0, image_raw, 0, TRUE, LLViewerImageBoostLevel::OTHER); - image_raw = NULL; - gImageList.addImage(imagep); - imagep->dontDiscard(); -#else - sDefaultImagep = gImageList.getImage(IMG_DEFAULT, TRUE, TRUE); -#endif - sSmokeImagep = gImageList.getImage(IMG_SMOKE, TRUE, TRUE); - sSmokeImagep->setNoDelete() ; - - if(gAuditTexture) - { - LLImageGL::setHighlightTexture(LLViewerImageBoostLevel::OTHER) ; - } -} - -// static -void LLViewerImage::cleanupClass() -{ - stop_glerror(); - LLImageGL::cleanupClass() ; - - sNullImagep = NULL; - sDefaultImagep = NULL; - sSmokeImagep = NULL; - sMissingAssetImagep = NULL; - sWhiteImagep = NULL; -} - -// tuning params -const F32 discard_bias_delta = .05f; -const F32 discard_delta_time = 0.5f; -const S32 min_non_tex_system_mem = (128<<20); // 128 MB -// non-const (used externally -F32 texmem_lower_bound_scale = 0.85f; -F32 texmem_middle_bound_scale = 0.925f; - -//static -void LLViewerImage::updateClass(const F32 velocity, const F32 angular_velocity) -{ - llpushcallstacks ; - sBoundTextureMemoryInBytes = LLImageGL::sBoundTextureMemoryInBytes;//in bytes - sTotalTextureMemoryInBytes = LLImageGL::sGlobalTextureMemoryInBytes;//in bytes - sMaxBoundTextureMemInMegaBytes = gImageList.getMaxResidentTexMem();//in MB - sMaxTotalTextureMemInMegaBytes = gImageList.getMaxTotalTextureMem() ;//in MB - sMaxDesiredTextureMemInBytes = MEGA_BYTES_TO_BYTES(sMaxTotalTextureMemInMegaBytes) ; //in Bytes, by default and when total used texture memory is small. - - if (BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) >= sMaxBoundTextureMemInMegaBytes || - BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) >= sMaxTotalTextureMemInMegaBytes) - { - //when texture memory overflows, lower down the threashold to release the textures more aggressively. - sMaxDesiredTextureMemInBytes = llmin((S32)(sMaxDesiredTextureMemInBytes * 0.75f) , MEGA_BYTES_TO_BYTES(MAX_VIDEO_RAM_IN_MEGA_BYTES)) ;//512 MB - - // If we are using more texture memory than we should, - // scale up the desired discard level - if (sEvaluationTimer.getElapsedTimeF32() > discard_delta_time) - { - sDesiredDiscardBias += discard_bias_delta; - sEvaluationTimer.reset(); - } - } - else if (sDesiredDiscardBias > 0.0f && - BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < sMaxBoundTextureMemInMegaBytes * texmem_lower_bound_scale && - BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < sMaxTotalTextureMemInMegaBytes * texmem_lower_bound_scale) - { - // If we are using less texture memory than we should, - // scale down the desired discard level - if (sEvaluationTimer.getElapsedTimeF32() > discard_delta_time) - { - sDesiredDiscardBias -= discard_bias_delta; - sEvaluationTimer.reset(); - } - } - sDesiredDiscardBias = llclamp(sDesiredDiscardBias, sDesiredDiscardBiasMin, sDesiredDiscardBiasMax); - - F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed() ; - F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed(); - sCameraMovingDiscardBias = (S8)llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1) ; - - LLViewerImage::sFreezeImageScalingDown = (BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < 0.75f * sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale) && - (BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < 0.75f * sMaxTotalTextureMemInMegaBytes * texmem_middle_bound_scale) ; -} - -// static -LLViewerImage* LLViewerImage::getImage(const LLUUID& image_id) -{ - return gImageList.getImage(image_id); -} - -//---------------------------------------------------------------------------- - -const U32 LLViewerImage::sCurrentFileVersion = 1; - -LLViewerImage::LLViewerImage(const LLUUID& id, const LLHost& host, BOOL usemipmaps) - : LLImageGL(usemipmaps), - mID(id), - mTargetHost(host) -{ - init(true); - sImageCount++; - if (host != LLHost::invalid) - { - mCanUseHTTP = false; // this is a baked texture - } -} - -LLViewerImage::LLViewerImage(const std::string& url, const LLUUID& id, BOOL usemipmaps) - : LLImageGL(usemipmaps), - mID(id), - mUrl(url) -{ - init(true); - sImageCount++; -} - - -LLViewerImage::LLViewerImage(const U32 width, const U32 height, const U8 components, BOOL usemipmaps) - : LLImageGL(width, height, components, usemipmaps) -{ - init(true); - // Create an empty image of the specified size and width - mID.generate(); - mFullyLoaded = TRUE; - sImageCount++; -} - -LLViewerImage::LLViewerImage(const LLImageRaw* raw, BOOL usemipmaps) - : LLImageGL(raw, usemipmaps) -{ - init(true); - // Create an empty image of the specified size and width - mID.generate(); - mFullyLoaded = TRUE; - sImageCount++; -} - -void LLViewerImage::init(bool firstinit) -{ - mFullWidth = 0; - mFullHeight = 0; - mOrigWidth = 0; - mOrigHeight = 0; - mNeedsAux = FALSE; - mTexelsPerImage = 64.f*64.f; - mMaxVirtualSize = 0.f; - mDiscardVirtualSize = 0.f; - mRequestedDiscardLevel = -1; - mRequestedDownloadPriority = 0.f; - mFullyLoaded = FALSE; - mDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; - mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; - mCalculatedDiscardLevel = -1.f; - - mDecodingAux = FALSE; - - mKnownDrawWidth = 0; - mKnownDrawHeight = 0; - - if (firstinit) - { - mDecodePriority = 0.f; - mInImageList = 0; - } - mIsMediaTexture = FALSE; - - mBoostLevel = LLViewerImageBoostLevel::BOOST_NONE; - - // Only set mIsMissingAsset true when we know for certain that the database - // does not contain this image. - mIsMissingAsset = FALSE; - - mNeedsCreateTexture = FALSE; - - mIsRawImageValid = FALSE; - mRawDiscardLevel = INVALID_DISCARD_LEVEL; - mMinDiscardLevel = 0; - - mHasFetcher = FALSE; - mIsFetching = FALSE; - mFetchState = 0; - mFetchPriority = 0; - mDownloadProgress = 0.f; - mFetchDeltaTime = 999999.f; - mDecodeFrame = 0; - mVisibleFrame = 0; - mForSculpt = FALSE ; - mCachedRawImage = NULL ; - mCachedRawDiscardLevel = -1 ; - mCachedRawImageReady = FALSE ; - mNeedsResetMaxVirtualSize = FALSE ; - - mForceToSaveRawImage = FALSE ; - mSavedRawDiscardLevel = -1 ; - mDesiredSavedRawDiscardLevel = -1 ; - - mCanUseHTTP = true; //default on if cap/settings allows us - - mNumFaces = 0 ; - mNumVolumes = 0; - mFaceList.clear() ; - mVolumeList.clear(); -} - -// virtual -void LLViewerImage::dump() -{ - LLImageGL::dump(); - - llinfos << "LLViewerImage" - << " mID " << mID - << " mIsMissingAsset " << (S32)mIsMissingAsset - << " mFullWidth " << mFullWidth - << " mFullHeight " << mFullHeight - << " mOrigWidth" << mOrigWidth - << " mOrigHeight" << mOrigHeight - << llendl; -} - -/////////////////////////////////////////////////////////////////////////////// - -LLViewerImage::~LLViewerImage() -{ - if (mHasFetcher) - { - LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); - } - // Explicitly call LLViewerImage::cleanup since we're in a destructor and cleanup is virtual - LLViewerImage::cleanup(); - sImageCount--; -} - - -/////////////////////////////////////////////////////////////////////////////// - -void LLViewerImage::cleanup() -{ - mFaceList.clear() ; - mVolumeList.clear(); - for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); - iter != mLoadedCallbackList.end(); ) - { - LLLoadedCallbackEntry *entryp = *iter++; - // We never finished loading the image. Indicate failure. - // Note: this allows mLoadedCallbackUserData to be cleaned up. - entryp->mCallback( FALSE, this, NULL, NULL, 0, TRUE, entryp->mUserData ); - delete entryp; - } - mLoadedCallbackList.clear(); - mNeedsAux = FALSE; - - // Clean up image data - destroyRawImage(); - mCachedRawImage = NULL ; - mCachedRawDiscardLevel = -1 ; - mCachedRawImageReady = FALSE ; - // LLImageGL::cleanup will get called more than once when this is used in the destructor. - LLImageGL::cleanup(); -} - -void LLViewerImage::reinit(BOOL usemipmaps /* = TRUE */) -{ - LLViewerImage::cleanup(); - LLImageGL::init(usemipmaps); - init(false); - setSize(0,0,0); -} - -/////////////////////////////////////////////////////////////////////////////// -// ONLY called from LLViewerImageList -void LLViewerImage::destroyTexture() -{ - if(sGlobalTextureMemoryInBytes < sMaxDesiredTextureMemInBytes)//not ready to release unused memory. - { - return ; - } - if (mNeedsCreateTexture)//return if in the process of generating a new texture. - { - return ; - } - - destroyGLTexture() ; -} - -void LLViewerImage::addToCreateTexture() -{ - if(isForSculptOnly()) - { - //just update some variables, not to create a real GL texture. - createGLTexture(mRawDiscardLevel, mRawImage, 0, FALSE) ; - mNeedsCreateTexture = FALSE ; - destroyRawImage(); - } - else - { -#if 1 - // - //if mRequestedDiscardLevel > mDesiredDiscardLevel, we assume the required image res keep going up, - //so do not scale down the over qualified image. - //Note: scaling down image is expensensive. Do it only when very necessary. - // - if(mRequestedDiscardLevel <= mDesiredDiscardLevel) - { - S32 w = mFullWidth >> mRawDiscardLevel; - S32 h = mFullHeight >> mRawDiscardLevel; - - //if big image, do not load extra data - //scale it down to size >= LLViewerImage::sMinLargeImageSize - if(w * h > LLViewerImage::sMinLargeImageSize) - { - S32 d_level = llmin(mRequestedDiscardLevel, (S32)mDesiredDiscardLevel) - mRawDiscardLevel ; - - if(d_level > 0) - { - S32 i = 0 ; - while((d_level > 0) && ((w >> i) * (h >> i) > LLViewerImage::sMinLargeImageSize)) - { - i++; - d_level--; - } - if(i > 0) - { - mRawDiscardLevel += i ; - if(mRawDiscardLevel >= getDiscardLevel() && getDiscardLevel() > 0) - { - mNeedsCreateTexture = FALSE ; - destroyRawImage(); - return ; - } - mRawImage->scale(w >> i, h >> i) ; - } - } - } - } -#endif - mNeedsCreateTexture = TRUE; - gImageList.mCreateTextureList.insert(this); - } - return ; -} - -// ONLY called from LLViewerImageList -BOOL LLViewerImage::createTexture(S32 usename/*= 0*/) -{ - if (!mNeedsCreateTexture) - { - destroyRawImage(); - return FALSE; - } - mNeedsCreateTexture = FALSE; - if (mRawImage.isNull()) - { - llerrs << "LLViewerImage trying to create texture with no Raw Image" << llendl; - } -// llinfos << llformat("IMAGE Creating (%d) [%d x %d] Bytes: %d ", -// mRawDiscardLevel, -// mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize()) -// << mID.getString() << llendl; - BOOL res = TRUE; - if (!gNoRender) - { - // store original size only for locally-sourced images - if (mUrl.compare(0, 7, "file://") == 0) - { - mOrigWidth = mRawImage->getWidth(); - mOrigHeight = mRawImage->getHeight(); - - // leave black border, do not scale image content - mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); - } - else - { - mOrigWidth = mFullWidth; - mOrigHeight = mFullHeight; - } - - bool size_okay = true; - - U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel; - U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel; - - if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) - { - llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl; - size_okay = false; - } - - if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) - { - // A non power-of-two image was uploaded (through a non standard client) - llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl; - size_okay = false; - } - - if( !size_okay ) - { - // An inappropriately-sized image was uploaded (through a non standard client) - // We treat these images as missing assets which causes them to - // be renderd as 'missing image' and to stop requesting data - setIsMissingAsset(); - destroyRawImage(); - return FALSE; - } - - res = LLImageGL::createGLTexture(mRawDiscardLevel, mRawImage, usename); - } - - // - // Iterate through the list of image loading callbacks to see - // what sort of data they need. - // - // *TODO: Fix image callback code - BOOL imageraw_callbacks = FALSE; - for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); - iter != mLoadedCallbackList.end(); ) - { - LLLoadedCallbackEntry *entryp = *iter++; - if (entryp->mNeedsImageRaw) - { - imageraw_callbacks = TRUE; - break; - } - } - - if (!imageraw_callbacks) - { - mNeedsAux = FALSE; - destroyRawImage(); - } - return res; -} - -//============================================================================ - -void LLViewerImage::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const -{ - if(needs_gltexture) - { - mNeedsGLTexture = TRUE ; - } - - if(mNeedsResetMaxVirtualSize) - { - //flag to reset the values because the old values are used. - mNeedsResetMaxVirtualSize = FALSE ; - mMaxVirtualSize = virtual_size; - mAdditionalDecodePriority = 0.f ; - mNeedsGLTexture = needs_gltexture ; - } - else if (virtual_size > mMaxVirtualSize) - { - mMaxVirtualSize = virtual_size; - } -} - -void LLViewerImage::resetTextureStats() -{ - mMaxVirtualSize = 0.0f; - mAdditionalDecodePriority = 0.f ; - mNeedsResetMaxVirtualSize = FALSE ; -} - -BOOL LLViewerImage::isUpdateFrozen() -{ - return LLViewerImage::sFreezeImageScalingDown && !getDiscardLevel() ; -} - -BOOL LLViewerImage::isLargeImage() -{ - return mTexelsPerImage > LLViewerImage::sMinLargeImageSize ; -} - -// This is gauranteed to get called periodically for every texture -void LLViewerImage::processTextureStats() -{ - //no need to update if the texture reaches its highest res and the memory is sufficient. - //if(isUpdateFrozen()) - //{ - // return ; - //} - - updateVirtualSize() ; - // Generate the request priority and render priority - if (mDontDiscard || !getUseMipMaps()) - { - mDesiredDiscardLevel = 0; - if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) - mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 - } - else if (mBoostLevel < LLViewerImageBoostLevel::BOOST_HIGH && mMaxVirtualSize <= 10.f) - { - // If the image has not been significantly visible in a while, we don't want it - mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)(MAX_DISCARD_LEVEL + 1)); - } - else if ((!mFullWidth && !getCurrentWidth()) || (!mFullHeight && !getCurrentHeight())) - { - mDesiredDiscardLevel = mMaxDiscardLevel; - } - else - { - //static const F64 log_2 = log(2.0); - static const F64 log_4 = log(4.0); - - S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); - S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); - mTexelsPerImage = (F32)fullwidth * fullheight; - F32 discard_level = 0.f; - - // If we know the output width and height, we can force the discard - // level to the correct value, and thus not decode more texture - // data than we need to. - if (mBoostLevel == LLViewerImageBoostLevel::BOOST_UI || - mBoostLevel == LLViewerImageBoostLevel::BOOST_PREVIEW || - mBoostLevel == LLViewerImageBoostLevel::BOOST_AVATAR_SELF) // JAMESDEBUG what about AVATAR_BAKED_SELF? - { - discard_level = 0; // full res - } - else if (mKnownDrawWidth && mKnownDrawHeight) - { - S32 draw_texels = mKnownDrawWidth * mKnownDrawHeight; - - // Use log_4 because we're in square-pixel space, so an image - // with twice the width and twice the height will have mTexelsPerImage - // 4 * draw_size - discard_level = (F32)(log(mTexelsPerImage/draw_texels) / log_4); - } - else - { - if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f) - { - //if is a big image and not being used recently, nor close to the view point, do not load hi-res data. - mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerImage::sMinLargeImageSize) ; - } - - if ((mCalculatedDiscardLevel >= 0.f) && - (llabs(mMaxVirtualSize - mDiscardVirtualSize) < mMaxVirtualSize*.20f)) - { - // < 20% change in virtual size = no change in desired discard - discard_level = mCalculatedDiscardLevel; - } - else - { - // Calculate the required scale factor of the image using pixels per texel - discard_level = (F32)(log(mTexelsPerImage/mMaxVirtualSize) / log_4); - mDiscardVirtualSize = mMaxVirtualSize; - mCalculatedDiscardLevel = discard_level; - } - } - if (mBoostLevel < LLViewerImageBoostLevel::BOOST_HIGH) - { - discard_level += sDesiredDiscardBias; - discard_level *= sDesiredDiscardScale; // scale - - discard_level += sCameraMovingDiscardBias ; - } - discard_level = floorf(discard_level); - - F32 min_discard = 0.f; - if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) - min_discard = 1.f; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 - - discard_level = llclamp(discard_level, min_discard, (F32)MAX_DISCARD_LEVEL); - - // Can't go higher than the max discard level - mDesiredDiscardLevel = llmin((S32)mMaxDiscardLevel+1, (S32)discard_level); - // Clamp to min desired discard - mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, mDesiredDiscardLevel); - - // - // At this point we've calculated the quality level that we want, - // if possible. Now we check to see if we have it, and take the - // proper action if we don't. - // - S32 current_discard = getDiscardLevel(); - if ((sDesiredDiscardBias > 0.0f) && - (current_discard >= 0 && mDesiredDiscardLevel >= current_discard)) - { - // Limit the amount of GL memory bound each frame - if ( (BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale) && - (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) - { - scaleDown() ; - } - // Only allow GL to have 2x the video card memory - else if ( (BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) > sMaxTotalTextureMemInMegaBytes*texmem_middle_bound_scale) && - (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) - { - scaleDown() ; - } - } - } -} -void LLViewerImage::updateVirtualSize() -{ -#if 1 - if(mNeedsResetMaxVirtualSize) - { - addTextureStats(0.f, FALSE) ;//reset - } - for(U32 i = 0 ; i < mNumFaces ; i++) - { - LLFace* facep = mFaceList[i] ; - if(facep->getDrawable()->isRecentlyVisible()) - { - addTextureStats(facep->getVirtualSize()) ; - setAdditionalDecodePriority(facep->getImportanceToCamera()) ; - } - } - - mNeedsResetMaxVirtualSize = TRUE ; - reorganizeFaceList(); - reorganizeVolumeList(); -#endif -} -void LLViewerImage::scaleDown() -{ - if(getHasGLTexture() && mCachedRawDiscardLevel > getDiscardLevel()) - { - switchToCachedImage() ; - } -} - -//use the mCachedRawImage to (re)generate the gl texture. -void LLViewerImage::switchToCachedImage() -{ - if(mCachedRawImage.notNull()) - { - mRawImage = mCachedRawImage ; - - if (getComponents() != mRawImage->getComponents()) - { - // We've changed the number of components, so we need to move any - // objects using this pool to a different pool. - mComponents = mRawImage->getComponents(); - gImageList.dirtyImage(this); - } - - mIsRawImageValid = TRUE; - mRawDiscardLevel = mCachedRawDiscardLevel ; - gImageList.mCreateTextureList.insert(this); - mNeedsCreateTexture = TRUE; - } -} -//============================================================================ - -F32 LLViewerImage::calcDecodePriority() -{ -#ifndef LL_RELEASE_FOR_DOWNLOAD - if (mID == LLAppViewer::getTextureFetch()->mDebugID) - { - LLAppViewer::getTextureFetch()->mDebugCount++; // for setting breakpoints - } -#endif - - if (mNeedsCreateTexture) - { - return mDecodePriority; // no change while waiting to create - } - if(mForceToSaveRawImage) - { - return maxDecodePriority() ; - } - - S32 cur_discard = getDiscardLevel(); - - //no need to update if the texture reaches its highest res and the memory is sufficient. - //if(LLViewerImage::sFreezeImageScalingDown && !cur_discard) - //{ - // return -5.0f ; - //} - - bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel)); - F32 pixel_priority = fsqrtf(mMaxVirtualSize); - const S32 MIN_NOT_VISIBLE_FRAMES = 30; // NOTE: this function is not called every frame - mDecodeFrame++; - if (pixel_priority > 0.f) - { - mVisibleFrame = mDecodeFrame; - } - - F32 priority = 0.f; - if (mIsMissingAsset) - { - priority = 0.0f; - } - else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1) - { - priority = -1.0f ; - } - else if (!isJustBound() && mCachedRawImageReady) - { - priority = -1.0f; - } - else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel) - { - priority = -1.0f; - } - else if (mDesiredDiscardLevel > mMaxDiscardLevel) - { - // Don't decode anything we don't need - priority = -1.0f; - } - else if (mBoostLevel == LLViewerImageBoostLevel::BOOST_UI && !have_all_data) - { - priority = 1.f; - } - else if (pixel_priority <= 0.f && !have_all_data) - { - // Not on screen but we might want some data - if (mBoostLevel > LLViewerImageBoostLevel::BOOST_HIGH) - { - // Always want high boosted images - priority = 1.f; - } - else if (mVisibleFrame == 0 || (mDecodeFrame - mVisibleFrame > MIN_NOT_VISIBLE_FRAMES)) - { - // Don't decode anything that isn't visible unless it's important - priority = -2.0f; - } - else - { - // Leave the priority as-is - return mDecodePriority; - } - } - else if (cur_discard < 0) - { - // We don't have any data yet, so we don't know the size of the image, treat as 32x32 -// priority = 900000.f; - static const F64 log_2 = log(2.0); - F32 desired = (F32)(log(32.0/pixel_priority) / log_2); - S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired + 1; - ddiscard = llclamp(ddiscard, 1, 9); - priority = ddiscard*100000.f; - } - else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel)) - { - // larger mips are corrupted - priority = -3.0f; - } - else if (cur_discard <= mDesiredDiscardLevel) - { - priority = -4.0f; - } - else - { - // priority range = 100000-400000 - S32 ddiscard = cur_discard - mDesiredDiscardLevel; - if (getDontDiscard()) - { - ddiscard+=2; - } - else if (!getBoundRecently() && mBoostLevel == 0) - { - ddiscard-=2; - } - ddiscard = llclamp(ddiscard, 0, 4); - - priority = ddiscard*100000.f; - } - if (priority > 0.0f) - { - // priority range = 100000-900000 - pixel_priority = llclamp(pixel_priority, 0.0f, priority-1.f); - - // priority range = [100000.f, 2000000.f] - if ( mBoostLevel > LLViewerImageBoostLevel::BOOST_HIGH) - { - priority = 1000000.f + pixel_priority + 1000.f * mBoostLevel; - } - else - { - priority += 0.f + pixel_priority + 1000.f * mBoostLevel; - } - - // priority range = [2100000.f, 5000000.f] if mAdditionalDecodePriority > 1.0 - if(mAdditionalDecodePriority > 1.0f) - { - priority += 2000000.f + mAdditionalDecodePriority ; - } - } - - return priority; -} - -// A value >= max value calculated above for normalization -//static -F32 LLViewerImage::maxDecodePriority() -{ - return 6000000.f; -} - -void LLViewerImage::setDecodePriority(F32 priority) -{ - llassert(!mInImageList); - mDecodePriority = priority; -} - -F32 LLViewerImage::maxAdditionalDecodePriority() -{ - return 2000000.f; -} -void LLViewerImage::setAdditionalDecodePriority(F32 priority) -{ - priority *= maxAdditionalDecodePriority(); - if(mAdditionalDecodePriority < priority) - { - mAdditionalDecodePriority = priority; - } -} -//------------------------------------------------------------ - -void LLViewerImage::setBoostLevel(S32 level) -{ - mBoostLevel = level; - - if(gAuditTexture) - { - setCategory(mBoostLevel); - } - - if(mBoostLevel != LLViewerImageBoostLevel::BOOST_NONE) - { - setNoDelete() ; - } -} - -//============================================================================ - -bool LLViewerImage::updateFetch() -{ - mFetchState = 0; - mFetchPriority = 0; - mFetchDeltaTime = 999999.f; - mRequestDeltaTime = 999999.f; - -#ifndef LL_RELEASE_FOR_DOWNLOAD - if (mID == LLAppViewer::getTextureFetch()->mDebugID) - { - LLAppViewer::getTextureFetch()->mDebugCount++; // for setting breakpoints - } -#endif - - if (mIsMediaTexture) - { - llassert_always(!mHasFetcher); - return false; // skip - } - if (mNeedsCreateTexture) - { - // We may be fetching still (e.g. waiting on write) - // but don't check until we've processed the raw data we have - return false; - } - if (mFullyLoaded) - { - llassert_always(!mHasFetcher); - return false; - } - if (mIsMissingAsset) - { - llassert_always(!mHasFetcher); - return false; // skip - } - if (!mLoadedCallbackList.empty() && mRawImage.notNull()) - { - return false; // process any raw image data in callbacks before replacing - } - - S32 current_discard = getDiscardLevel(); - S32 desired_discard = getDesiredDiscardLevel(); - F32 decode_priority = getDecodePriority(); - decode_priority = llclamp(decode_priority, 0.0f, maxDecodePriority()); - - if (mIsFetching) - { - // Sets mRawDiscardLevel, mRawImage, mAuxRawImage - S32 fetch_discard = current_discard; - if(mForceToSaveRawImage) - { - if(fetch_discard >= 0) - { - fetch_discard = llmax(fetch_discard, mSavedRawDiscardLevel) ; - } - } - - if (mRawImage.notNull()) sRawCount--; - if (mAuxRawImage.notNull()) sAuxCount--; - bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage); - if (mRawImage.notNull()) sRawCount++; - if (mAuxRawImage.notNull()) sAuxCount++; - if (finished) - { - mIsFetching = FALSE; - } - else - { - mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, - mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); - } - - // We may have data ready regardless of whether or not we are finished (e.g. waiting on write) - if (mRawImage.notNull()) - { - mRawDiscardLevel = fetch_discard; - - if ((mRawImage->getDataSize() > 0 && mRawDiscardLevel >= 0) && - (current_discard < 0 || mRawDiscardLevel < current_discard)) - { - if (getComponents() != mRawImage->getComponents()) - { - // We've changed the number of components, so we need to move any - // objects using this pool to a different pool. - mComponents = mRawImage->getComponents(); - - for(U32 i = 0 ; i < mNumFaces ; i++) - { - mFaceList[i]->dirtyTexture() ; - } - //gImageList.dirtyImage(this); - } - - mFullWidth = mRawImage->getWidth() << mRawDiscardLevel; - mFullHeight = mRawImage->getHeight() << mRawDiscardLevel; - - if(mFullWidth > MAX_IMAGE_SIZE || mFullHeight > MAX_IMAGE_SIZE) - { - //discard all oversized textures. - destroyRawImage(); - setIsMissingAsset(); - mRawDiscardLevel = INVALID_DISCARD_LEVEL ; - mIsFetching = FALSE ; - } - else - { - mIsRawImageValid = TRUE; - addToCreateTexture() ; - } - - return TRUE ; - } - else - { - // Data is ready but we don't need it - // (received it already while fetcher was writing to disk) - destroyRawImage(); - return false; // done - } - } - - if (!mIsFetching) - { - if ((decode_priority > 0) && (mRawDiscardLevel < 0 || mRawDiscardLevel == INVALID_DISCARD_LEVEL)) - { - // We finished but received no data - if (current_discard < 0) - { - setIsMissingAsset(); - desired_discard = -1; - } - else - { - //llwarns << mID << ": Setting min discard to " << current_discard << llendl; - mMinDiscardLevel = current_discard; - desired_discard = current_discard; - } - destroyRawImage(); - } - else if (mRawImage.isNull()) - { - // We have data, but our fetch failed to return raw data - // *TODO: FIgure out why this is happening and fix it - destroyRawImage(); - } - } - else - { - LLAppViewer::getTextureFetch()->updateRequestPriority(mID, decode_priority); - } - } - - if (!mDontDiscard) - { - if (mBoostLevel == 0) - { - desired_discard = llmax(desired_discard, current_discard-1); - } - else - { - desired_discard = llmax(desired_discard, current_discard-2); - } - } - - bool make_request = true; - if (decode_priority <= 0) - { - make_request = false; - } - else if (mNeedsCreateTexture || mIsMissingAsset) - { - make_request = false; - } - else if (current_discard >= 0 && current_discard <= mMinDiscardLevel) - { - make_request = false; - } - else if (!isJustBound() && mCachedRawImageReady) - { - make_request = false; - } - else - { - if (mIsFetching) - { - if (mRequestedDiscardLevel <= desired_discard) - { - make_request = false; - } - } - else - { - if (current_discard >= 0 && current_discard <= desired_discard) - { - make_request = false; - } - } - } - - if (make_request) - { - S32 w=0, h=0, c=0; - if (current_discard >= 0) - { - w = getWidth(0); - h = getHeight(0); - c = getComponents(); - } - - // bypass texturefetch directly by pulling from LLTextureCache - bool fetch_request_created = false; - fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), decode_priority, - w, h, c, desired_discard, needsAux(), mCanUseHTTP); - - if (fetch_request_created) - { - mHasFetcher = TRUE; - mIsFetching = TRUE; - mRequestedDiscardLevel = desired_discard; - - mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, - mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); - } - - // if createRequest() failed, we're finishing up a request for this UUID, - // wait for it to complete - } - else if (mHasFetcher && !mIsFetching) - { - // Only delete requests that haven't receeived any network data for a while - const F32 FETCH_IDLE_TIME = 5.f; - if (mLastPacketTimer.getElapsedTimeF32() > FETCH_IDLE_TIME) - { -// llinfos << "Deleting request: " << getID() << " Discard: " << current_discard << " <= min:" << mMinDiscardLevel << " or priority == 0: " << decode_priority << llendl; - LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); - mHasFetcher = FALSE; - } - } - - llassert_always(mRawImage.notNull() || (!mNeedsCreateTexture && !mIsRawImageValid)); - - return mIsFetching ? true : false; -} - -// -//force to fetch a new raw image for this texture -//this function is to replace readBackRaw(). -// -BOOL LLViewerImage::forceFetch() -{ - if(!mForceToSaveRawImage) - { - return false ; - } - if (mIsMediaTexture) - { - mForceToSaveRawImage = false ; - llassert_always(!mHasFetcher); - return false; // skip - } - if (mIsMissingAsset) - { - mForceToSaveRawImage = false ; - llassert_always(!mHasFetcher); - return false; // skip - } - if (!mLoadedCallbackList.empty() && mRawImage.notNull()) - { - return false; // process any raw image data in callbacks before replacing - } - if(mRawImage.notNull() && mRawDiscardLevel <= mDesiredSavedRawDiscardLevel) - { - return false ; // mRawImage is enough - } - if(mIsFetching) - { - return false ; - } - - S32 desired_discard = mDesiredSavedRawDiscardLevel ; - S32 current_discard = getDiscardLevel(); - - bool fetch_request_created = false; - S32 w=0, h=0, c=0; - if (current_discard >= 0) - { - w = getWidth(0); - h = getHeight(0); - c = getComponents(); - } - fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), maxDecodePriority(), - w, h, c, desired_discard, needsAux(), mCanUseHTTP); - - if (fetch_request_created) - { - mHasFetcher = TRUE; - mIsFetching = TRUE; - // Set the image's decode priority to maxDecodePriority() too, or updateFetch() will set - // the request priority to 0 and terminate the fetch before we even started (SNOW-203). - gImageList.bumpToMaxDecodePriority(this); - mRequestedDiscardLevel = desired_discard ; - - mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, - mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); - } - - return mIsFetching ? true : false; -} - -void LLViewerImage::setIsMissingAsset() -{ - if (mUrl.empty()) - { - llwarns << mID << ": Marking image as missing" << llendl; - } - else - { - llwarns << mUrl << ": Marking image as missing" << llendl; - } - if (mHasFetcher) - { - LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); - mHasFetcher = FALSE; - mIsFetching = FALSE; - mFetchState = 0; - mFetchPriority = 0; - } - mIsMissingAsset = TRUE; -} - -//============================================================================ - -void LLViewerImage::setLoadedCallback( loaded_callback_func loaded_callback, - S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, void* userdata) -{ - // - // Don't do ANYTHING here, just add it to the global callback list - // - if (mLoadedCallbackList.empty()) - { - // Put in list to call this->doLoadedCallbacks() periodically - gImageList.mCallbackList.insert(this); - } - LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata); - mLoadedCallbackList.push_back(entryp); - mNeedsAux |= needs_aux; - if (mNeedsAux && mAuxRawImage.isNull() && getDiscardLevel() >= 0) - { - // We need aux data, but we've already loaded the image, and it didn't have any - llwarns << "No aux data available for callback for image:" << getID() << llendl; - } -} - -// this method is stupid, remove it if at all possible -Day -void LLViewerImage::setLoadedCallbackNoAux( loaded_callback_func loaded_callback, - S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, void* userdata) -{ - // - // Don't do ANYTHING here, just add it to the global callback list - // - if (mLoadedCallbackList.empty()) - { - // Put in list to call this->doLoadedCallbacks() periodically - gImageList.mCallbackList.insert(this); - } - - LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata); - mLoadedCallbackList.push_back(entryp); - mNeedsAux = needs_aux; - - if (mNeedsAux && mAuxRawImage.isNull() && getDiscardLevel() >= 0) - { - // We need aux data, but we've already loaded the image, and it didn't have any - llwarns << "No aux data available for callback for image:" << getID() << llendl; - } -} -// - -bool LLViewerImage::doLoadedCallbacks() -{ - if (mNeedsCreateTexture) - { - return false; - } - - bool res = false; - - if (isMissingAsset()) - { - for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); - iter != mLoadedCallbackList.end(); ) - { - LLLoadedCallbackEntry *entryp = *iter++; - // We never finished loading the image. Indicate failure. - // Note: this allows mLoadedCallbackUserData to be cleaned up. - entryp->mCallback(FALSE, this, NULL, NULL, 0, TRUE, entryp->mUserData); - delete entryp; - } - mLoadedCallbackList.clear(); - - // Remove ourself from the global list of textures with callbacks - gImageList.mCallbackList.erase(this); - } - - S32 gl_discard = getDiscardLevel(); - - // If we don't have a legit GL image, set it to be lower than the worst discard level - if (gl_discard == -1) - { - gl_discard = MAX_DISCARD_LEVEL + 1; - } - - // - // Determine the quality levels of textures that we can provide to callbacks - // and whether we need to do decompression/readback to get it - // - S32 current_raw_discard = MAX_DISCARD_LEVEL + 1; // We can always do a readback to get a raw discard - S32 best_raw_discard = gl_discard; // Current GL quality level - S32 current_aux_discard = MAX_DISCARD_LEVEL + 1; - S32 best_aux_discard = MAX_DISCARD_LEVEL + 1; - - if (mIsRawImageValid) - { - // If we have an existing raw image, we have a baseline for the raw and auxiliary quality levels. - best_raw_discard = llmin(best_raw_discard, mRawDiscardLevel); - best_aux_discard = llmin(best_aux_discard, mRawDiscardLevel); // We always decode the aux when we decode the base raw - current_aux_discard = llmin(current_aux_discard, best_aux_discard); - } - else - { - // We have no data at all, we need to get it - // Do this by forcing the best aux discard to be 0. - best_aux_discard = 0; - } - - - // - // See if any of the callbacks would actually run using the data that we can provide, - // and also determine if we need to perform any readbacks or decodes. - // - bool run_gl_callbacks = false; - bool run_raw_callbacks = false; - bool need_readback = false; - - for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); - iter != mLoadedCallbackList.end(); ) - { - LLLoadedCallbackEntry *entryp = *iter++; - if (entryp->mNeedsImageRaw) - { - if (mNeedsAux) - { - // - // Need raw and auxiliary channels - // - if (entryp->mLastUsedDiscard > current_aux_discard) - { - // We have useful data, run the callbacks - run_raw_callbacks = true; - } - } - else - { - if (entryp->mLastUsedDiscard > current_raw_discard) - { - // We have useful data, just run the callbacks - run_raw_callbacks = true; - } - else if (entryp->mLastUsedDiscard > best_raw_discard) - { - // We can readback data, and then run the callbacks - need_readback = true; - run_raw_callbacks = true; - } - } - } - else - { - // Needs just GL - if (entryp->mLastUsedDiscard > gl_discard) - { - // We have enough data, run this callback requiring GL data - run_gl_callbacks = true; - } - } - } - - // - // Do a readback if required, OR start off a texture decode - // - if (need_readback && (mMaxDiscardLevel > gl_discard)) - { - // Do a readback to get the GL data into the raw image - // We have GL data. - - destroyRawImage(); - readBackRawImage(gl_discard); - llassert_always(mRawImage.notNull()); - llassert_always(!mNeedsAux || mAuxRawImage.notNull()); - } - - // - // Run raw/auxiliary data callbacks - // - if (run_raw_callbacks && mIsRawImageValid && (mRawDiscardLevel <= mMaxDiscardLevel)) - { - // Do callbacks which require raw image data. - //llinfos << "doLoadedCallbacks raw for " << getID() << llendl; - - // Call each party interested in the raw data. - for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); - iter != mLoadedCallbackList.end(); ) - { - callback_list_t::iterator curiter = iter++; - LLLoadedCallbackEntry *entryp = *curiter; - if (entryp->mNeedsImageRaw && (entryp->mLastUsedDiscard > mRawDiscardLevel)) - { - // If we've loaded all the data there is to load or we've loaded enough - // to satisfy the interested party, then this is the last time that - // we're going to call them. - - llassert_always(mRawImage.notNull()); - if(mNeedsAux && mAuxRawImage.isNull()) - { - llwarns << "Raw Image with no Aux Data for callback" << llendl; - } - BOOL final = mRawDiscardLevel <= entryp->mDesiredDiscard ? TRUE : FALSE; - //llinfos << "Running callback for " << getID() << llendl; - //llinfos << mRawImage->getWidth() << "x" << mRawImage->getHeight() << llendl; - if (final) - { - //llinfos << "Final!" << llendl; - } - entryp->mLastUsedDiscard = mRawDiscardLevel; - entryp->mCallback(TRUE, this, mRawImage, mAuxRawImage, mRawDiscardLevel, final, entryp->mUserData); - if (final) - { - iter = mLoadedCallbackList.erase(curiter); - delete entryp; - } - res = true; - } - } - } - - // - // Run GL callbacks - // - if (run_gl_callbacks && (gl_discard <= mMaxDiscardLevel)) - { - //llinfos << "doLoadedCallbacks GL for " << getID() << llendl; - - // Call the callbacks interested in GL data. - for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); - iter != mLoadedCallbackList.end(); ) - { - callback_list_t::iterator curiter = iter++; - LLLoadedCallbackEntry *entryp = *curiter; - if (!entryp->mNeedsImageRaw && (entryp->mLastUsedDiscard > gl_discard)) - { - BOOL final = gl_discard <= entryp->mDesiredDiscard ? TRUE : FALSE; - entryp->mLastUsedDiscard = gl_discard; - entryp->mCallback(TRUE, this, NULL, NULL, gl_discard, final, entryp->mUserData); - if (final) - { - iter = mLoadedCallbackList.erase(curiter); - delete entryp; - } - res = true; - } - } - } - - // - // If we have no callbacks, take us off of the image callback list. - // - if (mLoadedCallbackList.empty()) - { - gImageList.mCallbackList.erase(this); - } - - // Done with any raw image data at this point (will be re-created if we still have callbacks) - destroyRawImage(); - - return res; -} - -//============================================================================ - -// Call with 0,0 to turn this feature off. -void LLViewerImage::setKnownDrawSize(S32 width, S32 height) -{ - mKnownDrawWidth = width; - mKnownDrawHeight = height; - addTextureStats((F32)(width * height)); -} - -// virtual -bool LLViewerImage::bindError(S32 stage) const -{ - if (stage < 0) return false; - - if (gNoRender) - { - return false; - } - - bool res = true; - - // On failure to bind, what should we set the currently bound texture to? - if (mIsMissingAsset && !sMissingAssetImagep.isNull() && (this != (LLImageGL *)sMissingAssetImagep)) - { - res = gGL.getTexUnit(stage)->bind(sMissingAssetImagep.get()); - } - if (!res && !sDefaultImagep.isNull() && (this != (LLImageGL *)sDefaultImagep)) - { - // use default if we've got it - res = gGL.getTexUnit(stage)->bind(sDefaultImagep.get()); - } - if (!res && !sNullImagep.isNull() && (this != (LLImageGL *)sNullImagep)) - { - res = gGL.getTexUnit(stage)->bind(sNullImagep.get()); - } - if (!res) - { - llwarns << "LLViewerImage::bindError failed." << llendl; - } - stop_glerror(); - return res; -} - -bool LLViewerImage::bindDefaultImage(S32 stage) -{ - if (stage < 0) return false; - - bool res = true; - if (!sDefaultImagep.isNull() && (this != (LLImageGL *)sDefaultImagep)) - { - // use default if we've got it - res = gGL.getTexUnit(stage)->bind(sDefaultImagep.get()); - } - if (!res && !sNullImagep.isNull() && (this != (LLImageGL *)sNullImagep)) - { - res = gGL.getTexUnit(stage)->bind(sNullImagep.get()); - } - if (!res) - { - llwarns << "LLViewerImage::bindError failed." << llendl; - } - stop_glerror(); - - //check if there is cached raw image and switch to it if possible - switchToCachedImage() ; - - return res; -} - -//virtual -void LLViewerImage::forceImmediateUpdate() -{ - gImageList.bumpToMaxDecodePriority(this) ; - return ; -} - -// Was in LLImageGL -LLImageRaw* LLViewerImage::readBackRawImage(S8 discard_level) -{ - llassert_always(discard_level >= 0); - llassert_always(mComponents > 0); - if (mRawImage.notNull()) - { - llerrs << "called with existing mRawImage" << llendl; - mRawImage = NULL; - } - - if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level) - { - mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; - mRawImage->copy(mSavedRawImage) ; - mRawDiscardLevel = discard_level ; - } - else - { - mRawImage = mCachedRawImage ; - mRawDiscardLevel = mCachedRawDiscardLevel; - } - - sRawCount++; - mIsRawImageValid = TRUE; - - return mRawImage; -} - -void LLViewerImage::saveRawImage() -{ - if(mRawImage.isNull() || mRawDiscardLevel > mDesiredSavedRawDiscardLevel) - { - forceFetch() ; - } - - if(mRawImage.isNull() || mSavedRawDiscardLevel == mRawDiscardLevel) - { - return ; - } - - mSavedRawDiscardLevel = mRawDiscardLevel ; - mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()) ; - - if(mSavedRawDiscardLevel <= mDesiredSavedRawDiscardLevel) - { - mForceToSaveRawImage = FALSE ; - } -} - -void LLViewerImage::forceToSaveRawImage(S32 desired_discard) -{ - mForceToSaveRawImage = TRUE ; - mDesiredSavedRawDiscardLevel = desired_discard ; - - forceFetch() ; -} -void LLViewerImage::destroySavedRawImage() -{ - mSavedRawImage = NULL ; - mForceToSaveRawImage = FALSE ; - mSavedRawDiscardLevel = -1 ; - mDesiredSavedRawDiscardLevel = -1 ; -} - -void LLViewerImage::destroyRawImage() -{ - if (mRawImage.notNull()) sRawCount--; - if (mAuxRawImage.notNull()) sAuxCount--; - - if(mForceToSaveRawImage) - { - saveRawImage() ; - } - - setCachedRawImage() ; - - mRawImage = NULL; - mAuxRawImage = NULL; - mIsRawImageValid = FALSE; - mRawDiscardLevel = INVALID_DISCARD_LEVEL; -} - -void LLViewerImage::setCachedRawImage() -{ - if(mRawImage == mCachedRawImage) - { - return ; - } - if(!mIsRawImageValid) - { - return ; - } - - if(mCachedRawImageReady) - { - return ; - } - - if(mCachedRawDiscardLevel < 0 || mCachedRawDiscardLevel > mRawDiscardLevel) - { - S32 i = 0 ; - S32 w = mRawImage->getWidth() ; - S32 h = mRawImage->getHeight() ; - - S32 max_size = MAX_CACHED_RAW_IMAGE_AREA ; - if(LLViewerImageBoostLevel::BOOST_TERRAIN == mBoostLevel) - { - max_size = MAX_CACHED_RAW_TERRAIN_IMAGE_AREA ; - } - if(mForSculpt) - { - max_size = MAX_CACHED_RAW_SCULPT_IMAGE_AREA ; - // Even though we don't use the full pixel size, we want to decode up to discard 0, - // because some legacy sculpts are weird like that. - mCachedRawImageReady = !mRawDiscardLevel ; - } - else - { - mCachedRawImageReady = (!mRawDiscardLevel || ((w * h) >= max_size)) ; - } - - while(((w >> i) * (h >> i)) > max_size) - { - ++i ; - } - - if(i) - { - if(!(w >> i) || !(h >> i)) - { - --i ; - } - mRawImage->scale(w >> i, h >> i) ; - } - mCachedRawImage = mRawImage ; - mRawDiscardLevel += i ; - mCachedRawDiscardLevel = mRawDiscardLevel ; - } -} - -void LLViewerImage::checkCachedRawSculptImage() -{ - if(mCachedRawImageReady && mCachedRawDiscardLevel > 0) - { - if(getDiscardLevel() != 0) - { - mCachedRawImageReady = FALSE ; - } - else if(isForSculptOnly()) - { - resetTextureStats() ; //do not update this image any more. - } - } -} - -BOOL LLViewerImage::isForSculptOnly() const -{ - return mForSculpt && !mNeedsGLTexture ; -} - -void LLViewerImage::setForSculpt() -{ - mForSculpt = TRUE ; - if(isForSculptOnly() && !getBoundRecently()) - { - destroyGLTexture() ; //sculpt image does not need gl texture. - } - checkCachedRawSculptImage() ; -} - -//virtual -void LLViewerImage::addFace(LLFace* facep) -{ - if(mNumFaces >= mFaceList.size()) - { - mFaceList.resize(2 * mNumFaces + 1) ; - } - mFaceList[mNumFaces] = facep ; - facep->setIndexInTex(mNumFaces) ; - mNumFaces++ ; - mLastFaceListUpdateTimer.reset() ; -} - -//virtual -void LLViewerImage::removeFace(LLFace* facep) -{ - if(mNumFaces > 1) - { - S32 index = facep->getIndexInTex() ; - mFaceList[index] = mFaceList[--mNumFaces] ; - mFaceList[index]->setIndexInTex(index) ; - } - else - { - mFaceList.clear() ; - mNumFaces = 0 ; - } - mLastFaceListUpdateTimer.reset() ; -} - -S32 LLViewerImage::getNumFaces() const -{ - return mNumFaces ; -} - - -//virtual -void LLViewerImage::addVolume(LLVOVolume* volumep) -{ - if( mNumVolumes >= mVolumeList.size()) - { - mVolumeList.resize(2 * mNumVolumes + 1) ; - } - mVolumeList[mNumVolumes] = volumep ; - volumep->setIndexInTex(mNumVolumes) ; - mNumVolumes++ ; - mLastVolumeListUpdateTimer.reset() ; -} - -//virtual -void LLViewerImage::removeVolume(LLVOVolume* volumep) -{ - if(mNumVolumes > 1) - { - S32 index = volumep->getIndexInTex() ; - mVolumeList[index] = mVolumeList[--mNumVolumes] ; - mVolumeList[index]->setIndexInTex(index) ; - } - else - { - mVolumeList.clear() ; - mNumVolumes = 0 ; - } - mLastVolumeListUpdateTimer.reset() ; -} - -S32 LLViewerImage::getNumVolumes() const -{ - return mNumVolumes ; -} - -void LLViewerImage::reorganizeFaceList() -{ - static const F32 MAX_WAIT_TIME = 20.f; // seconds - static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ; - - if(mNumFaces + MAX_EXTRA_BUFFER_SIZE > mFaceList.size()) - { - return ; - } - - if(mLastFaceListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) - { - return ; - } - - mLastFaceListUpdateTimer.reset() ; - mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end()); -} - -void LLViewerImage::reorganizeVolumeList() -{ - static const F32 MAX_WAIT_TIME = 20.f; // seconds - static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ; - - if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size()) - { - return ; - } - - if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) - { - return ; - } - - mLastVolumeListUpdateTimer.reset() ; - mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end()); -} diff --git a/indra/newview/llviewerimage.h b/indra/newview/llviewerimage.h deleted file mode 100644 index abff3ed64..000000000 --- a/indra/newview/llviewerimage.h +++ /dev/null @@ -1,484 +0,0 @@ -/** - * @file llviewerimage.h - * @brief Object for managing images and their textures - * - * $LicenseInfo:firstyear=2000&license=viewergpl$ - * - * Copyright (c) 2000-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLVIEWERIMAGE_H -#define LL_LLVIEWERIMAGE_H - -#include "llimagegl.h" -#include "lltimer.h" -#include "llframetimer.h" -#include "llhost.h" - -#include -#include - -class LLFace; -#define MIN_VIDEO_RAM_IN_MEGA_BYTES 32 -#define MAX_VIDEO_RAM_IN_MEGA_BYTES 512 // 512MB max for performance reasons. - -class LLViewerImage; - -typedef void (*loaded_callback_func)( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); - -class LLVFile; -class LLMessageSystem; -class LLVOVolume; - -class LLLoadedCallbackEntry -{ -public: - LLLoadedCallbackEntry(loaded_callback_func cb, - S32 discard_level, - BOOL need_imageraw, // Needs image raw for the callback - void* userdata ) - : mCallback(cb), - mLastUsedDiscard(MAX_DISCARD_LEVEL+1), - mDesiredDiscard(discard_level), - mNeedsImageRaw(need_imageraw), - mUserData(userdata) - { - } - - loaded_callback_func mCallback; - S32 mLastUsedDiscard; - S32 mDesiredDiscard; - BOOL mNeedsImageRaw; - void* mUserData; -}; - -class LLTextureBar; - -//===================================== -struct LLViewerImageBoostLevel -{ - enum - { - BOOST_NONE = 0, - BOOST_AVATAR_BAKED = 1, - BOOST_AVATAR = 2, - BOOST_CLOUDS = 3, - BOOST_SCULPTED = 4, - - BOOST_HIGH = 5, - BOOST_TERRAIN , // has to be high priority for minimap / low detail - BOOST_SELECTED , - BOOST_HUD , - BOOST_AVATAR_BAKED_SELF , - BOOST_UI , - BOOST_PREVIEW , - BOOST_MAP , - BOOST_MAP_VISIBLE , - BOOST_AVATAR_SELF ,// needed for baking avatar - BOOST_MAX_LEVEL, - - //LLImageGLCategory - TEXLAYER_BUMP = BOOST_MAX_LEVEL, - AVATAR_SCRATCH_TEX, - FONT, - BUMP_IMAGE, - DYNAMIC_TEX, - TEXLAYER_CACHE, - MEDIA, - ATLAS, - OTHER, - MAX_GL_IMAGE_CATEGORY - }; -}; -//===================================== -class LLViewerImage : public LLImageGL -{ - LOG_CLASS(LLViewerImage); - - friend class LLTextureBar; // debug info only - friend class LLTextureView; // debug info only - -public: - static void initClass(); - static void cleanupClass(); - static void updateClass(const F32 velocity, const F32 angular_velocity); - - static LLViewerImage * getImage(const LLUUID &image_id); - // lightweight wrapper for gImageList.getImage() - - - struct Compare - { - // lhs < rhs - bool operator()(const LLPointer &lhs, const LLPointer &rhs) const - { - const LLViewerImage* lhsp = (const LLViewerImage*)lhs; - const LLViewerImage* rhsp = (const LLViewerImage*)rhs; - // greater priority is "less" - const F32 lpriority = lhsp->getDecodePriority(); - const F32 rpriority = rhsp->getDecodePriority(); - if (lpriority > rpriority) // higher priority - return true; - if (lpriority < rpriority) - return false; - return lhsp < rhsp; - } - }; - - struct CompareByHostAndPriority - { - // lhs < rhs - bool operator()(const LLPointer &lhs, const LLPointer &rhs) const - { - const LLViewerImage* lhsp = (const LLViewerImage*)lhs; - const LLViewerImage* rhsp = (const LLViewerImage*)rhs; - if (lhsp->mTargetHost != rhsp->mTargetHost) - return lhsp->mTargetHost < rhsp->mTargetHost; - - const F32 lpriority = lhsp->getDecodePriority(); - const F32 rpriority = rhsp->getDecodePriority(); - if (lpriority != rpriority) - return lpriority > rpriority; // greater priority is "less" - - return lhsp < rhsp; - } - }; - - struct CompareForRemoval - { - // lhs < rhs - bool operator()(const LLPointer &lhs, const LLPointer &rhs) const - { - const LLViewerImage* lhsp = (const LLViewerImage*)lhs; - const LLViewerImage* rhsp = (const LLViewerImage*)rhs; - // compare bind time - if (lhsp->mLastBindTime < rhsp->mLastBindTime) // older - return true; - if (lhsp->mLastBindTime > rhsp->mLastBindTime) - return false; - if (lhsp->getDiscardLevel() < rhsp->getDiscardLevel()) // larger - return true; - if (lhsp->getDiscardLevel() > rhsp->getDiscardLevel()) - return false; - return lhsp < rhsp; - } - }; - - struct CompareForWorstVisibility - { - // lhs < rhs - bool operator()(const LLPointer &lhs, const LLPointer &rhs) const - { - const LLViewerImage* lhsp = (const LLViewerImage*)lhs; - const LLViewerImage* rhsp = (const LLViewerImage*)rhs; - F32 lhsvis = ((lhsp->getWidth() * lhsp->getHeight()) / lhsp->mMaxVirtualSize); - F32 rhsvis = ((rhsp->getWidth() * rhsp->getHeight()) / rhsp->mMaxVirtualSize); - if (lhsvis > rhsvis) // fewer relative visible pixels - return true; - if (rhsvis < lhsvis) - return false; - return lhsp < rhsp; - } - }; - - enum - { - MAX_IMAGE_SIZE_DEFAULT = 1024, - INVALID_DISCARD_LEVEL = 0x7fff - }; - - typedef std::vector ll_face_list_t; - typedef std::vector ll_volume_list_t; - -protected: - /*virtual*/ ~LLViewerImage(); - -public: - LLViewerImage(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE); - LLViewerImage(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); - LLViewerImage(const U32 width, const U32 height, const U8 components, BOOL usemipmaps); - LLViewerImage(const LLImageRaw* raw, BOOL usemipmaps); - - /*virtual*/ void dump(); // debug info to llinfos - - /*virtual*/ bool bindError(const S32 stage = 0) const; - /*virtual*/ bool bindDefaultImage(const S32 stage = 0) ; - /*virtual*/ void forceImmediateUpdate() ; - - void reinit(BOOL usemipmaps = TRUE); - - const LLUUID& getID() const { return mID; } - - // New methods for determining image quality/priority - // texel_area_ratio is ("scaled" texel area)/(original texel area), approximately. - void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const; - void resetTextureStats(); - void setAdditionalDecodePriority(F32 priority) ; - F32 maxAdditionalDecodePriority() ; - - BOOL isLargeImage() ; - BOOL isUpdateFrozen() ; - - // Process image stats to determine priority/quality requirements. - void processTextureStats(); - - // Set callbacks to get called when the image gets updated with higher - // resolution versions. - void setLoadedCallback(loaded_callback_func cb, - S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, - void* userdata); - -// - void setLoadedCallbackNoAux(loaded_callback_func cb, - S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, - void* userdata); -// - - // ONLY call from LLViewerImageList - BOOL createTexture(S32 usename = 0); - void destroyTexture() ; - void addToCreateTexture(); - - BOOL needsAux() const { return mNeedsAux; } - - // setDesiredDiscardLevel is only used by LLViewerImageList - void setDesiredDiscardLevel(S32 discard) { mDesiredDiscardLevel = discard; } - S32 getDesiredDiscardLevel() { return mDesiredDiscardLevel; } - - void setMinDiscardLevel(S32 discard) { mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel,(S8)discard); } - - // Host we think might have this image, used for baked av textures. - LLHost getTargetHost() const { return mTargetHost; } - - void setBoostLevel(S32 level); - S32 getBoostLevel() { return mBoostLevel; } - - void updateVirtualSize() ; - F32 getDecodePriority() const { return mDecodePriority; }; - F32 calcDecodePriority(); - static F32 maxDecodePriority(); - - // Set the decode priority for this image... - // DON'T CALL THIS UNLESS YOU KNOW WHAT YOU'RE DOING, it can mess up - // the priority list, and cause horrible things to happen. - void setDecodePriority(F32 priority = -1.0f); - - bool updateFetch(); - - // Override the computation of discard levels if we know the exact output - // size of the image. Used for UI textures to not decode, even if we have - // more data. - void setKnownDrawSize(S32 width, S32 height); - - void setIsMissingAsset(); - BOOL isMissingAsset() const { return mIsMissingAsset; } - - bool hasCallbacks() { return mLoadedCallbackList.empty() ? false : true; } - - bool doLoadedCallbacks(); - - // returns dimensions of original image for local files (before power of two scaling) - // and returns 0 for all asset system images - S32 getOriginalWidth() { return mOrigWidth; } - S32 getOriginalHeight() { return mOrigHeight; } - - BOOL isForSculptOnly() const ; - void setForSculpt(); - - void checkCachedRawSculptImage() ; - LLImageRaw* getRawImage()const { return mRawImage ;} - S32 getRawImageLevel() const {return mRawDiscardLevel;} - LLImageRaw* getCachedRawImage() const { return mCachedRawImage ;} - S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;} - BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;} - BOOL isRawImageValid()const { return mIsRawImageValid ; } - - void forceToSaveRawImage(S32 desired_discard = 0) ; - void destroySavedRawImage() ; - - BOOL isSameTexture(const LLViewerImage* tex) const ; - - virtual void addFace(LLFace* facep) ; - virtual void removeFace(LLFace* facep) ; - S32 getNumFaces() const; - const ll_face_list_t* getFaceList() const {return &mFaceList;} - void reorganizeFaceList() ; - - virtual void addVolume(LLVOVolume* volumep); - virtual void removeVolume(LLVOVolume* volumep); - S32 getNumVolumes() const; - const ll_volume_list_t* getVolumeList() const { return &mVolumeList; } - void reorganizeVolumeList() ; - - void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;}; - - friend class LocalBitmap; // tag: vaa emerald local_asset_browser - -private: - /*virtual*/ void cleanup(); // Cleanup the LLViewerImage (so we can reinitialize it) - - void init(bool firstinit); - - // Used to be in LLImageGL - LLImageRaw* readBackRawImage(S8 discard_level = 0); - void destroyRawImage(); - void saveRawImage() ; - BOOL forceFetch() ; - - void scaleDown() ; - void switchToCachedImage(); - void setCachedRawImage() ; -public: - S32 mFullWidth; - S32 mFullHeight; - - S32 mOrigWidth; - S32 mOrigHeight; - std::string mUrl; - - // Data used for calculating required image priority/quality level/decimation - mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need? - - F32 mTexelsPerImage; // Texels per image. - F32 mDiscardVirtualSize; // Virtual size used to calculate desired discard - - S8 mInImageList; // TRUE if image is in list (in which case don't reset priority!) - S8 mIsMediaTexture; // TRUE if image is being replaced by media (in which case don't update) - - // Various info regarding image requests - S32 mRequestedDiscardLevel; - F32 mRequestedDownloadPriority; - S32 mFetchState; - U32 mFetchPriority; - F32 mDownloadProgress; - F32 mFetchDeltaTime; - F32 mRequestDeltaTime; - S32 mDecodeFrame; - S32 mVisibleFrame; // decode frame where image was last visible - - // Timers - LLFrameTimer mLastPacketTimer; // Time since last packet. - LLFrameTimer mLastReferencedTimer; - - std::string decodedComment; - unsigned int commentEncryptionType; - -private: - LLUUID mID; - - S8 mDesiredDiscardLevel; // The discard level we'd LIKE to have - if we have it and there's space - S8 mMinDesiredDiscardLevel; // The minimum discard level we'd like to have - S8 mNeedsCreateTexture; - mutable S8 mNeedsGLTexture; - S8 mNeedsAux; // We need to decode the auxiliary channels - S8 mDecodingAux; // Are we decoding high components - S8 mIsRawImageValid; - S8 mHasFetcher; // We've made a fecth request - S8 mIsFetching; // Fetch request is active - S8 mFullyLoaded; - mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database. - - // Override the computation of discard levels if we know the exact output size of the image. - // Used for UI textures to not decode, even if we have more data. - S32 mKnownDrawWidth; - S32 mKnownDrawHeight; - - F32 mDecodePriority; // The priority for decoding this image. - mutable F32 mAdditionalDecodePriority; // priority add to mDecodePriority. - S32 mBoostLevel; // enum describing priority level - - typedef std::list callback_list_t; - callback_list_t mLoadedCallbackList; - - LLPointer mRawImage; - S32 mRawDiscardLevel; - S32 mMinDiscardLevel; - F32 mCalculatedDiscardLevel; // Last calculated discard level - - //keep a copy of mRawImage for some special purposes - //when mForceToSaveRawImage is set. - BOOL mForceToSaveRawImage ; - LLPointer mSavedRawImage; - S32 mSavedRawDiscardLevel; - S32 mDesiredSavedRawDiscardLevel; - - // Used ONLY for cloth meshes right now. Make SURE you know what you're - // doing if you use it for anything else! - djs - LLPointer mAuxRawImage; - - //a small version of the copy of the raw image (<= 64 * 64) - LLPointer mCachedRawImage; - S32 mCachedRawDiscardLevel; - BOOL mCachedRawImageReady; //the rez of the mCachedRawImage reaches the upper limit. - - LLHost mTargetHost; // if LLHost::invalid, just request from agent's simulator - - BOOL mForSculpt ; //a flag if the texture is used for a sculpt data. - mutable BOOL mNeedsResetMaxVirtualSize ; - - ll_face_list_t mFaceList ; //reverse pointer pointing to the faces using this image as texture - U32 mNumFaces ; - LLFrameTimer mLastFaceListUpdateTimer ; - - ll_volume_list_t mVolumeList; - U32 mNumVolumes; - LLFrameTimer mLastVolumeListUpdateTimer; - - bool mCanUseHTTP; // can this image be fetched by http - -public: - static const U32 sCurrentFileVersion; - // Default textures - static LLPointer sMissingAssetImagep; // Texture to show for an image asset that is not in the database - static LLPointer sWhiteImagep; // Texture to show NOTHING (whiteness) - static LLPointer sDefaultImagep; // "Default" texture for error cases - static LLPointer sSmokeImagep; // Old "Default" translucent texture - static LLPointer sNullImagep; // Null texture for non-textured objects. - - static S32 sImageCount; - static S32 sRawCount; - static S32 sAuxCount; - static LLTimer sEvaluationTimer; - static S8 sCameraMovingDiscardBias; - static F32 sDesiredDiscardBias; - static F32 sDesiredDiscardScale; - static S32 sBoundTextureMemoryInBytes; - static S32 sTotalTextureMemoryInBytes; - static S32 sMaxBoundTextureMemInMegaBytes; - static S32 sMaxTotalTextureMemInMegaBytes; - static S32 sMaxDesiredTextureMemInBytes ; - static BOOL sDontLoadVolumeTextures; - - static S32 sMaxSculptRez ; - static S32 sMinLargeImageSize ; - static S32 sMaxSmallImageSize ; - static BOOL sFreezeImageScalingDown ;//do not scale down image res if set. - static S32 sLLViewerImageCount ; -}; - - - -#endif diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index aa9c1e9ff..fd779746e 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -324,8 +324,8 @@ bool LLViewerInventoryItem::exportFileLocal(LLFILE* fp) const fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); mPermissions.exportFile(fp); fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); - const char* inv_type_str = LLInventoryType::lookup(mInventoryType); - if(inv_type_str) fprintf(fp, "\t\tinv_type\t%s\n", inv_type_str); + const std::string& inv_type_str = LLInventoryType::lookup(mInventoryType); + if(!inv_type_str.empty()) fprintf(fp, "\t\tinv_type\t%s\n", inv_type_str.c_str()); fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); fprintf(fp, "\t\tcreation_date\t%d\n", (S32) mCreationDate); fprintf(fp,"\t}\n"); @@ -372,7 +372,7 @@ EWearableType LLViewerInventoryItem::getWearableType() const { return WT_INVALID; } - return EWearableType(getFlags() & II_FLAGS_WEARABLES_MASK); + return EWearableType(getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK); } // [/RLVa:KB] diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp index b89e1eeaa..8e8dcef98 100644 --- a/indra/newview/llviewerjointattachment.cpp +++ b/indra/newview/llviewerjointattachment.cpp @@ -139,7 +139,7 @@ void LLViewerJointAttachment::setupDrawable(LLViewerObject *object) LLViewerObject::const_child_list_t& child_list = object->getChildren(); for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) + iter != child_list.end(); ++iter) { LLViewerObject* childp = *iter; if (childp && childp->mDrawable.notNull()) @@ -197,7 +197,7 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object) } LLViewerObject::const_child_list_t& child_list = object->getChildren(); for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) + iter != child_list.end(); ++iter) { LLViewerObject* childp = *iter; if (childp && childp->mText.notNull()) @@ -266,7 +266,7 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object) LLViewerObject::const_child_list_t& child_list = object->getChildren(); for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) + iter != child_list.end(); ++iter) { LLViewerObject* childp = *iter; if (childp && childp->mDrawable.notNull()) @@ -291,7 +291,7 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object) } LLViewerObject::const_child_list_t& child_list = object->getChildren(); for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) + iter != child_list.end(); ++iter) { LLViewerObject* childp = *iter; if (childp->mText.notNull()) diff --git a/indra/newview/llviewerjointattachment.h b/indra/newview/llviewerjointattachment.h index 7037db039..269f7158b 100644 --- a/indra/newview/llviewerjointattachment.h +++ b/indra/newview/llviewerjointattachment.h @@ -114,8 +114,8 @@ public: protected: void calcLOD(); void setupDrawable(LLViewerObject *object); - -protected: + +private: BOOL mVisibleInFirst; LLVector3 mOriginalPos; S32 mGroup; diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 5e5a98d0b..055e488ff 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -52,7 +52,7 @@ #include "lltexlayer.h" #include "llviewercamera.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerjointmesh.h" #include "llvoavatar.h" #include "llsky.h" @@ -231,7 +231,7 @@ void LLViewerJointMesh::setColor( F32 red, F32 green, F32 blue, F32 alpha ) //-------------------------------------------------------------------- // LLViewerJointMesh::getTexture() //-------------------------------------------------------------------- -//LLViewerImage *LLViewerJointMesh::getTexture() +//LLViewerTexture *LLViewerJointMesh::getTexture() //{ // return mTexture; //} @@ -239,7 +239,7 @@ void LLViewerJointMesh::setColor( F32 red, F32 green, F32 blue, F32 alpha ) //-------------------------------------------------------------------- // LLViewerJointMesh::setTexture() //-------------------------------------------------------------------- -void LLViewerJointMesh::setTexture( LLViewerImage *texture ) +void LLViewerJointMesh::setTexture( LLViewerTexture *texture ) { mTexture = texture; @@ -558,7 +558,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) { if( mLayerSet->hasComposite() ) { - gGL.getTexUnit(0)->bind(mLayerSet->getComposite()->getTexture()); + gGL.getTexUnit(0)->bind(mLayerSet->getComposite()); } else { @@ -568,22 +568,22 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) { llwarns << "Layerset without composite" << llendl; } - gGL.getTexUnit(0)->bind(gImageList.getImage(IMG_DEFAULT)); + gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT)); } } else if ( !is_dummy && mTexture.notNull() ) { - if(mTexture->getHasGLTexture()) + if(mTexture->hasGLTexture()) { old_mode = mTexture->getAddressMode(); } - gGL.getTexUnit(0)->bind(mTexture.get()); + gGL.getTexUnit(0)->bind(mTexture); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); } else { - gGL.getTexUnit(0)->bind(gImageList.getImage(IMG_DEFAULT_AVATAR)); + gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR)); } if (gRenderForSelect) diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h index 721c3f1dd..3e4854e1a 100644 --- a/indra/newview/llviewerjointmesh.h +++ b/indra/newview/llviewerjointmesh.h @@ -34,7 +34,7 @@ #define LL_LLVIEWERJOINTMESH_H #include "llviewerjoint.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llpolymesh.h" #include "v4color.h" #include "llapr.h" @@ -72,7 +72,7 @@ protected: LLColor4 mColor; // color value // LLColor4 mSpecular; // specular color (always white for now) F32 mShiny; // shiny value - LLPointer mTexture; // ptr to a global texture + LLPointer mTexture; // ptr to a global texture LLTexLayerSet* mLayerSet; // ptr to a layer set owned by the avatar U32 mTestImageName; // handle to a temporary texture for previewing uploads LLPolyMesh* mMesh; // ptr to a global polymesh @@ -110,7 +110,7 @@ public: void setSpecular( const LLColor4& color, F32 shiny ) { /*mSpecular = color;*/ mShiny = shiny; }; // Sets the shape texture - void setTexture( LLViewerImage *texture ); + void setTexture( LLViewerTexture *texture ); void setTestTexture( U32 name ) { mTestImageName = name; } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index b2fa45dcf..dbb83b1ee 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -37,9 +37,8 @@ #include "llhoverview.h" #include "llmimetypes.h" #include "llviewercontrol.h" -#include "llviewerimage.h" #include "llviewerwindow.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" //#include "viewerversion.h" #include "llpluginclassmedia.h" @@ -377,6 +376,8 @@ LLViewerMediaImpl::LLViewerMediaImpl(const std::string& media_url, mMediaURL(media_url), mMimeType(mime_type), mNeedsNewTexture(true), + mTextureUsedWidth(0), + mTextureUsedHeight(0), mSuspendUpdates(false), mVisible(true) { @@ -881,23 +882,25 @@ void LLViewerMediaImpl::updateMovieImage(const LLUUID& uuid, BOOL active) // If we have changed media uuid, restore the old one if (!mTextureId.isNull()) { - LLViewerImage* oldImage = LLViewerImage::getImage( mTextureId ); - if (oldImage) + LLViewerTexture* oldImage = LLViewerTextureManager::findTexture( mTextureId ); + if (oldImage) { - oldImage->reinit(mMovieImageHasMips); + // Casting to LLViewerMediaTexture is a huge hack. Implement LLViewerMediaTexture some time later. + ((LLViewerMediaTexture*)oldImage)->reinit(mMovieImageHasMips); oldImage->mIsMediaTexture = FALSE; } } // If the movie is playing, set the new media image if (active && !uuid.isNull()) { - LLViewerImage* viewerImage = LLViewerImage::getImage( uuid ); + LLViewerTexture* viewerImage = LLViewerTextureManager::findTexture( uuid ); if( viewerImage ) { mTextureId = uuid; // Can't use mipmaps for movies because they don't update the full image - mMovieImageHasMips = viewerImage->getUseMipMaps(); - viewerImage->reinit(FALSE); + // Casting to LLViewerMediaTexture is a huge hack. Implement LLViewerMediaTexture some time later. + mMovieImageHasMips = ((LLViewerMediaTexture*)viewerImage)->getUseMipMaps(); + ((LLViewerMediaTexture*)viewerImage)->reinit(FALSE); viewerImage->mIsMediaTexture = TRUE; } } @@ -929,7 +932,7 @@ void LLViewerMediaImpl::update() return; } - LLViewerImage* placeholder_image = updatePlaceholderImage(); + LLViewerTexture* placeholder_image = updatePlaceholderImage(); if(placeholder_image) { @@ -976,7 +979,7 @@ void LLViewerMediaImpl::updateImagesMediaStreams() ////////////////////////////////////////////////////////////////////////////////////////// -LLViewerImage* LLViewerMediaImpl::updatePlaceholderImage() +/*LLViewerMediaTexture*/LLViewerTexture* LLViewerMediaImpl::updatePlaceholderImage() { if(mTextureId.isNull()) { @@ -984,13 +987,18 @@ LLViewerImage* LLViewerMediaImpl::updatePlaceholderImage() return NULL; } - LLViewerImage* placeholder_image = gImageList.getImage( mTextureId ); + LLViewerMediaTexture* placeholder_image = (LLViewerMediaTexture*)LLViewerTextureManager::getFetchedTexture( mTextureId ); + placeholder_image->getLastReferencedTimer()->reset(); + if (mNeedsNewTexture || placeholder_image->getUseMipMaps() || ! placeholder_image->mIsMediaTexture - || placeholder_image->getWidth() != mMediaSource->getTextureWidth() - || placeholder_image->getHeight() != mMediaSource->getTextureHeight()) + || (placeholder_image->getWidth() != mMediaSource->getTextureWidth()) + || (placeholder_image->getHeight() != mMediaSource->getTextureHeight()) + || (mTextureUsedWidth != mMediaSource->getWidth()) + || (mTextureUsedHeight != mMediaSource->getHeight()) + ) { llinfos << "initializing media placeholder" << llendl; llinfos << "movie image id " << mTextureId << llendl; @@ -1024,6 +1032,11 @@ LLViewerImage* LLViewerMediaImpl::updatePlaceholderImage() // MEDIAOPT: set this dynamically on play/stop placeholder_image->mIsMediaTexture = true; mNeedsNewTexture = false; + + // If the amount of the texture being drawn by the media goes down in either width or height, + // recreate the texture to avoid leaving parts of the old image behind. + mTextureUsedWidth = mMediaSource->getWidth(); + mTextureUsedHeight = mMediaSource->getHeight(); } return placeholder_image; diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index afda426af..1e9ef6c90 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -42,7 +42,8 @@ class LLViewerMediaImpl; class LLUUID; -class LLViewerImage; +//class LLViewerMediaTexture; +class LLViewerTexture; typedef LLPointer viewer_media_t; /////////////////////////////////////////////////////////////////////////////// @@ -213,12 +214,14 @@ public: bool mMediaAutoScale; bool mMediaLoop; bool mNeedsNewTexture; + S32 mTextureUsedWidth; + S32 mTextureUsedHeight; bool mSuspendUpdates; bool mVisible; private: - LLViewerImage *updatePlaceholderImage(); + /*LLViewerMediaTexture*/LLViewerTexture *updatePlaceholderImage(); }; #endif // LLVIEWERMEDIA_H diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index afcbf7cbf..873e6d1ae 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -209,7 +209,7 @@ #include "llviewercamera.h" #include "llviewergenericmessage.h" #include "llviewergesture.h" -#include "llviewerimagelist.h" // gImageList +#include "llviewertexturelist.h" // gTextureList #include "llviewerinventory.h" #include "llviewermenufile.h" // init_menu_file() #include "llviewermessage.h" @@ -1526,7 +1526,7 @@ void init_debug_rendering_menu(LLMenuGL* menu) item = new LLMenuItemCheckGL("Animate Textures", menu_toggle_control, NULL, menu_check_control, (void*)"AnimateTextures"); menu->append(item); - item = new LLMenuItemCheckGL("Disable Textures", menu_toggle_variable, NULL, menu_check_variable, (void*)&LLViewerImage::sDontLoadVolumeTextures); + item = new LLMenuItemCheckGL("Disable Textures", menu_toggle_variable, NULL, menu_check_variable, (void*)&LLViewerTexture::sDontLoadVolumeTextures); menu->append(item); item = new LLMenuItemCheckGL("HTTP Get Textures", menu_toggle_control, NULL, menu_check_control, (void*)"ImagePipelineUseHTTP"); @@ -3913,6 +3913,7 @@ class LLEditEnableCustomizeAvatar : public view_listener_t } }; + class LLEditEnableChangeDisplayname : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -6642,7 +6643,7 @@ class LLFloaterVisible : public view_listener_t } else if (floater_name == "teleport history") { - new_value = gFloaterTeleportHistory->getVisible(); + new_value = (gFloaterTeleportHistory && gFloaterTeleportHistory->getVisible()); } else if (floater_name == "im") { @@ -7648,7 +7649,7 @@ void handle_selected_texture_info(void*) { if (!node->isTESelected(i)) continue; - LLViewerImage* img = node->getObject()->getTEImage(i); + LLViewerTexture* img = node->getObject()->getTEImage(i); LLUUID image_id = img->getID(); faces_per_texture[image_id].push_back(i); // @@ -7664,7 +7665,7 @@ void handle_selected_texture_info(void*) for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it) { U8 te = it->second[0]; - LLViewerImage* img = node->getObject()->getTEImage(te); + LLViewerTexture* img = node->getObject()->getTEImage(te); S32 height = img->getHeight(); S32 width = img->getWidth(); S32 components = img->getComponents(); @@ -7694,7 +7695,7 @@ void handle_selected_texture_info(void*) void handle_dump_image_list(void*) { - gImageList.dump(); + gTextureList.dump(); } void handle_test_male(void*) @@ -8467,7 +8468,7 @@ void handle_grab_texture(void* data) name, LLStringUtil::null, LLSaleInfo::DEFAULT, - LLInventoryItem::II_FLAGS_NONE, + LLInventoryItemFlags::II_FLAGS_NONE, creation_date_now); item->updateServer(TRUE); @@ -8894,6 +8895,10 @@ class LLEditEnableTakeOff : public view_listener_t { new_value = LLAgent::selfHasWearable((void *)WT_TATTOO); } + if (clothing == "physics") + { + new_value = LLAgent::selfHasWearable((void *)WT_PHYSICS); + } // [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.1.3b) | Modified: RLVa-1.1.3b | OK // Why aren't they using LLWearable::typeNameToType()? *confuzzled* @@ -8957,6 +8962,10 @@ class LLEditTakeOff : public view_listener_t { LLAgent::userRemoveWearable((void*)WT_TATTOO); } + else if (clothing == "physics") + { + LLAgent::userRemoveWearable((void*)WT_PHYSICS); + } else if (clothing == "all") { LLAgent::userRemoveAllClothes(NULL); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 8fa19c504..b4d01d476 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -55,7 +55,7 @@ #include "llstatusbar.h" #include "llviewercontrol.h" // gSavedSettings -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "lluictrlfactory.h" #include "llviewermenu.h" // gMenuHolder #include "llviewerregion.h" @@ -526,12 +526,15 @@ class LLFileTakeSnapshotToDisk : public view_listener_t S32 width = gViewerWindow->getWindowDisplayWidth(); S32 height = gViewerWindow->getWindowDisplayHeight(); + F32 supersample = 1.f; if (gSavedSettings.getBOOL("HighResSnapshot")) { -#if SHY_MOD // screenshot improvement +#if 1//SHY_MOD // screenshot improvement const F32 mult = gSavedSettings.getF32("SHHighResSnapshotScale"); width *= mult; height *= mult; + static const LLCachedControl super_sample_scale("SHHighResSnapshotSuperSample",1.f); + supersample = super_sample_scale; #else //shy_mod width *= 2; height *= 2; @@ -544,7 +547,10 @@ class LLFileTakeSnapshotToDisk : public view_listener_t TRUE, FALSE, gSavedSettings.getBOOL("RenderUIInSnapshot"), - FALSE)) + FALSE, + LLViewerWindow::SNAPSHOT_TYPE_COLOR, + 6144, + supersample)) { gViewerWindow->playSnapshotAnimAndSound(); @@ -623,7 +629,7 @@ void handle_compress_image(void*) BOOL success; - success = LLViewerImageList::createUploadFile(infile, outfile, IMG_CODEC_TGA); + success = LLViewerTextureList::createUploadFile(infile, outfile, IMG_CODEC_TGA); if (success) { @@ -679,7 +685,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, else if( exten == "bmp") { asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerImageList::createUploadFile(src_filename, + if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_BMP )) { @@ -694,7 +700,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, else if( exten == "tga") { asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerImageList::createUploadFile(src_filename, + if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_TGA )) { @@ -709,7 +715,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, else if( exten == "jpg" || exten == "jpeg") { asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerImageList::createUploadFile(src_filename, + if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_JPEG )) { @@ -724,7 +730,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, else if( exten == "png") { asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerImageList::createUploadFile(src_filename, + if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_PNG )) { diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a9fc5c5f8..99844508f 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -232,6 +232,75 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] = FALSE // ControlYourCamera }; +template +class SH_SpamHandler +{ +public: + SH_SpamHandler(const char *pToggleCtrl, const char *pDurCtrl, const char *pFreqCtrl) : + mDuration(pDurCtrl, 1.f), + mFrequency(pFreqCtrl, 5), + mEnabled(false) + { + gSavedSettings.getControl(pToggleCtrl)->getSignal()->connect(boost::bind(&SH_SpamHandler::CtrlToggle, this, _1)); + CtrlToggle(gSavedSettings.getBOOL(pToggleCtrl)); + } + bool CtrlToggle(const LLSD& newvalue) + { + bool on = newvalue.asBoolean(); + if(on == mEnabled) + return true; + mEnabled = on; + mTimer.stop(); + mActiveList.clear(); + mBlockedList.clear(); + return true; + } + bool isBlocked(const T &owner, const LLUUID &source_id, const char *pNotification, LLSD args=LLSD()) + { + if(!mEnabled || isAgent(owner)) + return false; + if(mBlockedList.find(owner) != mBlockedList.end()) + return true; + if(mTimer.getStarted() && mTimer.getElapsedTimeF32() < mDuration) + { + typename std::map::iterator it = mActiveList.insert(std::pair(owner,0)).first; + if(++(it->second)>=mFrequency) + { + mBlockedList.insert(owner); + if(pNotification) + { + args["OWNER"] = owner; + args["SOURCE"] = source_id; + LLNotifications::getInstance()->add(pNotification,args); + } + return true; + } + } + else + { + mActiveList.clear(); + mTimer.start(); + } + return false; + } +private: + //Owner is either a key, or a name. Do not look up perms since object may be unknown. + static bool isAgent(const T &owner); + bool mEnabled; + LLFrameTimer mTimer; + const LLCachedControl mDuration; + const LLCachedControl mFrequency; + std::map mActiveList; + std::set mBlockedList; +}; +template<> bool SH_SpamHandler::isAgent(const LLUUID &owner) { return gAgent.getID() == owner; } +template<> bool SH_SpamHandler::isAgent(const std::string &owner) +{ + std::string str; + gAgent.getName(str); + return str == owner; +} + bool friendship_offer_callback(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); @@ -1631,6 +1700,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) chat.mFromID = from_id; chat.mFromName = name; chat.mSourceType = (from_id.isNull() || (name == std::string(SYSTEM_FROM))) ? CHAT_SOURCE_SYSTEM : CHAT_SOURCE_AGENT; + + if(chat.mSourceType == CHAT_SOURCE_AGENT) + { + LLSD args; + args["FULL_NAME"] = name; + static SH_SpamHandler avatar_spam_check("SGBlockGeneralSpam","SGSpamTime","SGSpamCount"); + static SH_SpamHandler object_spam_check("SGBlockGeneralSpam","SGSpamTime","SGSpamCount"); + if(d==IM_FROM_TASK||d==IM_GOTO_URL||d==IM_FROM_TASK_AS_ALERT||d==IM_TASK_INVENTORY_OFFERED||d==IM_TASK_INVENTORY_ACCEPTED||d==IM_TASK_INVENTORY_DECLINED) + { + if(object_spam_check.isBlocked(from_id,session_id,"BlockedGeneralObjects",args)) + return; + } + else if(avatar_spam_check.isBlocked(from_id,from_id,"BlockedGeneralAvatar",args)) + return; + } LLViewerObject *source = gObjectList.findObject(session_id); //Session ID is probably the wrong thing. if (source) @@ -2812,6 +2896,9 @@ void process_offer_callingcard(LLMessageSystem* msg, void**) } else { + static SH_SpamHandler spam_check("SGBlockCardSpam","SHSpamTime","SGSpamCount"); + if(spam_check.isBlocked(source_id,source_id,"BlockedCards",args)) + return; LLNotifications::instance().add("OfferCallingCard", args, payload); } } @@ -2985,6 +3072,14 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) // if (chatter) { + LLSD args; + args["FULL_NAME"] = from_name; + static SH_SpamHandler avatar_spam_check("SGBlockChatSpam","SGChatSpamTime","SGChatSpamCount"); + static SH_SpamHandler object_spam_check("SGBlockChatSpam","SGChatSpamTime","SGChatSpamCount"); + if( (chatter->isAvatar() && avatar_spam_check.isBlocked(from_id,from_id,"BlockedChatterAvatar",args)) || + (!chatter->isAvatar() && object_spam_check.isBlocked(owner_id,from_id,"BlockedChatterObjects",args)) ) + return; + chat.mPosAgent = chatter->getPositionAgent(); // Make swirly things only for talking objects. (not script debug messages, though) @@ -5835,7 +5930,7 @@ void process_derez_container(LLMessageSystem *msg, void**) } void container_inventory_arrived(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void* data) { @@ -5855,8 +5950,8 @@ void container_inventory_arrived(LLViewerObject* object, LLAssetType::AT_NONE, std::string("Acquired Items")); //TODO: Translate - InventoryObjectList::const_iterator it = inventory->begin(); - InventoryObjectList::const_iterator end = inventory->end(); + LLInventoryObject::object_list_t::const_iterator it = inventory->begin(); + LLInventoryObject::object_list_t::const_iterator end = inventory->end(); for ( ; it != end; ++it) { if ((*it)->getType() != LLAssetType::AT_CATEGORY && @@ -6366,17 +6461,22 @@ static LLNotificationFunctorRegistration callback_script_dialog_reg_2("ScriptDia void process_script_dialog(LLMessageSystem* msg, void**) { S32 i; - LLSD payload; + LLUUID object_id; + msg->getUUID("Data", "ObjectID", object_id); + + if (LLMuteList::getInstance()->isMuted(object_id)) + { + return; + } + std::string message; std::string first_name; std::string last_name; std::string title; - LLUUID object_id; S32 chat_channel; - msg->getUUID("Data", "ObjectID", object_id); msg->getString("Data", "FirstName", first_name); msg->getString("Data", "LastName", last_name); msg->getString("Data", "ObjectName", title); @@ -6437,6 +6537,10 @@ void process_script_dialog(LLMessageSystem* msg, void**) args["FIRST"] = first_name; args["LAST"] = last_name; + static SH_SpamHandler spam_check("SGBlockDialogSpam","SGSpamTime","SGSpamCount"); + if(spam_check.isBlocked(first_name + " " + last_name,object_id,"BlockedDialogs",args)) + return; + if (is_text_box) { args["DEFAULT"] = default_text; @@ -6601,6 +6705,8 @@ void process_initiate_download(LLMessageSystem* msg, void**) void process_script_teleport_request(LLMessageSystem* msg, void**) { + if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return; + std::string object_name; std::string sim_name; LLVector3 pos; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 0aabf8269..74a84cd00 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -70,7 +70,7 @@ #include "llrendersphere.h" #include "lltooldraganddrop.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerobjectlist.h" #include "llviewerparceloverlay.h" @@ -2221,8 +2221,8 @@ void LLViewerObject::deleteInventoryItem(const LLUUID& item_id) { if(mInventory) { - InventoryObjectList::iterator it = mInventory->begin(); - InventoryObjectList::iterator end = mInventory->end(); + LLInventoryObject::object_list_t::iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::iterator end = mInventory->end(); for( ; it != end; ++it ) { if((*it)->getUUID() == item_id) @@ -2532,7 +2532,7 @@ void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data) } else { - object->mInventory = new InventoryObjectList(); + object->mInventory = new LLInventoryObject::object_list_t(); } LLPointer obj; obj = new LLInventoryObject(object->mID, LLUUID::null, @@ -2588,7 +2588,7 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename) } else { - mInventory = new InventoryObjectList; + mInventory = new LLInventoryObject::object_list_t; } while(ifs.good()) { @@ -2725,8 +2725,8 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id) LLInventoryObject* rv = NULL; if(mInventory) { - InventoryObjectList::iterator it = mInventory->begin(); - InventoryObjectList::iterator end = mInventory->end(); + LLInventoryObject::object_list_t::iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::iterator end = mInventory->end(); for ( ; it != end; ++it) { if((*it)->getUUID() == item_id) @@ -2739,12 +2739,12 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id) return rv; } -void LLViewerObject::getInventoryContents(InventoryObjectList& objects) +void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects) { if(mInventory) { - InventoryObjectList::iterator it = mInventory->begin(); - InventoryObjectList::iterator end = mInventory->end(); + LLInventoryObject::object_list_t::iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::iterator end = mInventory->end(); for( ; it != end; ++it) { if ((*it)->getType() != LLAssetType::AT_CATEGORY) @@ -2774,8 +2774,8 @@ LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& ass { LLViewerInventoryItem* item = NULL; - InventoryObjectList::iterator it = mInventory->begin(); - InventoryObjectList::iterator end = mInventory->end(); + LLInventoryObject::object_list_t::iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::iterator end = mInventory->end(); for( ; it != end; ++it) { LLInventoryObject* obj = *it; @@ -2986,14 +2986,14 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */) S32 tex_count = getNumTEs(); for (i = 0; i < tex_count; i++) { - getTEImage(i)->setBoostLevel(LLViewerImageBoostLevel::BOOST_SELECTED); + getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); } if (isSculpted()) { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); LLUUID sculpt_id = sculpt_params->getSculptTexture(); - gImageList.getImage(sculpt_id)->setBoostLevel(LLViewerImageBoostLevel::BOOST_SELECTED); + LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); } if (boost_children) @@ -3421,8 +3421,8 @@ void LLViewerObject::setPositionParent(const LLVector3 &pos_parent, BOOL damped) // Set position relative to parent, if no parent, relative to region if (!isRoot()) { - LLViewerObject::setPosition(pos_parent); - updateDrawable(damped); + LLViewerObject::setPosition(pos_parent, damped); + //updateDrawable(damped); } else { @@ -3463,6 +3463,7 @@ void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped) LLVector3 position_offset = getPosition() * getParent()->getRotation(); ((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset); + updateDrawable(damped); } else if (isJointChild()) { @@ -3471,15 +3472,14 @@ void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped) LLQuaternion inv_parent_rot = parent->getRotation(); inv_parent_rot.transQuat(); LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot; - LLViewerObject::setPosition(pos_parent); + LLViewerObject::setPosition(pos_parent, damped); } else { - LLViewerObject::setPosition(pos_edit); + LLViewerObject::setPosition(pos_edit, damped); mPositionRegion = pos_edit; mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion); - } - updateDrawable(damped); + } } @@ -3621,8 +3621,8 @@ void LLViewerObject::setNumTEs(const U8 num_tes) { if (num_tes) { - LLPointer *new_images; - new_images = new LLPointer[num_tes]; + LLPointer *new_images; + new_images = new LLPointer[num_tes]; for (i = 0; i < num_tes; i++) { if (i < getNumTEs()) @@ -3756,11 +3756,11 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry) // if (mDrawable.notNull() && mDrawable->isVisible()) // { const LLUUID& image_id = getTE(te)->getID(); - mTEImages[te] = gImageList.getImage(image_id); + mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); // } } -void LLViewerObject::setTEImage(const U8 te, LLViewerImage *imagep) +void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep) { if (mTEImages[te] != imagep) { @@ -3782,7 +3782,7 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos uuid == LLUUID::null) { retval = LLPrimitive::setTETexture(te, uuid); - mTEImages[te] = gImageList.getImageFromHost(uuid, host); + mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); setChanged(TEXTURE); if (mDrawable.notNull()) { @@ -3793,7 +3793,7 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos } -void LLViewerObject::changeTEImage(S32 index, LLViewerImage* new_image) +void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image) { if(index < 0 || index >= getNumTEs()) { @@ -4046,20 +4046,20 @@ S32 LLViewerObject::setTERotation(const U8 te, const F32 r) } -LLViewerImage *LLViewerObject::getTEImage(const U8 face) const +LLViewerTexture *LLViewerObject::getTEImage(const U8 face) const { // llassert(mTEImages); if (face < getNumTEs()) { - LLViewerImage* image = mTEImages[face]; + LLViewerTexture* image = mTEImages[face]; if (image) { return image; } else { - return (LLViewerImage*)((LLImageGL*)LLViewerImage::sDefaultImagep); + return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep); } } @@ -4138,8 +4138,8 @@ S32 LLViewerObject::countInventoryContents(LLAssetType::EType type) S32 count = 0; if( mInventory ) { - InventoryObjectList::const_iterator it = mInventory->begin(); - InventoryObjectList::const_iterator end = mInventory->end(); + LLInventoryObject::object_list_t::const_iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::const_iterator end = mInventory->end(); for( ; it != end ; ++it ) { if( (*it)->getType() == type ) @@ -4194,7 +4194,7 @@ std::string LLViewerObject::getDebugText() } // -void LLViewerObject::setIcon(LLViewerImage* icon_image) +void LLViewerObject::setIcon(LLViewerTexture* icon_image) { if (!mIcon) { @@ -4284,14 +4284,14 @@ void LLViewerObject::setParticleSource(const LLPartSysData& particle_parameters, if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID) { - LLViewerImage* image; + LLViewerTexture* image; if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null) { - image = gImageList.getImageFromFile("pixiesmall.tga"); + image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.tga"); } else { - image = gImageList.getImage(mPartSourcep->mPartSysData.mPartImageID); + image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID); } mPartSourcep->setImage(image); } @@ -4333,14 +4333,14 @@ void LLViewerObject::unpackParticleSource(const S32 block_num, const LLUUID& own { if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID) { - LLViewerImage* image; + LLViewerTexture* image; if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null) { - image = gImageList.getImageFromFile("pixiesmall.j2c"); + image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c"); } else { - image = gImageList.getImage(mPartSourcep->mPartSysData.mPartImageID); + image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID); } mPartSourcep->setImage(image); } @@ -4380,14 +4380,14 @@ void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_ { if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID) { - LLViewerImage* image; + LLViewerTexture* image; if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null) { - image = gImageList.getImageFromFile("pixiesmall.j2c"); + image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c"); } else { - image = gImageList.getImage(mPartSourcep->mPartSysData.mPartImageID); + image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID); } mPartSourcep->setImage(image); } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 0dc36c6c2..4833b96d8 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -66,7 +66,7 @@ class LLMessageSystem; class LLPrimitive; class LLPipeline; class LLTextureEntry; -class LLViewerImage; +class LLViewerTexture; class LLViewerInventoryItem; class LLViewerObject; class LLViewerPartSourceScript; @@ -86,7 +86,7 @@ typedef enum e_object_update_type // callback typedef for inventory typedef void (*inventory_callback)(LLViewerObject*, - InventoryObjectList*, + LLInventoryObject::object_list_t*, S32 serial_num, void*); @@ -312,9 +312,9 @@ public: /*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags ); /*virtual*/ S32 setTEGlow(const U8 te, const F32 glow); /*virtual*/ BOOL setMaterial(const U8 material); - virtual void setTEImage(const U8 te, LLViewerImage *imagep); // Not derived from LLPrimitive - void changeTEImage(S32 index, LLViewerImage* new_image) ; - LLViewerImage *getTEImage(const U8 te) const; + virtual void setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive + void changeTEImage(S32 index, LLViewerTexture* new_image) ; + LLViewerTexture *getTEImage(const U8 te) const; void fitFaceTexture(const U8 face); void sendTEUpdate() const; // Sends packed representation of all texture entry information @@ -361,7 +361,7 @@ public: // std::string getDebugText(); // - void setIcon(LLViewerImage* icon_image); + void setIcon(LLViewerTexture* icon_image); void clearIcon(); void markForUpdate(BOOL priority); @@ -535,7 +535,7 @@ public: // Last total CRC received from sim, used for caching U32 mTotalCRC; - LLPointer *mTEImages; + LLPointer *mTEImages; // Selection, picking and rendering variables U32 mGLName; // GL "name" used by selection code @@ -622,7 +622,7 @@ protected: F32 mPixelArea; // Apparent area in pixels // This is the object's inventory from the viewer's perspective. - InventoryObjectList* mInventory; + LLInventoryObject::object_list_t* mInventory; class LLInventoryCallbackInfo { public: diff --git a/indra/newview/llviewerobjectbackup.cpp b/indra/newview/llviewerobjectbackup.cpp old mode 100755 new mode 100644 index 8892de13f..c944780af --- a/indra/newview/llviewerobjectbackup.cpp +++ b/indra/newview/llviewerobjectbackup.cpp @@ -72,7 +72,7 @@ #include "lluictrlfactory.h" #include "lluploaddialog.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobjectlist.h" #include "llviewermenu.h" #include "llviewerregion.h" @@ -147,7 +147,7 @@ public: mPostData["name"].asString(), mPostData["description"].asString(), LLSaleInfo::DEFAULT, - LLInventoryItem::II_FLAGS_NONE, + LLInventoryItemFlags::II_FLAGS_NONE, creation_date_now); gInventory.updateItem(item); gInventory.notifyObservers(); @@ -691,16 +691,16 @@ void LLObjectBackup::exportNextTexture() id = (*iter); - LLViewerImage* imagep = gImageList.hasImage(id); + LLViewerTexture* imagep = LLViewerTextureManager::findTexture(id); if (imagep != NULL) { S32 cur_discard = imagep->getDiscardLevel(); if (cur_discard > 0) { - if (imagep->getBoostLevel() != LLViewerImageBoostLevel::BOOST_PREVIEW) + if (imagep->getBoostLevel() != LLViewerTexture::BOOST_PREVIEW) { // we want to force discard 0: this one does this. - imagep->setBoostLevel(LLViewerImageBoostLevel::BOOST_PREVIEW); + imagep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); } } else diff --git a/indra/newview/llviewerobjectbackup.h b/indra/newview/llviewerobjectbackup.h old mode 100755 new mode 100644 diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 80000d21a..5e62531d1 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -64,7 +64,7 @@ #include "lltoolpie.h" #include "llkeyboard.h" #include "u64.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "lldatapacker.h" #ifdef LL_STANDALONE #include @@ -594,7 +594,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) { num_updates = (S32) mObjects.size() - mCurLazyUpdateIndex; max_value = (S32) mObjects.size(); - gImageList.setUpdateStats(TRUE); + gTextureList.setUpdateStats(TRUE); } else { @@ -827,13 +827,14 @@ void LLViewerObjectList::clearDebugText() void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp) { LLMemType mt(LLMemType::MTYPE_OBJECT); - if (mDeadObjects.count(objectp->mID)) + if (mDeadObjects.find(objectp->mID) != mDeadObjects.end()) { - llinfos << "Object " << objectp->mID << " already on dead list, ignoring cleanup!" << llendl; - return; + llinfos << "Object " << objectp->mID << " already on dead list!" << llendl; + } + else + { + mDeadObjects.insert(objectp->mID); } - - mDeadObjects.insert(std::pair >(objectp->mID, objectp)); // Cleanup any references we have to this object // Remove from object map so noone can look it up. @@ -1091,9 +1092,9 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap) LLViewerObject* objectp = *iter; llassert_always(objectp); - llassert_always(!objectp->isDead()); - - if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment()) + llassert(!objectp->isDead()); + + if (objectp->isDead() || !objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment()) { continue; } diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index 868e0ba8b..43d25229e 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -202,8 +202,7 @@ protected: vobj_list_t mMapObjects; - typedef std::map > vo_map; - vo_map mDeadObjects; // Need to keep multiple entries per UUID + std::set mDeadObjects; std::map > mUUIDObjectMap; std::map > mUUIDAvatarMap; diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp index ccd6b14d3..523fc0e29 100644 --- a/indra/newview/llviewerparcelmediaautoplay.cpp +++ b/indra/newview/llviewerparcelmediaautoplay.cpp @@ -39,7 +39,7 @@ #include "llviewerparcelmgr.h" #include "lluuid.h" #include "message.h" -#include "llviewerimagelist.h" // for texture stats +#include "llviewertexturelist.h" // for texture stats #include "llagent.h" const F32 AUTOPLAY_TIME = 5; // how many seconds before we autoplay @@ -113,13 +113,13 @@ BOOL LLViewerParcelMediaAutoPlay::tick() { if (this_media_texture_id.notNull()) // and if the media texture is good { - LLViewerImage *image = gImageList.getImage(this_media_texture_id, FALSE); + LLViewerTexture *image = LLViewerTextureManager::getFetchedTexture(this_media_texture_id, FALSE); F32 image_size = 0; if (image) { - image_size = image->mMaxVirtualSize; + image_size = image->getMaxVirtualSize(); } if (gAgent.getVelocity().magVec() < AUTOPLAY_SPEED) // and if the agent is stopped (slow enough) diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 72a3f159d..88f7e36bf 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -62,8 +62,7 @@ #include "llsdutil_math.h" #include "llstatusbar.h" #include "llui.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermenu.h" #include "llviewerparcelmedia.h" #include "llviewerparceloverlay.h" @@ -82,8 +81,8 @@ U8* LLViewerParcelMgr::sPackedOverlay = NULL; LLUUID gCurrentMovieID = LLUUID::null; -LLPointer sBlockedImage; -LLPointer sPassImage; +LLPointer sBlockedImage; +LLPointer sPassImage; // Local functions void optionally_start_music(LLParcel* parcel); @@ -145,8 +144,11 @@ LLViewerParcelMgr::LLViewerParcelMgr() mCollisionSegments = new U8[(mParcelsPerEdge+1)*(mParcelsPerEdge+1)]; resetSegments(mCollisionSegments); - mBlockedImage = gImageList.getImageFromFile("noentrylines.j2c"); - mPassImage = gImageList.getImageFromFile("noentrypasslines.j2c"); + // JC: Resolved a merge conflict here, eliminated + // mBlockedImage->setAddressMode(LLTexUnit::TAM_WRAP); + // because it is done in llviewertexturelist.cpp + mBlockedImage = LLViewerTextureManager::getFetchedTextureFromFile("noentrylines.j2c"); + mPassImage = LLViewerTextureManager::getFetchedTextureFromFile("noentrypasslines.j2c"); S32 overlay_size = mParcelsPerEdge * mParcelsPerEdge / PARCEL_OVERLAY_CHUNKS; sPackedOverlay = new U8[overlay_size]; @@ -2451,12 +2453,12 @@ void LLViewerParcelMgr::cleanupGlobals() LLParcelSelection::sNullSelection = NULL; } -LLViewerImage* LLViewerParcelMgr::getBlockedImage() const +LLViewerTexture* LLViewerParcelMgr::getBlockedImage() const { return sBlockedImage; } -LLViewerImage* LLViewerParcelMgr::getPassImage() const +LLViewerTexture* LLViewerParcelMgr::getPassImage() const { return sPassImage; } diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 9bf609639..236dbcbec 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -43,7 +43,7 @@ class LLUUID; class LLMessageSystem; class LLParcel; -class LLViewerImage; +class LLViewerTexture; class LLViewerRegion; // Constants for sendLandOwner @@ -284,8 +284,8 @@ private: static bool callbackJoinLand(const LLSD& notification, const LLSD& response); //void finishClaim(BOOL user_to_user_sale, U32 join); - LLViewerImage* getBlockedImage() const; - LLViewerImage* getPassImage() const; + LLViewerTexture* getBlockedImage() const; + LLViewerTexture* getPassImage() const; private: BOOL mSelected; @@ -329,8 +329,8 @@ private: BOOL mRenderSelection; S32 mCollisionBanned; LLFrameTimer mCollisionTimer; - LLImageGL* mBlockedImage; - LLImageGL* mPassImage; + LLViewerTexture* mBlockedImage; + LLViewerTexture* mPassImage; // Media S32 mMediaParcelId; diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index d005bd010..4e8f30f70 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -42,13 +42,12 @@ #include "v2math.h" // newview includes -#include "llviewerimage.h" #include "llviewercontrol.h" #include "llsurface.h" #include "llviewerregion.h" #include "llagent.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llselectmgr.h" #include "llfloatertools.h" #include "llglheaders.h" @@ -68,12 +67,9 @@ LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_ { // Create a texture to hold color information. // 4 components - // Use mipmaps = FALSE, clamped, NEAREST filter, for sharp edges - mTexture = new LLImageGL(FALSE); + // Use mipmaps = FALSE, clamped, NEAREST filter, for sharp edges mImageRaw = new LLImageRaw(mParcelGridsPerEdge, mParcelGridsPerEdge, OVERLAY_IMG_COMPONENTS); - mTexture->createGLTexture(0, mImageRaw, 0, TRUE, LLViewerImageBoostLevel::OTHER); - gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->bind(mTexture); + mTexture = LLViewerTextureManager::getLocalTexture(mImageRaw.get(), FALSE); mTexture->setAddressMode(LLTexUnit::TAM_CLAMP); mTexture->setFilteringOption(LLTexUnit::TFO_POINT); @@ -283,6 +279,10 @@ void LLViewerParcelOverlay::updateOverlayTexture() // Copy data into GL texture from raw data if (i >= COUNT) { + if (!mTexture->hasGLTexture()) + { + mTexture->createGLTexture(0, mImageRaw); + } mTexture->setSubImage(mImageRaw, 0, 0, mParcelGridsPerEdge, mParcelGridsPerEdge); mOverlayTextureIdx = -1; } diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h index 1ab83a20a..161b7a386 100644 --- a/indra/newview/llviewerparceloverlay.h +++ b/indra/newview/llviewerparceloverlay.h @@ -39,7 +39,7 @@ #include "lldarray.h" #include "llframetimer.h" #include "lluuid.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llgl.h" class LLViewerRegion; @@ -54,7 +54,7 @@ public: ~LLViewerParcelOverlay(); // ACCESS - LLImageGL* getTexture() const { return mTexture; } + LLViewerTexture* getTexture() const { return mTexture; } BOOL isOwned(const LLVector3& pos) const; BOOL isOwnedSelf(const LLVector3& pos) const; @@ -101,7 +101,7 @@ private: S32 mParcelGridsPerEdge; - LLPointer mTexture; + LLPointer mTexture; LLPointer mImageRaw; // Size: mParcelGridsPerEdge * mParcelGridsPerEdge diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp index d5c28fb67..216adc892 100644 --- a/indra/newview/llviewerpartsim.cpp +++ b/indra/newview/llviewerpartsim.cpp @@ -71,9 +71,9 @@ const F32 LLViewerPartSim::PART_ADAPT_RATE_MULT_RECIP = 1.0f/PART_ADAPT_RATE_MUL U32 LLViewerPart::sNextPartID = 1; -F32 calc_desired_size(LLVector3 pos, LLVector2 scale) +F32 calc_desired_size(LLViewerCamera* camera, LLVector3 pos, LLVector2 scale) { - F32 desired_size = (pos-LLViewerCamera::getInstance()->getOrigin()).magVec(); + F32 desired_size = (pos - camera->getOrigin()).magVec(); desired_size /= 4; return llclamp(desired_size, scale.magVec()*0.5f, PART_SIM_BOX_SIDE*2); } @@ -99,7 +99,7 @@ LLViewerPart::~LLViewerPart() --LLViewerPartSim::sParticleCount2 ; } -void LLViewerPart::init(LLPointer sourcep, LLViewerImage *imagep, LLVPCallback cb) +void LLViewerPart::init(LLPointer sourcep, LLViewerTexture *imagep, LLVPCallback cb) { LLMemType mt(LLMemType::MTYPE_PARTICLES); mPartID = LLViewerPart::sNextPartID; @@ -274,6 +274,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt) LLViewerPartSim::checkParticleCount(mParticles.size()); + LLViewerCamera* camera = LLViewerCamera::getInstance(); LLViewerRegion *regionp = getRegion(); S32 end = (S32) mParticles.size(); for (S32 i = 0 ; i < (S32)mParticles.size();) @@ -395,7 +396,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt) } else { - F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale); + F32 desired_size = calc_desired_size(camera, part->mPosAgent, part->mScale); if (!posInGroup(part->mPosAgent, desired_size)) { // Transfer particles between groups @@ -558,7 +559,8 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part) } else { - F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + F32 desired_size = calc_desired_size(camera, part->mPosAgent, part->mScale); S32 count = (S32) mViewerPartGroups.size(); for (S32 i = 0; i < count; i++) diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h index 21bc37f89..f13a9a89f 100644 --- a/indra/newview/llviewerpartsim.h +++ b/indra/newview/llviewerpartsim.h @@ -39,10 +39,10 @@ #include "llpartdata.h" #include "llviewerpartsource.h" -class LLViewerImage; +class LLViewerTexture; class LLViewerPart; class LLViewerRegion; -class LLViewerImage; +class LLViewerTexture; class LLVOPartGroup; typedef void (*LLVPCallback)(LLViewerPart &part, const F32 dt); @@ -60,7 +60,7 @@ public: public: LLViewerPart(); - void init(LLPointer sourcep, LLViewerImage *imagep, LLVPCallback cb); + void init(LLPointer sourcep, LLViewerTexture *imagep, LLVPCallback cb); U32 mPartID; // Particle ID used primarily for moving between groups @@ -72,7 +72,7 @@ public: // Current particle state (possibly used for rendering) - LLPointer mImagep; + LLPointer mImagep; LLVector3 mPosAgent; LLVector3 mVelocity; LLVector3 mAccel; diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp index 38c75a84d..4752bf1a8 100644 --- a/indra/newview/llviewerpartsource.cpp +++ b/indra/newview/llviewerpartsource.cpp @@ -39,7 +39,7 @@ #include "llagent.h" #include "lldrawable.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llvoavatar.h" @@ -78,7 +78,7 @@ void LLViewerPartSource::update(const F32 dt) LLUUID LLViewerPartSource::getImageUUID() const { - LLViewerImage* imagep = mImagep; + LLViewerTexture* imagep = mImagep; if(imagep) { return imagep->getID(); @@ -100,8 +100,8 @@ LLViewerPartSourceScript::LLViewerPartSourceScript(LLViewerObject *source_objp) llassert(source_objp); mSourceObjectp = source_objp; mPosAgent = mSourceObjectp->getPositionAgent(); - mImagep = gImageList.getImageFromFile("pixiesmall.j2c"); - gGL.getTexUnit(0)->bind(mImagep.get()); + mImagep = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c"); + mImagep->setAddressMode(LLTexUnit::TAM_CLAMP); } @@ -491,7 +491,7 @@ LLPointer LLViewerPartSourceScript::createPSS(LLViewer } -void LLViewerPartSourceScript::setImage(LLViewerImage *imagep) +void LLViewerPartSourceScript::setImage(LLViewerTexture *imagep) { LLMemType mt(LLMemType::MTYPE_PARTICLES); mImagep = imagep; @@ -551,7 +551,7 @@ void LLViewerPartSourceSpiral::update(const F32 dt) LLMemType mt(LLMemType::MTYPE_PARTICLES); if (!mImagep) { - mImagep = gImageList.getImageFromFile("pixiesmall.j2c"); + mImagep = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c"); } const F32 RATE = 0.025f; @@ -720,7 +720,7 @@ void LLViewerPartSourceBeam::update(const F32 dt) if (!mImagep) { - mImagep = gImageList.getImageFromFile("pixiesmall.j2c"); + mImagep = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c"); } LLViewerPart* part = new LLViewerPart(); @@ -806,7 +806,7 @@ void LLViewerPartSourceChat::update(const F32 dt) LLMemType mt(LLMemType::MTYPE_PARTICLES); if (!mImagep) { - mImagep = gImageList.getImageFromFile("pixiesmall.j2c"); + mImagep = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c"); } diff --git a/indra/newview/llviewerpartsource.h b/indra/newview/llviewerpartsource.h index 4258b9170..2aa2bfaa1 100644 --- a/indra/newview/llviewerpartsource.h +++ b/indra/newview/llviewerpartsource.h @@ -44,7 +44,7 @@ // // -class LLViewerImage; +class LLViewerTexture; class LLViewerObject; class LLViewerPart; @@ -89,7 +89,7 @@ protected: F32 mLastUpdateTime; F32 mLastPartTime; LLUUID mOwnerUUID; - LLPointer mImagep; + LLPointer mImagep; // Particle information U32 mPartFlags; // Flags for the particle @@ -122,8 +122,8 @@ public: static LLPointer unpackPSS(LLViewerObject *source_objp, LLPointer pssp, LLDataPacker &dp); static LLPointer createPSS(LLViewerObject *source_objp, const LLPartSysData& particle_parameters); - LLViewerImage *getImage() const { return mImagep; } - void setImage(LLViewerImage *imagep); + LLViewerTexture *getImage() const { return mImagep; } + void setImage(LLViewerTexture *imagep); LLPartSysData mPartSysData; void setTargetObject(LLViewerObject *objp); diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index 2921dd583..85eaabee9 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -164,7 +164,7 @@ #include "llinstantmessage.h" #include "llinvite.h" //#include "llloginflags.h" -#include "llmail.h" +//#include "llmail.h" #include "llmessagethrottle.h" #include "llnamevalue.h" #include "llpacketack.h" diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 920bdb126..5c1b22fa6 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -43,7 +43,7 @@ #include "pipeline.h" #include "lltexturefetch.h" #include "llviewerobjectlist.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "lltexlayer.h" #include "llsurface.h" #include "llvlmanager.h" @@ -363,7 +363,7 @@ void output_statistics(void*) { llinfos << "Number of orphans: " << gObjectList.getOrphanCount() << llendl; llinfos << "Number of dead objects: " << gObjectList.mNumDeadObjects << llendl; - llinfos << "Num images: " << gImageList.getNumImages() << llendl; + llinfos << "Num images: " << gTextureList.getNumImages() << llendl; llinfos << "Texture usage: " << LLImageGL::sGlobalTextureMemoryInBytes << llendl; llinfos << "Texture working set: " << LLImageGL::sBoundTextureMemoryInBytes << llendl; llinfos << "Raw usage: " << LLImageRaw::sGlobalRawMemory << llendl; @@ -495,7 +495,7 @@ F32 gWorstLandCompression = 0.f, gWorstWaterCompression = 0.f; U32 gTotalWorldBytes = 0, gTotalObjectBytes = 0, gTotalTextureBytes = 0, gSimPingCount = 0; U32 gObjectBits = 0; F32 gAvgSimPing = 0.f; - +U32 gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY] = {0}; extern U32 gVisCompared; extern U32 gVisTested; @@ -602,11 +602,11 @@ void update_statistics(U32 frame_count) static LLFrameTimer texture_stats_timer; if (texture_stats_timer.getElapsedTimeF32() >= texture_stats_freq) { - LLViewerStats::getInstance()->mTextureKBitStat.addValue(LLViewerImageList::sTextureBits/1024.f); - LLViewerStats::getInstance()->mTexturePacketsStat.addValue(LLViewerImageList::sTexturePackets); - gTotalTextureBytes += LLViewerImageList::sTextureBits / 8; - LLViewerImageList::sTextureBits = 0; - LLViewerImageList::sTexturePackets = 0; + LLViewerStats::getInstance()->mTextureKBitStat.addValue(LLViewerTextureList::sTextureBits/1024.f); + LLViewerStats::getInstance()->mTexturePacketsStat.addValue(LLViewerTextureList::sTexturePackets); + gTotalTextureBytes += LLViewerTextureList::sTextureBits / 8; + LLViewerTextureList::sTextureBits = 0; + LLViewerTextureList::sTexturePackets = 0; texture_stats_timer.reset(); } } diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index b176632d0..1cea273ad 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -207,5 +207,7 @@ void send_stats(); extern std::map gDebugTimers; extern std::map gDebugTimerLabel; - +extern U32 gTotalTextureBytes; +extern U32 gTotalObjectBytes; +extern U32 gTotalTextureBytesPerBoostLevel[] ; #endif // LL_LLVIEWERSTATS_H diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 2ed2b193a..2055f54b2 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -52,7 +52,7 @@ #include "llscrollbar.h" #include "lltooldraganddrop.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerwindow.h" #include "llviewerinventory.h" #include "lluictrlfactory.h" @@ -417,7 +417,7 @@ void LLEmbeddedItems::bindEmbeddedChars( const LLFontGL* font ) const break; case LLAssetType::AT_SOUND: img_name = "inv_item_sound.tga"; break; case LLAssetType::AT_LANDMARK: - if (item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) + if (item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED) { img_name = "inv_item_landmark_visited.tga"; } @@ -428,7 +428,7 @@ void LLEmbeddedItems::bindEmbeddedChars( const LLFontGL* font ) const break; case LLAssetType::AT_CLOTHING: img_name = "inv_item_clothing.tga"; break; case LLAssetType::AT_OBJECT: - if (item->getFlags() & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) + if (item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) { img_name = "inv_item_object_multi.tga"; } diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h index dd5831a3c..0a364a90f 100644 --- a/indra/newview/llviewertexteditor.h +++ b/indra/newview/llviewertexteditor.h @@ -97,8 +97,8 @@ public: // should be changed to get a different asset id from the verifier // rather than checking if a re-load is necessary. Phoenix 2007-02-27 bool hasEmbeddedInventory(); - // - std::vector > getEmbeddedItems(); + // + std::vector > getEmbeddedItems(); // private: diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp new file mode 100644 index 000000000..e818cd514 --- /dev/null +++ b/indra/newview/llviewertexture.cpp @@ -0,0 +1,4035 @@ +/** + * @file llviewertexture.cpp + * @brief Object which handles a received image (and associated texture(s)) + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewertexture.h" + +// Library includes +#include "imageids.h" +#include "llmath.h" +#include "llerror.h" +#include "llgl.h" +#include "llglheaders.h" +#include "llhost.h" +#include "llimage.h" +#include "llimagebmp.h" +#include "llimagej2c.h" +#include "llimagetga.h" +#include "llmemtype.h" +#include "llstl.h" +#include "llvfile.h" +#include "llvfs.h" +#include "message.h" +#include "lltimer.h" + +// viewer includes +#include "llimagegl.h" +#include "lldrawpool.h" +#include "lltexturefetch.h" +#include "llviewertexturelist.h" +#include "llviewercontrol.h" +#include "pipeline.h" +#include "llappviewer.h" +#include "llface.h" +#include "llviewercamera.h" +//#include "lltextureatlas.h" +//#include "lltextureatlasmanager.h" +#include "lltextureentry.h" +//#include "llmediaentry.h" +#include "llvovolume.h" +#include "llviewermedia.h" +/////////////////////////////////////////////////////////////////////////////// + +// statics +LLPointer LLViewerTexture::sNullImagep = NULL; +LLPointer LLViewerFetchedTexture::sMissingAssetImagep = NULL; +LLPointer LLViewerFetchedTexture::sWhiteImagep = NULL; +LLPointer LLViewerFetchedTexture::sDefaultImagep = NULL; +LLPointer LLViewerFetchedTexture::sSmokeImagep = NULL; +#if NEW_MEDIA_TEXTURE +LLViewerMediaTexture::media_map_t LLViewerMediaTexture::sMediaMap ; +#endif +//LLTexturePipelineTester* LLViewerTextureManager::sTesterp = NULL ; +//const std::string sTesterName("TextureTester"); + +S32 LLViewerTexture::sImageCount = 0; +S32 LLViewerTexture::sRawCount = 0; +S32 LLViewerTexture::sAuxCount = 0; +LLFrameTimer LLViewerTexture::sEvaluationTimer; +F32 LLViewerTexture::sDesiredDiscardBias = 0.f; +F32 LLViewerTexture::sDesiredDiscardScale = 1.1f; +S32 LLViewerTexture::sBoundTextureMemoryInBytes = 0; +S32 LLViewerTexture::sTotalTextureMemoryInBytes = 0; +S32 LLViewerTexture::sMaxBoundTextureMemInMegaBytes = 0; +S32 LLViewerTexture::sMaxTotalTextureMemInMegaBytes = 0; +S32 LLViewerTexture::sMaxDesiredTextureMemInBytes = 0 ; +S8 LLViewerTexture::sCameraMovingDiscardBias = 0 ; +S32 LLViewerTexture::sMaxSculptRez = 128 ; //max sculpt image size +const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64 ; +const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez ; +const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128 ; +S32 LLViewerTexture::sMinLargeImageSize = 65536 ; //256 * 256. +S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA ; +BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE ; +F32 LLViewerTexture::sCurrentTime = 0.0f ; +//BOOL LLViewerTexture::sUseTextureAtlas = FALSE ; +BOOL LLViewerTexture::sDontLoadVolumeTextures = FALSE ; + +const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve image quality by +const F32 desired_discard_bias_max = (F32)MAX_DISCARD_LEVEL; // max number of levels to reduce image quality by +const F64 log_2 = log(2.0); + +//---------------------------------------------------------------------------------------------- +//namespace: LLViewerTextureAccess +//---------------------------------------------------------------------------------------------- + +LLLoadedCallbackEntry::LLLoadedCallbackEntry(loaded_callback_func cb, + S32 discard_level, + BOOL need_imageraw, // Needs image raw for the callback + void* userdata, + LLLoadedCallbackEntry::source_callback_list_t* src_callback_list, + LLViewerFetchedTexture* target, + BOOL pause) + : mCallback(cb), + mLastUsedDiscard(MAX_DISCARD_LEVEL+1), + mDesiredDiscard(discard_level), + mNeedsImageRaw(need_imageraw), + mUserData(userdata), + mSourceCallbackList(src_callback_list), + mPaused(pause) +{ + if(mSourceCallbackList) + { + mSourceCallbackList->insert(target->getID()); + } +} + +LLLoadedCallbackEntry::~LLLoadedCallbackEntry() +{ +} + +void LLLoadedCallbackEntry::removeTexture(LLViewerFetchedTexture* tex) +{ + if(mSourceCallbackList) + { + mSourceCallbackList->erase(tex->getID()) ; + } +} + +//static +void LLLoadedCallbackEntry::cleanUpCallbackList(LLLoadedCallbackEntry::source_callback_list_t* callback_list) +{ + //clear texture callbacks. + if(callback_list && !callback_list->empty()) + { + for(LLLoadedCallbackEntry::source_callback_list_t::iterator iter = callback_list->begin(); + iter != callback_list->end(); ++iter) + { + LLViewerFetchedTexture* tex = gTextureList.findImage(*iter) ; + if(tex) + { + tex->deleteCallbackEntry(callback_list) ; + } + } + callback_list->clear() ; + } +} + +#if NEW_MEDIA_TEXTURE +LLViewerMediaTexture* LLViewerTextureManager::createMediaTexture(const LLUUID &media_id, BOOL usemipmaps, LLImageGL* gl_image) +{ + return new LLViewerMediaTexture(media_id, usemipmaps, gl_image) ; +} +#endif + +LLViewerTexture* LLViewerTextureManager::findTexture(const LLUUID& id) +{ + LLViewerTexture* tex ; + //search fetched texture list + tex = gTextureList.findImage(id) ; + +#if NEW_MEDIA_TEXTURE + //search media texture list + if(!tex) + { + tex = LLViewerTextureManager::findMediaTexture(id) ; + } +#endif + return tex ; +} + +#if NEW_MEDIA_TEXTURE +LLViewerMediaTexture* LLViewerTextureManager::findMediaTexture(const LLUUID &media_id) +{ + return LLViewerMediaTexture::findMediaTexture(media_id) ; +} + +LLViewerMediaTexture* LLViewerTextureManager::getMediaTexture(const LLUUID& id, BOOL usemipmaps, LLImageGL* gl_image) +{ + LLViewerMediaTexture* tex = LLViewerMediaTexture::findMediaTexture(id) ; + if(!tex) + { + tex = LLViewerTextureManager::createMediaTexture(id, usemipmaps, gl_image) ; + } + + tex->initVirtualSize() ; + + return tex ; +} +#endif + +LLViewerFetchedTexture* LLViewerTextureManager::staticCastToFetchedTexture(LLTexture* tex, BOOL report_error) +{ + if(!tex) + { + return NULL ; + } + + S8 type = tex->getType() ; + if(type == LLViewerTexture::FETCHED_TEXTURE || type == LLViewerTexture::LOD_TEXTURE) + { + return static_cast(tex) ; + } + + if(report_error) + { + llerrs << "not a fetched texture type: " << type << llendl ; + } + + return NULL ; +} + +LLPointer LLViewerTextureManager::getLocalTexture(BOOL usemipmaps, BOOL generate_gl_tex) +{ + LLPointer tex = new LLViewerTexture(usemipmaps) ; + if(generate_gl_tex) + { + tex->generateGLTexture() ; + tex->setCategory(LLViewerTexture::LOCAL) ; + } + return tex ; +} +LLPointer LLViewerTextureManager::getLocalTexture(const LLUUID& id, BOOL usemipmaps, BOOL generate_gl_tex) +{ + LLPointer tex = new LLViewerTexture(id, usemipmaps) ; + if(generate_gl_tex) + { + tex->generateGLTexture() ; + tex->setCategory(LLViewerTexture::LOCAL) ; + } + return tex ; +} +LLPointer LLViewerTextureManager::getLocalTexture(const LLImageRaw* raw, BOOL usemipmaps) +{ + LLPointer tex = new LLViewerTexture(raw, usemipmaps) ; + tex->setCategory(LLViewerTexture::LOCAL) ; + return tex ; +} +LLPointer LLViewerTextureManager::getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex) +{ + LLPointer tex = new LLViewerTexture(width, height, components, usemipmaps) ; + if(generate_gl_tex) + { + tex->generateGLTexture() ; + tex->setCategory(LLViewerTexture::LOCAL) ; + } + return tex ; +} + +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture( + const LLUUID &image_id, + BOOL usemipmaps, + LLViewerTexture::EBoostLevel boost_priority, + S8 texture_type, + LLGLint internal_format, + LLGLenum primary_format, + LLHost request_from_host) +{ + return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ; +} + +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile( + const std::string& filename, + BOOL usemipmaps, + LLViewerTexture::EBoostLevel boost_priority, + S8 texture_type, + LLGLint internal_format, + LLGLenum primary_format, + const LLUUID& force_id) +{ + return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ; +} + +//static +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url, + BOOL usemipmaps, + LLViewerTexture::EBoostLevel boost_priority, + S8 texture_type, + LLGLint internal_format, + LLGLenum primary_format, + const LLUUID& force_id + ) +{ + return gTextureList.getImageFromUrl(url, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ; +} + +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const LLUUID& image_id, LLHost host) +{ + return gTextureList.getImageFromHost(image_id, host) ; +} + +void LLViewerTextureManager::init() +{ + LLPointer raw = new LLImageRaw(1,1,3); + raw->clear(0x77, 0x77, 0x77, 0xFF); + LLViewerTexture::sNullImagep = LLViewerTextureManager::getLocalTexture(raw.get(), TRUE) ; + +#if 1 + LLPointer imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT); + LLViewerFetchedTexture::sDefaultImagep = imagep; + + const S32 dim = 128; + LLPointer image_raw = new LLImageRaw(dim,dim,3); + U8* data = image_raw->getData(); + for (S32 i = 0; i=(dim-border) || j>=(dim-border)) + { + *data++ = 0xff; + *data++ = 0xff; + *data++ = 0xff; + } + else +#endif + { + *data++ = 0x7f; + *data++ = 0x7f; + *data++ = 0x7f; + } + } + } + imagep->createGLTexture(0, image_raw); + //cache the raw image + imagep->setCachedRawImage(0, image_raw) ; + image_raw = NULL; +#else + LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); +#endif + LLViewerFetchedTexture::sDefaultImagep->dontDiscard(); + LLViewerFetchedTexture::sDefaultImagep->setCategory(LLViewerTexture::OTHER) ; + + LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, LLViewerTexture::BOOST_UI); + LLViewerFetchedTexture::sSmokeImagep->setNoDelete() ; + + LLViewerTexture::initClass() ; + + /*if (LLMetricPerformanceTesterBasic::isMetricLogRequested(sTesterName) && !LLMetricPerformanceTesterBasic::getTester(sTesterName)) + { + sTesterp = new LLTexturePipelineTester() ; + if (!sTesterp->isValid()) + { + delete sTesterp; + sTesterp = NULL; + } + }*/ +} + +void LLViewerTextureManager::cleanup() +{ + stop_glerror(); + + LLImageGL::sDefaultGLTexture = NULL ; + LLViewerTexture::sNullImagep = NULL; + LLViewerFetchedTexture::sDefaultImagep = NULL; + LLViewerFetchedTexture::sSmokeImagep = NULL; + LLViewerFetchedTexture::sMissingAssetImagep = NULL; + LLViewerFetchedTexture::sWhiteImagep = NULL; + +#if NEW_MEDIA_TEXTURE + LLViewerMediaTexture::cleanUpClass() ; +#endif +} + +//---------------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------------- +//start of LLViewerTexture +//---------------------------------------------------------------------------------------------- +// static +void LLViewerTexture::initClass() +{ + LLImageGL::sDefaultGLTexture = LLViewerFetchedTexture::sDefaultImagep->getGLTexture() ; + + if(gAuditTexture) + { + LLImageGL::setHighlightTexture(LLViewerTexture::OTHER) ; + } +} + +// static +S32 LLViewerTexture::getTotalNumOfCategories() +{ + return MAX_GL_IMAGE_CATEGORY - (BOOST_HIGH - BOOST_SCULPTED) + 2 ; +} + +// static +//index starts from zero. +S32 LLViewerTexture::getIndexFromCategory(S32 category) +{ + return (category < BOOST_HIGH) ? category : category - (BOOST_HIGH - BOOST_SCULPTED) + 1 ; +} + +//static +S32 LLViewerTexture::getCategoryFromIndex(S32 index) +{ + return (index < BOOST_HIGH) ? index : index + (BOOST_HIGH - BOOST_SCULPTED) - 1 ; +} + +// tuning params +const F32 discard_bias_delta = .25f; +const F32 discard_delta_time = 0.5f; +const S32 min_non_tex_system_mem = (128<<20); // 128 MB +// non-const (used externally +F32 texmem_lower_bound_scale = 0.85f; +F32 texmem_middle_bound_scale = 0.925f; + +//static +void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity) +{ + sCurrentTime = gFrameTimeSeconds ; + + /*LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) + { + tester->update() ; + }*/ +#if NEW_MEDIA_TEXTURE + LLViewerMediaTexture::updateClass() ; +#endif + + sBoundTextureMemoryInBytes = LLImageGL::sBoundTextureMemoryInBytes;//in bytes + sTotalTextureMemoryInBytes = LLImageGL::sGlobalTextureMemoryInBytes;//in bytes + sMaxBoundTextureMemInMegaBytes = gTextureList.getMaxResidentTexMem();//in MB + sMaxTotalTextureMemInMegaBytes = gTextureList.getMaxTotalTextureMem() ;//in MB + sMaxDesiredTextureMemInBytes = MEGA_BYTES_TO_BYTES(sMaxTotalTextureMemInMegaBytes) ; //in Bytes, by default and when total used texture memory is small. + + if (BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) >= sMaxBoundTextureMemInMegaBytes || + BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) >= sMaxTotalTextureMemInMegaBytes) + { + //when texture memory overflows, lower down the threashold to release the textures more aggressively. + sMaxDesiredTextureMemInBytes = llmin((S32)(sMaxDesiredTextureMemInBytes * 0.75f) , MEGA_BYTES_TO_BYTES(MAX_VIDEO_RAM_IN_MEGA_BYTES)) ;//512 MB + + // If we are using more texture memory than we should, + // scale up the desired discard level + if (sEvaluationTimer.getElapsedTimeF32() > discard_delta_time) + { + sDesiredDiscardBias += discard_bias_delta; + sEvaluationTimer.reset(); + } + } + else if (sDesiredDiscardBias > 0.0f && + BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < sMaxBoundTextureMemInMegaBytes * texmem_lower_bound_scale && + BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < sMaxTotalTextureMemInMegaBytes * texmem_lower_bound_scale) + { + // If we are using less texture memory than we should, + // scale down the desired discard level + if (sEvaluationTimer.getElapsedTimeF32() > discard_delta_time) + { + sDesiredDiscardBias -= discard_bias_delta; + sEvaluationTimer.reset(); + } + } + sDesiredDiscardBias = llclamp(sDesiredDiscardBias, desired_discard_bias_min, desired_discard_bias_max); + //LLViewerTexture::sUseTextureAtlas = gSavedSettings.getBOOL("EnableTextureAtlas") ; + + F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed() ; + F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed(); + sCameraMovingDiscardBias = (S8)llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1) ; + + LLViewerTexture::sFreezeImageScalingDown = (BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < 0.75f * sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale) && + (BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < 0.75f * sMaxTotalTextureMemInMegaBytes * texmem_middle_bound_scale) ; +} + +//end of static functions +//------------------------------------------------------------------------------------------- +const U32 LLViewerTexture::sCurrentFileVersion = 1; + +LLViewerTexture::LLViewerTexture(BOOL usemipmaps) +{ + init(true); + mUseMipMaps = usemipmaps ; + + mID.generate(); + sImageCount++; +} + +LLViewerTexture::LLViewerTexture(const LLUUID& id, BOOL usemipmaps) + : mID(id) +{ + init(true); + mUseMipMaps = usemipmaps ; + + sImageCount++; +} + +LLViewerTexture::LLViewerTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps) +{ + init(true); + + mFullWidth = width ; + mFullHeight = height ; + mUseMipMaps = usemipmaps ; + mComponents = components ; + setTexelsPerImage(); + + mID.generate(); + sImageCount++; +} + +LLViewerTexture::LLViewerTexture(const LLImageRaw* raw, BOOL usemipmaps) +{ + init(true); + mUseMipMaps = usemipmaps ; + mGLTexturep = new LLImageGL(raw, usemipmaps) ; + + // Create an empty image of the specified size and width + mID.generate(); + sImageCount++; +} + +LLViewerTexture::~LLViewerTexture() +{ + cleanup(); + sImageCount--; +} + +void LLViewerTexture::init(bool firstinit) +{ + mBoostLevel = LLViewerTexture::BOOST_NONE; + + mFullWidth = 0; + mFullHeight = 0; + mTexelsPerImage = 0 ; + mUseMipMaps = FALSE ; + mComponents = 0 ; + + mTextureState = NO_DELETE ; + mDontDiscard = FALSE; + mMaxVirtualSize = 0.f; + mNeedsGLTexture = FALSE ; + mMaxVirtualSizeResetInterval = 1; + mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval ; + mAdditionalDecodePriority = 0.f ; + mParcelMedia = NULL ; + mNumFaces = 0 ; + mNumVolumes = 0; + mFaceList.clear() ; + mVolumeList.clear(); + + mIsMediaTexture = false; +} + +//virtual +S8 LLViewerTexture::getType() const +{ + return LLViewerTexture::LOCAL_TEXTURE ; +} + +void LLViewerTexture::cleanup() +{ + mFaceList.clear() ; + mVolumeList.clear(); + if(mGLTexturep) + { + mGLTexturep->cleanup(); + } +} + +// virtual +void LLViewerTexture::dump() +{ + if(mGLTexturep) + { + mGLTexturep->dump(); + } + + llinfos << "LLViewerTexture" + << " mID " << mID + << llendl; +} + +void LLViewerTexture::setBoostLevel(S32 level) +{ + if(mBoostLevel != level) + { + mBoostLevel = level ; + if(mBoostLevel != LLViewerTexture::BOOST_NONE) + { + setNoDelete() ; + } + if(gAuditTexture) + { + setCategory(mBoostLevel); + } + } +} + + +bool LLViewerTexture::bindDefaultImage(S32 stage) +{ + if (stage < 0) return false; + + bool res = true; + if (LLViewerFetchedTexture::sDefaultImagep.notNull() && (this != LLViewerFetchedTexture::sDefaultImagep.get())) + { + // use default if we've got it + res = gGL.getTexUnit(stage)->bind(LLViewerFetchedTexture::sDefaultImagep); + } + if (!res && LLViewerTexture::sNullImagep.notNull() && (this != LLViewerTexture::sNullImagep)) + { + res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep) ; + } + if (!res) + { + llwarns << "LLViewerTexture::bindDefaultImage failed." << llendl; + } + stop_glerror(); + + //check if there is cached raw image and switch to it if possible + switchToCachedImage() ; + + /*LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) + { + tester->updateGrayTextureBinding() ; + }*/ + return res; +} + +//virtual +BOOL LLViewerTexture::isMissingAsset()const +{ + return FALSE; +} + +//virtual +void LLViewerTexture::forceImmediateUpdate() +{ +} + +void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const +{ + if(needs_gltexture) + { + mNeedsGLTexture = TRUE ; + } + + if(!mMaxVirtualSizeResetCounter) + { + //flag to reset the values because the old values are used. + resetMaxVirtualSizeResetCounter() ; + mMaxVirtualSize = virtual_size; + mAdditionalDecodePriority = 0.f ; + mNeedsGLTexture = needs_gltexture ; + } + else if (virtual_size > mMaxVirtualSize) + { + mMaxVirtualSize = virtual_size; + } +} + +void LLViewerTexture::resetTextureStats() +{ + mMaxVirtualSize = 0.0f ; + mAdditionalDecodePriority = 0.f ; + mMaxVirtualSizeResetCounter = 0 ; +} + +//virtual +F32 LLViewerTexture::getMaxVirtualSize() +{ + return mMaxVirtualSize ; +} + +//virtual +void LLViewerTexture::setKnownDrawSize(S32 width, S32 height) +{ + //nothing here. +} + +//virtual +void LLViewerTexture::addFace(LLFace* facep) +{ + if(mNumFaces >= mFaceList.size()) + { + mFaceList.resize(2 * mNumFaces + 1) ; + } + mFaceList[mNumFaces] = facep ; + facep->setIndexInTex(mNumFaces) ; + mNumFaces++ ; + mLastFaceListUpdateTimer.reset() ; +} + +//virtual +void LLViewerTexture::removeFace(LLFace* facep) +{ + if(mNumFaces > 1) + { + S32 index = facep->getIndexInTex() ; + mFaceList[index] = mFaceList[--mNumFaces] ; + mFaceList[index]->setIndexInTex(index) ; + } + else + { + mFaceList.clear() ; + mNumFaces = 0 ; + } + mLastFaceListUpdateTimer.reset() ; +} + +S32 LLViewerTexture::getNumFaces() const +{ + return mNumFaces ; +} + + +//virtual +void LLViewerTexture::addVolume(LLVOVolume* volumep) +{ + if( mNumVolumes >= mVolumeList.size()) + { + mVolumeList.resize(2 * mNumVolumes + 1) ; + } + mVolumeList[mNumVolumes] = volumep ; + volumep->setIndexInTex(mNumVolumes) ; + mNumVolumes++ ; + mLastVolumeListUpdateTimer.reset() ; +} + +//virtual +void LLViewerTexture::removeVolume(LLVOVolume* volumep) +{ + if(mNumVolumes > 1) + { + S32 index = volumep->getIndexInTex() ; + mVolumeList[index] = mVolumeList[--mNumVolumes] ; + mVolumeList[index]->setIndexInTex(index) ; + } + else + { + mVolumeList.clear() ; + mNumVolumes = 0 ; + } + mLastVolumeListUpdateTimer.reset() ; +} + +S32 LLViewerTexture::getNumVolumes() const +{ + return mNumVolumes ; +} + +void LLViewerTexture::reorganizeFaceList() +{ + static const F32 MAX_WAIT_TIME = 20.f; // seconds + static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ; + + if(mNumFaces + MAX_EXTRA_BUFFER_SIZE > mFaceList.size()) + { + return ; + } + + if(mLastFaceListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) + { + return ; + } + + mLastFaceListUpdateTimer.reset() ; + mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end()); +} + +void LLViewerTexture::reorganizeVolumeList() +{ + static const F32 MAX_WAIT_TIME = 20.f; // seconds + static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ; + + if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size()) + { + return ; + } + + if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) + { + return ; + } + + mLastVolumeListUpdateTimer.reset() ; + mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end()); +} + + + +//virtual +void LLViewerTexture::switchToCachedImage() +{ + //nothing here. +} + +void LLViewerTexture::forceActive() +{ + mTextureState = ACTIVE ; +} + +void LLViewerTexture::setActive() +{ + if(mTextureState != NO_DELETE) + { + mTextureState = ACTIVE ; + } +} + +//set the texture to stay in memory +void LLViewerTexture::setNoDelete() +{ + mTextureState = NO_DELETE ; +} + +void LLViewerTexture::generateGLTexture() +{ + if(mGLTexturep.isNull()) + { + mGLTexturep = new LLImageGL(mFullWidth, mFullHeight, mComponents, mUseMipMaps) ; + } +} + +LLImageGL* LLViewerTexture::getGLTexture() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep ; +} + +BOOL LLViewerTexture::createGLTexture() +{ + if(mGLTexturep.isNull()) + { + generateGLTexture() ; + } + + return mGLTexturep->createGLTexture() ; +} + +BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename, BOOL to_create, S32 category) +{ + llassert(mGLTexturep.notNull()) ; + + BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ; + + if(ret) + { + mFullWidth = mGLTexturep->getCurrentWidth() ; + mFullHeight = mGLTexturep->getCurrentHeight() ; + mComponents = mGLTexturep->getComponents() ; + setTexelsPerImage(); + } + + return ret ; +} + +//virtual +void LLViewerTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) +{ + //nothing here. +} + +void LLViewerTexture::setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes) +{ + llassert(mGLTexturep.notNull()) ; + + mGLTexturep->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes) ; +} +void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode mode) +{ + llassert(mGLTexturep.notNull()) ; + mGLTexturep->setAddressMode(mode) ; +} +void LLViewerTexture::setFilteringOption(LLTexUnit::eTextureFilterOptions option) +{ + llassert(mGLTexturep.notNull()) ; + mGLTexturep->setFilteringOption(option) ; +} + +//virtual +S32 LLViewerTexture::getWidth(S32 discard_level) const +{ + llassert(mGLTexturep.notNull()) ; + return mGLTexturep->getWidth(discard_level) ; +} + +//virtual +S32 LLViewerTexture::getHeight(S32 discard_level) const +{ + llassert(mGLTexturep.notNull()) ; + return mGLTexturep->getHeight(discard_level) ; +} + +S32 LLViewerTexture::getMaxDiscardLevel() const +{ + llassert(mGLTexturep.notNull()) ; + return mGLTexturep->getMaxDiscardLevel() ; +} +S32 LLViewerTexture::getDiscardLevel() const +{ + llassert(mGLTexturep.notNull()) ; + return mGLTexturep->getDiscardLevel() ; +} +S8 LLViewerTexture::getComponents() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getComponents() ; +} + +LLGLuint LLViewerTexture::getTexName() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getTexName() ; +} + +BOOL LLViewerTexture::hasGLTexture() const +{ + if(mGLTexturep.notNull()) + { + return mGLTexturep->getHasGLTexture() ; + } + return FALSE ; +} + +BOOL LLViewerTexture::getBoundRecently() const +{ + if(mGLTexturep.notNull()) + { + return mGLTexturep->getBoundRecently() ; + } + return FALSE ; +} + +LLTexUnit::eTextureType LLViewerTexture::getTarget(void) const +{ + llassert(mGLTexturep.notNull()) ; + return mGLTexturep->getTarget() ; +} + +BOOL LLViewerTexture::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height, bool fast_update) +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->setSubImage(imageraw, x_pos, y_pos, width, height, fast_update) ; +} + +BOOL LLViewerTexture::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height, bool fast_update) +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->setSubImage(datap, data_width, data_height, x_pos, y_pos, width, height, fast_update) ; +} + +void LLViewerTexture::setGLTextureCreated (bool initialized) +{ + llassert(mGLTexturep.notNull()) ; + + mGLTexturep->setGLTextureCreated (initialized) ; +} + +void LLViewerTexture::setCategory(S32 category) +{ + llassert(mGLTexturep.notNull()) ; + + mGLTexturep->setCategory(category) ; +} + +LLTexUnit::eTextureAddressMode LLViewerTexture::getAddressMode(void) const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getAddressMode() ; +} + +S32 LLViewerTexture::getTextureMemory() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->mTextureMemory ; +} + +LLGLenum LLViewerTexture::getPrimaryFormat() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getPrimaryFormat() ; +} + +BOOL LLViewerTexture::getIsAlphaMask() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getIsAlphaMask() ; +} + +BOOL LLViewerTexture::getMask(const LLVector2 &tc) +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getMask(tc) ; +} + +F32 LLViewerTexture::getTimePassedSinceLastBound() +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getTimePassedSinceLastBound() ; +} +BOOL LLViewerTexture::getMissed() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getMissed() ; +} + +BOOL LLViewerTexture::isJustBound() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->isJustBound() ; +} + +void LLViewerTexture::forceUpdateBindStats(void) const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->forceUpdateBindStats() ; +} + +/*U32 LLViewerTexture::getTexelsInAtlas() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getTexelsInAtlas() ; +} + +U32 LLViewerTexture::getTexelsInGLTexture() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getTexelsInGLTexture() ; +} + +BOOL LLViewerTexture::isGLTextureCreated() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->isGLTextureCreated() ; +} + +S32 LLViewerTexture::getDiscardLevelInAtlas() const +{ + llassert(mGLTexturep.notNull()) ; + + return mGLTexturep->getDiscardLevelInAtlas() ; +}*/ + +void LLViewerTexture::destroyGLTexture() +{ + if(mGLTexturep.notNull() && mGLTexturep->getHasGLTexture()) + { + mGLTexturep->destroyGLTexture() ; + mTextureState = DELETED ; + } +} + +void LLViewerTexture::setTexelsPerImage() +{ + S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); + S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); + mTexelsPerImage = (F32)fullwidth * fullheight; +} + +BOOL LLViewerTexture::isLargeImage() +{ + return (S32)mTexelsPerImage > LLViewerTexture::sMinLargeImageSize ; +} + +//virtual +void LLViewerTexture::updateBindStatsForTester() +{ + /*LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) + { + tester->updateTextureBindingStats(this) ; + }*/ +} + +//---------------------------------------------------------------------------------------------- +//end of LLViewerTexture +//---------------------------------------------------------------------------------------------- + +//---------------------------------------------------------------------------------------------- +//start of LLViewerFetchedTexture +//---------------------------------------------------------------------------------------------- + +LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps) + : LLViewerTexture(id, usemipmaps), + mTargetHost(host) +{ + init(TRUE) ; + generateGLTexture() ; +} + +LLViewerFetchedTexture::LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemipmaps) + : LLViewerTexture(raw, usemipmaps) +{ + init(TRUE) ; +} + +LLViewerFetchedTexture::LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps) + : LLViewerTexture(id, usemipmaps), + mUrl(url) +{ + init(TRUE) ; + generateGLTexture() ; +} + +void LLViewerFetchedTexture::init(bool firstinit) +{ + mOrigWidth = 0; + mOrigHeight = 0; + mNeedsAux = FALSE; + mRequestedDiscardLevel = -1; + mRequestedDownloadPriority = 0.f; + mFullyLoaded = FALSE; + mCanUseHTTP = true ; + mDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; + mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; + + mDecodingAux = FALSE; + + mKnownDrawWidth = 0; + mKnownDrawHeight = 0; + mKnownDrawSizeChanged = FALSE ; + + if (firstinit) + { + mDecodePriority = 0.f; + mInImageList = 0; + } + + // Only set mIsMissingAsset true when we know for certain that the database + // does not contain this image. + mIsMissingAsset = FALSE; + + mLoadedCallbackDesiredDiscardLevel = S8_MAX; + mPauseLoadedCallBacks = TRUE ; + + mNeedsCreateTexture = FALSE; + + mIsRawImageValid = FALSE; + mRawDiscardLevel = INVALID_DISCARD_LEVEL; + mMinDiscardLevel = 0; + + mHasFetcher = FALSE; + mIsFetching = FALSE; + mFetchState = 0; + mFetchPriority = 0; + mDownloadProgress = 0.f; + mFetchDeltaTime = 999999.f; + mRequestDeltaTime = 0.f; + mForSculpt = FALSE ; + mIsFetched = FALSE ; + + if(!firstinit && mCachedRawImage.notNull()) + mCachedRawImage->setInCache(false); + mCachedRawImage = NULL ; + mCachedRawDiscardLevel = -1 ; + mCachedRawImageReady = FALSE ; + + mSavedRawImage = NULL ; + mForceToSaveRawImage = FALSE ; + mSaveRawImage = FALSE ; + mSavedRawDiscardLevel = -1 ; + mDesiredSavedRawDiscardLevel = -1 ; + mLastReferencedSavedRawImageTime = 0.0f ; + mLastCallBackActiveTime = 0.f; +} + +LLViewerFetchedTexture::~LLViewerFetchedTexture() +{ + //*NOTE getTextureFetch can return NULL when Viewer is shutting down. + // This is due to LLWearableList is singleton and is destroyed after + // LLAppViewer::cleanup() was called. (see ticket EXT-177) + if (mHasFetcher && LLAppViewer::getTextureFetch()) + { + LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); + } + cleanup(); +} + +//virtual +S8 LLViewerFetchedTexture::getType() const +{ + return LLViewerTexture::FETCHED_TEXTURE ; +} + +void LLViewerFetchedTexture::cleanup() +{ + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + LLLoadedCallbackEntry *entryp = *iter++; + // We never finished loading the image. Indicate failure. + // Note: this allows mLoadedCallbackUserData to be cleaned up. + entryp->mCallback( FALSE, this, NULL, NULL, 0, TRUE, entryp->mUserData ); + entryp->removeTexture(this) ; + delete entryp; + } + mLoadedCallbackList.clear(); + mNeedsAux = FALSE; + + // Clean up image data + destroyRawImage(); + if(mCachedRawImage.notNull()) + mCachedRawImage->setInCache(false); + mCachedRawImage = NULL ; + mCachedRawDiscardLevel = -1 ; + mCachedRawImageReady = FALSE ; + mSavedRawImage = NULL ; +} + +void LLViewerFetchedTexture::setForSculpt() +{ + static const S32 MAX_INTERVAL = 8 ; //frames + + mForSculpt = TRUE ; + if(isForSculptOnly() && !getBoundRecently()) + { + destroyGLTexture() ; //sculpt image does not need gl texture. + } + checkCachedRawSculptImage() ; + setMaxVirtualSizeResetInterval(MAX_INTERVAL) ; +} + +BOOL LLViewerFetchedTexture::isForSculptOnly() const +{ + return mForSculpt && !mNeedsGLTexture ; +} + +BOOL LLViewerFetchedTexture::isDeleted() +{ + return mTextureState == DELETED ; +} + +BOOL LLViewerFetchedTexture::isInactive() +{ + return mTextureState == INACTIVE ; +} + +BOOL LLViewerFetchedTexture::isDeletionCandidate() +{ + return mTextureState == DELETION_CANDIDATE ; +} + +void LLViewerFetchedTexture::setDeletionCandidate() +{ + if(mGLTexturep.notNull() && mGLTexturep->getTexName() && (mTextureState == INACTIVE)) + { + mTextureState = DELETION_CANDIDATE ; + } +} + +//set the texture inactive +void LLViewerFetchedTexture::setInactive() +{ + if(mTextureState == ACTIVE && mGLTexturep.notNull() && mGLTexturep->getTexName() && !mGLTexturep->getBoundRecently()) + { + mTextureState = INACTIVE ; + } +} + +BOOL LLViewerFetchedTexture::isFullyLoaded() const +{ + // Unfortunately, the boolean "mFullyLoaded" is never updated correctly so we use that logic + // to check if the texture is there and completely downloaded + return (mFullWidth != 0) && (mFullHeight != 0) && !mIsFetching && !mHasFetcher; +} + + +// virtual +void LLViewerFetchedTexture::dump() +{ + LLViewerTexture::dump(); + + llinfos << "Dump : " << mID + << ", mIsMissingAsset = " << (S32)mIsMissingAsset + << ", mFullWidth = " << (S32)mFullWidth + << ", mFullHeight = " << (S32)mFullHeight + << ", mOrigWidth = " << (S32)mOrigWidth + << ", mOrigHeight = " << (S32)mOrigHeight + << llendl; + llinfos << " : " + << " mFullyLoaded = " << (S32)mFullyLoaded + << ", mFetchState = " << (S32)mFetchState + << ", mFetchPriority = " << (S32)mFetchPriority + << ", mDownloadProgress = " << (F32)mDownloadProgress + << llendl; + llinfos << " : " + << " mHasFetcher = " << (S32)mHasFetcher + << ", mIsFetching = " << (S32)mIsFetching + << ", mIsFetched = " << (S32)mIsFetched + << ", mBoostLevel = " << (S32)mBoostLevel + << llendl; +} + +/////////////////////////////////////////////////////////////////////////////// +// ONLY called from LLViewerFetchedTextureList +void LLViewerFetchedTexture::destroyTexture() +{ + if(LLImageGL::sGlobalTextureMemoryInBytes < sMaxDesiredTextureMemInBytes)//not ready to release unused memory. + { + return ; + } + if (mNeedsCreateTexture)//return if in the process of generating a new texture. + { + return ; + } + + destroyGLTexture() ; + mFullyLoaded = FALSE ; +} + +void LLViewerFetchedTexture::addToCreateTexture() +{ + bool force_update = false ; + if (getComponents() != mRawImage->getComponents()) + { + // We've changed the number of components, so we need to move any + // objects using this pool to a different pool. + mComponents = mRawImage->getComponents(); + mGLTexturep->setComponents(mComponents) ; + force_update = true ; + + for(U32 i = 0 ; i < mNumFaces ; i++) + { + mFaceList[i]->dirtyTexture() ; + } + + //discard the cached raw image and the saved raw image + mCachedRawImageReady = FALSE ; + mCachedRawDiscardLevel = -1 ; + if(mCachedRawImage.notNull()) + mCachedRawImage->setInCache(false); + mCachedRawImage = NULL ; + mSavedRawDiscardLevel = -1 ; + mSavedRawImage = NULL ; + } + + if(isForSculptOnly()) + { + //just update some variables, not to create a real GL texture. + createGLTexture(mRawDiscardLevel, mRawImage, 0, FALSE) ; + mNeedsCreateTexture = FALSE ; + destroyRawImage(); + } + else if(!force_update && getDiscardLevel() > -1 && getDiscardLevel() <= mRawDiscardLevel) + { + mNeedsCreateTexture = FALSE ; + destroyRawImage(); + } + else + { +#if 1 + // + //if mRequestedDiscardLevel > mDesiredDiscardLevel, we assume the required image res keep going up, + //so do not scale down the over qualified image. + //Note: scaling down image is expensensive. Do it only when very necessary. + // + if(mRequestedDiscardLevel <= mDesiredDiscardLevel && !mForceToSaveRawImage) + { + S32 w = mFullWidth >> mRawDiscardLevel; + S32 h = mFullHeight >> mRawDiscardLevel; + + //if big image, do not load extra data + //scale it down to size >= LLViewerTexture::sMinLargeImageSize + if(w * h > LLViewerTexture::sMinLargeImageSize) + { + S32 d_level = llmin(mRequestedDiscardLevel, (S32)mDesiredDiscardLevel) - mRawDiscardLevel ; + + if(d_level > 0) + { + S32 i = 0 ; + while((d_level > 0) && ((w >> i) * (h >> i) > LLViewerTexture::sMinLargeImageSize)) + { + i++; + d_level--; + } + if(i > 0) + { + mRawDiscardLevel += i ; + if(mRawDiscardLevel >= getDiscardLevel() && getDiscardLevel() > 0) + { + mNeedsCreateTexture = FALSE ; + destroyRawImage(); + return ; + } + mRawImage->scale(w >> i, h >> i) ; + } + } + } + } +#endif + mNeedsCreateTexture = TRUE; + gTextureList.mCreateTextureList.insert(this); + } + return ; +} + +// ONLY called from LLViewerTextureList +BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) +{ + if (!mNeedsCreateTexture) + { + destroyRawImage(); + return FALSE; + } + mNeedsCreateTexture = FALSE; + if (mRawImage.isNull()) + { + llerrs << "LLViewerTexture trying to create texture with no Raw Image" << llendl; + } +// llinfos << llformat("IMAGE Creating (%d) [%d x %d] Bytes: %d ", +// mRawDiscardLevel, +// mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize()) +// << mID.getString() << llendl; + BOOL res = TRUE; + if (!gNoRender) + { + // store original size only for locally-sourced images + if (mUrl.compare(0, 7, "file://") == 0) + { + mOrigWidth = mRawImage->getWidth(); + mOrigHeight = mRawImage->getHeight(); + + // leave black border, do not scale image content + mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); + + mFullWidth = mRawImage->getWidth(); + mFullHeight = mRawImage->getHeight(); + setTexelsPerImage(); + } + else + { + mOrigWidth = mFullWidth; + mOrigHeight = mFullHeight; + } + + bool size_okay = true; + + U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel; + U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel; + if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) + { + llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl; + size_okay = false; + } + + if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) + { + // A non power-of-two image was uploaded (through a non standard client) + llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl; + size_okay = false; + } + + if( !size_okay ) + { + // An inappropriately-sized image was uploaded (through a non standard client) + // We treat these images as missing assets which causes them to + // be renderd as 'missing image' and to stop requesting data + setIsMissingAsset(); + destroyRawImage(); + return FALSE; + } + + //if(!(res = insertToAtlas())) + //{ + res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); + //resetFaceAtlas() ; + //} + setActive() ; + } + + if (!needsToSaveRawImage()) + { + mNeedsAux = FALSE; + destroyRawImage(); + } + return res; +} + +// Call with 0,0 to turn this feature off. +//virtual +void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height) +{ + if(mKnownDrawWidth < width || mKnownDrawHeight < height) + { + mKnownDrawWidth = llmax(mKnownDrawWidth, width) ; + mKnownDrawHeight = llmax(mKnownDrawHeight, height) ; + + mKnownDrawSizeChanged = TRUE ; + mFullyLoaded = FALSE ; + } + addTextureStats((F32)(mKnownDrawWidth * mKnownDrawHeight)); +} + +//virtual +void LLViewerFetchedTexture::processTextureStats() +{ + if(mFullyLoaded) + { + if(mDesiredDiscardLevel > mMinDesiredDiscardLevel)//need to load more + { + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; + mFullyLoaded = FALSE ; + } + } + else + { + updateVirtualSize() ; + + static LLCachedControl textures_fullres("TextureLoadFullRes",false); + + if (textures_fullres) + { + mDesiredDiscardLevel = 0; + } + else if(!mFullWidth || !mFullHeight) + { + mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ; + } + else + { + if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight) + { + if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) + { + mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + } + else + { + mDesiredDiscardLevel = 0; + } + } + else if(mKnownDrawSizeChanged)//known draw size is set + { + mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2, + log((F32)mFullHeight / mKnownDrawHeight) / log_2) ; + mDesiredDiscardLevel = llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ; + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; + } + mKnownDrawSizeChanged = FALSE ; + + if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel)) + { + mFullyLoaded = TRUE ; + } + } + } + + if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0) //force to refetch the texture. + { + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S8)mDesiredSavedRawDiscardLevel) ; + if(getDiscardLevel() < 0 || getDiscardLevel() > mDesiredDiscardLevel) + { + mFullyLoaded = FALSE ; + } + } +} + +const F32 MAX_PRIORITY_PIXEL = 999.f ; //pixel area +const F32 PRIORITY_BOOST_LEVEL_FACTOR = 1000.f ; //boost level +const F32 PRIORITY_DELTA_DISCARD_LEVEL_FACTOR = 100000.f ; //delta discard +const S32 MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY = 4 ; +const F32 PRIORITY_ADDITIONAL_FACTOR = 1000000.f ; //additional +const S32 MAX_ADDITIONAL_LEVEL_FOR_PRIORITY = 8 ; +const F32 PRIORITY_BOOST_HIGH_FACTOR = 10000000.f ;//boost high +F32 LLViewerFetchedTexture::calcDecodePriority() +{ +#ifndef LL_RELEASE_FOR_DOWNLOAD + if (mID == LLAppViewer::getTextureFetch()->mDebugID) + { + LLAppViewer::getTextureFetch()->mDebugCount++; // for setting breakpoints + } +#endif + + if (mNeedsCreateTexture) + { + return mDecodePriority; // no change while waiting to create + } + if(mFullyLoaded && !mForceToSaveRawImage)//already loaded for static texture + { + return -1.0f ; //alreay fetched + } + + S32 cur_discard = getCurrentDiscardLevelForFetching(); + bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel)); + F32 pixel_priority = fsqrtf(mMaxVirtualSize); + + F32 priority = 0.f; + + if (mIsMissingAsset) + { + priority = 0.0f; + } + else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1) + { + priority = -2.0f ; + } + else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel) + { + priority = -3.0f; + } + else if (mDesiredDiscardLevel > getMaxDiscardLevel()) + { + // Don't decode anything we don't need + priority = -4.0f; + } + else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data) + { + priority = 1.f; + } + else if (pixel_priority < 0.001f && !have_all_data) + { + // Not on screen but we might want some data + if (mBoostLevel > BOOST_HIGH) + { + // Always want high boosted images + priority = 1.f; + } + else + { + priority = -5.f; //stop fetching + } + } + else if (cur_discard < 0) + { + //texture does not have any data, so we don't know the size of the image, treat it like 32 * 32. + // priority range = 100,000 - 500,000 + static const F64 log_2 = log(2.0); + F32 desired = (F32)(log(32.0/pixel_priority) / log_2); + S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired; + ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY); + priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR; + setAdditionalDecodePriority(1.0f) ;//boost the textures without any data so far. + } + else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel)) + { + // larger mips are corrupted + priority = -6.0f; + } + else + { + // priority range = 100,000 - 500,000 + S32 desired_discard = mDesiredDiscardLevel; + if (!isJustBound() && mCachedRawImageReady) + { + if(mBoostLevel < BOOST_HIGH) + { + // We haven't rendered this in a while, de-prioritize it + desired_discard += 2; + } + else + { + // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is + desired_discard = cur_discard; + } + } + + S32 ddiscard = cur_discard - desired_discard; + ddiscard = llclamp(ddiscard, -1, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY); + priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR; + } + + // Priority Formula: + // BOOST_HIGH + ADDITIONAL PRI + DELTA DISCARD + BOOST LEVEL + PIXELS + // [10,000,000] + [1,000,000-9,000,000] + [100,000-500,000] + [1-20,000] + [0-999] + if (priority > 0.0f) + { + bool large_enough = mCachedRawImageReady && ((S32)mTexelsPerImage > sMinLargeImageSize) ; + if(large_enough) + { + //Note: + //to give small, low-priority textures some chance to be fetched, + //cut the priority in half if the texture size is larger than 256 * 256 and has a 64*64 ready. + priority *= 0.5f ; + } + + pixel_priority = llclamp(pixel_priority, 0.0f, MAX_PRIORITY_PIXEL); + + priority += pixel_priority + PRIORITY_BOOST_LEVEL_FACTOR * mBoostLevel; + + if ( mBoostLevel > BOOST_HIGH) + { + if(mBoostLevel > BOOST_SUPER_HIGH) + { + //for very important textures, always grant the highest priority. + priority += PRIORITY_BOOST_HIGH_FACTOR; + } + else if(mCachedRawImageReady) + { + //Note: + //to give small, low-priority textures some chance to be fetched, + //if high priority texture has a 64*64 ready, lower its fetching priority. + setAdditionalDecodePriority(0.5f) ; + } + else + { + priority += PRIORITY_BOOST_HIGH_FACTOR; + } + } + + if(mAdditionalDecodePriority > 0.0f) + { + // priority range += 1,000,000.f-9,000,000.f + F32 additional = PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY); + if(large_enough) + { + //Note: + //to give small, low-priority textures some chance to be fetched, + //cut the additional priority to a quarter if the texture size is larger than 256 * 256 and has a 64*64 ready. + additional *= 0.25f ; + } + priority += additional; + } + } + return priority; +} + +//static +F32 LLViewerFetchedTexture::maxDecodePriority() +{ + static const F32 max_priority = PRIORITY_BOOST_HIGH_FACTOR + //boost_high + PRIORITY_ADDITIONAL_FACTOR * (MAX_ADDITIONAL_LEVEL_FOR_PRIORITY + 1) + //additional (view dependent factors) + PRIORITY_DELTA_DISCARD_LEVEL_FACTOR * (MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY + 1) + //delta discard + PRIORITY_BOOST_LEVEL_FACTOR * (BOOST_MAX_LEVEL - 1) + //boost level + MAX_PRIORITY_PIXEL + 1.0f ; //pixel area. + + return max_priority ; +} + +//============================================================================ + +void LLViewerFetchedTexture::setDecodePriority(F32 priority) +{ + llassert(!mInImageList); + + mDecodePriority = priority; + + if(mDecodePriority < F_ALMOST_ZERO) + { + mStopFetchingTimer.reset() ; + } +} + +void LLViewerFetchedTexture::setAdditionalDecodePriority(F32 priority) +{ + priority = llclamp(priority, 0.f, 1.f); + if(mAdditionalDecodePriority < priority) + { + mAdditionalDecodePriority = priority; + } +} + +void LLViewerFetchedTexture::updateVirtualSize() +{ + if(!mMaxVirtualSizeResetCounter) + { + addTextureStats(0.f, FALSE) ;//reset + } + + for(U32 i = 0 ; i < mNumFaces ; i++) + { + LLFace* facep = mFaceList[i] ; + if(facep->getDrawable()->isRecentlyVisible()) + { + addTextureStats(facep->getVirtualSize()) ; + setAdditionalDecodePriority(facep->getImportanceToCamera()) ; + } + } + + if(mMaxVirtualSizeResetCounter > 0) + { + mMaxVirtualSizeResetCounter--; + } + reorganizeFaceList() ; + reorganizeVolumeList(); +} + +S32 LLViewerFetchedTexture::getCurrentDiscardLevelForFetching() +{ + S32 current_discard = getDiscardLevel() ; + if(mForceToSaveRawImage) + { + if(mSavedRawDiscardLevel < 0 || current_discard < 0) + { + current_discard = -1 ; + } + else + { + current_discard = llmax(current_discard, mSavedRawDiscardLevel) ; + } + } + + return current_discard ; +} + +bool LLViewerFetchedTexture::updateFetch() +{ + static LLCachedControl textures_decode_disabled("TextureDecodeDisabled",false); + if(textures_decode_disabled) + { + return false ; + } + + mFetchState = 0; + mFetchPriority = 0; + mFetchDeltaTime = 999999.f; + mRequestDeltaTime = 999999.f; + +#ifndef LL_RELEASE_FOR_DOWNLOAD + if (mID == LLAppViewer::getTextureFetch()->mDebugID) + { + LLAppViewer::getTextureFetch()->mDebugCount++; // for setting breakpoints + } +#endif + + if (mNeedsCreateTexture) + { + // We may be fetching still (e.g. waiting on write) + // but don't check until we've processed the raw data we have + return false; + } + if (mIsMissingAsset) + { + llassert_always(!mHasFetcher); + return false; // skip + } + if (!mLoadedCallbackList.empty() && mRawImage.notNull()) + { + return false; // process any raw image data in callbacks before replacing + } + + S32 current_discard = getCurrentDiscardLevelForFetching() ; + S32 desired_discard = getDesiredDiscardLevel(); + F32 decode_priority = getDecodePriority(); + decode_priority = llclamp(decode_priority, 0.0f, maxDecodePriority()); + + if (mIsFetching) + { + // Sets mRawDiscardLevel, mRawImage, mAuxRawImage + S32 fetch_discard = current_discard; + + if (mRawImage.notNull()) sRawCount--; + if (mAuxRawImage.notNull()) sAuxCount--; + bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage); + if (mRawImage.notNull()) sRawCount++; + if (mAuxRawImage.notNull()) sAuxCount++; + if (finished) + { + mIsFetching = FALSE; + mLastPacketTimer.reset() ; + } + else + { + mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, + mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); + } + + // We may have data ready regardless of whether or not we are finished (e.g. waiting on write) + if (mRawImage.notNull()) + { + /*LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) + { + mIsFetched = TRUE ; + tester->updateTextureLoadingStats(this, mRawImage, LLAppViewer::getTextureFetch()->isFromLocalCache(mID)) ; + }*/ + mRawDiscardLevel = fetch_discard; + if ((mRawImage->getDataSize() > 0 && mRawDiscardLevel >= 0) && + (current_discard < 0 || mRawDiscardLevel < current_discard)) + { + mFullWidth = mRawImage->getWidth() << mRawDiscardLevel; + mFullHeight = mRawImage->getHeight() << mRawDiscardLevel; + setTexelsPerImage(); + + if(mFullWidth > MAX_IMAGE_SIZE || mFullHeight > MAX_IMAGE_SIZE) + { + //discard all oversized textures. + destroyRawImage(); + setIsMissingAsset(); + mRawDiscardLevel = INVALID_DISCARD_LEVEL ; + mIsFetching = FALSE ; + mLastPacketTimer.reset(); + } + else + { + mIsRawImageValid = TRUE; + addToCreateTexture() ; + } + + return TRUE ; + } + else + { + // Data is ready but we don't need it + // (received it already while fetcher was writing to disk) + destroyRawImage(); + return false; // done + } + } + + if (!mIsFetching) + { + if ((decode_priority > 0) && (mRawDiscardLevel < 0 || mRawDiscardLevel == INVALID_DISCARD_LEVEL)) + { + // We finished but received no data + if (current_discard < 0) + { + setIsMissingAsset(); + desired_discard = -1; + } + else + { + //llwarns << mID << ": Setting min discard to " << current_discard << llendl; + mMinDiscardLevel = current_discard; + desired_discard = current_discard; + } + destroyRawImage(); + } + else if (mRawImage.notNull()) + { + // We have data, but our fetch failed to return raw data + // *TODO: FIgure out why this is happening and fix it + destroyRawImage(); + } + } + else + { +// // Useful debugging code for undesired deprioritization of textures. +// if (decode_priority <= 0.0f && desired_discard >= 0 && desired_discard < current_discard) +// { +// llinfos << "Calling updateRequestPriority() with decode_priority = 0.0f" << llendl; +// calcDecodePriority(); +// } + static const F32 MAX_HOLD_TIME = 5.0f ; //seconds to wait before canceling fecthing if decode_priority is 0.f. + if(decode_priority > 0.0f || mStopFetchingTimer.getElapsedTimeF32() > MAX_HOLD_TIME) + { + mStopFetchingTimer.reset() ; + LLAppViewer::getTextureFetch()->updateRequestPriority(mID, decode_priority); + } + } + } + + bool make_request = true; + if (decode_priority <= 0) + { + make_request = false; + } + else if (mNeedsCreateTexture || mIsMissingAsset) + { + make_request = false; + } + else if (current_discard >= 0 && current_discard <= mMinDiscardLevel) + { + make_request = false; + } + //else if (!isJustBound() && mCachedRawImageReady) + //{ + // make_request = false; + //} + + if(make_request) + { + //load the texture progressively. + S32 delta_level = (mBoostLevel > LLViewerTexture::BOOST_NONE) ? 2 : 1 ; + if(current_discard < 0) + { + desired_discard = llmax(desired_discard, getMaxDiscardLevel() - delta_level); + } + else + { + desired_discard = llmax(desired_discard, current_discard - delta_level); + } + + if (mIsFetching) + { + if (mRequestedDiscardLevel <= desired_discard) + { + make_request = false; + } + } + else + { + if (current_discard >= 0 && current_discard <= desired_discard) + { + make_request = false; + } + } + } + + if (make_request) + { + S32 w=0, h=0, c=0; + if (getDiscardLevel() >= 0) + { + w = mGLTexturep->getWidth(0); + h = mGLTexturep->getHeight(0); + c = mComponents; + } + + /*const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + if (override_tex_discard_level != 0) + { + desired_discard = override_tex_discard_level; + }*/ + + // bypass texturefetch directly by pulling from LLTextureCache + bool fetch_request_created = false; + fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), decode_priority, + w, h, c, desired_discard, needsAux(), mCanUseHTTP); + + if (fetch_request_created) + { + mHasFetcher = TRUE; + mIsFetching = TRUE; + mRequestedDiscardLevel = desired_discard; + mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, + mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); + } + + // if createRequest() failed, we're finishing up a request for this UUID, + // wait for it to complete + } + else if (mHasFetcher && !mIsFetching) + { + // Only delete requests that haven't receeived any network data for a while + const F32 FETCH_IDLE_TIME = 5.f; + if (mLastPacketTimer.getElapsedTimeF32() > FETCH_IDLE_TIME) + { +// llinfos << "Deleting request: " << getID() << " Discard: " << current_discard << " <= min:" << mMinDiscardLevel << " or priority == 0: " << decode_priority << llendl; + LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); + mHasFetcher = FALSE; + } + } + + llassert_always(mRawImage.notNull() || (!mNeedsCreateTexture && !mIsRawImageValid)); + + return mIsFetching ? true : false; +} + +void LLViewerFetchedTexture::setIsMissingAsset() +{ + if (mUrl.empty()) + { + llwarns << mID << ": Marking image as missing" << llendl; + } + else + { + llwarns << mUrl << ": Marking image as missing" << llendl; + } + if (mHasFetcher) + { + LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); + mHasFetcher = FALSE; + mIsFetching = FALSE; + mLastPacketTimer.reset(); + mFetchState = 0; + mFetchPriority = 0; + } + mIsMissingAsset = TRUE; +} + +void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_callback, + S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, void* userdata, + LLLoadedCallbackEntry::source_callback_list_t* src_callback_list, BOOL pause) +{ + // + // Don't do ANYTHING here, just add it to the global callback list + // + if (mLoadedCallbackList.empty()) + { + // Put in list to call this->doLoadedCallbacks() periodically + gTextureList.mCallbackList.insert(this); + mLoadedCallbackDesiredDiscardLevel = (S8)discard_level; + } + else + { + mLoadedCallbackDesiredDiscardLevel = llmin(mLoadedCallbackDesiredDiscardLevel, (S8)discard_level) ; + } + + if(mPauseLoadedCallBacks && !pause) + { + unpauseLoadedCallbacks(src_callback_list) ; + } + LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata, src_callback_list, this, pause); + mLoadedCallbackList.push_back(entryp); + + mNeedsAux |= needs_aux; + if(keep_imageraw) + { + mSaveRawImage = TRUE ; + } + if (mNeedsAux && mAuxRawImage.isNull() && getDiscardLevel() >= 0) + { + // We need aux data, but we've already loaded the image, and it didn't have any + llwarns << "No aux data available for callback for image:" << getID() << llendl; + } + mLastCallBackActiveTime = sCurrentTime ; +} + +void LLViewerFetchedTexture::clearCallbackEntryList() +{ + if(mLoadedCallbackList.empty()) + { + return ; + } + + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + LLLoadedCallbackEntry *entryp = *iter; + + // We never finished loading the image. Indicate failure. + // Note: this allows mLoadedCallbackUserData to be cleaned up. + entryp->mCallback(FALSE, this, NULL, NULL, 0, TRUE, entryp->mUserData); + iter = mLoadedCallbackList.erase(iter) ; + delete entryp; + } + gTextureList.mCallbackList.erase(this); + + mLoadedCallbackDesiredDiscardLevel = S8_MAX ; + if(needsToSaveRawImage()) + { + destroySavedRawImage() ; + } + + return ; +} + +void LLViewerFetchedTexture::deleteCallbackEntry(const LLLoadedCallbackEntry::source_callback_list_t* callback_list) +{ + if(mLoadedCallbackList.empty() || !callback_list) + { + return ; + } + + S32 desired_discard = S8_MAX ; + S32 desired_raw_discard = INVALID_DISCARD_LEVEL ; + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + LLLoadedCallbackEntry *entryp = *iter; + if(entryp->mSourceCallbackList == callback_list) + { + // We never finished loading the image. Indicate failure. + // Note: this allows mLoadedCallbackUserData to be cleaned up. + entryp->mCallback(FALSE, this, NULL, NULL, 0, TRUE, entryp->mUserData); + iter = mLoadedCallbackList.erase(iter) ; + delete entryp; + } + else + { + ++iter; + + desired_discard = llmin(desired_discard, entryp->mDesiredDiscard) ; + if(entryp->mNeedsImageRaw) + { + desired_raw_discard = llmin(desired_raw_discard, entryp->mDesiredDiscard) ; + } + } + } + + mLoadedCallbackDesiredDiscardLevel = desired_discard; + if (mLoadedCallbackList.empty()) + { + // If we have no callbacks, take us off of the image callback list. + gTextureList.mCallbackList.erase(this); + + if(needsToSaveRawImage()) + { + destroySavedRawImage() ; + } + } + else if(needsToSaveRawImage() && mBoostLevel != LLViewerTexture::BOOST_PREVIEW) + { + if(desired_raw_discard != INVALID_DISCARD_LEVEL) + { + mDesiredSavedRawDiscardLevel = desired_raw_discard ; + } + else + { + destroySavedRawImage() ; + } + } +} + +void LLViewerFetchedTexture::unpauseLoadedCallbacks(const LLLoadedCallbackEntry::source_callback_list_t* callback_list) +{ + if(!callback_list) + { + mPauseLoadedCallBacks = FALSE ; + return ; + } + + BOOL need_raw = FALSE ; + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + LLLoadedCallbackEntry *entryp = *iter++; + if(entryp->mSourceCallbackList == callback_list) + { + entryp->mPaused = FALSE ; + if(entryp->mNeedsImageRaw) + { + need_raw = TRUE ; + } + } + } + mPauseLoadedCallBacks = FALSE ; + if(need_raw) + { + mSaveRawImage = TRUE ; + } +} + +void LLViewerFetchedTexture::pauseLoadedCallbacks(const LLLoadedCallbackEntry::source_callback_list_t* callback_list) +{ + if(!callback_list) + { + return ; + } + + bool paused = true ; + + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + LLLoadedCallbackEntry *entryp = *iter++; + if(entryp->mSourceCallbackList == callback_list) + { + entryp->mPaused = TRUE ; + } + else if(!entryp->mPaused) + { + paused = false ; + } + } + + if(paused) + { + mPauseLoadedCallBacks = TRUE ;//when set, loaded callback is paused. + resetTextureStats(); + mSaveRawImage = FALSE ; + } +} + +bool LLViewerFetchedTexture::doLoadedCallbacks() +{ + static const F32 MAX_INACTIVE_TIME = 120.f ; //seconds + + if (mNeedsCreateTexture) + { + return false; + } + if(sCurrentTime - mLastCallBackActiveTime > MAX_INACTIVE_TIME) + { + clearCallbackEntryList() ; //remove all callbacks. + return false ; + } + + bool res = false; + + if (isMissingAsset()) + { + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + LLLoadedCallbackEntry *entryp = *iter++; + // We never finished loading the image. Indicate failure. + // Note: this allows mLoadedCallbackUserData to be cleaned up. + entryp->mCallback(FALSE, this, NULL, NULL, 0, TRUE, entryp->mUserData); + delete entryp; + } + mLoadedCallbackList.clear(); + + // Remove ourself from the global list of textures with callbacks + gTextureList.mCallbackList.erase(this); + } + if(mPauseLoadedCallBacks) + { + destroyRawImage(); + return res; //paused + } + + S32 gl_discard = getDiscardLevel(); + + // If we don't have a legit GL image, set it to be lower than the worst discard level + if (gl_discard == -1) + { + gl_discard = MAX_DISCARD_LEVEL + 1; + } + + // + // Determine the quality levels of textures that we can provide to callbacks + // and whether we need to do decompression/readback to get it + // + S32 current_raw_discard = MAX_DISCARD_LEVEL + 1; // We can always do a readback to get a raw discard + S32 best_raw_discard = gl_discard; // Current GL quality level + S32 current_aux_discard = MAX_DISCARD_LEVEL + 1; + S32 best_aux_discard = MAX_DISCARD_LEVEL + 1; + + if (mIsRawImageValid) + { + // If we have an existing raw image, we have a baseline for the raw and auxiliary quality levels. + best_raw_discard = llmin(best_raw_discard, mRawDiscardLevel); + best_aux_discard = llmin(best_aux_discard, mRawDiscardLevel); // We always decode the aux when we decode the base raw + current_aux_discard = llmin(current_aux_discard, best_aux_discard); + } + else + { + // We have no data at all, we need to get it + // Do this by forcing the best aux discard to be 0. + best_aux_discard = 0; + } + + + // + // See if any of the callbacks would actually run using the data that we can provide, + // and also determine if we need to perform any readbacks or decodes. + // + bool run_gl_callbacks = false; + bool run_raw_callbacks = false; + bool need_readback = false; + + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + LLLoadedCallbackEntry *entryp = *iter++; + + if (entryp->mNeedsImageRaw) + { + if (mNeedsAux) + { + // + // Need raw and auxiliary channels + // + if (entryp->mLastUsedDiscard > current_aux_discard) + { + // We have useful data, run the callbacks + run_raw_callbacks = true; + } + } + else + { + if (entryp->mLastUsedDiscard > current_raw_discard) + { + // We have useful data, just run the callbacks + run_raw_callbacks = true; + } + else if (entryp->mLastUsedDiscard > best_raw_discard) + { + // We can readback data, and then run the callbacks + need_readback = true; + run_raw_callbacks = true; + } + } + } + else + { + // Needs just GL + if (entryp->mLastUsedDiscard > gl_discard) + { + // We have enough data, run this callback requiring GL data + run_gl_callbacks = true; + } + } + } + + // + // Do a readback if required, OR start off a texture decode + // + if (need_readback && (getMaxDiscardLevel() > gl_discard)) + { + // Do a readback to get the GL data into the raw image + // We have GL data. + + destroyRawImage(); + reloadRawImage(mLoadedCallbackDesiredDiscardLevel); + llassert_always(mRawImage.notNull()); + llassert_always(!mNeedsAux || mAuxRawImage.notNull()); + } + + // + // Run raw/auxiliary data callbacks + // + if (run_raw_callbacks && mIsRawImageValid && (mRawDiscardLevel <= getMaxDiscardLevel())) + { + // Do callbacks which require raw image data. + //llinfos << "doLoadedCallbacks raw for " << getID() << llendl; + + // Call each party interested in the raw data. + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + callback_list_t::iterator curiter = iter++; + LLLoadedCallbackEntry *entryp = *curiter; + if (entryp->mNeedsImageRaw && (entryp->mLastUsedDiscard > mRawDiscardLevel)) + { + // If we've loaded all the data there is to load or we've loaded enough + // to satisfy the interested party, then this is the last time that + // we're going to call them. + + mLastCallBackActiveTime = sCurrentTime ; + //llassert_always(mRawImage.notNull()); + if(mNeedsAux && mAuxRawImage.isNull()) + { + llwarns << "Raw Image with no Aux Data for callback" << llendl; + } + BOOL final = mRawDiscardLevel <= entryp->mDesiredDiscard ? TRUE : FALSE; + //llinfos << "Running callback for " << getID() << llendl; + //llinfos << mRawImage->getWidth() << "x" << mRawImage->getHeight() << llendl; + entryp->mLastUsedDiscard = mRawDiscardLevel; + entryp->mCallback(TRUE, this, mRawImage, mAuxRawImage, mRawDiscardLevel, final, entryp->mUserData); + if (final) + { + iter = mLoadedCallbackList.erase(curiter); + delete entryp; + } + res = true; + } + } + } + + // + // Run GL callbacks + // + if (run_gl_callbacks && (gl_discard <= getMaxDiscardLevel())) + { + //llinfos << "doLoadedCallbacks GL for " << getID() << llendl; + + // Call the callbacks interested in GL data. + for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); + iter != mLoadedCallbackList.end(); ) + { + callback_list_t::iterator curiter = iter++; + LLLoadedCallbackEntry *entryp = *curiter; + if (!entryp->mNeedsImageRaw && (entryp->mLastUsedDiscard > gl_discard)) + { + mLastCallBackActiveTime = sCurrentTime ; + BOOL final = gl_discard <= entryp->mDesiredDiscard ? TRUE : FALSE; + entryp->mLastUsedDiscard = gl_discard; + entryp->mCallback(TRUE, this, NULL, NULL, gl_discard, final, entryp->mUserData); + if (final) + { + iter = mLoadedCallbackList.erase(curiter); + delete entryp; + } + res = true; + } + } + } + + // + // If we have no callbacks, take us off of the image callback list. + // + if (mLoadedCallbackList.empty()) + { + gTextureList.mCallbackList.erase(this); + } + + // Done with any raw image data at this point (will be re-created if we still have callbacks) + destroyRawImage(); + + return res; +} + +//virtual +void LLViewerFetchedTexture::forceImmediateUpdate() +{ + //only immediately update a deleted texture which is now being re-used. + if(!isDeleted()) + { + return ; + } + //if already called forceImmediateUpdate() + if(mInImageList && mDecodePriority == LLViewerFetchedTexture::maxDecodePriority()) + { + return ; + } + + gTextureList.forceImmediateUpdate(this) ; + return ; +} + +LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level) +{ + llassert_always(mGLTexturep.notNull()) ; + llassert_always(discard_level >= 0); + llassert_always(mComponents > 0); + + if (mRawImage.notNull()) + { + //mRawImage is in use by somebody else, do not delete it. + return NULL ; + } + + if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level) + { + if(mSavedRawDiscardLevel != discard_level) + { + mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; + mRawImage->copy(getSavedRawImage()) ; + } + else + { + mRawImage = getSavedRawImage() ; + } + mRawDiscardLevel = discard_level ; + } + else + { + //force to fetch raw image again if cached raw image is not good enough. + if(mCachedRawDiscardLevel > discard_level) + { + mRawImage = mCachedRawImage ; + mRawDiscardLevel = mCachedRawDiscardLevel; + } + else //cached raw image is good enough, copy it. + { + if(mCachedRawDiscardLevel != discard_level) + { + mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; + mRawImage->copy(mCachedRawImage) ; + } + else + { + mRawImage = mCachedRawImage ; + } + mRawDiscardLevel = discard_level ; + } + } + mIsRawImageValid = TRUE ; + sRawCount++; + + return mRawImage; +} + +bool LLViewerFetchedTexture::needsToSaveRawImage() +{ + return mForceToSaveRawImage || mSaveRawImage ; +} + +void LLViewerFetchedTexture::destroyRawImage() +{ + if (mAuxRawImage.notNull()) sAuxCount--; + + if (mRawImage.notNull()) + { + sRawCount--; + + if(mIsRawImageValid) + { + if(needsToSaveRawImage()) + { + saveRawImage() ; + } + setCachedRawImage() ; + } + } + + mRawImage = NULL; + mAuxRawImage = NULL; + mIsRawImageValid = FALSE; + mRawDiscardLevel = INVALID_DISCARD_LEVEL; +} + +//use the mCachedRawImage to (re)generate the gl texture. +//virtual +void LLViewerFetchedTexture::switchToCachedImage() +{ + if(mCachedRawImage.notNull()) + { + mRawImage = mCachedRawImage ; + + if (getComponents() != mRawImage->getComponents()) + { + // We've changed the number of components, so we need to move any + // objects using this pool to a different pool. + mComponents = mRawImage->getComponents(); + mGLTexturep->setComponents(mComponents) ; + gTextureList.dirtyImage(this); + } + + mIsRawImageValid = TRUE; + mRawDiscardLevel = mCachedRawDiscardLevel ; + gTextureList.mCreateTextureList.insert(this); + mNeedsCreateTexture = TRUE; + } +} + +//cache the imageraw forcefully. +//virtual +void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) +{ + if(imageraw != mRawImage.get()) + { + if(mCachedRawImage.notNull()) + mCachedRawImage->setInCache(false); + mCachedRawImage = imageraw ; + if(mCachedRawImage.notNull()) + mCachedRawImage->setInCache(true); + mCachedRawDiscardLevel = discard_level ; + mCachedRawImageReady = TRUE ; + } +} + +void LLViewerFetchedTexture::setCachedRawImage() +{ + if(mRawImage == mCachedRawImage) + { + return ; + } + if(!mIsRawImageValid) + { + return ; + } + + if(mCachedRawImageReady) + { + return ; + } + + if(mCachedRawDiscardLevel < 0 || mCachedRawDiscardLevel > mRawDiscardLevel) + { + S32 i = 0 ; + S32 w = mRawImage->getWidth() ; + S32 h = mRawImage->getHeight() ; + + S32 max_size = MAX_CACHED_RAW_IMAGE_AREA ; + if(LLViewerTexture::BOOST_TERRAIN == mBoostLevel) + { + max_size = MAX_CACHED_RAW_TERRAIN_IMAGE_AREA ; + } + if(mForSculpt) + { + max_size = MAX_CACHED_RAW_SCULPT_IMAGE_AREA ; + mCachedRawImageReady = !mRawDiscardLevel ; + } + else + { + mCachedRawImageReady = (!mRawDiscardLevel || ((w * h) >= max_size)) ; + } + + while(((w >> i) * (h >> i)) > max_size) + { + ++i ; + } + + if(i) + { + if(!(w >> i) || !(h >> i)) + { + --i ; + } + + mRawImage->scale(w >> i, h >> i) ; + } + if(mCachedRawImage.notNull()) + mCachedRawImage->setInCache(false); + mCachedRawImage = mRawImage ; + if(mCachedRawImage.notNull()) + mCachedRawImage->setInCache(true); + mRawDiscardLevel += i ; + mCachedRawDiscardLevel = mRawDiscardLevel ; + } +} + +void LLViewerFetchedTexture::checkCachedRawSculptImage() +{ + if(mCachedRawImageReady && mCachedRawDiscardLevel > 0) + { + if(getDiscardLevel() != 0) + { + mCachedRawImageReady = FALSE ; + } + else if(isForSculptOnly()) + { + resetTextureStats() ; //do not update this image any more. + } + } +} + +void LLViewerFetchedTexture::saveRawImage() +{ + if(mRawImage.isNull() || mRawImage == mSavedRawImage || (mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= mRawDiscardLevel)) + { + return ; + } + + mSavedRawDiscardLevel = mRawDiscardLevel ; + mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()) ; + + if(mForceToSaveRawImage && mSavedRawDiscardLevel <= mDesiredSavedRawDiscardLevel) + { + mForceToSaveRawImage = FALSE ; + } + + mLastReferencedSavedRawImageTime = sCurrentTime ; +} + +void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard) +{ + if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard) + { + mForceToSaveRawImage = TRUE ; + mDesiredSavedRawDiscardLevel = desired_discard ; + + //copy from the cached raw image if exists. + if(mCachedRawImage.notNull() && mRawImage.isNull() ) + { + mRawImage = mCachedRawImage ; + mRawDiscardLevel = mCachedRawDiscardLevel ; + + saveRawImage() ; + + mRawImage = NULL ; + mRawDiscardLevel = INVALID_DISCARD_LEVEL ; + } + } +} +void LLViewerFetchedTexture::destroySavedRawImage() +{ + clearCallbackEntryList() ; + + mSavedRawImage = NULL ; + mForceToSaveRawImage = FALSE ; + mSaveRawImage = FALSE ; + mSavedRawDiscardLevel = -1 ; + mDesiredSavedRawDiscardLevel = -1 ; + mLastReferencedSavedRawImageTime = 0.0f ; +} + +LLImageRaw* LLViewerFetchedTexture::getSavedRawImage() +{ + mLastReferencedSavedRawImageTime = sCurrentTime ; + + return mSavedRawImage ; +} + +BOOL LLViewerFetchedTexture::hasSavedRawImage() const +{ + return mSavedRawImage.notNull() ; +} + +F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const +{ + return sCurrentTime - mLastReferencedSavedRawImageTime ; +} +//---------------------------------------------------------------------------------------------- +//atlasing +//---------------------------------------------------------------------------------------------- +/*void LLViewerFetchedTexture::resetFaceAtlas() +{ + //Nothing should be done here. +} + +//invalidate all atlas slots for this image. +void LLViewerFetchedTexture::invalidateAtlas(BOOL rebuild_geom) +{ + for(U32 i = 0 ; i < mNumFaces ; i++) + { + LLFace* facep = mFaceList[i] ; + facep->removeAtlas() ; + if(rebuild_geom && facep->getDrawable() && facep->getDrawable()->getSpatialGroup()) + { + facep->getDrawable()->getSpatialGroup()->setState(LLSpatialGroup::GEOM_DIRTY); + } + } +} + +BOOL LLViewerFetchedTexture::insertToAtlas() +{ + if(!LLViewerTexture::sUseTextureAtlas) + { + return FALSE ; + } + if(getNumFaces() < 1) + { + return FALSE ; + } + if(mGLTexturep->getDiscardLevelInAtlas() > 0 && mRawDiscardLevel >= mGLTexturep->getDiscardLevelInAtlas()) + { + return FALSE ; + } + if(!LLTextureAtlasManager::getInstance()->canAddToAtlas(mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents(), mGLTexturep->getTexTarget())) + { + return FALSE ; + } + + BOOL ret = TRUE ;//if ret is set to false, will generate a gl texture for this image. + S32 raw_w = mRawImage->getWidth() ; + S32 raw_h = mRawImage->getHeight() ; + F32 xscale = 1.0f, yscale = 1.0f ; + LLPointer slot_infop; + LLTextureAtlasSlot* cur_slotp ;//no need to be smart pointer. + LLSpatialGroup* groupp ; + LLFace* facep; + + //if the atlas slot pointers for some faces are null, process them later. + ll_face_list_t waiting_list ; + for(U32 i = 0 ; i < mNumFaces ; i++) + { + { + facep = mFaceList[i] ; + + //face can not use atlas. + if(!facep->canUseAtlas()) + { + if(facep->getAtlasInfo()) + { + facep->removeAtlas() ; + } + ret = FALSE ; + continue ; + } + + //the atlas slot is updated + slot_infop = facep->getAtlasInfo() ; + groupp = facep->getDrawable()->getSpatialGroup() ; + + if(slot_infop) + { + if(slot_infop->getSpatialGroup() != groupp) + { + if((cur_slotp = groupp->getCurUpdatingSlot(this))) //switch slot + { + facep->setAtlasInfo(cur_slotp) ; + facep->setAtlasInUse(TRUE) ; + continue ; + } + else //do not forget to update slot_infop->getSpatialGroup(). + { + LLSpatialGroup* gp = slot_infop->getSpatialGroup() ; + gp->setCurUpdatingTime(gFrameCount) ; + gp->setCurUpdatingTexture(this) ; + gp->setCurUpdatingSlot(slot_infop) ; + } + } + else //same group + { + if(gFrameCount && slot_infop->getUpdatedTime() == gFrameCount)//slot is just updated + { + facep->setAtlasInUse(TRUE) ; + continue ; + } + } + } + else + { + //if the slot is null, wait to process them later. + waiting_list.push_back(facep) ; + continue ; + } + + //---------- + //insert to atlas + if(!slot_infop->getAtlas()->insertSubTexture(mGLTexturep, mRawDiscardLevel, mRawImage, slot_infop->getSlotCol(), slot_infop->getSlotRow())) + { + + //the texture does not qualify to add to atlas, do not bother to try for other faces. + //invalidateAtlas(); + return FALSE ; + } + + //update texture scale + slot_infop->getAtlas()->getTexCoordScale(raw_w, raw_h, xscale, yscale) ; + slot_infop->setTexCoordScale(xscale, yscale) ; + slot_infop->setValid() ; + slot_infop->setUpdatedTime(gFrameCount) ; + + //update spatial group atlas info + groupp->setCurUpdatingTime(gFrameCount) ; + groupp->setCurUpdatingTexture(this) ; + groupp->setCurUpdatingSlot(slot_infop) ; + + //make the face to switch to the atlas. + facep->setAtlasInUse(TRUE) ; + } + } + + //process the waiting_list + for(ll_face_list_t::iterator iter = waiting_list.begin(); iter != waiting_list.end(); ++iter) + { + facep = (LLFace*)*iter ; + groupp = facep->getDrawable()->getSpatialGroup() ; + + //check if this texture already inserted to atlas for this group + if((cur_slotp = groupp->getCurUpdatingSlot(this))) + { + facep->setAtlasInfo(cur_slotp) ; + facep->setAtlasInUse(TRUE) ; + continue ; + } + + //need to reserve a slot from atlas + slot_infop = LLTextureAtlasManager::getInstance()->reserveAtlasSlot(llmax(mFullWidth, mFullHeight), getComponents(), groupp, this) ; + + facep->setAtlasInfo(slot_infop) ; + + groupp->setCurUpdatingTime(gFrameCount) ; + groupp->setCurUpdatingTexture(this) ; + groupp->setCurUpdatingSlot(slot_infop) ; + + //slot allocation failed. + if(!slot_infop || !slot_infop->getAtlas()) + { + ret = FALSE ; + facep->setAtlasInUse(FALSE) ; + continue ; + } + + //insert to atlas + if(!slot_infop->getAtlas()->insertSubTexture(mGLTexturep, mRawDiscardLevel, mRawImage, slot_infop->getSlotCol(), slot_infop->getSlotRow())) + { + //the texture does not qualify to add to atlas, do not bother to try for other faces. + ret = FALSE ; + //invalidateAtlas(); + break ; + } + + //update texture scale + slot_infop->getAtlas()->getTexCoordScale(raw_w, raw_h, xscale, yscale) ; + slot_infop->setTexCoordScale(xscale, yscale) ; + slot_infop->setValid() ; + slot_infop->setUpdatedTime(gFrameCount) ; + + //make the face to switch to the atlas. + facep->setAtlasInUse(TRUE) ; + } + + return ret ; +}*/ + +//---------------------------------------------------------------------------------------------- +//end of LLViewerFetchedTexture +//---------------------------------------------------------------------------------------------- + +//---------------------------------------------------------------------------------------------- +//start of LLViewerLODTexture +//---------------------------------------------------------------------------------------------- +LLViewerLODTexture::LLViewerLODTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps) + : LLViewerFetchedTexture(id, host, usemipmaps) +{ + init(TRUE) ; +} + +LLViewerLODTexture::LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps) + : LLViewerFetchedTexture(url, id, usemipmaps) +{ + init(TRUE) ; +} + +void LLViewerLODTexture::init(bool firstinit) +{ + mTexelsPerImage = 64.f*64.f; + mDiscardVirtualSize = 0.f; + mCalculatedDiscardLevel = -1.f; +} + +//virtual +S8 LLViewerLODTexture::getType() const +{ + return LLViewerTexture::LOD_TEXTURE ; +} + +BOOL LLViewerLODTexture::isUpdateFrozen() +{ + return LLViewerTexture::sFreezeImageScalingDown && !getDiscardLevel() ; +} + +// This is gauranteed to get called periodically for every texture +//virtual +void LLViewerLODTexture::processTextureStats() +{ + updateVirtualSize() ; + + static LLCachedControl textures_fullres("TextureLoadFullRes", false); + + if (textures_fullres) + { + mDesiredDiscardLevel = 0; + } + // Generate the request priority and render priority + else if (mDontDiscard || !mUseMipMaps) + { + mDesiredDiscardLevel = 0; + if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) + mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + } + else if (mBoostLevel < LLViewerTexture::BOOST_HIGH && mMaxVirtualSize <= 10.f) + { + // If the image has not been significantly visible in a while, we don't want it + mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)(MAX_DISCARD_LEVEL + 1)); + } + else if (!mFullWidth || !mFullHeight) + { + mDesiredDiscardLevel = getMaxDiscardLevel() ; + } + else + { + //static const F64 log_2 = log(2.0); + static const F64 log_4 = log(4.0); + + F32 discard_level = 0.f; + + // If we know the output width and height, we can force the discard + // level to the correct value, and thus not decode more texture + // data than we need to. + if (mKnownDrawWidth && mKnownDrawHeight) + { + S32 draw_texels = mKnownDrawWidth * mKnownDrawHeight; + + // Use log_4 because we're in square-pixel space, so an image + // with twice the width and twice the height will have mTexelsPerImage + // 4 * draw_size + discard_level = (F32)(log(mTexelsPerImage/draw_texels) / log_4); + } + else + { + if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f) + { + //if is a big image and not being used recently, nor close to the view point, do not load hi-res data. + mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ; + } + + if ((mCalculatedDiscardLevel >= 0.f) && + (llabs(mMaxVirtualSize - mDiscardVirtualSize) < mMaxVirtualSize*.20f)) + { + // < 20% change in virtual size = no change in desired discard + discard_level = mCalculatedDiscardLevel; + } + else + { + // Calculate the required scale factor of the image using pixels per texel + discard_level = (F32)(log(mTexelsPerImage/mMaxVirtualSize) / log_4); + mDiscardVirtualSize = mMaxVirtualSize; + mCalculatedDiscardLevel = discard_level; + } + } + if (mBoostLevel < LLViewerTexture::BOOST_SCULPTED) + { + discard_level += sDesiredDiscardBias; + discard_level *= sDesiredDiscardScale; // scale + discard_level += sCameraMovingDiscardBias ; + } + discard_level = floorf(discard_level); + + F32 min_discard = 0.f; + if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) + min_discard = 1.f; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + + discard_level = llclamp(discard_level, min_discard, (F32)MAX_DISCARD_LEVEL); + + // Can't go higher than the max discard level + mDesiredDiscardLevel = llmin(getMaxDiscardLevel() + 1, (S32)discard_level); + // Clamp to min desired discard + mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, mDesiredDiscardLevel); + + // + // At this point we've calculated the quality level that we want, + // if possible. Now we check to see if we have it, and take the + // proper action if we don't. + // + + S32 current_discard = getDiscardLevel(); + if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0) + { + // Limit the amount of GL memory bound each frame + if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale && + (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) + { + scaleDown() ; + } + // Only allow GL to have 2x the video card memory + else if ( BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) > sMaxTotalTextureMemInMegaBytes*texmem_middle_bound_scale && + (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) + { + scaleDown() ; + + } + } + } + + if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0) + { + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S8)mDesiredSavedRawDiscardLevel) ; + } +} + +void LLViewerLODTexture::scaleDown() +{ + if(hasGLTexture() && mCachedRawDiscardLevel > getDiscardLevel()) + { + switchToCachedImage() ; + + /*LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) + { + tester->setStablizingTime() ; + }*/ + } +} +//---------------------------------------------------------------------------------------------- +//end of LLViewerLODTexture +//---------------------------------------------------------------------------------------------- + +//---------------------------------------------------------------------------------------------- +//start of LLViewerMediaTexture +//---------------------------------------------------------------------------------------------- +#if NEW_MEDIA_TEXTURE +//static +void LLViewerMediaTexture::updateClass() +{ + static const F32 MAX_INACTIVE_TIME = 30.f ; + +#if NEW_MEDIA_TEXTURE + //force to play media. + gSavedSettings.setBOOL("AudioStreamingMedia", true) ; +#endif + + for(media_map_t::iterator iter = sMediaMap.begin() ; iter != sMediaMap.end(); ) + { + LLViewerMediaTexture* mediap = iter->second; + + if(mediap->getNumRefs() == 1) //one reference by sMediaMap + { + // + //Note: delay some time to delete the media textures to stop endlessly creating and immediately removing media texture. + // + if(mediap->getLastReferencedTimer()->getElapsedTimeF32() > MAX_INACTIVE_TIME) + { + media_map_t::iterator cur = iter++ ; + sMediaMap.erase(cur) ; + continue ; + } + } + ++iter ; + } +} + +//static +void LLViewerMediaTexture::removeMediaImplFromTexture(const LLUUID& media_id) +{ + LLViewerMediaTexture* media_tex = findMediaTexture(media_id) ; + if(media_tex) + { + media_tex->invalidateMediaImpl() ; + } +} + +//static +void LLViewerMediaTexture::cleanUpClass() +{ + sMediaMap.clear() ; +} + +//static +LLViewerMediaTexture* LLViewerMediaTexture::findMediaTexture(const LLUUID& media_id) +{ + media_map_t::iterator iter = sMediaMap.find(media_id); + if(iter == sMediaMap.end()) + { + return NULL; + } + + LLViewerMediaTexture* media_tex = iter->second ; + media_tex->setMediaImpl() ; + media_tex->getLastReferencedTimer()->reset() ; + + return media_tex; +} + +LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LLImageGL* gl_image) + : LLViewerTexture(id, usemipmaps), + mMediaImplp(NULL), + mUpdateVirtualSizeTime(0) +{ + sMediaMap.insert(std::make_pair(id, this)); + + mGLTexturep = gl_image ; + if(mGLTexturep.isNull()) + { + generateGLTexture() ; + } + mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ; + + mIsPlaying = FALSE ; + + setMediaImpl() ; + + setCategory(LLViewerTexture::MEDIA) ; + + LLViewerTexture* tex = gTextureList.findImage(mID) ; + if(tex) //this media is a parcel media for tex. + { + tex->setParcelMedia(this) ; + } +} + +//virtual +LLViewerMediaTexture::~LLViewerMediaTexture() +{ + LLViewerTexture* tex = gTextureList.findImage(mID) ; + if(tex) //this media is a parcel media for tex. + { + tex->setParcelMedia(NULL) ; + } +} +#endif +void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */) +{ + llassert(mGLTexturep.notNull()) ; + + mUseMipMaps = usemipmaps ; + getLastReferencedTimer()->reset() ; + mGLTexturep->setUseMipMaps(mUseMipMaps) ; + mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ; +} + +void LLViewerMediaTexture::setUseMipMaps(BOOL mipmap) +{ + mUseMipMaps = mipmap; + + if(mGLTexturep.notNull()) + { + mGLTexturep->setUseMipMaps(mipmap) ; + } +} +#if NEW_MEDIA_TEXTURE +//virtual +S8 LLViewerMediaTexture::getType() const +{ + return LLViewerTexture::MEDIA_TEXTURE ; +} + +void LLViewerMediaTexture::invalidateMediaImpl() +{ + mMediaImplp = NULL ; +} + +void LLViewerMediaTexture::setMediaImpl() +{ + if(!mMediaImplp) + { + mMediaImplp = LLViewerMedia::getMediaImplFromTextureID(mID) ; + } +} + +//return true if all faces to reference to this media texture are found +//Note: mMediaFaceList is valid only for the current instant +// because it does not check the face validity after the current frame. +BOOL LLViewerMediaTexture::findFaces() +{ + mMediaFaceList.clear() ; + + BOOL ret = TRUE ; + + LLViewerTexture* tex = gTextureList.findImage(mID) ; + if(tex) //this media is a parcel media for tex. + { + const ll_face_list_t* face_list = tex->getFaceList() ; + U32 end = tex->getNumFaces() ; + for(U32 i = 0 ; i < end ; i++) + { + mMediaFaceList.push_back((*face_list)[i]) ; + } + } + + if(!mMediaImplp) + { + return TRUE ; + } + + //for media on a face. + const std::list< LLVOVolume* >* obj_list = mMediaImplp->getObjectList() ; + std::list< LLVOVolume* >::const_iterator iter = obj_list->begin() ; + for(; iter != obj_list->end(); ++iter) + { + LLVOVolume* obj = *iter ; + if(obj->mDrawable.isNull()) + { + ret = FALSE ; + continue ; + } + + S32 face_id = -1 ; + S32 num_faces = obj->mDrawable->getNumFaces() ; + while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1 && face_id < num_faces) + { + LLFace* facep = obj->mDrawable->getFace(face_id) ; + if(facep) + { + mMediaFaceList.push_back(facep) ; + } + else + { + ret = FALSE ; + } + } + } + + return ret ; +} + +void LLViewerMediaTexture::initVirtualSize() +{ + if(mIsPlaying) + { + return ; + } + + findFaces() ; + for(std::list< LLFace* >::iterator iter = mMediaFaceList.begin(); iter!= mMediaFaceList.end(); ++iter) + { + addTextureStats((*iter)->getVirtualSize()) ; + } +} + +void LLViewerMediaTexture::addMediaToFace(LLFace* facep) +{ + if(facep) + { + facep->setHasMedia(true) ; + } + if(!mIsPlaying) + { + return ; //no need to add the face because the media is not in playing. + } + + switchTexture(facep) ; +} + +void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep) +{ + if(!facep) + { + return ; + } + facep->setHasMedia(false) ; + + if(!mIsPlaying) + { + return ; //no need to remove the face because the media is not in playing. + } + + mIsPlaying = FALSE ; //set to remove the media from the face. + switchTexture(facep) ; + mIsPlaying = TRUE ; //set the flag back. + + if(getNumFaces() < 1) //no face referencing to this media + { + stopPlaying() ; + } +} + +//virtual +void LLViewerMediaTexture::addFace(LLFace* facep) +{ + LLViewerTexture::addFace(facep) ; + + const LLTextureEntry* te = facep->getTextureEntry() ; + if(te && te->getID().notNull()) + { + LLViewerTexture* tex = gTextureList.findImage(te->getID()) ; + if(tex) + { + mTextureList.push_back(tex) ;//increase the reference number by one for tex to avoid deleting it. + return ; + } + } + + //check if it is a parcel media + if(facep->getTexture() && facep->getTexture() != this && facep->getTexture()->getID() == mID) + { + mTextureList.push_back(facep->getTexture()) ; //a parcel media. + return ; + } + + if(te && te->getID().notNull()) //should have a texture + { + llerrs << "The face does not have a valid texture before media texture." << llendl ; + } +} + +//virtual +void LLViewerMediaTexture::removeFace(LLFace* facep) +{ + LLViewerTexture::removeFace(facep) ; + + const LLTextureEntry* te = facep->getTextureEntry() ; + if(te && te->getID().notNull()) + { + LLViewerTexture* tex = gTextureList.findImage(te->getID()) ; + if(tex) + { + for(std::list< LLPointer >::iterator iter = mTextureList.begin(); + iter != mTextureList.end(); ++iter) + { + if(*iter == tex) + { + mTextureList.erase(iter) ; //decrease the reference number for tex by one. + return ; + } + } + + // + //we have some trouble here: the texture of the face is changed. + //we need to find the former texture, and remove it from the list to avoid memory leaking. + if(!mNumFaces) + { + mTextureList.clear() ; + return ; + } + S32 end = getNumFaces() ; + std::vector te_list(end) ; + S32 i = 0 ; + for(U32 j = 0 ; j < mNumFaces ; j++) + { + te_list[i++] = mFaceList[j]->getTextureEntry() ;//all textures are in use. + } + for(std::list< LLPointer >::iterator iter = mTextureList.begin(); + iter != mTextureList.end(); ++iter) + { + for(i = 0 ; i < end ; i++) + { + if(te_list[i] && te_list[i]->getID() == (*iter)->getID())//the texture is in use. + { + te_list[i] = NULL ; + break ; + } + } + if(i == end) //no hit for this texture, remove it. + { + mTextureList.erase(iter) ; //decrease the reference number for tex by one. + return ; + } + } + } + } + + //check if it is a parcel media + for(std::list< LLPointer >::iterator iter = mTextureList.begin(); + iter != mTextureList.end(); ++iter) + { + if((*iter)->getID() == mID) + { + mTextureList.erase(iter) ; //decrease the reference number for tex by one. + return ; + } + } + + if(te && te->getID().notNull()) //should have a texture + { + llerrs << "mTextureList texture reference number is corrupted." << llendl ; + } +} + +void LLViewerMediaTexture::stopPlaying() +{ + // Don't stop the media impl playing here -- this breaks non-inworld media (login screen, search, and media browser). +// if(mMediaImplp) +// { +// mMediaImplp->stop() ; +// } + mIsPlaying = FALSE ; +} + +void LLViewerMediaTexture::switchTexture(LLFace* facep) +{ + if(facep) + { + //check if another media is playing on this face. + if(facep->getTexture() && facep->getTexture() != this + && facep->getTexture()->getType() == LLViewerTexture::MEDIA_TEXTURE) + { + if(mID == facep->getTexture()->getID()) //this is a parcel media + { + return ; //let the prim media win. + } + } + + if(mIsPlaying) //old textures switch to the media texture + { + facep->switchTexture(this) ; + } + else //switch to old textures. + { + const LLTextureEntry* te = facep->getTextureEntry() ; + if(te) + { + LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID()) : NULL ; + if(!tex && te->getID() != mID)//try parcel media. + { + tex = gTextureList.findImage(mID) ; + } + if(!tex) + { + tex = LLViewerFetchedTexture::sDefaultImagep ; + } + facep->switchTexture(tex) ; + } + } + } +} + +void LLViewerMediaTexture::setPlaying(BOOL playing) +{ + if(!mMediaImplp) + { + return ; + } + if(!playing && !mIsPlaying) + { + return ; //media is already off + } + + if(playing == mIsPlaying && !mMediaImplp->isUpdated()) + { + return ; //nothing has changed since last time. + } + + mIsPlaying = playing ; + if(mIsPlaying) //is about to play this media + { + if(findFaces()) + { + //about to update all faces. + mMediaImplp->setUpdated(FALSE) ; + } + + if(mMediaFaceList.empty())//no face pointing to this media + { + stopPlaying() ; + return ; + } + + for(std::list< LLFace* >::iterator iter = mMediaFaceList.begin(); iter!= mMediaFaceList.end(); ++iter) + { + switchTexture(*iter) ; + } + } + else //stop playing this media + { + for(U32 i = mNumFaces ; i ; i--) + { + switchTexture(mFaceList[i - 1]) ; //current face could be removed in this function. + } + } + return ; +} + +//virtual +F32 LLViewerMediaTexture::getMaxVirtualSize() +{ + if(LLFrameTimer::getFrameCount() == mUpdateVirtualSizeTime) + { + return mMaxVirtualSize ; + } + mUpdateVirtualSizeTime = LLFrameTimer::getFrameCount() ; + + if(!mMaxVirtualSizeResetCounter) + { + addTextureStats(0.f, FALSE) ;//reset + } + + if(mIsPlaying) //media is playing + { + for(U32 i = 0 ; i < mNumFaces ; i++) + { + LLFace* facep = mFaceList[i] ; + if(facep->getDrawable()->isRecentlyVisible()) + { + addTextureStats(facep->getVirtualSize()) ; + } + } + } + else //media is not in playing + { + findFaces() ; + + if(!mMediaFaceList.empty()) + { + for(std::list< LLFace* >::iterator iter = mMediaFaceList.begin(); iter!= mMediaFaceList.end(); ++iter) + { + LLFace* facep = *iter ; + if(facep->getDrawable()->isRecentlyVisible()) + { + addTextureStats(facep->getVirtualSize()) ; + } + } + } + } + + if(mMaxVirtualSizeResetCounter > 0) + { + mMaxVirtualSizeResetCounter--; + } + reorganizeFaceList() ; + reorganizeVolumeList(); + + return mMaxVirtualSize ; +} +#endif +//---------------------------------------------------------------------------------------------- +//end of LLViewerMediaTexture +//---------------------------------------------------------------------------------------------- + +//---------------------------------------------------------------------------------------------- +//start of LLTexturePipelineTester +//---------------------------------------------------------------------------------------------- +#if 0 +LLTexturePipelineTester::LLTexturePipelineTester() : LLMetricPerformanceTesterWithSession(sTesterName) +{ + addMetric("TotalBytesLoaded") ; + addMetric("TotalBytesLoadedFromCache") ; + addMetric("TotalBytesLoadedForLargeImage") ; + addMetric("TotalBytesLoadedForSculpties") ; + addMetric("StartFetchingTime") ; + addMetric("TotalGrayTime") ; + addMetric("TotalStablizingTime") ; + addMetric("StartTimeLoadingSculpties") ; + addMetric("EndTimeLoadingSculpties") ; + + addMetric("Time") ; + addMetric("TotalBytesBound") ; + addMetric("TotalBytesBoundForLargeImage") ; + addMetric("PercentageBytesBound") ; + + mTotalBytesLoaded = 0 ; + mTotalBytesLoadedFromCache = 0 ; + mTotalBytesLoadedForLargeImage = 0 ; + mTotalBytesLoadedForSculpties = 0 ; + + reset() ; +} + +LLTexturePipelineTester::~LLTexturePipelineTester() +{ + LLViewerTextureManager::sTesterp = NULL ; +} + +void LLTexturePipelineTester::update() +{ + mLastTotalBytesUsed = mTotalBytesUsed ; + mLastTotalBytesUsedForLargeImage = mTotalBytesUsedForLargeImage ; + mTotalBytesUsed = 0 ; + mTotalBytesUsedForLargeImage = 0 ; + + if(LLAppViewer::getTextureFetch()->getNumRequests() > 0) //fetching list is not empty + { + if(mPause) + { + //start a new fetching session + reset() ; + mStartFetchingTime = LLImageGL::sLastFrameTime ; + mPause = FALSE ; + } + + //update total gray time + if(mUsingDefaultTexture) + { + mUsingDefaultTexture = FALSE ; + mTotalGrayTime = LLImageGL::sLastFrameTime - mStartFetchingTime ; + } + + //update the stablizing timer. + updateStablizingTime() ; + + outputTestResults() ; + } + else if(!mPause) + { + //stop the current fetching session + mPause = TRUE ; + outputTestResults() ; + reset() ; + } +} + +void LLTexturePipelineTester::reset() +{ + mPause = TRUE ; + + mUsingDefaultTexture = FALSE ; + mStartStablizingTime = 0.0f ; + mEndStablizingTime = 0.0f ; + + mTotalBytesUsed = 0 ; + mTotalBytesUsedForLargeImage = 0 ; + mLastTotalBytesUsed = 0 ; + mLastTotalBytesUsedForLargeImage = 0 ; + + mStartFetchingTime = 0.0f ; + + mTotalGrayTime = 0.0f ; + mTotalStablizingTime = 0.0f ; + + mStartTimeLoadingSculpties = 1.0f ; + mEndTimeLoadingSculpties = 0.0f ; +} + +//virtual +void LLTexturePipelineTester::outputTestRecord(LLSD *sd) +{ + (*sd)[mCurLabel]["TotalBytesLoaded"] = (LLSD::Integer)mTotalBytesLoaded ; + (*sd)[mCurLabel]["TotalBytesLoadedFromCache"] = (LLSD::Integer)mTotalBytesLoadedFromCache ; + (*sd)[mCurLabel]["TotalBytesLoadedForLargeImage"] = (LLSD::Integer)mTotalBytesLoadedForLargeImage ; + (*sd)[mCurLabel]["TotalBytesLoadedForSculpties"] = (LLSD::Integer)mTotalBytesLoadedForSculpties ; + + (*sd)[mCurLabel]["StartFetchingTime"] = (LLSD::Real)mStartFetchingTime ; + (*sd)[mCurLabel]["TotalGrayTime"] = (LLSD::Real)mTotalGrayTime ; + (*sd)[mCurLabel]["TotalStablizingTime"] = (LLSD::Real)mTotalStablizingTime ; + + (*sd)[mCurLabel]["StartTimeLoadingSculpties"] = (LLSD::Real)mStartTimeLoadingSculpties ; + (*sd)[mCurLabel]["EndTimeLoadingSculpties"] = (LLSD::Real)mEndTimeLoadingSculpties ; + + (*sd)[mCurLabel]["Time"] = LLImageGL::sLastFrameTime ; + (*sd)[mCurLabel]["TotalBytesBound"] = (LLSD::Integer)mLastTotalBytesUsed ; + (*sd)[mCurLabel]["TotalBytesBoundForLargeImage"] = (LLSD::Integer)mLastTotalBytesUsedForLargeImage ; + (*sd)[mCurLabel]["PercentageBytesBound"] = (LLSD::Real)(100.f * mLastTotalBytesUsed / mTotalBytesLoaded) ; +} + +void LLTexturePipelineTester::updateTextureBindingStats(const LLViewerTexture* imagep) +{ + U32 mem_size = (U32)imagep->getTextureMemory() ; + mTotalBytesUsed += mem_size ; + + if(MIN_LARGE_IMAGE_AREA <= (U32)(mem_size / (U32)imagep->getComponents())) + { + mTotalBytesUsedForLargeImage += mem_size ; + } +} + +void LLTexturePipelineTester::updateTextureLoadingStats(const LLViewerFetchedTexture* imagep, const LLImageRaw* raw_imagep, BOOL from_cache) +{ + U32 data_size = (U32)raw_imagep->getDataSize() ; + mTotalBytesLoaded += data_size ; + + if(from_cache) + { + mTotalBytesLoadedFromCache += data_size ; + } + + if(MIN_LARGE_IMAGE_AREA <= (U32)(data_size / (U32)raw_imagep->getComponents())) + { + mTotalBytesLoadedForLargeImage += data_size ; + } + + if(imagep->forSculpt()) + { + mTotalBytesLoadedForSculpties += data_size ; + + if(mStartTimeLoadingSculpties > mEndTimeLoadingSculpties) + { + mStartTimeLoadingSculpties = LLImageGL::sLastFrameTime ; + } + mEndTimeLoadingSculpties = LLImageGL::sLastFrameTime ; + } +} + +void LLTexturePipelineTester::updateGrayTextureBinding() +{ + mUsingDefaultTexture = TRUE ; +} + +void LLTexturePipelineTester::setStablizingTime() +{ + if(mStartStablizingTime <= mStartFetchingTime) + { + mStartStablizingTime = LLImageGL::sLastFrameTime ; + } + mEndStablizingTime = LLImageGL::sLastFrameTime ; +} + +void LLTexturePipelineTester::updateStablizingTime() +{ + if(mStartStablizingTime > mStartFetchingTime) + { + F32 t = mEndStablizingTime - mStartStablizingTime ; + + if(t > F_ALMOST_ZERO && (t - mTotalStablizingTime) < F_ALMOST_ZERO) + { + //already stablized + mTotalStablizingTime = LLImageGL::sLastFrameTime - mStartStablizingTime ; + + //cancel the timer + mStartStablizingTime = 0.f ; + mEndStablizingTime = 0.f ; + } + else + { + mTotalStablizingTime = t ; + } + } + mTotalStablizingTime = 0.f ; +} + +//virtual +void LLTexturePipelineTester::compareTestSessions(std::ofstream* os) +{ + LLTexturePipelineTester::LLTextureTestSession* base_sessionp = dynamic_cast(mBaseSessionp) ; + LLTexturePipelineTester::LLTextureTestSession* current_sessionp = dynamic_cast(mCurrentSessionp) ; + if(!base_sessionp || !current_sessionp) + { + llerrs << "type of test session does not match!" << llendl ; + } + + //compare and output the comparison + *os << llformat("%s\n", mName.c_str()) ; + *os << llformat("AggregateResults\n") ; + + compareTestResults(os, "TotalFetchingTime", base_sessionp->mTotalFetchingTime, current_sessionp->mTotalFetchingTime) ; + compareTestResults(os, "TotalGrayTime", base_sessionp->mTotalGrayTime, current_sessionp->mTotalGrayTime) ; + compareTestResults(os, "TotalStablizingTime", base_sessionp->mTotalStablizingTime, current_sessionp->mTotalStablizingTime); + compareTestResults(os, "StartTimeLoadingSculpties", base_sessionp->mStartTimeLoadingSculpties, current_sessionp->mStartTimeLoadingSculpties) ; + compareTestResults(os, "TotalTimeLoadingSculpties", base_sessionp->mTotalTimeLoadingSculpties, current_sessionp->mTotalTimeLoadingSculpties) ; + + compareTestResults(os, "TotalBytesLoaded", base_sessionp->mTotalBytesLoaded, current_sessionp->mTotalBytesLoaded) ; + compareTestResults(os, "TotalBytesLoadedFromCache", base_sessionp->mTotalBytesLoadedFromCache, current_sessionp->mTotalBytesLoadedFromCache) ; + compareTestResults(os, "TotalBytesLoadedForLargeImage", base_sessionp->mTotalBytesLoadedForLargeImage, current_sessionp->mTotalBytesLoadedForLargeImage) ; + compareTestResults(os, "TotalBytesLoadedForSculpties", base_sessionp->mTotalBytesLoadedForSculpties, current_sessionp->mTotalBytesLoadedForSculpties) ; + + *os << llformat("InstantResults\n") ; + S32 size = llmin(base_sessionp->mInstantPerformanceListCounter, current_sessionp->mInstantPerformanceListCounter) ; + for(S32 i = 0 ; i < size ; i++) + { + *os << llformat("Time(B-T)-%.4f-%.4f\n", base_sessionp->mInstantPerformanceList[i].mTime, current_sessionp->mInstantPerformanceList[i].mTime) ; + + compareTestResults(os, "AverageBytesUsedPerSecond", base_sessionp->mInstantPerformanceList[i].mAverageBytesUsedPerSecond, + current_sessionp->mInstantPerformanceList[i].mAverageBytesUsedPerSecond) ; + + compareTestResults(os, "AverageBytesUsedForLargeImagePerSecond", base_sessionp->mInstantPerformanceList[i].mAverageBytesUsedForLargeImagePerSecond, + current_sessionp->mInstantPerformanceList[i].mAverageBytesUsedForLargeImagePerSecond) ; + + compareTestResults(os, "AveragePercentageBytesUsedPerSecond", base_sessionp->mInstantPerformanceList[i].mAveragePercentageBytesUsedPerSecond, + current_sessionp->mInstantPerformanceList[i].mAveragePercentageBytesUsedPerSecond) ; + } + + if(size < base_sessionp->mInstantPerformanceListCounter) + { + for(S32 i = size ; i < base_sessionp->mInstantPerformanceListCounter ; i++) + { + *os << llformat("Time(B-T)-%.4f- \n", base_sessionp->mInstantPerformanceList[i].mTime) ; + + *os << llformat(", AverageBytesUsedPerSecond, %d, N/A \n", base_sessionp->mInstantPerformanceList[i].mAverageBytesUsedPerSecond) ; + *os << llformat(", AverageBytesUsedForLargeImagePerSecond, %d, N/A \n", base_sessionp->mInstantPerformanceList[i].mAverageBytesUsedForLargeImagePerSecond) ; + *os << llformat(", AveragePercentageBytesUsedPerSecond, %.4f, N/A \n", base_sessionp->mInstantPerformanceList[i].mAveragePercentageBytesUsedPerSecond) ; + } + } + else if(size < current_sessionp->mInstantPerformanceListCounter) + { + for(S32 i = size ; i < current_sessionp->mInstantPerformanceListCounter ; i++) + { + *os << llformat("Time(B-T)- -%.4f\n", current_sessionp->mInstantPerformanceList[i].mTime) ; + + *os << llformat(", AverageBytesUsedPerSecond, N/A, %d\n", current_sessionp->mInstantPerformanceList[i].mAverageBytesUsedPerSecond) ; + *os << llformat(", AverageBytesUsedForLargeImagePerSecond, N/A, %d\n", current_sessionp->mInstantPerformanceList[i].mAverageBytesUsedForLargeImagePerSecond) ; + *os << llformat(", AveragePercentageBytesUsedPerSecond, N/A, %.4f\n", current_sessionp->mInstantPerformanceList[i].mAveragePercentageBytesUsedPerSecond) ; + } + } +} + +//virtual +LLMetricPerformanceTester::LLTestSession* LLTexturePipelineTester::loadTestSession(LLSD* log) +{ + LLTexturePipelineTester::LLTextureTestSession* sessionp = new LLTexturePipelineTester::LLTextureTestSession() ; + if(!sessionp) + { + return NULL ; + } + + F32 total_fetching_time = 0.f ; + F32 total_gray_time = 0.f ; + F32 total_stablizing_time = 0.f ; + F32 total_loading_sculpties_time = 0.f ; + + F32 start_fetching_time = -1.f ; + F32 start_fetching_sculpties_time = 0.f ; + + F32 last_time = 0.0f ; + S32 frame_count = 0 ; + + sessionp->mInstantPerformanceListCounter = 0 ; + sessionp->mInstantPerformanceList.resize(128) ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedPerSecond = 0 ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedForLargeImagePerSecond = 0 ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAveragePercentageBytesUsedPerSecond = 0.f ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mTime = 0.f ; + + //load a session + BOOL in_log = (*log).has(mCurLabel) ; + while(in_log) + { + LLSD::String label = mCurLabel ; + incLabel() ; + in_log = (*log).has(mCurLabel) ; + + if(sessionp->mInstantPerformanceListCounter >= (S32)sessionp->mInstantPerformanceList.size()) + { + sessionp->mInstantPerformanceList.resize(sessionp->mInstantPerformanceListCounter + 128) ; + } + + //time + F32 start_time = (*log)[label]["StartFetchingTime"].asReal() ; + F32 cur_time = (*log)[label]["Time"].asReal() ; + if(start_time - start_fetching_time > F_ALMOST_ZERO) //fetching has paused for a while + { + sessionp->mTotalFetchingTime += total_fetching_time ; + sessionp->mTotalGrayTime += total_gray_time ; + sessionp->mTotalStablizingTime += total_stablizing_time ; + + sessionp->mStartTimeLoadingSculpties = start_fetching_sculpties_time ; + sessionp->mTotalTimeLoadingSculpties += total_loading_sculpties_time ; + + start_fetching_time = start_time ; + total_fetching_time = 0.0f ; + total_gray_time = 0.f ; + total_stablizing_time = 0.f ; + total_loading_sculpties_time = 0.f ; + } + else + { + total_fetching_time = cur_time - start_time ; + total_gray_time = (*log)[label]["TotalGrayTime"].asReal() ; + total_stablizing_time = (*log)[label]["TotalStablizingTime"].asReal() ; + + total_loading_sculpties_time = (*log)[label]["EndTimeLoadingSculpties"].asReal() - (*log)[label]["StartTimeLoadingSculpties"].asReal() ; + if(start_fetching_sculpties_time < 0.f && total_loading_sculpties_time > 0.f) + { + start_fetching_sculpties_time = (*log)[label]["StartTimeLoadingSculpties"].asReal() ; + } + } + + //total loaded bytes + sessionp->mTotalBytesLoaded = (*log)[label]["TotalBytesLoaded"].asInteger() ; + sessionp->mTotalBytesLoadedFromCache = (*log)[label]["TotalBytesLoadedFromCache"].asInteger() ; + sessionp->mTotalBytesLoadedForLargeImage = (*log)[label]["TotalBytesLoadedForLargeImage"].asInteger() ; + sessionp->mTotalBytesLoadedForSculpties = (*log)[label]["TotalBytesLoadedForSculpties"].asInteger() ; + + //instant metrics + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedPerSecond += + (*log)[label]["TotalBytesBound"].asInteger() ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedForLargeImagePerSecond += + (*log)[label]["TotalBytesBoundForLargeImage"].asInteger() ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAveragePercentageBytesUsedPerSecond += + (*log)[label]["PercentageBytesBound"].asReal() ; + frame_count++ ; + if(cur_time - last_time >= 1.0f) + { + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedPerSecond /= frame_count ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedForLargeImagePerSecond /= frame_count ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAveragePercentageBytesUsedPerSecond /= frame_count ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mTime = last_time ; + + frame_count = 0 ; + last_time = cur_time ; + sessionp->mInstantPerformanceListCounter++ ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedPerSecond = 0 ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedForLargeImagePerSecond = 0 ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAveragePercentageBytesUsedPerSecond = 0.f ; + sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mTime = 0.f ; + } + } + + sessionp->mTotalFetchingTime += total_fetching_time ; + sessionp->mTotalGrayTime += total_gray_time ; + sessionp->mTotalStablizingTime += total_stablizing_time ; + + if(sessionp->mStartTimeLoadingSculpties < 0.f) + { + sessionp->mStartTimeLoadingSculpties = start_fetching_sculpties_time ; + } + sessionp->mTotalTimeLoadingSculpties += total_loading_sculpties_time ; + + return sessionp; +} + +LLTexturePipelineTester::LLTextureTestSession::LLTextureTestSession() +{ + reset() ; +} +LLTexturePipelineTester::LLTextureTestSession::~LLTextureTestSession() +{ +} +void LLTexturePipelineTester::LLTextureTestSession::reset() +{ + mTotalFetchingTime = 0.0f ; + + mTotalGrayTime = 0.0f ; + mTotalStablizingTime = 0.0f ; + + mStartTimeLoadingSculpties = 0.0f ; + mTotalTimeLoadingSculpties = 0.0f ; + + mTotalBytesLoaded = 0 ; + mTotalBytesLoadedFromCache = 0 ; + mTotalBytesLoadedForLargeImage = 0 ; + mTotalBytesLoadedForSculpties = 0 ; + + mInstantPerformanceListCounter = 0 ; +} +#endif //0 +//---------------------------------------------------------------------------------------------- +//end of LLTexturePipelineTester +//---------------------------------------------------------------------------------------------- + diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h new file mode 100644 index 000000000..ad59d37c8 --- /dev/null +++ b/indra/newview/llviewertexture.h @@ -0,0 +1,846 @@ +/** + * @file llviewertexture.h + * @brief Object for managing images and their textures + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * + */ + +#ifndef LL_LLVIEWERTEXTURE_H +#define LL_LLVIEWERTEXTURE_H + +#include "lltexture.h" +#include "lltimer.h" +#include "llframetimer.h" +#include "llhost.h" +#include "llgltypes.h" +#include "llrender.h" +//#include "llmetricperformancetester.h" + +#include +#include + +#define MIN_VIDEO_RAM_IN_MEGA_BYTES 32 +#define MAX_VIDEO_RAM_IN_MEGA_BYTES 512 // 512MB max for performance reasons. + +class LLFace; +class LLImageGL ; +class LLImageRaw; +class LLViewerObject; +class LLViewerTexture; +class LLViewerFetchedTexture ; +class LLViewerMediaTexture ; +class LLTexturePipelineTester ; + + +typedef void (*loaded_callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); + +class LLVFile; +class LLMessageSystem; +class LLViewerMediaImpl ; +class LLVOVolume ; + +class LLLoadedCallbackEntry +{ +public: + typedef std::set< LLUUID > source_callback_list_t; + +public: + LLLoadedCallbackEntry(loaded_callback_func cb, + S32 discard_level, + BOOL need_imageraw, // Needs image raw for the callback + void* userdata, + source_callback_list_t* src_callback_list, + LLViewerFetchedTexture* target, + BOOL pause); + ~LLLoadedCallbackEntry(); + void removeTexture(LLViewerFetchedTexture* tex) ; + + loaded_callback_func mCallback; + S32 mLastUsedDiscard; + S32 mDesiredDiscard; + BOOL mNeedsImageRaw; + BOOL mPaused; + void* mUserData; + source_callback_list_t* mSourceCallbackList; + +public: + static void cleanUpCallbackList(LLLoadedCallbackEntry::source_callback_list_t* callback_list) ; +}; + +class LLTextureBar; + +class LLViewerTexture : public LLTexture +{ +public: + enum + { + MAX_IMAGE_SIZE_DEFAULT = 1024, + INVALID_DISCARD_LEVEL = 0x7fff + }; + enum + { + LOCAL_TEXTURE, + MEDIA_TEXTURE, + DYNAMIC_TEXTURE, + FETCHED_TEXTURE, + LOD_TEXTURE, + //ATLAS_TEXTURE, + INVALID_TEXTURE_TYPE + }; + + enum EBoostLevel + { + BOOST_NONE = 0, + BOOST_AVATAR_BAKED , + BOOST_AVATAR , + BOOST_CLOUDS , + BOOST_SCULPTED , + + BOOST_HIGH = 10, + BOOST_BUMP , + BOOST_TERRAIN , // has to be high priority for minimap / low detail + BOOST_SELECTED , + BOOST_AVATAR_BAKED_SELF , + BOOST_AVATAR_SELF , // needed for baking avatar + BOOST_SUPER_HIGH , //textures higher than this need to be downloaded at the required resolution without delay. + BOOST_HUD , + BOOST_ICON , + BOOST_UI , + BOOST_PREVIEW , + BOOST_MAP , + BOOST_MAP_VISIBLE , + BOOST_MAX_LEVEL, + + //other texture Categories + LOCAL = BOOST_MAX_LEVEL, + AVATAR_SCRATCH_TEX, + DYNAMIC_TEX, + MEDIA, + //ATLAS, + OTHER, + MAX_GL_IMAGE_CATEGORY + }; + static S32 getTotalNumOfCategories() ; + static S32 getIndexFromCategory(S32 category) ; + static S32 getCategoryFromIndex(S32 index) ; + + typedef std::vector ll_face_list_t; + typedef std::vector ll_volume_list_t; + + +protected: + virtual ~LLViewerTexture(); + LOG_CLASS(LLViewerTexture); + +public: + bool mIsMediaTexture; + static void initClass(); + static void updateClass(const F32 velocity, const F32 angular_velocity) ; + + LLViewerTexture(BOOL usemipmaps = TRUE); + LLViewerTexture(const LLUUID& id, BOOL usemipmaps) ; + LLViewerTexture(const LLImageRaw* raw, BOOL usemipmaps) ; + LLViewerTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps) ; + + virtual S8 getType() const; + virtual BOOL isMissingAsset()const ; + virtual void dump(); // debug info to llinfos + + /*virtual*/ bool bindDefaultImage(const S32 stage = 0) ; + /*virtual*/ void forceImmediateUpdate() ; + + const LLUUID& getID() const { return mID; } + + void setBoostLevel(S32 level); + S32 getBoostLevel() { return mBoostLevel; } + + void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const; + void resetTextureStats(); + void setMaxVirtualSizeResetInterval(S32 interval)const {mMaxVirtualSizeResetInterval = interval;} + void resetMaxVirtualSizeResetCounter()const {mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval;} + + virtual F32 getMaxVirtualSize() ; + + LLFrameTimer* getLastReferencedTimer() {return &mLastReferencedTimer ;} + + S32 getFullWidth() const { return mFullWidth; } + S32 getFullHeight() const { return mFullHeight; } + /*virtual*/ void setKnownDrawSize(S32 width, S32 height); + + virtual void addFace(LLFace* facep) ; + virtual void removeFace(LLFace* facep) ; + S32 getNumFaces() const; + const ll_face_list_t* getFaceList() const {return &mFaceList;} + + virtual void addVolume(LLVOVolume* volumep); + virtual void removeVolume(LLVOVolume* volumep); + S32 getNumVolumes() const; + const ll_volume_list_t* getVolumeList() const { return &mVolumeList; } + + void generateGLTexture() ; + void destroyGLTexture() ; + + //--------------------------------------------------------------------------------------------- + //functions to access LLImageGL + //--------------------------------------------------------------------------------------------- + /*virtual*/S32 getWidth(S32 discard_level = -1) const; + /*virtual*/S32 getHeight(S32 discard_level = -1) const; + + BOOL hasGLTexture() const ; + LLGLuint getTexName() const ; + BOOL createGLTexture() ; + BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, S32 category = LLViewerTexture::OTHER); + virtual void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ; + + void setFilteringOption(LLTexUnit::eTextureFilterOptions option); + void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE); + void setAddressMode(LLTexUnit::eTextureAddressMode mode); + BOOL setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height, bool fast_update = false); + BOOL setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height, bool fast_update = false); + void setGLTextureCreated (bool initialized); + void setCategory(S32 category) ; + + LLTexUnit::eTextureAddressMode getAddressMode(void) const ; + S32 getMaxDiscardLevel() const; + S32 getDiscardLevel() const; + S8 getComponents() const ; + BOOL getBoundRecently() const; + S32 getTextureMemory() const ; + LLGLenum getPrimaryFormat() const; + BOOL getIsAlphaMask() const ; + LLTexUnit::eTextureType getTarget(void) const ; + BOOL getMask(const LLVector2 &tc); + F32 getTimePassedSinceLastBound(); + BOOL getMissed() const ; + BOOL isJustBound()const ; + void forceUpdateBindStats(void) const; + + /*U32 getTexelsInAtlas() const ; + U32 getTexelsInGLTexture() const ; + BOOL isGLTextureCreated() const ; + S32 getDiscardLevelInAtlas() const ;*/ + //--------------------------------------------------------------------------------------------- + //end of functions to access LLImageGL + //--------------------------------------------------------------------------------------------- + + //----------------- + /*virtual*/ void setActive() ; + void forceActive() ; + void setNoDelete() ; + void dontDiscard() { mDontDiscard = 1; mTextureState = NO_DELETE; } + BOOL getDontDiscard() const { return mDontDiscard; } + //----------------- + + BOOL isLargeImage() ; + + void setParcelMedia(LLViewerMediaTexture* media) {mParcelMedia = media;} + BOOL hasParcelMedia() const { return mParcelMedia != NULL;} + LLViewerMediaTexture* getParcelMedia() const { return mParcelMedia;} + + /*virtual*/ void updateBindStatsForTester() ; +protected: + void cleanup() ; + void init(bool firstinit) ; + void reorganizeFaceList() ; + void reorganizeVolumeList() ; + void setTexelsPerImage(); +private: + //note: do not make this function public. + /*virtual*/ LLImageGL* getGLTexture() const ; + virtual void switchToCachedImage(); + +protected: + LLUUID mID; + S32 mBoostLevel; // enum describing priority level + S32 mFullWidth; + S32 mFullHeight; + BOOL mUseMipMaps ; + S8 mComponents; + F32 mTexelsPerImage; // Texels per image. + mutable S8 mNeedsGLTexture; + mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need? + mutable S32 mMaxVirtualSizeResetCounter ; + mutable S32 mMaxVirtualSizeResetInterval; + mutable F32 mAdditionalDecodePriority; // priority add to mDecodePriority. + LLFrameTimer mLastReferencedTimer; + + //GL texture + LLPointer mGLTexturep ; + S8 mDontDiscard; // Keep full res version of this image (for UI, etc) + + ll_face_list_t mFaceList ; //reverse pointer pointing to the faces using this image as texture + U32 mNumFaces ; + LLFrameTimer mLastFaceListUpdateTimer ; + + ll_volume_list_t mVolumeList; + U32 mNumVolumes; + LLFrameTimer mLastVolumeListUpdateTimer; + + //do not use LLPointer here. + LLViewerMediaTexture* mParcelMedia ; + +protected: + typedef enum + { + DELETED = 0, //removed from memory + DELETION_CANDIDATE, //ready to be removed from memory + INACTIVE, //not be used for the last certain period (i.e., 30 seconds). + ACTIVE, //just being used, can become inactive if not being used for a certain time (10 seconds). + NO_DELETE = 99 //stay in memory, can not be removed. + } LLGLTextureState; + LLGLTextureState mTextureState ; + +public: + static const U32 sCurrentFileVersion; + static S32 sImageCount; + static S32 sRawCount; + static S32 sAuxCount; + static LLFrameTimer sEvaluationTimer; + static F32 sDesiredDiscardBias; + static F32 sDesiredDiscardScale; + static S32 sBoundTextureMemoryInBytes; + static S32 sTotalTextureMemoryInBytes; + static S32 sMaxBoundTextureMemInMegaBytes; + static S32 sMaxTotalTextureMemInMegaBytes; + static S32 sMaxDesiredTextureMemInBytes ; + static S8 sCameraMovingDiscardBias; + static S32 sMaxSculptRez ; + static S32 sMinLargeImageSize ; + static S32 sMaxSmallImageSize ; + static BOOL sFreezeImageScalingDown ;//do not scale down image res if set. + static F32 sCurrentTime ; + //static BOOL sUseTextureAtlas ; + static BOOL sDontLoadVolumeTextures ; + + static LLPointer sNullImagep; // Null texture for non-textured objects. +}; + + +// +//textures are managed in gTextureList. +//raw image data is fetched from remote or local cache +//but the raw image this texture pointing to is fixed. +// +class LLViewerFetchedTexture : public LLViewerTexture +{ + friend class LLTextureBar; // debug info only + friend class LLTextureView; // debug info only + +protected: + /*virtual*/ ~LLViewerFetchedTexture(); +public: + LLViewerFetchedTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); + LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemipmaps); + LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE); + +public: + static F32 maxDecodePriority(); + + struct Compare + { + // lhs < rhs + bool operator()(const LLPointer &lhs, const LLPointer &rhs) const + { + const LLViewerFetchedTexture* lhsp = (const LLViewerFetchedTexture*)lhs; + const LLViewerFetchedTexture* rhsp = (const LLViewerFetchedTexture*)rhs; + // greater priority is "less" + const F32 lpriority = lhsp->getDecodePriority(); + const F32 rpriority = rhsp->getDecodePriority(); + if (lpriority > rpriority) // higher priority + return true; + if (lpriority < rpriority) + return false; + return lhsp < rhsp; + } + }; + +public: + /*virtual*/ S8 getType() const ; + /*virtual*/ void forceImmediateUpdate() ; + /*virtual*/ void dump() ; + + // Set callbacks to get called when the image gets updated with higher + // resolution versions. + void setLoadedCallback(loaded_callback_func cb, + S32 discard_level, BOOL keep_imageraw, BOOL needs_aux, + void* userdata, LLLoadedCallbackEntry::source_callback_list_t* src_callback_list, BOOL pause = FALSE); + bool hasCallbacks() { return mLoadedCallbackList.empty() ? false : true; } + void pauseLoadedCallbacks(const LLLoadedCallbackEntry::source_callback_list_t* callback_list); + void unpauseLoadedCallbacks(const LLLoadedCallbackEntry::source_callback_list_t* callback_list); + bool doLoadedCallbacks(); + void deleteCallbackEntry(const LLLoadedCallbackEntry::source_callback_list_t* callback_list); + void clearCallbackEntryList() ; + + void addToCreateTexture(); + + // ONLY call from LLViewerTextureList + BOOL createTexture(S32 usename = 0); + void destroyTexture() ; + + virtual void processTextureStats() ; + F32 calcDecodePriority() ; + + BOOL needsAux() const { return mNeedsAux; } + + // Host we think might have this image, used for baked av textures. + void setTargetHost(LLHost host) { mTargetHost = host; } + LLHost getTargetHost() const { return mTargetHost; } + + // Set the decode priority for this image... + // DON'T CALL THIS UNLESS YOU KNOW WHAT YOU'RE DOING, it can mess up + // the priority list, and cause horrible things to happen. + void setDecodePriority(F32 priority = -1.0f); + F32 getDecodePriority() const { return mDecodePriority; }; + + void setAdditionalDecodePriority(F32 priority) ; + + void updateVirtualSize() ; + + S32 getDesiredDiscardLevel() { return mDesiredDiscardLevel; } + void setMinDiscardLevel(S32 discard) { mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel,(S8)discard); } + + bool updateFetch(); + + // Override the computation of discard levels if we know the exact output + // size of the image. Used for UI textures to not decode, even if we have + // more data. + /*virtual*/ void setKnownDrawSize(S32 width, S32 height); + + void setIsMissingAsset(); + /*virtual*/ BOOL isMissingAsset() const { return mIsMissingAsset; } + + // returns dimensions of original image for local files (before power of two scaling) + // and returns 0 for all asset system images + S32 getOriginalWidth() { return mOrigWidth; } + S32 getOriginalHeight() { return mOrigHeight; } + + BOOL isInImageList() const {return mInImageList ;} + void setInImageList(BOOL flag) {mInImageList = flag ;} + + LLFrameTimer* getLastPacketTimer() {return &mLastPacketTimer;} + + U32 getFetchPriority() const { return mFetchPriority ;} + F32 getDownloadProgress() const {return mDownloadProgress ;} + + LLImageRaw* reloadRawImage(S8 discard_level) ; + void destroyRawImage(); + bool needsToSaveRawImage(); + + const std::string& getUrl() const {return mUrl;} + //--------------- + BOOL isDeleted() ; + BOOL isInactive() ; + BOOL isDeletionCandidate(); + void setDeletionCandidate() ; + void setInactive() ; + BOOL getUseDiscard() const { return mUseMipMaps && !mDontDiscard; } + //--------------- + + void setForSculpt(); + BOOL forSculpt() const {return mForSculpt;} + BOOL isForSculptOnly() const; + + //raw image management + void checkCachedRawSculptImage() ; + LLImageRaw* getRawImage()const { return mRawImage ;} + S32 getRawImageLevel() const {return mRawDiscardLevel;} + LLImageRaw* getCachedRawImage() const { return mCachedRawImage ;} + S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;} + BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;} + BOOL isRawImageValid()const { return mIsRawImageValid ; } + void forceToSaveRawImage(S32 desired_discard = 0) ; + /*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ; + void destroySavedRawImage() ; + LLImageRaw* getSavedRawImage() ; + BOOL hasSavedRawImage() const ; + F32 getElapsedLastReferencedSavedRawImageTime() const ; + BOOL isFullyLoaded() const; + + BOOL hasFetcher() const { return mHasFetcher;} + void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;} + +protected: + /*virtual*/ void switchToCachedImage(); + S32 getCurrentDiscardLevelForFetching() ; + +private: + void init(bool firstinit) ; + void cleanup() ; + + void saveRawImage() ; + void setCachedRawImage() ; + void setCachedRawImagePtr(LLImageRaw *pRawImage) ; + + //for atlas + /*void resetFaceAtlas() ; + void invalidateAtlas(BOOL rebuild_geom) ; + BOOL insertToAtlas() ;*/ + +private: + BOOL mFullyLoaded; + +protected: + std::string mLocalFileName; + + S32 mOrigWidth; + S32 mOrigHeight; + + // Override the computation of discard levels if we know the exact output size of the image. + // Used for UI textures to not decode, even if we have more data. + S32 mKnownDrawWidth; + S32 mKnownDrawHeight; + BOOL mKnownDrawSizeChanged ; + std::string mUrl; + + S32 mRequestedDiscardLevel; + F32 mRequestedDownloadPriority; + S32 mFetchState; + U32 mFetchPriority; + F32 mDownloadProgress; + F32 mFetchDeltaTime; + F32 mRequestDeltaTime; + F32 mDecodePriority; // The priority for decoding this image. + S32 mMinDiscardLevel; + S8 mDesiredDiscardLevel; // The discard level we'd LIKE to have - if we have it and there's space + S8 mMinDesiredDiscardLevel; // The minimum discard level we'd like to have + + S8 mNeedsAux; // We need to decode the auxiliary channels + S8 mDecodingAux; // Are we decoding high components + S8 mIsRawImageValid; + S8 mHasFetcher; // We've made a fecth request + S8 mIsFetching; // Fetch request is active + bool mCanUseHTTP ; //This texture can be fetched through http if true. + + mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database. + + typedef std::list callback_list_t; + S8 mLoadedCallbackDesiredDiscardLevel; + BOOL mPauseLoadedCallBacks; + callback_list_t mLoadedCallbackList; + F32 mLastCallBackActiveTime; + + LLPointer mRawImage; + S32 mRawDiscardLevel; + + // Used ONLY for cloth meshes right now. Make SURE you know what you're + // doing if you use it for anything else! - djs + LLPointer mAuxRawImage; + + //keep a copy of mRawImage for some special purposes + //when mForceToSaveRawImage is set. + BOOL mForceToSaveRawImage ; + BOOL mSaveRawImage; + LLPointer mSavedRawImage; + S32 mSavedRawDiscardLevel; + S32 mDesiredSavedRawDiscardLevel; + F32 mLastReferencedSavedRawImageTime ; + + //a small version of the copy of the raw image (<= 64 * 64) + LLPointer mCachedRawImage; + S32 mCachedRawDiscardLevel; + BOOL mCachedRawImageReady; //the rez of the mCachedRawImage reaches the upper limit. + + LLHost mTargetHost; // if LLHost::invalid, just request from agent's simulator + + // Timers + LLFrameTimer mLastPacketTimer; // Time since last packet. + LLFrameTimer mStopFetchingTimer; // Time since mDecodePriority == 0.f. + + BOOL mInImageList; // TRUE if image is in list (in which case don't reset priority!) + BOOL mNeedsCreateTexture; + + BOOL mForSculpt ; //a flag if the texture is used as sculpt data. + BOOL mIsFetched ; //is loaded from remote or from cache, not generated locally. + +public: + static LLPointer sMissingAssetImagep; // Texture to show for an image asset that is not in the database + static LLPointer sWhiteImagep; // Texture to show NOTHING (whiteness) + static LLPointer sDefaultImagep; // "Default" texture for error cases, the only case of fetched texture which is generated in local. + static LLPointer sSmokeImagep; // Old "Default" translucent texture +}; + +// +//the image data is fetched from remote or from local cache +//the resolution of the texture is adjustable: depends on the view-dependent parameters. +// +class LLViewerLODTexture : public LLViewerFetchedTexture +{ +protected: + /*virtual*/ ~LLViewerLODTexture(){} + +public: + LLViewerLODTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); + LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE); + + /*virtual*/ S8 getType() const; + // Process image stats to determine priority/quality requirements. + /*virtual*/ void processTextureStats(); + BOOL isUpdateFrozen() ; + +private: + void init(bool firstinit) ; + void scaleDown() ; + +private: + F32 mDiscardVirtualSize; // Virtual size used to calculate desired discard + F32 mCalculatedDiscardLevel; // Last calculated discard level +}; + +// +//the image data is fetched from the media pipeline periodically +//the resolution of the texture is also adjusted by the media pipeline +// +class LLViewerMediaTexture : public LLViewerTexture +{ +#if NEW_MEDIA_TEXTURE +protected: + *virtual*/ ~LLViewerMediaTexture() ; + +public: + LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps = TRUE, LLImageGL* gl_image = NULL) ; + + /*virtual*/* S8 getType() const; +#endif +public: + void reinit(BOOL usemipmaps = TRUE); + + BOOL getUseMipMaps() {return mUseMipMaps ; } + void setUseMipMaps(BOOL mipmap) ; + +#if NEW_MEDIA_TEXTURE + void setPlaying(BOOL playing) ; + BOOL isPlaying() const {return mIsPlaying;} + void setMediaImpl() ; + + void initVirtualSize() ; + void invalidateMediaImpl() ; + + void addMediaToFace(LLFace* facep) ; + void removeMediaFromFace(LLFace* facep) ;*/ + + /*virtual*/ void addFace(LLFace* facep) ; + /*virtual*/ void removeFace(LLFace* facep) ; + + /*virtual*/ F32 getMaxVirtualSize() ; +private: + void switchTexture(LLFace* facep) ; + BOOL findFaces() ; + void stopPlaying() ; + +private: + // + //an instant list, recording all faces referencing or can reference to this media texture. + //NOTE: it is NOT thread safe. + // + std::list< LLFace* > mMediaFaceList ; + + //an instant list keeping all textures which are replaced by the current media texture, + //is only used to avoid the removal of those textures from memory. + std::list< LLPointer > mTextureList ; + + LLViewerMediaImpl* mMediaImplp ; + BOOL mIsPlaying ; + U32 mUpdateVirtualSizeTime ; + +public: + static void updateClass() ; + static void cleanUpClass() ; + + static LLViewerMediaTexture* findMediaTexture(const LLUUID& media_id) ; + static void removeMediaImplFromTexture(const LLUUID& media_id) ; + +private: + typedef std::map< LLUUID, LLPointer > media_map_t ; + static media_map_t sMediaMap ; +#endif +}; + +//just an interface class, do not create instance from this class. +class LLViewerTextureManager +{ +private: + //make the constructor private to preclude creating instances from this class. + LLViewerTextureManager(){} + +public: + //texture pipeline tester + //static LLTexturePipelineTester* sTesterp ; + + //returns NULL if tex is not a LLViewerFetchedTexture nor derived from LLViewerFetchedTexture. + static LLViewerFetchedTexture* staticCastToFetchedTexture(LLTexture* tex, BOOL report_error = FALSE) ; + + // + //"find-texture" just check if the texture exists, if yes, return it, otherwise return null. + // + static LLViewerTexture* findTexture(const LLUUID& id) ; +#if NEW_MEDIA_TEXTURE + static LLViewerMediaTexture* findMediaTexture(const LLUUID& id) ; + + static LLViewerMediaTexture* createMediaTexture(const LLUUID& id, BOOL usemipmaps = TRUE, LLImageGL* gl_image = NULL) ; + + // + //"get-texture" will create a new texture if the texture does not exist. + // + static LLViewerMediaTexture* getMediaTexture(const LLUUID& id, BOOL usemipmaps = TRUE, LLImageGL* gl_image = NULL) ; +#endif + + static LLPointer getLocalTexture(BOOL usemipmaps = TRUE, BOOL generate_gl_tex = TRUE); + static LLPointer getLocalTexture(const LLUUID& id, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) ; + static LLPointer getLocalTexture(const LLImageRaw* raw, BOOL usemipmaps) ; + static LLPointer getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) ; + + static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id, + BOOL usemipmap = TRUE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + LLHost request_from_host = LLHost() + ); + + static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename, + BOOL usemipmap = TRUE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + const LLUUID& force_id = LLUUID::null + ); + + static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url, + BOOL usemipmap = TRUE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + const LLUUID& force_id = LLUUID::null + ); + + static LLViewerFetchedTexture* getFetchedTextureFromHost(const LLUUID& image_id, LLHost host) ; + + static void init() ; + static void cleanup() ; +}; +// +//this class is used for test/debug only +//it tracks the activities of the texture pipeline +//records them, and outputs them to log files +// +#if 0 +class LLTexturePipelineTester : public LLMetricPerformanceTesterWithSession +{ + enum + { + MIN_LARGE_IMAGE_AREA = 262144 //512 * 512 + }; +public: + LLTexturePipelineTester() ; + ~LLTexturePipelineTester() ; + + void update(); + void updateTextureBindingStats(const LLViewerTexture* imagep) ; + void updateTextureLoadingStats(const LLViewerFetchedTexture* imagep, const LLImageRaw* raw_imagep, BOOL from_cache) ; + void updateGrayTextureBinding() ; + void setStablizingTime() ; + +private: + void reset() ; + void updateStablizingTime() ; + + /*virtual*/ void outputTestRecord(LLSD* sd) ; + +private: + BOOL mPause ; +private: + BOOL mUsingDefaultTexture; //if set, some textures are still gray. + + U32 mTotalBytesUsed ; //total bytes of textures bound/used for the current frame. + U32 mTotalBytesUsedForLargeImage ; //total bytes of textures bound/used for the current frame for images larger than 256 * 256. + U32 mLastTotalBytesUsed ; //total bytes of textures bound/used for the previous frame. + U32 mLastTotalBytesUsedForLargeImage ; //total bytes of textures bound/used for the previous frame for images larger than 256 * 256. + + // + //data size + // + U32 mTotalBytesLoaded ; //total bytes fetched by texture pipeline + U32 mTotalBytesLoadedFromCache ; //total bytes fetched by texture pipeline from local cache + U32 mTotalBytesLoadedForLargeImage ; //total bytes fetched by texture pipeline for images larger than 256 * 256. + U32 mTotalBytesLoadedForSculpties ; //total bytes fetched by texture pipeline for sculpties + + // + //time + //NOTE: the error tolerances of the following timers is one frame time. + // + F32 mStartFetchingTime ; + F32 mTotalGrayTime ; //total loading time when no gray textures. + F32 mTotalStablizingTime ; //total stablizing time when texture memory overflows + F32 mStartTimeLoadingSculpties ; //the start moment of loading sculpty images. + F32 mEndTimeLoadingSculpties ; //the end moment of loading sculpty images. + F32 mStartStablizingTime ; + F32 mEndStablizingTime ; + +private: + // + //The following members are used for performance analyzing + // + class LLTextureTestSession : public LLTestSession + { + public: + LLTextureTestSession() ; + /*virtual*/ ~LLTextureTestSession() ; + + void reset() ; + + F32 mTotalFetchingTime ; + F32 mTotalGrayTime ; + F32 mTotalStablizingTime ; + F32 mStartTimeLoadingSculpties ; + F32 mTotalTimeLoadingSculpties ; + + S32 mTotalBytesLoaded ; + S32 mTotalBytesLoadedFromCache ; + S32 mTotalBytesLoadedForLargeImage ; + S32 mTotalBytesLoadedForSculpties ; + + typedef struct _texture_instant_preformance_t + { + S32 mAverageBytesUsedPerSecond ; + S32 mAverageBytesUsedForLargeImagePerSecond ; + F32 mAveragePercentageBytesUsedPerSecond ; + F32 mTime ; + }texture_instant_preformance_t ; + std::vector mInstantPerformanceList ; + S32 mInstantPerformanceListCounter ; + }; + + /*virtual*/ LLMetricPerformanceTester::LLTestSession* loadTestSession(LLSD* log) ; + /*virtual*/ void compareTestSessions(std::ofstream* os) ; +}; +#endif //0 +#endif diff --git a/indra/newview/llviewerimagelist.cpp b/indra/newview/llviewertexturelist.cpp similarity index 63% rename from indra/newview/llviewerimagelist.cpp rename to indra/newview/llviewertexturelist.cpp index 10cbdfdc9..f7562ecec 100644 --- a/indra/newview/llviewerimagelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1,10 +1,10 @@ /** - * @file llviewerimagelist.cpp + * @file llviewertexturelist.cpp * @brief Object for managing the list of images within a region * * $LicenseInfo:firstyear=2000&license=viewergpl$ * - * Copyright (c) 2000-2009, Linden Research, Inc. + * Copyright (c) 2000-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -12,13 +12,13 @@ * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * online at http://secondlife.com/developers/opensource/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * http://secondlife.com/developers/opensource/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -28,11 +28,14 @@ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ + * */ #include "llviewerprecompiledheaders.h" -#include "llviewerimagelist.h" +#include + +#include "llviewertexturelist.h" #include "imageids.h" #include "llgl.h" // fot gathering stats from GL @@ -52,39 +55,35 @@ #include "llxmltree.h" #include "message.h" -#include "llagent.h" #include "lltexturecache.h" #include "lltexturefetch.h" #include "llviewercontrol.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llviewermedia.h" #include "llviewerregion.h" #include "llviewerstats.h" #include "pipeline.h" #include "llappviewer.h" -#include - //////////////////////////////////////////////////////////////////////////// -void (*LLViewerImageList::sUUIDCallback)(void **, const LLUUID&) = NULL; +void (*LLViewerTextureList::sUUIDCallback)(void **, const LLUUID&) = NULL; -U32 LLViewerImageList::sTextureBits = 0; -U32 LLViewerImageList::sTexturePackets = 0; +U32 LLViewerTextureList::sTextureBits = 0; +U32 LLViewerTextureList::sTexturePackets = 0; +S32 LLViewerTextureList::sNumImages = 0; +LLStat LLViewerTextureList::sNumImagesStat(32, TRUE); +LLStat LLViewerTextureList::sNumRawImagesStat(32, TRUE); +LLStat LLViewerTextureList::sGLTexMemStat(32, TRUE); +LLStat LLViewerTextureList::sGLBoundMemStat(32, TRUE); +LLStat LLViewerTextureList::sRawMemStat(32, TRUE); +LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE); -LLViewerImageList gImageList; - -S32 LLViewerImageList::sNumImages = 0; -LLStat LLViewerImageList::sNumImagesStat(32, TRUE); -LLStat LLViewerImageList::sNumRawImagesStat(32, TRUE); -LLStat LLViewerImageList::sGLTexMemStat(32, TRUE); -LLStat LLViewerImageList::sGLBoundMemStat(32, TRUE); -LLStat LLViewerImageList::sRawMemStat(32, TRUE); -LLStat LLViewerImageList::sFormattedMemStat(32, TRUE); +LLViewerTextureList gTextureList; /////////////////////////////////////////////////////////////////////////////// -LLViewerImageList::LLViewerImageList() +LLViewerTextureList::LLViewerTextureList() : mForceResetTextureStats(FALSE), mUpdateStats(FALSE), mMaxResidentTexMemInMegaBytes(0), @@ -92,12 +91,11 @@ LLViewerImageList::LLViewerImageList() { } -void LLViewerImageList::init() +void LLViewerTextureList::init() { sNumImages = 0; mMaxResidentTexMemInMegaBytes = 0; mMaxTotalTextureMemInMegaBytes = 0 ; - if (gNoRender) { // Don't initialize GL stuff if we're not rendering. @@ -113,22 +111,22 @@ void LLViewerImageList::init() } -void LLViewerImageList::doPreloadImages() +void LLViewerTextureList::doPreloadImages() { LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL; // Set the "missing asset" image - LLViewerImage::sMissingAssetImagep = getImageFromFile("missing_asset.tga", MIPMAP_NO, IMMEDIATE_YES); + LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); // Set the "white" image - LLViewerImage::sWhiteImagep = getImageFromFile("white.tga", MIPMAP_NO, IMMEDIATE_YES); + LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); LLUIImageList* image_list = LLUIImageList::getInstance(); image_list->initFromFile(); // turn off clamping and bilinear filtering for uv picking images - //LLViewerImage* uv_test = preloadUIImage("uv_test1.tga", LLUUID::null, FALSE); + //LLViewerFetchedTexture* uv_test = preloadUIImage("uv_test1.tga", LLUUID::null, FALSE); //uv_test->setClamp(FALSE, FALSE); //uv_test->setMipFilterNearest(TRUE, TRUE); //uv_test = preloadUIImage("uv_test2.tga", LLUUID::null, FALSE); @@ -136,33 +134,34 @@ void LLViewerImageList::doPreloadImages() //uv_test->setMipFilterNearest(TRUE, TRUE); // prefetch specific UUIDs - getImage(IMG_SHOT, TRUE); - getImage(IMG_SMOKE_POOF, TRUE); - LLViewerImage* image = getImageFromFile("silhouette.j2c", MIPMAP_YES, IMMEDIATE_YES); + LLViewerTextureManager::getFetchedTexture(IMG_SHOT, TRUE); + LLViewerTextureManager::getFetchedTexture(IMG_SMOKE_POOF, TRUE); + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); mImagePreloads.insert(image); } - image = getImageFromFile("noentrylines.j2c", MIPMAP_YES, IMMEDIATE_YES); + image = LLViewerTextureManager::getFetchedTextureFromFile("noentrylines.j2c"/*"world/NoEntryLines.png"*/, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); mImagePreloads.insert(image); } - image = getImageFromFile("noentrypasslines.j2c", MIPMAP_YES, IMMEDIATE_YES); + image = LLViewerTextureManager::getFetchedTextureFromFile("noentrypasslines.j2c"/*"world/NoEntryPassLines.png"*/, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); mImagePreloads.insert(image); } - image = getImage(DEFAULT_WATER_NORMAL, MIPMAP_YES, IMMEDIATE_YES); + image = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); mImagePreloads.insert(image); } - image = getImageFromFile("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903.j2c", MIPMAP_YES, IMMEDIATE_YES,0,0,LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903")); + image = LLViewerTextureManager::getFetchedTextureFromFile("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903.j2c"/*"transparent.j2c"*/, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, + 0,0,LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903")); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); @@ -173,14 +172,14 @@ void LLViewerImageList::doPreloadImages() static std::string get_texture_list_name() { - BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation"); + //return std::string("texture_list_") + gSavedSettings.getString("LoginLocation") + ".xml"; + bool login_last = gSavedSettings.getBOOL("LoginLastLocation"); return std::string("texture_list_") + (login_last?"last":"home") + ".xml"; } -void LLViewerImageList::doPrefetchImages() +void LLViewerTextureList::doPrefetchImages() { -#if 1 - if (LLAppViewer::instance()->getPurgeCache()) + if (LLAppViewer::instance()->getPurgeCache()) { // cache was purged, no point return; @@ -201,35 +200,39 @@ void LLViewerImageList::doPrefetchImages() LLSD imagesd = *iter; LLUUID uuid = imagesd["uuid"]; S32 pixel_area = imagesd["area"]; - LLViewerImage* image = getImage(uuid, MIPMAP_TRUE, FALSE); - if (image) + S32 texture_type = imagesd["type"]; + + if(LLViewerTexture::FETCHED_TEXTURE == texture_type || LLViewerTexture::LOD_TEXTURE == texture_type) { - image->addTextureStats((F32)pixel_area); + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, texture_type); + if (image) + { + image->addTextureStats((F32)pixel_area); + } } } -#endif - } /////////////////////////////////////////////////////////////////////////////// -LLViewerImageList::~LLViewerImageList() +LLViewerTextureList::~LLViewerTextureList() { } -void LLViewerImageList::shutdown() +void LLViewerTextureList::shutdown() { // clear out preloads mImagePreloads.clear(); // Write out list of currently loaded textures for precaching on startup - typedef std::set > image_area_list_t; + typedef std::set > image_area_list_t; image_area_list_t image_area_list; for (image_priority_list_t::iterator iter = mImageList.begin(); iter != mImageList.end(); ++iter) { - LLViewerImage* image = *iter; - if (!image->getUseDiscard() || + LLViewerFetchedTexture* image = *iter; + if (!image->hasGLTexture() || + !image->getUseDiscard() || image->needsAux() || image->getTargetHost() != LLHost::invalid) { @@ -250,12 +253,15 @@ void LLViewerImageList::shutdown() LLSD imagelist; const S32 max_count = 1000; S32 count = 0; + S32 image_type ; for (image_area_list_t::reverse_iterator riter = image_area_list.rbegin(); riter != image_area_list.rend(); ++riter) { - LLViewerImage* image = riter->second; + LLViewerFetchedTexture* image = riter->second; + image_type = (S32)image->getType() ; imagelist[count]["area"] = riter->first; imagelist[count]["uuid"] = image->getID(); + imagelist[count]["type"] = image_type; if (++count >= max_count) break; } @@ -282,13 +288,13 @@ void LLViewerImageList::shutdown() mImageList.clear(); } -void LLViewerImageList::dump() +void LLViewerTextureList::dump() { - llinfos << "LLViewerImageList::dump()" << llendl; + llinfos << "LLViewerTextureList::dump()" << llendl; for (image_priority_list_t::iterator it = mImageList.begin(); it != mImageList.end(); ++it) { - LLViewerImage* image = *it; - + LLViewerFetchedTexture* image = *it; + llinfos << "priority " << image->getDecodePriority() << " boost " << image->getBoostLevel() << " size " << image->getWidth() << "x" << image->getHeight() @@ -299,12 +305,12 @@ void LLViewerImageList::dump() } } -void LLViewerImageList::destroyGL(BOOL save_state) +void LLViewerTextureList::destroyGL(BOOL save_state) { LLImageGL::destroyGL(save_state); } -void LLViewerImageList::restoreGL() +void LLViewerTextureList::restoreGL() { LLImageGL::restoreGL(); } @@ -318,9 +324,10 @@ void LLViewerImageList::restoreGL() /////////////////////////////////////////////////////////////////////////////// -LLViewerImage* LLViewerImageList::getImageFromFile(const std::string& filename, +LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename, BOOL usemipmaps, - BOOL level_immediate, + LLViewerTexture::EBoostLevel boost_priority, + S8 texture_type, LLGLint internal_format, LLGLenum primary_format, const LLUUID& force_id) @@ -329,17 +336,18 @@ LLViewerImage* LLViewerImageList::getImageFromFile(const std::string& filename, if (full_path.empty()) { llwarns << "Failed to find local image file: " << filename << llendl; - return getImage(IMG_DEFAULT, TRUE, TRUE); + return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); } std::string url = "file://" + full_path; - return getImageFromUrl(url, usemipmaps, level_immediate, internal_format, primary_format, force_id); + return getImageFromUrl(url, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id); } -LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url, +LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url, BOOL usemipmaps, - BOOL level_immediate, + LLViewerTexture::EBoostLevel boost_priority, + S8 texture_type, LLGLint internal_format, LLGLenum primary_format, const LLUUID& force_id) @@ -348,7 +356,7 @@ LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url, { // Never mind that this ignores image_set_id; // getImage() will handle that later. - return getImage(IMG_DEFAULT, TRUE, TRUE); + return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); } // generate UUID based on hash of filename @@ -362,11 +370,21 @@ LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url, new_id.generate(url); } - LLPointer imagep = hasImage(new_id); + LLPointer imagep = findImage(new_id); if (imagep.isNull()) { - imagep = new LLViewerImage(url, new_id, usemipmaps); + switch(texture_type) + { + case LLViewerTexture::FETCHED_TEXTURE: + imagep = new LLViewerFetchedTexture(url, new_id, usemipmaps); + break ; + case LLViewerTexture::LOD_TEXTURE: + imagep = new LLViewerLODTexture(url, new_id, usemipmaps); + break ; + default: + llerrs << "Invalid texture type " << texture_type << llendl ; + } if (internal_format && primary_format) { @@ -375,10 +393,14 @@ LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url, addImage(imagep); - if (level_immediate) + if (boost_priority != 0) { - imagep->dontDiscard(); - imagep->setBoostLevel(LLViewerImageBoostLevel::BOOST_UI); + if (boost_priority == LLViewerFetchedTexture::BOOST_UI || + boost_priority == LLViewerFetchedTexture::BOOST_ICON) + { + imagep->dontDiscard(); + } + imagep->setBoostLevel(boost_priority); } } @@ -388,9 +410,10 @@ LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url, } -LLViewerImage* LLViewerImageList::getImage(const LLUUID &image_id, +LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, BOOL usemipmaps, - BOOL level_immediate, + LLViewerTexture::EBoostLevel boost_priority, + S8 texture_type, LLGLint internal_format, LLGLenum primary_format, LLHost request_from_host) @@ -401,34 +424,14 @@ LLViewerImage* LLViewerImageList::getImage(const LLUUID &image_id, if ((&image_id == NULL) || image_id.isNull()) { - return (getImage(IMG_DEFAULT, TRUE, TRUE)); + return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI)); } - LLPointer imagep = hasImage(image_id); + LLPointer imagep = findImage(image_id); if (imagep.isNull()) { - imagep = new LLViewerImage(image_id, request_from_host, usemipmaps); - - if (internal_format && primary_format) - { - imagep->setExplicitFormat(internal_format, primary_format); - } - - addImage(imagep); - - if (level_immediate) - { - imagep->dontDiscard(); - imagep->setBoostLevel(LLViewerImageBoostLevel::BOOST_UI); - } - else - { - //by default, the texure can not be removed from memory even if it is not used. - //here turn this off - //if this texture should be set to NO_DELETE, either pass level_immediate == TRUE here, or call setNoDelete() afterwards. - imagep->forceActive() ; - } + imagep = createImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ; } imagep->setGLTextureCreated(true); @@ -436,7 +439,56 @@ LLViewerImage* LLViewerImageList::getImage(const LLUUID &image_id, return imagep; } -LLViewerImage *LLViewerImageList::hasImage(const LLUUID &image_id) +//when this function is called, there is no such texture in the gTextureList with image_id. +LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, + BOOL usemipmaps, + LLViewerTexture::EBoostLevel boost_priority, + S8 texture_type, + LLGLint internal_format, + LLGLenum primary_format, + LLHost request_from_host) +{ + LLPointer imagep ; + switch(texture_type) + { + case LLViewerTexture::FETCHED_TEXTURE: + imagep = new LLViewerFetchedTexture(image_id, request_from_host, usemipmaps); + break ; + case LLViewerTexture::LOD_TEXTURE: + imagep = new LLViewerLODTexture(image_id, request_from_host, usemipmaps); + break ; + default: + llerrs << "Invalid texture type " << texture_type << llendl ; + } + + if (internal_format && primary_format) + { + imagep->setExplicitFormat(internal_format, primary_format); + } + + addImage(imagep); + + if (boost_priority != 0) + { + if (boost_priority == LLViewerFetchedTexture::BOOST_UI || + boost_priority == LLViewerFetchedTexture::BOOST_ICON) + { + imagep->dontDiscard(); + } + imagep->setBoostLevel(boost_priority); + } + else + { + //by default, the texture can not be removed from memory even if it is not used. + //here turn this off + //if this texture should be set to NO_DELETE, call setNoDelete() afterwards. + imagep->forceActive() ; + } + + return imagep ; +} + +LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id) { uuid_map_t::iterator iter = mUUIDMap.find(image_id); if(iter == mUUIDMap.end()) @@ -444,21 +496,25 @@ LLViewerImage *LLViewerImageList::hasImage(const LLUUID &image_id) return iter->second; } -void LLViewerImageList::addImageToList(LLViewerImage *image) +void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) { llassert(image); - if (image->mInImageList) + if (image->isInImageList()) { - llerrs << "LLViewerImageList::addImageToList - Image already in list" << llendl; + llerrs << "LLViewerTextureList::addImageToList - Image already in list" << llendl; } - llverify((mImageList.insert(image)).second == true); - image->mInImageList = TRUE; + if((mImageList.insert(image)).second != true) + { + llerrs << "Error happens when insert image to mImageList!" << llendl ; + } + + image->setInImageList(TRUE) ; } -void LLViewerImageList::removeImageFromList(LLViewerImage *image) +void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image) { llassert(image); - if (!image->mInImageList) + if (!image->isInImageList()) { llinfos << "RefCount: " << image->getNumRefs() << llendl ; uuid_map_t::iterator iter = mUUIDMap.find(image->getID()); @@ -466,13 +522,17 @@ void LLViewerImageList::removeImageFromList(LLViewerImage *image) { llinfos << "Image is not in mUUIDMap!" << llendl ; } - llerrs << "LLViewerImageList::removeImageFromList - Image not in list" << llendl; + llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl; } - llverify(mImageList.erase(image) == 1); - image->mInImageList = FALSE; + if(mImageList.erase(image) != 1) + { + llerrs << "Error happens when remove image from mImageList!" << llendl ; + } + + image->setInImageList(FALSE) ; } -void LLViewerImageList::addImage(LLViewerImage *new_image) +void LLViewerTextureList::addImage(LLViewerFetchedTexture *new_image) { if (!new_image) { @@ -481,7 +541,7 @@ void LLViewerImageList::addImage(LLViewerImage *new_image) } LLUUID image_id = new_image->getID(); - LLViewerImage *image = hasImage(image_id); + LLViewerFetchedTexture *image = findImage(image_id); if (image) { llwarns << "Image with ID " << image_id << " already in list" << llendl; @@ -493,13 +553,13 @@ void LLViewerImageList::addImage(LLViewerImage *new_image) } -void LLViewerImageList::deleteImage(LLViewerImage *image) +void LLViewerTextureList::deleteImage(LLViewerFetchedTexture *image) { if( image) { if (image->hasCallbacks()) { - mCallbackList.erase((LLViewerImage*)image); + mCallbackList.erase(image); } llverify(mUUIDMap.erase(image->getID()) == 1); @@ -513,16 +573,16 @@ void LLViewerImageList::deleteImage(LLViewerImage *image) //////////////////////////////////////////////////////////////////////////// -void LLViewerImageList::dirtyImage(LLViewerImage *image) +void LLViewerTextureList::dirtyImage(LLViewerFetchedTexture *image) { mDirtyTextureList.insert(image); } //////////////////////////////////////////////////////////////////////////// +//static LLFastTimer::DeclareTimer FTM_IMAGE_MARK_DIRTY("Dirty Images"); -void LLViewerImageList::updateImages(F32 max_time) +void LLViewerTextureList::updateImages(F32 max_time) { - llpushcallstacks ; LLAppViewer::getTextureFetch()->setTextureBandwidth(LLViewerStats::getInstance()->mTextureKBitStat.getMeanPerSec()); sNumImagesStat.addValue(sNumImages); @@ -531,20 +591,14 @@ void LLViewerImageList::updateImages(F32 max_time) sGLBoundMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageGL::sBoundTextureMemoryInBytes)); sRawMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageRaw::sGlobalRawMemory)); sFormattedMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageFormatted::sGlobalFormattedMemory)); - - llpushcallstacks ; - + updateImagesDecodePriorities(); - llpushcallstacks ; F32 total_max_time = max_time; max_time -= updateImagesFetchTextures(max_time); - - llpushcallstacks ; - max_time = llmax(max_time, total_max_time*.25f); // at least 25% of max_time - max_time -= updateImagesCreateTextures(max_time); - llpushcallstacks ; + max_time = llmax(max_time, total_max_time*.50f); // at least 50% of max_time + max_time -= updateImagesCreateTextures(max_time); if (!mDirtyTextureList.empty()) { @@ -552,14 +606,13 @@ void LLViewerImageList::updateImages(F32 max_time) gPipeline.dirtyPoolObjectTextures(mDirtyTextureList); mDirtyTextureList.clear(); } - llpushcallstacks ; bool didone = false; for (image_list_t::iterator iter = mCallbackList.begin(); iter != mCallbackList.end(); ) { //trigger loaded callbacks on local textures immediately - LLViewerImage* image = *iter++; - if (!image->mUrl.empty()) + LLViewerFetchedTexture* image = *iter++; + if (!image->getUrl().empty()) { // Do stuff to handle callbacks, update priorities, etc. didone = image->doLoadedCallbacks(); @@ -570,17 +623,15 @@ void LLViewerImageList::updateImages(F32 max_time) didone = image->doLoadedCallbacks(); } } - llpushcallstacks ; + //Required for old media system if (!gNoRender && !gGLManager.mIsDisabled) { LLViewerMedia::updateMedia(); } - llpushcallstacks ; updateImagesUpdateStats(); - llpushcallstacks ; } -void LLViewerImageList::updateImagesDecodePriorities() +void LLViewerTextureList::updateImagesDecodePriorities() { // Update the decode priority for N images each frame { @@ -594,7 +645,7 @@ void LLViewerImageList::updateImagesDecodePriorities() iter = mUUIDMap.begin(); } mLastUpdateUUID = iter->first; - LLPointer imagep = iter->second; + LLPointer imagep = iter->second; ++iter; // safe to incrament now // @@ -610,7 +661,7 @@ void LLViewerImageList::updateImagesDecodePriorities() S32 num_refs = imagep->getNumRefs(); if (num_refs == min_refs) { - if (imagep->mLastReferencedTimer.getElapsedTimeF32() > LAZY_FLUSH_TIMEOUT) + if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > LAZY_FLUSH_TIMEOUT) { // Remove the unused image from the image list deleteImage(imagep); @@ -620,6 +671,14 @@ void LLViewerImageList::updateImagesDecodePriorities() } else { + if(imagep->hasSavedRawImage()) + { + if(imagep->getElapsedLastReferencedSavedRawImageTime() > MAX_INACTIVE_TIME) + { + imagep->destroySavedRawImage() ; + } + } + if(imagep->isDeleted()) { continue ; @@ -631,7 +690,7 @@ void LLViewerImageList::updateImagesDecodePriorities() } else if(imagep->isInactive()) { - if (imagep->mLastReferencedTimer.getElapsedTimeF32() > MAX_INACTIVE_TIME) + if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > MAX_INACTIVE_TIME) { imagep->setDeletionCandidate() ; } @@ -639,13 +698,13 @@ void LLViewerImageList::updateImagesDecodePriorities() } else { - imagep->mLastReferencedTimer.reset(); + imagep->getLastReferencedTimer()->reset(); //reset texture state. imagep->setInactive() ; } } - + imagep->processTextureStats(); F32 old_priority = imagep->getDecodePriority(); F32 old_priority_test = llmax(old_priority, 0.0f); @@ -665,7 +724,7 @@ void LLViewerImageList::updateImagesDecodePriorities() } /* - static U8 get_image_type(LLViewerImage* imagep, LLHost target_host) + static U8 get_image_type(LLViewerFetchedTexture* imagep, LLHost target_host) { // Having a target host implies this is a baked image. I don't // believe that boost level has been set at this point. JC @@ -673,8 +732,8 @@ void LLViewerImageList::updateImagesDecodePriorities() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL); S32 boost_level = imagep->getBoostLevel(); - U8 type_from_boost = ( (boost_level == LLViewerImage::BOOST_AVATAR_BAKED - || boost_level == LLViewerImage::BOOST_AVATAR_BAKED_SELF) + U8 type_from_boost = ( (boost_level == LLViewerFetchedTexture::BOOST_AVATAR_BAKED + || boost_level == LLViewerFetchedTexture::BOOST_AVATAR_BAKED_SELF) ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL); if (type_from_host == LLImageBase::TYPE_NORMAL @@ -690,8 +749,9 @@ void LLViewerImageList::updateImagesDecodePriorities() return type_from_host; } */ +//static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create Images"); -F32 LLViewerImageList::updateImagesCreateTextures(F32 max_time) +F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time) { if (gNoRender || gGLManager.mIsDisabled) return 0.0f; @@ -708,7 +768,7 @@ F32 LLViewerImageList::updateImagesCreateTextures(F32 max_time) { image_list_t::iterator curiter = iter++; enditer = iter; - LLViewerImage *imagep = *curiter; + LLViewerFetchedTexture *imagep = *curiter; imagep->createTexture(); if (create_timer.getElapsedTimeF32() > max_time) { @@ -719,32 +779,27 @@ F32 LLViewerImageList::updateImagesCreateTextures(F32 max_time) return create_timer.getElapsedTimeF32(); } -void LLViewerImageList::bumpToMaxDecodePriority(LLViewerImage* imagep) +void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep) { if(!imagep) { return ; } - if(imagep->mInImageList) + if(imagep->isInImageList()) { - if (imagep->getDecodePriority() == LLViewerImage::maxDecodePriority()) - { - // Already at maximum. - return; - } removeImageFromList(imagep); } imagep->processTextureStats(); - F32 decode_priority = LLViewerImage::maxDecodePriority() ; + F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ; imagep->setDecodePriority(decode_priority); mImageList.insert(imagep); - imagep->mInImageList = TRUE; + imagep->setInImageList(TRUE) ; return ; } -F32 LLViewerImageList::updateImagesFetchTextures(F32 max_time) +F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time) { LLTimer image_op_timer; @@ -754,20 +809,21 @@ F32 LLViewerImageList::updateImagesFetchTextures(F32 max_time) const size_t max_update_count = llmin((S32) (1024*10.f*gFrameIntervalSeconds)+1, 256); // 32 high priority entries - typedef std::vector entries_list_t; + typedef std::vector entries_list_t; entries_list_t entries; size_t update_counter = llmin(max_priority_count, mImageList.size()); image_priority_list_t::iterator iter1 = mImageList.begin(); while(update_counter > 0) { entries.push_back(*iter1); + ++iter1; update_counter--; } // 256 cycled entries - update_counter = llmin(max_update_count, mUUIDMap.size()); - if (update_counter > 0) + update_counter = llmin(max_update_count, mUUIDMap.size()); + if(update_counter > 0) { uuid_map_t::iterator iter2 = mUUIDMap.upper_bound(mLastFetchUUID); uuid_map_t::iterator iter2p = iter2; @@ -781,6 +837,7 @@ F32 LLViewerImageList::updateImagesFetchTextures(F32 max_time) iter2p = iter2++; update_counter--; } + mLastFetchUUID = iter2p->first; } @@ -789,7 +846,7 @@ F32 LLViewerImageList::updateImagesFetchTextures(F32 max_time) for (entries_list_t::iterator iter3 = entries.begin(); iter3 != entries.end(); ) { - LLPointer imagep = *iter3++; + LLPointer imagep = *iter3++; bool fetching = imagep->updateFetch(); if (fetching) @@ -802,27 +859,25 @@ F32 LLViewerImageList::updateImagesFetchTextures(F32 max_time) } min_count--; } - if (fetch_count == 0) - { - gDebugTimers[0].pause(); - } - else - { - gDebugTimers[0].unpause(); - } - - + //if (fetch_count == 0) + //{ + // gDebugTimers[0].pause(); + //} + //else + //{ + // gDebugTimers[0].unpause(); + //} return image_op_timer.getElapsedTimeF32(); } -void LLViewerImageList::updateImagesUpdateStats() +void LLViewerTextureList::updateImagesUpdateStats() { if (mUpdateStats && mForceResetTextureStats) { for (image_priority_list_t::iterator iter = mImageList.begin(); iter != mImageList.end(); ) { - LLViewerImage* imagep = *iter++; + LLViewerFetchedTexture* imagep = *iter++; imagep->resetTextureStats(); } mUpdateStats = FALSE; @@ -830,30 +885,30 @@ void LLViewerImageList::updateImagesUpdateStats() } } -void LLViewerImageList::decodeAllImages(F32 max_time) +void LLViewerTextureList::decodeAllImages(F32 max_time) { LLTimer timer; if(gNoRender) return; // Update texture stats and priorities - std::vector > image_list; + std::vector > image_list; for (image_priority_list_t::iterator iter = mImageList.begin(); iter != mImageList.end(); ) { - LLViewerImage* imagep = *iter++; + LLViewerFetchedTexture* imagep = *iter++; image_list.push_back(imagep); - imagep->mInImageList = FALSE; + imagep->setInImageList(FALSE) ; } mImageList.clear(); - for (std::vector >::iterator iter = image_list.begin(); + for (std::vector >::iterator iter = image_list.begin(); iter != image_list.end(); ++iter) { - LLViewerImage* imagep = *iter; + LLViewerFetchedTexture* imagep = *iter; imagep->processTextureStats(); F32 decode_priority = imagep->calcDecodePriority(); imagep->setDecodePriority(decode_priority); mImageList.insert(imagep); - imagep->mInImageList = TRUE; + imagep->setInImageList(TRUE) ; } image_list.clear(); @@ -861,7 +916,7 @@ void LLViewerImageList::decodeAllImages(F32 max_time) for (image_priority_list_t::iterator iter = mImageList.begin(); iter != mImageList.end(); ) { - LLViewerImage* imagep = *iter++; + LLViewerFetchedTexture* imagep = *iter++; imagep->updateFetch(); } // Run threads @@ -880,7 +935,7 @@ void LLViewerImageList::decodeAllImages(F32 max_time) for (image_priority_list_t::iterator iter = mImageList.begin(); iter != mImageList.end(); ) { - LLViewerImage* imagep = *iter++; + LLViewerFetchedTexture* imagep = *iter++; imagep->updateFetch(); } max_time -= timer.getElapsedTimeF32(); @@ -894,7 +949,7 @@ void LLViewerImageList::decodeAllImages(F32 max_time) } -BOOL LLViewerImageList::createUploadFile(const std::string& filename, +BOOL LLViewerTextureList::createUploadFile(const std::string& filename, const std::string& out_filename, const U8 codec) { @@ -994,9 +1049,9 @@ BOOL LLViewerImageList::createUploadFile(const std::string& filename, } // note: modifies the argument raw_image!!!! -LLPointer LLViewerImageList::convertToUploadFile(LLPointer raw_image) +LLPointer LLViewerTextureList::convertToUploadFile(LLPointer raw_image) { - raw_image->biasedScaleToPowerOfTwo(LLViewerImage::MAX_IMAGE_SIZE_DEFAULT); + raw_image->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); LLPointer compressedImage = new LLImageJ2C(); compressedImage->setRate(0.f); @@ -1008,9 +1063,12 @@ LLPointer LLViewerImageList::convertToUploadFile(LLPointer> 2); } - - if (mMaxTotalTextureMemInMegaBytes > (S32)BYTES_TO_MEGA_BYTES(gSysMemory.getPhysicalMemoryClamped()) - 128) + + //system mem + S32 system_ram = (S32)BYTES_TO_MEGA_BYTES(gSysMemory.getPhysicalMemoryClamped()); // In MB + + //minimum memory reserved for non-texture use. + //if system_raw >= 1GB, reserve at least 512MB for non-texture use; + //otherwise reserve half of the system_ram for non-texture use. + S32 min_non_texture_mem = llmin(system_ram / 2, MIN_MEM_FOR_NON_TEXTURE) ; + + if (mMaxTotalTextureMemInMegaBytes > system_ram - min_non_texture_mem) { - mMaxTotalTextureMemInMegaBytes = (S32)BYTES_TO_MEGA_BYTES(gSysMemory.getPhysicalMemoryClamped()) - 128 ; + mMaxTotalTextureMemInMegaBytes = system_ram - min_non_texture_mem ; } llinfos << "Total Video Memory set to: " << vb_mem << " MB" << llendl; @@ -1105,8 +1171,10 @@ void LLViewerImageList::updateMaxResidentTexMem(S32 mem) /////////////////////////////////////////////////////////////////////////////// // static -void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_data) +void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_data) { + static LLCachedControl log_texture_traffic("LogTextureNetworkTraffic",false) ; + LLFastTimer t(LLFastTimer::FTM_PROCESS_IMAGES); // Receive image header, copy into image object and decompresses @@ -1117,15 +1185,17 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat char ip_string[256]; u32_to_ip_string(msg->getSenderIP(),ip_string); + U32 received_size ; if (msg->getReceiveCompressedSize()) { - gImageList.sTextureBits += msg->getReceiveCompressedSize() * 8; + received_size = msg->getReceiveCompressedSize() ; } else { - gImageList.sTextureBits += msg->getReceiveSize() * 8; + received_size = msg->getReceiveSize() ; } - gImageList.sTexturePackets++; + gTextureList.sTextureBits += received_size * 8; + gTextureList.sTexturePackets++; U8 codec; U16 packets; @@ -1153,13 +1223,18 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat U8 *data = new U8[data_size]; msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); - LLViewerImage *image = gImageList.getImage(id); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (!image) { delete [] data; return; } - image->mLastPacketTimer.reset(); + if(log_texture_traffic) + { + gTotalTextureBytesPerBoostLevel[image->getBoostLevel()] += received_size ; + } + + //image->getLastPacketTimer()->reset(); bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data); if (!res) { @@ -1168,8 +1243,10 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat } // static -void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_data) +void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_data) { + static LLCachedControl log_texture_traffic("LogTextureNetworkTraffic",FALSE) ; + LLMemType mt1(LLMemType::MTYPE_APPFMTIMAGE); LLFastTimer t(LLFastTimer::FTM_PROCESS_IMAGES); @@ -1182,15 +1259,17 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat char ip_string[256]; u32_to_ip_string(msg->getSenderIP(),ip_string); + U32 received_size ; if (msg->getReceiveCompressedSize()) { - gImageList.sTextureBits += msg->getReceiveCompressedSize() * 8; + received_size = msg->getReceiveCompressedSize() ; } else { - gImageList.sTextureBits += msg->getReceiveSize() * 8; + received_size = msg->getReceiveSize() ; } - gImageList.sTexturePackets++; + gTextureList.sTextureBits += received_size * 8; + gTextureList.sTexturePackets++; //llprintline("Start decode, image header..."); msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id); @@ -1217,13 +1296,18 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat U8 *data = new U8[data_size]; msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); - LLViewerImage *image = gImageList.getImage(id); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (!image) { delete [] data; return; } - image->mLastPacketTimer.reset(); + if(log_texture_traffic) + { + gTotalTextureBytesPerBoostLevel[image->getBoostLevel()] += received_size ; + } + + //image->getLastPacketTimer()->reset(); bool res = LLAppViewer::getTextureFetch()->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data); if (!res) { @@ -1234,13 +1318,13 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat // We've been that the asset server does not contain the requested image id. // static -void LLViewerImageList::processImageNotInDatabase(LLMessageSystem *msg,void **user_data) +void LLViewerTextureList::processImageNotInDatabase(LLMessageSystem *msg,void **user_data) { LLFastTimer t(LLFastTimer::FTM_PROCESS_IMAGES); LLUUID image_id; msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, image_id); - LLViewerImage* image = gImageList.hasImage( image_id ); + LLViewerFetchedTexture* image = gTextureList.findImage( image_id ); if( image ) { image->setIsMissingAsset(); @@ -1251,7 +1335,7 @@ void LLViewerImageList::processImageNotInDatabase(LLMessageSystem *msg,void **us //static const U32 SIXTEEN_MEG = 0x1000000; -S32 LLViewerImageList::calcMaxTextureRAM() +S32 LLViewerTextureList::calcMaxTextureRAM() { // Decide the maximum amount of RAM we should allow the user to allocate to texture cache LLMemoryInfo memory_info; @@ -1273,9 +1357,10 @@ S32 LLViewerImageList::calcMaxTextureRAM() void LLUIImageList::cleanUp() { mUIImages.clear(); + mUITextureList.clear() ; } -LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id) +LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority) { // use id as image name std::string image_name = image_id.asString(); @@ -1287,10 +1372,12 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id) return found_it->second; } - return loadUIImageByID(image_id); + const BOOL use_mips = FALSE; + const LLRect scale_rect = LLRect::null; + return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority); } -LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name) +LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority) { // look for existing image uuid_ui_image_map_t::iterator found_it = mUIImages.find(image_name); @@ -1299,39 +1386,57 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name) return found_it->second; } - return loadUIImageByName(image_name, image_name); + const BOOL use_mips = FALSE; + const LLRect scale_rect = LLRect::null; + return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority); } -LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect) +LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename, + BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority ) { - LLViewerImage* imagep = gImageList.getImageFromFile(filename, MIPMAP_NO, IMMEDIATE_YES); + if (boost_priority == LLViewerTexture::BOOST_NONE) + { + boost_priority = LLViewerTexture::BOOST_UI; + } + LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority); return loadUIImage(imagep, name, use_mips, scale_rect); } -LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id, BOOL use_mips, const LLRect& scale_rect) +LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id, + BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority) { - LLViewerImage* imagep = gImageList.getImage(id, MIPMAP_NO, IMMEDIATE_YES); + if (boost_priority == LLViewerTexture::BOOST_NONE) + { + boost_priority = LLViewerTexture::BOOST_UI; + } + LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority); return loadUIImage(imagep, id.asString(), use_mips, scale_rect); } -LLUIImagePtr LLUIImageList::loadUIImage(LLViewerImage* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect) +LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect) { if (!imagep) return NULL; imagep->setAddressMode(LLTexUnit::TAM_CLAMP); //all UI images are non-deletable - imagep->setNoDelete() ; + imagep->setNoDelete(); LLUIImagePtr new_imagep = new LLUIImage(name, imagep); mUIImages.insert(std::make_pair(name, new_imagep)); + mUITextureList.push_back(imagep); - LLUIImageLoadData* datap = new LLUIImageLoadData; - datap->mImageName = name; - datap->mImageScaleRegion = scale_rect; - - imagep->setLoadedCallback(onUIImageLoaded, 0, FALSE, FALSE, datap); + //Note: + //Some other textures such as ICON also through this flow to be fetched. + //But only UI textures need to set this callback. + if(imagep->getBoostLevel() == LLViewerTexture::BOOST_UI) + { + LLUIImageLoadData* datap = new LLUIImageLoadData; + datap->mImageName = name; + datap->mImageScaleRegion = scale_rect; + imagep->setLoadedCallback(onUIImageLoaded, 0, FALSE, FALSE, datap, NULL); + } return new_imagep; } @@ -1349,7 +1454,7 @@ LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::s } //static -void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* user_data ) +void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* user_data ) { if(!success || !user_data) { @@ -1373,10 +1478,10 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerImage *src_vi, LLImag // for images grabbed from local files, apply clipping rectangle to restore original dimensions // from power-of-2 gl image - if (success && imagep.notNull() && src_vi && (src_vi->mUrl.compare(0, 7, "file://")==0)) + if (success && imagep.notNull() && src_vi && (src_vi->getUrl().compare(0, 7, "file://")==0)) { - F32 clip_x = (F32)src_vi->getOriginalWidth() / (F32)src_vi->getWidth(0); - F32 clip_y = (F32)src_vi->getOriginalHeight() / (F32)src_vi->getHeight(0); + F32 clip_x = (F32)src_vi->getOriginalWidth() / (F32)src_vi->getFullWidth(); + F32 clip_y = (F32)src_vi->getOriginalHeight() / (F32)src_vi->getFullHeight(); imagep->setClipRegion(LLRectf(0.f, clip_y, clip_x, 0.f)); if (scale_rect != LLRect::null) { @@ -1386,10 +1491,129 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerImage *src_vi, LLImag llclamp((F32)scale_rect.mRight / (F32)imagep->getWidth(), 0.f, 1.f), llclamp((F32)scale_rect.mBottom / (F32)imagep->getHeight(), 0.f, 1.f))); } + + //imagep->onImageLoaded(); } } } +/*struct UIImageDeclaration : public LLInitParam::Block +{ + Mandatory name; + Optional file_name; + Optional preload; + Optional scale; + Optional use_mips; + + UIImageDeclaration() + : name("name"), + file_name("file_name"), + preload("preload", false), + scale("scale"), + use_mips("use_mips", false) + {} +}; + +struct UIImageDeclarations : public LLInitParam::Block +{ + Mandatory version; + Multiple textures; + + UIImageDeclarations() + : version("version"), + textures("texture") + {} +}; + +bool LLUIImageList::initFromFile() +{ + // construct path to canonical textures.xml in default skin dir + std::string base_file_path = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "default", "textures", "textures.xml"); + + LLXMLNodePtr root; + + if (!LLXMLNode::parseFile(base_file_path, root, NULL)) + { + llwarns << "Unable to parse UI image list file " << base_file_path << llendl; + return false; + } + if (!root->hasAttribute("version")) + { + llwarns << "No valid version number in UI image list file " << base_file_path << llendl; + return false; + } + + UIImageDeclarations images; + LLXUIParser parser; + parser.readXUI(root, images, base_file_path); + + // add components defined in current skin + std::string skin_update_path = gDirUtilp->getSkinDir() + + gDirUtilp->getDirDelimiter() + + "textures" + + gDirUtilp->getDirDelimiter() + + "textures.xml"; + LLXMLNodePtr update_root; + if (skin_update_path != base_file_path + && LLXMLNode::parseFile(skin_update_path, update_root, NULL)) + { + parser.readXUI(update_root, images, skin_update_path); + } + + // add components defined in user override of current skin + skin_update_path = gDirUtilp->getUserSkinDir() + + gDirUtilp->getDirDelimiter() + + "textures" + + gDirUtilp->getDirDelimiter() + + "textures.xml"; + if (skin_update_path != base_file_path + && LLXMLNode::parseFile(skin_update_path, update_root, NULL)) + { + parser.readXUI(update_root, images, skin_update_path); + } + + if (!images.validateBlock()) return false; + + std::map merged_declarations; + for (LLInitParam::ParamIterator::const_iterator image_it = images.textures.begin(); + image_it != images.textures.end(); + ++image_it) + { + merged_declarations[image_it->name].overwriteFrom(*image_it); + } + + enum e_decode_pass + { + PASS_DECODE_NOW, + PASS_DECODE_LATER, + NUM_PASSES + }; + + for (S32 cur_pass = PASS_DECODE_NOW; cur_pass < NUM_PASSES; cur_pass++) + { + for (std::map::const_iterator image_it = merged_declarations.begin(); + image_it != merged_declarations.end(); + ++image_it) + { + const UIImageDeclaration& image = image_it->second; + std::string file_name = image.file_name.isProvided() ? image.file_name() : image.name(); + + // load high priority textures on first pass (to kick off decode) + enum e_decode_pass decode_pass = image.preload ? PASS_DECODE_NOW : PASS_DECODE_LATER; + if (decode_pass != cur_pass) + { + continue; + } + preloadUIImage(image.name, file_name, image.use_mips, image.scale); + } + + if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload")) + { + gTextureList.decodeAllImages(10.f); // decode preloaded images + } + } + return true; +}*/ bool LLUIImageList::initFromFile() { // construct path to canonical textures.xml in default skin dir @@ -1494,7 +1718,7 @@ bool LLUIImageList::initFromFile() if (pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload")) { - gImageList.decodeAllImages(10.f); // decode preloaded images + gTextureList.decodeAllImages(10.f); // decode preloaded images } } return true; diff --git a/indra/newview/llviewerimagelist.h b/indra/newview/llviewertexturelist.h similarity index 58% rename from indra/newview/llviewerimagelist.h rename to indra/newview/llviewertexturelist.h index a6c26fa38..39fea0b75 100644 --- a/indra/newview/llviewerimagelist.h +++ b/indra/newview/llviewertexturelist.h @@ -1,10 +1,10 @@ /** - * @file llviewerimagelist.h + * @file llviewertexturelist.h * @brief Object for managing the list of images within a region * * $LicenseInfo:firstyear=2000&license=viewergpl$ * - * Copyright (c) 2000-2009, Linden Research, Inc. + * Copyright (c) 2000-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -12,13 +12,13 @@ * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * online at http://secondlife.com/developers/opensource/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * http://secondlife.com/developers/opensource/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -28,16 +28,17 @@ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ + * */ -#ifndef LL_LLVIEWERIMAGELIST_H -#define LL_LLVIEWERIMAGELIST_H +#ifndef LL_LLVIEWERTEXTURELIST_H +#define LL_LLVIEWERTEXTURELIST_H #include "lluuid.h" //#include "message.h" #include "llgl.h" #include "llstat.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llui.h" #include #include @@ -53,24 +54,24 @@ const BOOL GL_TEXTURE_NO = FALSE; const BOOL IMMEDIATE_YES = TRUE; const BOOL IMMEDIATE_NO = FALSE; -class LLMessageSystem; -class LLViewerImage; -class LLTextureView; class LLImageJ2C; +class LLMessageSystem; +class LLTextureView; typedef void (*LLImageCallback)(BOOL success, - LLViewerImage *src_vi, + LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata); -class LLViewerImageList +class LLViewerTextureList { - LOG_CLASS(LLViewerImageList); + LOG_CLASS(LLViewerTextureList); friend class LLTextureView; + friend class LLViewerTextureManager; public: static BOOL createUploadFile(const std::string& filename, const std::string& out_filename, const U8 codec); @@ -81,8 +82,8 @@ public: static void receiveImagePacket(LLMessageSystem *msg, void **user_data); public: - LLViewerImageList(); - ~LLViewerImageList(); + LLViewerTextureList(); + ~LLViewerTextureList(); void init(); void shutdown(); @@ -90,47 +91,13 @@ public: void destroyGL(BOOL save_state = TRUE); void restoreGL(); - LLViewerImage * getImage(const LLUUID &image_id, - BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. - LLGLint internal_format = 0, - LLGLenum primary_format = 0, - LLHost request_from_host = LLHost() - ); - - LLViewerImage * getImageFromUrl(const std::string& url, - BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. - LLGLint internal_format = 0, - LLGLenum primary_format = 0, - const LLUUID& force_id = LLUUID::null - ); + LLViewerFetchedTexture *findImage(const LLUUID &image_id); - LLViewerImage * getImageFromFile(const std::string& filename, - BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. - LLGLint internal_format = 0, - LLGLenum primary_format = 0, - const LLUUID& force_id = LLUUID::null - ); - - // Request image from a specific host, used for baked avatar textures. - // Implemented in header in case someone changes default params above. JC - LLViewerImage* getImageFromHost(const LLUUID& image_id, LLHost host) - { return getImage(image_id, TRUE, FALSE, 0, 0, host); } - - LLViewerImage *hasImage(const LLUUID &image_id); - void addImage(LLViewerImage *image); - void deleteImage(LLViewerImage *image); - - void addImageToList(LLViewerImage *image); - void removeImageFromList(LLViewerImage *image); - - void dirtyImage(LLViewerImage *image); + void dirtyImage(LLViewerFetchedTexture *image); // Using image stats, determine what images are necessary, and perform image updates. void updateImages(F32 max_time); - void bumpToMaxDecodePriority(LLViewerImage* imagep) ; + void forceImmediateUpdate(LLViewerFetchedTexture* imagep) ; // Decode and create textures for all images currently in list. void decodeAllImages(F32 max_decode_time); @@ -156,29 +123,78 @@ private: F32 updateImagesCreateTextures(F32 max_time); F32 updateImagesFetchTextures(F32 max_time); void updateImagesUpdateStats(); - + public: - typedef std::set > image_list_t; + void addImage(LLViewerFetchedTexture *image); + void deleteImage(LLViewerFetchedTexture *image); +private: + + void addImageToList(LLViewerFetchedTexture *image); + void removeImageFromList(LLViewerFetchedTexture *image); + + LLViewerFetchedTexture * getImage(const LLUUID &image_id, + BOOL usemipmap = TRUE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + LLHost request_from_host = LLHost() + ); + + LLViewerFetchedTexture * getImageFromFile(const std::string& filename, + BOOL usemipmap = TRUE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + const LLUUID& force_id = LLUUID::null + ); + + LLViewerFetchedTexture* getImageFromUrl(const std::string& url, + BOOL usemipmap = TRUE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + const LLUUID& force_id = LLUUID::null + ); + + LLViewerFetchedTexture* createImage(const LLUUID &image_id, + BOOL usemipmap = TRUE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + LLHost request_from_host = LLHost() + ); + + // Request image from a specific host, used for baked avatar textures. + // Implemented in header in case someone changes default params above. JC + LLViewerFetchedTexture* getImageFromHost(const LLUUID& image_id, LLHost host) + { return getImage(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); } + +public: + typedef std::set > image_list_t; image_list_t mLoadingStreamList; image_list_t mCreateTextureList; image_list_t mCallbackList; // Note: just raw pointers because they are never referenced, just compared against - std::set mDirtyTextureList; + std::set mDirtyTextureList; BOOL mForceResetTextureStats; private: - typedef std::map< LLUUID, LLPointer > uuid_map_t; + typedef std::map< LLUUID, LLPointer > uuid_map_t; uuid_map_t mUUIDMap; LLUUID mLastUpdateUUID; LLUUID mLastFetchUUID; - typedef std::set, LLViewerImage::Compare> image_priority_list_t; + typedef std::set, LLViewerFetchedTexture::Compare> image_priority_list_t; image_priority_list_t mImageList; - // simply holds on to LLViewerImage references to stop them from being purged too soon - std::set > mImagePreloads; + // simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon + std::set > mImagePreloads; BOOL mUpdateStats; S32 mMaxResidentTexMemInMegaBytes; @@ -205,20 +221,24 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton > uuid_ui_image_map_t; uuid_ui_image_map_t mUIImages; + + // + //keep a copy of UI textures to prevent them to be deleted. + //mGLTexturep of each UI texture equals to some LLUIImage.mImage. + std::list< LLPointer > mUITextureList ; }; const BOOL GLTEXTURE_TRUE = TRUE; @@ -236,6 +261,6 @@ const BOOL GLTEXTURE_FALSE = FALSE; const BOOL MIPMAP_TRUE = TRUE; const BOOL MIPMAP_FALSE = FALSE; -extern LLViewerImageList gImageList; +extern LLViewerTextureList gTextureList; #endif diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 501126abd..a82fdb3d5 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -161,7 +161,7 @@ #include "llvieweraudio.h" #include "llviewercamera.h" #include "llviewergesture.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerkeyboard.h" #include "llviewermedia.h" @@ -200,7 +200,7 @@ // // Globals // -void render_ui(F32 zoom_factor = 1.f, int subfield = 0); +void render_ui(F32 zoom_factor = 1.f, int subfield = 0, bool tiling = false); LLBottomPanel* gBottomPanel = NULL; extern BOOL gDebugClicks; @@ -686,11 +686,12 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask llinfos << "Left Mouse Down not handled by view" << llendl; } + // Do not allow tool manager to handle mouseclicks if we have disconnected if (gDisconnected) { return FALSE; } - + if(LLToolMgr::getInstance()->getCurrentTool()->handleMouseDown( x, y, mask ) ) { // This is necessary to force clicks in the world to cause edit @@ -1499,6 +1500,15 @@ LLViewerWindow::LLViewerWindow( LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL; } + LLCoordScreen scr; + mWindow->getSize(&scr); + + if(fullscreen && ( scr.mX!=width || scr.mY!=height)) + { + llwarns << "Fullscreen has forced us in to a different resolution now using "<getRect().getWidth(); LLRect full_window(0, height, width, 0); - if ( gBottomPanel == NULL ) // Don't re-enter if objects are alreay created + // Don't re-enter if objects are alreay created + if (gBottomPanel == NULL) { // panel containing chatbar, toolbar, and overlay, over floaters gBottomPanel = new LLBottomPanel(mRootView->getRect()); @@ -1915,6 +1926,57 @@ void LLViewerWindow::initWorldUI() gIMMgr = LLIMMgr::getInstance(); + // + // Tools for building + // + + init_menus(); + + // Toolbox floater + gFloaterTools = new LLFloaterTools(); + gFloaterTools->setVisible(FALSE); + } + + if ( gHUDView == NULL ) + { + LLRect hud_rect = full_window; + hud_rect.mBottom += 50; + if (gMenuBarView) + { + hud_rect.mTop -= gMenuBarView->getRect().getHeight(); + } + gHUDView = new LLHUDView(hud_rect); + // put behind everything else in the UI + mRootView->addChildAtEnd(gHUDView); + } +} + +// initWorldUI that wasn't before logging in. Some of this may require the access the 'LindenUserDir'. +void LLViewerWindow::initWorldUI_postLogin() +{ + S32 height = mRootView->getRect().getHeight(); + S32 width = mRootView->getRect().getWidth(); + LLRect full_window(0, height, width, 0); + + // Don't re-enter if objects are alreay created. + if (!gStatusBar) + { + // Status bar + S32 menu_bar_height = gMenuBarView->getRect().getHeight(); + LLRect root_rect = getRootView()->getRect(); + LLRect status_rect(0, root_rect.getHeight(), root_rect.getWidth(), root_rect.getHeight() - menu_bar_height); + gStatusBar = new LLStatusBar(std::string("status"), status_rect); + gStatusBar->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP); + + gStatusBar->reshape(root_rect.getWidth(), gStatusBar->getRect().getHeight(), TRUE); + gStatusBar->translate(0, root_rect.getHeight() - gStatusBar->getRect().getHeight()); + // sync bg color with menu bar + gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor() ); + getRootView()->addChild(gStatusBar); + + // Menu holder appears on top to get first pass at all mouse events + getRootView()->sendChildToFront(gMenuHolder); + if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") ) { LLFloaterChat::getInstance(LLSD())->loadHistory(); @@ -1940,47 +2002,7 @@ void LLViewerWindow::initWorldUI() gFloaterTeleportHistory = new LLFloaterTeleportHistory(); gFloaterTeleportHistory->setVisible(FALSE); - // - // Tools for building - // - - // Toolbox floater - init_menus(); - - gFloaterTools = new LLFloaterTools(); - gFloaterTools->setVisible(FALSE); - - // Status bar - S32 menu_bar_height = gMenuBarView->getRect().getHeight(); - LLRect root_rect = getRootView()->getRect(); - LLRect status_rect(0, root_rect.getHeight(), root_rect.getWidth(), root_rect.getHeight() - menu_bar_height); - gStatusBar = new LLStatusBar(std::string("status"), status_rect); - gStatusBar->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP); - - gStatusBar->reshape(root_rect.getWidth(), gStatusBar->getRect().getHeight(), TRUE); - gStatusBar->translate(0, root_rect.getHeight() - gStatusBar->getRect().getHeight()); - // sync bg color with menu bar - gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor() ); - LLFloaterChatterBox::createInstance(LLSD()); - - getRootView()->addChild(gStatusBar); - - // menu holder appears on top to get first pass at all mouse events - getRootView()->sendChildToFront(gMenuHolder); - } - - if ( gHUDView == NULL ) - { - LLRect hud_rect = full_window; - hud_rect.mBottom += 50; - if (gMenuBarView) - { - hud_rect.mTop -= gMenuBarView->getRect().getHeight(); - } - gHUDView = new LLHUDView(hud_rect); - // put behind everything else in the UI - mRootView->addChildAtEnd(gHUDView); } } @@ -2031,7 +2053,7 @@ void LLViewerWindow::shutdownGL() gSky.cleanup(); stop_glerror(); - gImageList.shutdown(); + gTextureList.shutdown(); stop_glerror(); gBumpImageList.shutdown(); @@ -2043,8 +2065,11 @@ void LLViewerWindow::shutdownGL() gPipeline.cleanup(); stop_glerror(); - LLViewerImage::cleanupClass(); - + LLViewerTextureManager::cleanup() ; + LLImageGL::cleanupClass() ; + + llinfos << "All textures and llimagegl images are destroyed!" << llendl ; + llinfos << "Cleaning up select manager" << llendl; LLSelectMgr::getInstance()->cleanup(); @@ -2130,6 +2155,7 @@ void LLViewerWindow::reshape(S32 width, S32 height) return; } + gWindowResized = TRUE; glViewport(0, 0, width, height ); if (height > 0) @@ -4248,7 +4274,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p // Saves the image from the screen to the specified filename and path. BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, - BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size) + BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size, F32 supersample) { if (!raw) { @@ -4278,25 +4304,26 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // Copy screen to a buffer // crop sides or top and bottom, if taking a snapshot of different aspect ratio // from window - S32 snapshot_width = mWindowRect.getWidth(); - S32 snapshot_height = mWindowRect.getHeight(); - // SNAPSHOT - S32 window_width = mWindowRect.getWidth(); - S32 window_height = mWindowRect.getHeight(); LLRect window_rect = mWindowRect; - BOOL use_fbo = FALSE; - LLRenderTarget target; + S32 snapshot_width = window_rect.getWidth(); + S32 snapshot_height = window_rect.getHeight(); + // SNAPSHOT + S32 window_width = snapshot_width; + S32 window_height = snapshot_height; + + F32 scale_factor = 1.0f ; + + bool is_tiling = false; -#if SHY_MOD // screenshot improvement - F32 internal_scale = 1.f; - static const LLCachedControl force_tile("SHHighResSnapshotForceTile",false); - if(force_tile) - { - static const LLCachedControl super_sample_scale("SHHighResSnapshotSuperSample",1.f); - internal_scale = llmax(super_sample_scale.get(),1.f); - } + //fbo method no longer supported. Good riddance + /*LLRenderTarget target; + bool use_fbo = false; + static const LLCachedControl force_tile("SHHighResSnapshotForceTile",false);*/ + +#if 1//SHY_MOD // screenshot improvement + F32 internal_scale = llmin(llmax(supersample,1.f),3.f); // render at specified internal resolution. >1 results in supersampling. image_height *= internal_scale; image_width *= internal_scale; @@ -4313,10 +4340,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { if(image_width > window_width || image_height > window_height) //need to enlarge the scene { -#if SHY_MOD // screenshot improvement - if(!force_tile) -#endif //shy_mod - if (gGLManager.mHasFramebufferObject && !show_ui) + //Unsupported + /*if (!force_tile && gGLManager.mHasFramebufferObject && !show_ui) { GLint max_size = 0; glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size); @@ -4336,12 +4361,13 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei } } - if(!use_fbo) //no re-projection, so tiling the scene + if(!use_fbo) //no re-projection, so tiling the scene*/ { F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; snapshot_width = (S32)(ratio * image_width) ; snapshot_height = (S32)(ratio * image_height) ; scale_factor = llmax(1.0f, 1.0f / ratio) ; + is_tiling = true; } } //else: keep the current scene scale, re-scale it if necessary after reading out. @@ -4351,9 +4377,9 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f); S32 image_buffer_x = llfloor(snapshot_width*scale_factor) ; - S32 image_buffer_y = llfloor(snapshot_height *scale_factor) ; -#if SHY_MOD // screenshot improvement - if(internal_scale > 1.f) //If supersampling... Don't care about max_size. + S32 image_buffer_y = llfloor(snapshot_height*scale_factor) ; +#if 1//SHY_MOD // screenshot improvement + if(internal_scale <= 1.f) //If supersampling... Don't care about max_size. #endif //shy_mod if(image_buffer_x > max_size || image_buffer_y > max_size) //boundary check to avoid memory overflow { @@ -4418,20 +4444,16 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei else { const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); -#if SHY_MOD // screenshot improvement - //tiling requires gPipeline.generateWaterReflection to be called in display(). CANNOT be done if using an fbo. - display(do_rebuild, scale_factor, subfield, TRUE, !use_fbo && (scale_factor > 1.0f)); -#else //shy_mod - display(do_rebuild, scale_factor, subfield, TRUE); -#endif + display(do_rebuild, scale_factor, subfield, TRUE, is_tiling); // Required for showing the GUI in snapshots? See DEV-16350 for details. JC - render_ui(scale_factor, subfield); + render_ui(scale_factor, subfield, is_tiling); } S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width); // handle fractional rows U32 read_width = llmax(0, (window_width - subimage_x_offset) - llmax(0, (window_width * (subimage_x + 1)) - (buffer_x_offset + raw->getWidth()))); + for(U32 out_y = 0; out_y < read_height ; out_y++) { S32 output_buffer_offset = ( @@ -4451,7 +4473,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei if (type == SNAPSHOT_TYPE_OBJECT_ID || type == SNAPSHOT_TYPE_COLOR) { glReadPixels( - subimage_x_offset, out_y + subimage_y_offset, + subimage_x_offset, + out_y + subimage_y_offset, read_width, 1, GL_RGB, GL_UNSIGNED_BYTE, raw->getData() + output_buffer_offset @@ -4487,12 +4510,12 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei output_buffer_offset_y += subimage_y_offset; } - if (use_fbo) + /*if (use_fbo) { mWindowRect = window_rect; target.flush(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - } + }*/ gDisplaySwapBuffers = FALSE; gDepthDirty = TRUE; @@ -4528,7 +4551,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei ret = raw->scale( image_width, image_height, FALSE ); } -#if SHY_MOD // screenshot improvement +#if 1//SHY_MOD // screenshot improvement if(raw->isBufferInvalid()) //Just checking! return FALSE; if(internal_scale != 1.f) //Scale down our render to the desired dimensions. @@ -4711,7 +4734,7 @@ void LLViewerWindow::stopGL(BOOL save_state) //Note: --bao //if not necessary, do not change the order of the function calls in this function. //if change something, make sure it will not break anything. - //especially be careful to put anything behind gImageList.destroyGL(save_state); + //especially be careful to put anything behind gTextureList.destroyGL(save_state); if (!gGLManager.mIsDisabled) { llinfos << "Shutting down GL..." << llendl; @@ -4736,7 +4759,7 @@ void LLViewerWindow::stopGL(BOOL save_state) LLVOAvatar::destroyGL(); stop_glerror(); - LLDynamicTexture::destroyGL(); + LLViewerDynamicTexture::destroyGL(); stop_glerror(); if (gPipeline.isInit()) @@ -4754,7 +4777,7 @@ void LLViewerWindow::stopGL(BOOL save_state) gPostProcess->invalidate(); } - gImageList.destroyGL(save_state); + gTextureList.destroyGL(save_state); stop_glerror(); gGLManager.mIsDisabled = TRUE; @@ -4769,7 +4792,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message) //Note: --bao //if not necessary, do not change the order of the function calls in this function. //if change something, make sure it will not break anything. - //especially, be careful to put something before gImageList.restoreGL(); + //especially, be careful to put something before gTextureList.restoreGL(); if (gGLManager.mIsDisabled) { llinfos << "Restoring GL..." << llendl; @@ -4777,7 +4800,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message) initGLDefaults(); LLGLState::restoreGL(); - gImageList.restoreGL(); + gTextureList.restoreGL(); // for future support of non-square pixels, and fonts that are properly stretched //LLFontGL::destroyDefaultFonts(); @@ -4789,10 +4812,11 @@ void LLViewerWindow::restoreGL(const std::string& progress_message) LLManipTranslate::restoreGL(); gBumpImageList.restoreGL(); - LLDynamicTexture::restoreGL(); + LLViewerDynamicTexture::restoreGL(); LLVOAvatar::restoreGL(); gResizeScreenTexture = TRUE; + gWindowResized = TRUE; if (gFloaterCustomize && gFloaterCustomize->getVisible()) { @@ -5461,7 +5485,7 @@ void LLPickInfo::updateXYCoords() if (mObjectFace > -1) { const LLTextureEntry* tep = getObject()->getTE(mObjectFace); - LLPointer imagep = gImageList.getImage(tep->getID()); + LLPointer imagep = LLViewerTextureManager::getFetchedTexture(tep->getID()); if(mUVCoords.mV[VX] >= 0.f && mUVCoords.mV[VY] >= 0.f && imagep.notNull()) { mXYCoords.mX = llround(mUVCoords.mV[VX] * (F32)imagep->getWidth()); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 5de38390a..21867f7eb 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -144,6 +144,7 @@ public: void adjustRectanglesForFirstUse(const LLRect& window); void adjustControlRectanglesForFirstUse(const LLRect& window); void initWorldUI(); + void initWorldUI_postLogin(); // // LLWindowCallback interface implementation @@ -289,7 +290,7 @@ public: } ESnapshotType; BOOL saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR); BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, BOOL is_texture = FALSE, - BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE ); + BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE, F32 supersample = 1.f ); BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ; BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); } void resetSnapshotLoc() const { sSnapshotDir.clear(); } diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index fb3683764..fa5970a7b 100644 --- a/indra/newview/llvlcomposition.cpp +++ b/indra/newview/llvlcomposition.cpp @@ -39,8 +39,7 @@ #include "v3math.h" #include "llsurface.h" #include "lltextureview.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "noise.h" #include "llregionhandle.h" // for from_region_handle @@ -109,7 +108,7 @@ void LLVLComposition::setDetailTextureID(S32 corner, const LLUUID& id) { return; } - mDetailTextures[corner] = gImageList.getImage(id); + mDetailTextures[corner] = LLViewerTextureManager::getFetchedTexture(id); mDetailTextures[corner]->setNoDelete() ; mRawImages[corner] = NULL; } @@ -217,7 +216,7 @@ BOOL LLVLComposition::generateHeights(const F32 x, const F32 y, return TRUE; } -static const S32 BASE_SIZE = 128; +static const U32 BASE_SIZE = 128; BOOL LLVLComposition::generateComposition() { @@ -232,7 +231,7 @@ BOOL LLVLComposition::generateComposition() { if (mDetailTextures[i]->getDiscardLevel() < 0) { - mDetailTextures[i]->setBoostLevel(LLViewerImageBoostLevel::BOOST_TERRAIN); // in case we are at low detail + mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); // in case we are at low detail mDetailTextures[i]->addTextureStats(BASE_SIZE*BASE_SIZE); return FALSE; } @@ -240,8 +239,8 @@ BOOL LLVLComposition::generateComposition() (mDetailTextures[i]->getWidth() < BASE_SIZE || mDetailTextures[i]->getHeight() < BASE_SIZE))) { - S32 width = mDetailTextures[i]->getWidth(0); - S32 height = mDetailTextures[i]->getHeight(0); + S32 width = mDetailTextures[i]->getFullWidth(); + S32 height = mDetailTextures[i]->getFullHeight(); S32 min_dim = llmin(width, height); S32 ddiscard = 0; while (min_dim > BASE_SIZE && ddiscard < MAX_DISCARD_LEVEL) @@ -249,7 +248,7 @@ BOOL LLVLComposition::generateComposition() ddiscard++; min_dim /= 2; } - mDetailTextures[i]->setBoostLevel(LLViewerImageBoostLevel::BOOST_TERRAIN); // in case we are at low detail + mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); // in case we are at low detail mDetailTextures[i]->setMinDiscardLevel(ddiscard); return FALSE; } @@ -282,20 +281,30 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, if (mRawImages[i].isNull()) { // Read back a raw image for this discard level, if it exists - mRawImages[i] = new LLImageRaw; - S32 min_dim = llmin(mDetailTextures[i]->getWidth(0), mDetailTextures[i]->getHeight(0)); + S32 min_dim = llmin(mDetailTextures[i]->getFullWidth(), mDetailTextures[i]->getFullHeight()); S32 ddiscard = 0; while (min_dim > BASE_SIZE && ddiscard < MAX_DISCARD_LEVEL) { ddiscard++; min_dim /= 2; } - mRawImages[i] = mDetailTextures[i]->getCachedRawImage() ; - if (!mRawImages[i]) + + BOOL delete_raw = (mDetailTextures[i]->reloadRawImage(ddiscard) != NULL) ; + if(mDetailTextures[i]->getRawImageLevel() != ddiscard)//raw iamge is not ready, will enter here again later. { - llwarns << "no cached raw data for terrain detail texture: " << mDetailTextures[i]->getID() << llendl; + if(delete_raw) + { + mDetailTextures[i]->destroyRawImage() ; + } + lldebugs << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << llendl; return FALSE; } + + mRawImages[i] = mDetailTextures[i]->getRawImage() ; + if(delete_raw) + { + mDetailTextures[i]->destroyRawImage() ; + } if (mDetailTextures[i]->getWidth(ddiscard) != BASE_SIZE || mDetailTextures[i]->getHeight(ddiscard) != BASE_SIZE || mDetailTextures[i]->getComponents() != 3) @@ -339,7 +348,7 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, // // - LLViewerImage *texturep; + LLViewerTexture *texturep; U32 tex_width, tex_height, tex_comps; U32 tex_stride; F32 tex_x_scalef, tex_y_scalef; @@ -352,9 +361,9 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, tex_comps = texturep->getComponents(); tex_stride = tex_width * tex_comps; - S32 st_comps = 3; - S32 st_width = BASE_SIZE; - S32 st_height = BASE_SIZE; + U32 st_comps = 3; + U32 st_width = BASE_SIZE; + U32 st_height = BASE_SIZE; if (tex_comps != st_comps) { @@ -451,6 +460,10 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, } } + if (!texturep->hasGLTexture()) + { + texturep->createGLTexture(0, raw); + } texturep->setSubImage(raw, tex_x_begin, tex_y_begin, tex_x_end - tex_x_begin, tex_y_end - tex_y_begin); LLSurface::sTextureUpdateTime += gen_timer.getElapsedTimeF32(); LLSurface::sTexelsUpdated += (tex_x_end - tex_x_begin) * (tex_y_end - tex_y_begin); @@ -458,7 +471,7 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, for (S32 i = 0; i < 4; i++) { // Un-boost detatil textures (will get re-boosted if rendering in high detail) - mDetailTextures[i]->setBoostLevel(LLViewerImageBoostLevel::BOOST_NONE); + mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_NONE); mDetailTextures[i]->setMinDiscardLevel(MAX_DISCARD_LEVEL + 1); } @@ -470,7 +483,7 @@ LLUUID LLVLComposition::getDetailTextureID(S32 corner) return mDetailTextures[corner]->getID(); } -LLViewerImage* LLVLComposition::getDetailTexture(S32 corner) +LLViewerFetchedTexture* LLVLComposition::getDetailTexture(S32 corner) { return mDetailTextures[corner]; } diff --git a/indra/newview/llvlcomposition.h b/indra/newview/llvlcomposition.h index 6d5db3c05..d1b3dc449 100644 --- a/indra/newview/llvlcomposition.h +++ b/indra/newview/llvlcomposition.h @@ -34,7 +34,7 @@ #define LL_LLVLCOMPOSITION_H #include "llviewerlayer.h" -#include "llviewerimage.h" +#include "llviewertexture.h" class LLSurface; @@ -62,7 +62,7 @@ public: CORNER_COUNT = 4 }; LLUUID getDetailTextureID(S32 corner); - LLViewerImage* getDetailTexture(S32 corner); + LLViewerFetchedTexture* getDetailTexture(S32 corner); F32 getStartHeight(S32 corner); F32 getHeightRange(S32 corner); @@ -79,7 +79,7 @@ protected: LLSurface *mSurfacep; BOOL mTexturesLoaded; - LLPointer mDetailTextures[CORNER_COUNT]; + LLPointer mDetailTextures[CORNER_COUNT]; LLPointer mRawImages[CORNER_COUNT]; F32 mStartHeight[CORNER_COUNT]; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 72615e790..85d0e5f4c 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -75,7 +75,7 @@ #include "llviewercamera.h" #include "llviewergenericmessage.h" //for Auto Deruth #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermedia.h" #include "llviewermenu.h" #include "llviewerobjectlist.h" @@ -103,6 +103,8 @@ #include "llavatarname.h" #include "llavatarnamecache.h" +#include "llphysicsmotion.h" + // [RLVa:KB] - Checked: 2010-04-01 (RLVa-1.2.0c) #include "rlvhandler.h" // [/RLVa:KB] @@ -128,6 +130,7 @@ const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d" const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b"); //"pelvis_fix" const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55"); //"target" const LLUUID ANIM_AGENT_WALK_ADJUST = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d"); //"walk_adjust" +const LLUUID ANIM_AGENT_PHYSICS_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987"); //"physics_motion" //----------------------------------------------------------------------------- @@ -216,8 +219,10 @@ struct LLAvatarTexData struct LLTextureMaskData { - LLTextureMaskData( const LLUUID& id ) - : mAvatarID(id), mLastDiscardLevel(S32_MAX) {} + LLTextureMaskData( const LLUUID& id ) : + mAvatarID(id), + mLastDiscardLevel(S32_MAX) + {} LLUUID mAvatarID; S32 mLastDiscardLevel; }; @@ -244,10 +249,9 @@ public: } BOOL parseXml(LLXmlTreeNode* node); - BOOL mIsJoint; - private: std::string mName; + BOOL mIsJoint; LLVector3 mPos; LLVector3 mRot; LLVector3 mScale; @@ -720,6 +724,7 @@ BOOL LLVOAvatar::sShowAnimationDebug = FALSE; BOOL LLVOAvatar::sShowFootPlane = FALSE; BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE; F32 LLVOAvatar::sLODFactor = 1.f; +F32 LLVOAvatar::sPhysicsLODFactor = 1.f; BOOL LLVOAvatar::sUseImpostors = FALSE; BOOL LLVOAvatar::sJointDebug = FALSE; @@ -766,16 +771,16 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mAppearanceAnimating(FALSE), mNameString(), mTitle(), - mRenderedName(), - mUsedNameSystem(), - mClientName(), mNameAway(FALSE), mNameBusy(FALSE), mNameMute(FALSE), + mNameAppearance(FALSE), + mRenderedName(), + mUsedNameSystem(), + mClientName(), mRenderGroupTitles(sRenderGroupTitles), mNameFromChatOverride(false), mNameFromChatChanged(false), - mNameAppearance(FALSE), mRenderTag(FALSE), mLastRegionHandle(0), mRegionCrossingCount(0), @@ -791,7 +796,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mFullyLoadedInitialized(FALSE), mHasBakedHair( FALSE ), mSupportsAlphaLayers(FALSE), - mFirstSetActualBoobGravRan( false ) + mFirstSetActualBoobGravRan( false ), + mSupportsPhysics( false ) //mFirstSetActualButtGravRan( false ), //mFirstSetActualFatGravRan( false ) // @@ -883,7 +889,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mRippleTimeLast = 0.f; - mShadowImagep = gImageList.getImageFromFile("foot_shadow.j2c"); + mShadowImagep = LLViewerTextureManager::getFetchedTextureFromFile("foot_shadow.j2c"); gGL.getTexUnit(0)->bind(mShadowImagep.get()); mShadowImagep->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -1016,6 +1022,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, // motions without a start/stop bit registerMotion( ANIM_AGENT_BODY_NOISE, LLBodyNoiseMotion::create ); registerMotion( ANIM_AGENT_BREATHE_ROT, LLBreatheMotionRot::create ); + registerMotion( ANIM_AGENT_PHYSICS_MOTION, LLPhysicsMotionController::create ); registerMotion( ANIM_AGENT_EDITING, LLEditingMotion::create ); registerMotion( ANIM_AGENT_EYE, LLEyeMotion::create ); registerMotion( ANIM_AGENT_FLY_ADJUST, LLFlyAdjustMotion::create ); @@ -1383,38 +1390,38 @@ if(gAuditTexture) if( LLVOAvatar::sScratchTexNames.checkData( GL_LUMINANCE ) ) { - LLImageGL::decTextureCounterStatic(tex_size, 1, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ; total_tex_size -= tex_size ; } if( LLVOAvatar::sScratchTexNames.checkData( GL_ALPHA ) ) { - LLImageGL::decTextureCounterStatic(tex_size, 1, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ; total_tex_size -= tex_size ; } if( LLVOAvatar::sScratchTexNames.checkData( GL_COLOR_INDEX ) ) { - LLImageGL::decTextureCounterStatic(tex_size, 1, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ; total_tex_size -= tex_size ; } if( LLVOAvatar::sScratchTexNames.checkData( GL_LUMINANCE_ALPHA ) ) { - LLImageGL::decTextureCounterStatic(tex_size, 2, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::decTextureCounter(tex_size, 2, LLViewerTexture::AVATAR_SCRATCH_TEX) ; total_tex_size -= 2 * tex_size ; } if( LLVOAvatar::sScratchTexNames.checkData( GL_RGB ) ) { - LLImageGL::decTextureCounterStatic(tex_size, 3, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::decTextureCounter(tex_size, 3, LLViewerTexture::AVATAR_SCRATCH_TEX) ; total_tex_size -= 3 * tex_size ; } if( LLVOAvatar::sScratchTexNames.checkData( GL_RGBA ) ) { - LLImageGL::decTextureCounterStatic(tex_size, 4, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::decTextureCounter(tex_size, 4, LLViewerTexture::AVATAR_SCRATCH_TEX) ; total_tex_size -= 4 * tex_size ; } //others while(total_tex_size > 0) { - LLImageGL::decTextureCounterStatic(tex_size, 4, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::decTextureCounter(tex_size, 4, LLViewerTexture::AVATAR_SCRATCH_TEX) ; total_tex_size -= 4 * tex_size ; } } @@ -1970,6 +1977,7 @@ void LLVOAvatar::startDefaultMotions() startMotion( ANIM_AGENT_EYE ); startMotion( ANIM_AGENT_BODY_NOISE ); startMotion( ANIM_AGENT_BREATHE_ROT ); + startMotion( ANIM_AGENT_PHYSICS_MOTION ); startMotion( ANIM_AGENT_HAND_MOTION ); startMotion( ANIM_AGENT_PELVIS_FIX ); @@ -2781,7 +2789,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { for(U8 i=0;iforceActive(); } } @@ -2789,11 +2797,14 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) idleUpdateVoiceVisualizer( voice_enabled ); idleUpdateMisc( detailed_update ); idleUpdateAppearanceAnimation(); - idleUpdateBoobEffect(); - idleUpdateLipSync( voice_enabled ); - idleUpdateLoadingEffect(); - idleUpdateBelowWater(); // wind effect uses this - idleUpdateWindEffect(); + if (detailed_update) + { + //idleUpdateBoobEffect(); + idleUpdateLipSync( voice_enabled ); + idleUpdateLoadingEffect(); + idleUpdateBelowWater(); // wind effect uses this + idleUpdateWindEffect(); + } idleUpdateNameTag( root_pos_last ); idleUpdateRenderCost(); idleUpdateTractorBeam(); @@ -2931,11 +2942,12 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) LLJoint::sNumUpdates = 0; LLJoint::sNumTouches = 0; - // *NOTE: this is necessary for the floating name text above your head. + /*// *NOTE: this is necessary for the floating name text above your head. + // NOTE NOTE: This doesn't seem to be needed any more? if (mDrawable && mDrawable.notNull()) { gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_SHADOW, TRUE); - } + }*/ BOOL visible = isVisible() || mNeedsAnimUpdate; @@ -3251,6 +3263,7 @@ void LLVOAvatar::idleUpdateLoadingEffect() if (isFullyLoaded()) { deleteParticleSource(); + updateLOD(); } else { @@ -3266,7 +3279,7 @@ void LLVOAvatar::idleUpdateLoadingEffect() particle_parameters.mPartData.mStartColor = LLColor4(1, 1, 1, 0.5f); particle_parameters.mPartData.mEndColor = LLColor4(1, 1, 1, 0.0f); particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f; - LLViewerImage* cloud = gImageList.getImageFromFile("cloud-particle.j2c"); + LLViewerTexture* cloud = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.j2c"); particle_parameters.mPartImageID = cloud->getID(); particle_parameters.mMaxAge = 0.f; particle_parameters.mPattern = LLPartSysData::LL_PART_SRC_PATTERN_ANGLE_CONE; @@ -3510,12 +3523,12 @@ void LLVOAvatar::getClientInfo(std::string& client, LLColor4& color, BOOL useCom //llinfos << "Apparently this tag isn't registered: " << uuid_str << llendl; } - if (false) + /*if (false) //We'll remove this entirely eventually, but it's useful information if we're going to try for the new client tag idea. -HgB //if(useComment) { LLUUID baked_head_id = getTE(9)->getID(); - LLPointer baked_head_image = gImageList.getImage(baked_head_id); + LLPointer baked_head_image = LLViewerTextureManager::getFetchedTexture(baked_head_id); if(baked_head_image && baked_head_image->decodedComment.length()) { if(client.length()) @@ -3529,7 +3542,7 @@ void LLVOAvatar::getClientInfo(std::string& client, LLColor4& color, BOOL useCom client += baked_head_image->decodedComment; } - LLPointer baked_eye_image = gImageList.getImage(getTE(11)->getID()); + LLPointer baked_eye_image = gTextureList.getImage(getTE(11)->getID()); if(baked_eye_image && !baked_eye_image->decodedComment.empty() && baked_eye_image->decodedComment != baked_head_image->decodedComment) @@ -3541,7 +3554,7 @@ void LLVOAvatar::getClientInfo(std::string& client, LLColor4& color, BOOL useCom extraMetadata += baked_eye_image->decodedComment; } - } + }*/ } @@ -4401,7 +4414,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE; } - if (!visible) + if (!visible && !mIsSelf) { updateMotions(LLCharacter::HIDDEN_UPDATE); return FALSE; @@ -5410,7 +5423,7 @@ void LLVOAvatar::updateTextures() mHasGrey = FALSE; // debug for (U32 index = 0; index < getNumTEs(); index++) { - LLViewerImage *imagep = getTEImage(index); + LLViewerFetchedTexture *imagep = LLViewerTextureManager::staticCastToFetchedTexture(getTEImage(index)); if (imagep) { // Debugging code - maybe non-self avatars are downloading textures? @@ -5424,7 +5437,7 @@ void LLVOAvatar::updateTextures() const LLTextureEntry *te = getTE(index); F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT); - S32 boost_level = mIsSelf ? LLViewerImageBoostLevel::BOOST_AVATAR_BAKED_SELF : LLViewerImageBoostLevel::BOOST_AVATAR_BAKED; + S32 boost_level = mIsSelf ? LLViewerTexture::BOOST_AVATAR_BAKED_SELF : LLViewerTexture::BOOST_AVATAR_BAKED; // Spam if this is a baked texture, not set to default image, without valid host info if (isIndexBakedTexture((ETextureIndex)index) @@ -5472,7 +5485,7 @@ void LLVOAvatar::updateTextures() } -void LLVOAvatar::addLocalTextureStats( ETextureIndex idx, LLViewerImage* imagep, +void LLVOAvatar::addLocalTextureStats( ETextureIndex idx, LLViewerTexture* imagep, F32 texel_area_ratio, BOOL render_avatar, BOOL covered_by_baked ) { if (!isIndexLocalTexture(idx)) return; @@ -5485,7 +5498,7 @@ void LLVOAvatar::addLocalTextureStats( ETextureIndex idx, LLViewerImage* imagep, if( mIsSelf ) { desired_pixels = llmax(mPixelArea, (F32)TEX_IMAGE_AREA_SELF ); - imagep->setBoostLevel(LLViewerImageBoostLevel::BOOST_AVATAR_SELF); + imagep->setBoostLevel(LLViewerTexture::BOOST_AVATAR_SELF); // SNOW-8 : temporary snowglobe1.0 fix for baked textures if (render_avatar && !gGLManager.mIsDisabled ) { @@ -5496,7 +5509,7 @@ void LLVOAvatar::addLocalTextureStats( ETextureIndex idx, LLViewerImage* imagep, else { desired_pixels = llmin(mPixelArea, (F32)TEX_IMAGE_AREA_OTHER ); - imagep->setBoostLevel(LLViewerImageBoostLevel::BOOST_AVATAR); + imagep->setBoostLevel(LLViewerTexture::BOOST_AVATAR); } imagep->addTextureStats( desired_pixels / texel_area_ratio ); if (imagep->getDiscardLevel() < 0) @@ -5512,14 +5525,24 @@ void LLVOAvatar::addLocalTextureStats( ETextureIndex idx, LLViewerImage* imagep, } } - -void LLVOAvatar::addBakedTextureStats( LLViewerImage* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level) +const F32 SELF_ADDITIONAL_PRI = 0.75f ; +const F32 ADDITIONAL_PRI = 0.5f; +void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level) { imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures. mMaxPixelArea = llmax(pixel_area, mMaxPixelArea); mMinPixelArea = llmin(pixel_area, mMinPixelArea); imagep->addTextureStats(pixel_area / texel_area_ratio); imagep->setBoostLevel(boost_level); + + if(boost_level != LLViewerTexture::BOOST_AVATAR_BAKED_SELF) + { + imagep->setAdditionalDecodePriority(ADDITIONAL_PRI) ; + } + else + { + imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; + } } //----------------------------------------------------------------------------- @@ -6882,7 +6905,7 @@ void LLVOAvatar::updateShadowFaces() sprite.setSize(0.4f + cos_elev * 0.8f, 0.3f); LLVector3 sun_vec = gSky.mVOSkyp ? gSky.mVOSkyp->getToSun() : LLVector3(0.f, 0.f, 0.f); - if (mShadowImagep->getHasGLTexture()) + if (mShadowImagep->hasGLTexture()) { LLVector3 normal; LLVector3d shadow_pos; @@ -7626,7 +7649,7 @@ const std::string LLVOAvatar::getAttachedPointName(const LLUUID& inv_item_id) // onLocalTextureLoaded() //----------------------------------------------------------------------------- -void LLVOAvatar::onLocalTextureLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src_raw, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) +void LLVOAvatar::onLocalTextureLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src_raw, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) { //llinfos << "onLocalTextureLoaded: " << src_vi->getID() << llendl; @@ -7766,7 +7789,7 @@ void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user llassert( mIsSelf ); ETextureIndex baked_te = getBakedTE( layerset ); - setTEImage( baked_te, gImageList.getImage(IMG_DEFAULT_AVATAR) ); + setTEImage( baked_te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR,0)); layerset->requestUpload(); } } @@ -7900,7 +7923,7 @@ void LLVOAvatar::processRebakeAvatarTextures(LLMessageSystem* msg, void**) } -BOOL LLVOAvatar::getLocalTextureRaw(ETextureIndex index, LLImageRaw* image_raw) +/*BOOL LLVOAvatar::getLocalTextureRaw(ETextureIndex index, LLImageRaw* image_raw) { if (!isIndexLocalTexture(index)) return FALSE; @@ -7924,9 +7947,9 @@ BOOL LLVOAvatar::getLocalTextureRaw(ETextureIndex index, LLImageRaw* image_raw) } } return success; -} +}*/ -BOOL LLVOAvatar::getLocalTextureGL(ETextureIndex index, LLImageGL** image_gl_pp) +BOOL LLVOAvatar::getLocalTextureGL(ETextureIndex index, LLViewerTexture** image_gl_pp) { if (!isIndexLocalTexture(index)) return FALSE; @@ -8127,12 +8150,12 @@ void LLVOAvatar::getLocalTextureByteCount( S32* gl_bytes ) for( S32 i = 0; i < TEX_NUM_INDICES; i++ ) { if (!isIndexLocalTexture((ETextureIndex)i)) continue; - LLViewerImage* image_gl = mLocalTextureData[(ETextureIndex)i].mImage; + LLViewerTexture* image_gl = mLocalTextureData[(ETextureIndex)i].mImage; if( image_gl ) { S32 bytes = (S32)image_gl->getWidth() * image_gl->getHeight() * image_gl->getComponents(); - if( image_gl->getHasGLTexture() ) + if( image_gl->hasGLTexture() ) { *gl_bytes += bytes; } @@ -8156,12 +8179,12 @@ BOOL LLVOAvatar::bindScratchTexture( LLGLenum format ) if( *last_bind_time != LLImageGL::sLastFrameTime ) { *last_bind_time = LLImageGL::sLastFrameTime; - LLImageGL::updateBoundTexMemStatic(texture_bytes, SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::updateBoundTexMem(texture_bytes, SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, LLViewerTexture::AVATAR_SCRATCH_TEX) ; } } else { - LLImageGL::updateBoundTexMemStatic(texture_bytes, SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::updateBoundTexMem(texture_bytes, SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, LLViewerTexture::AVATAR_SCRATCH_TEX) ; LLVOAvatar::sScratchTexLastBindTime.addData( format, new F32(LLImageGL::sLastFrameTime) ); } @@ -8229,7 +8252,7 @@ LLGLuint LLVOAvatar::getScratchTexName( LLGLenum format, U32* texture_bytes ) if(gAuditTexture) { - LLImageGL::incTextureCounterStatic(SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, components, LLViewerImageBoostLevel::AVATAR_SCRATCH_TEX) ; + LLImageGL::incTextureCounter(SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ; } return name; @@ -8241,7 +8264,7 @@ LLGLuint LLVOAvatar::getScratchTexName( LLGLenum format, U32* texture_bytes ) //----------------------------------------------------------------------------- // setLocalTextureTE() //----------------------------------------------------------------------------- -void LLVOAvatar::setLocTexTE( U8 te, LLViewerImage* image, BOOL set_by_user ) +void LLVOAvatar::setLocTexTE( U8 te, LLViewerTexture* image, BOOL set_by_user ) { if( !mIsSelf ) { @@ -8305,10 +8328,10 @@ void LLVOAvatar::updateMeshTextures() // if user has never specified a texture, assign the default for (U32 i=0; i < getNumTEs(); i++) { - const LLViewerImage* te_image = getTEImage(i); + const LLViewerTexture* te_image = getTEImage(i); if(!te_image || te_image->getID().isNull() || (te_image->getID() == IMG_DEFAULT)) { - setTEImage(i, gImageList.getImage(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR)); // IMG_DEFAULT_AVATAR = a special texture that's never rendered. + setTEImage(i, LLViewerTextureManager::getFetchedTexture(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR)); // IMG_DEFAULT_AVATAR = a special texture that's never rendered. } } @@ -8365,7 +8388,7 @@ void LLVOAvatar::updateMeshTextures() { if (use_lkg_baked_layer[i] && !self_customizing ) { - LLViewerImage* baked_img = gImageList.getImageFromHost( mBakedTextureData[i].mLastTextureIndex, target_host ); + LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureData[i].mLastTextureIndex, target_host ); mBakedTextureData[i].mIsUsed = TRUE; for (U32 k=0; k < mBakedTextureData[i].mMeshes.size(); k++) { @@ -8374,7 +8397,7 @@ void LLVOAvatar::updateMeshTextures() } else if (!self_customizing && is_layer_baked[i]) { - LLViewerImage* baked_img = getTEImage( mBakedTextureData[i].mTextureIndex ); + LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getTEImage( mBakedTextureData[i].mTextureIndex ), TRUE) ; if( baked_img->getID() == mBakedTextureData[i].mLastTextureIndex ) { // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing). @@ -8385,9 +8408,9 @@ void LLVOAvatar::updateMeshTextures() mBakedTextureData[i].mIsLoaded = FALSE; if ((baked_img->getID() != IMG_INVISIBLE) && (i == BAKED_HEAD || i == BAKED_UPPER || i == BAKED_LOWER)) { - baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ), NULL); } - baked_img->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); + baked_img->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ), NULL); } } else if (mBakedTextureData[i].mTexLayerSet @@ -8410,7 +8433,7 @@ void LLVOAvatar::updateMeshTextures() if (!is_layer_baked[BAKED_HAIR] || self_customizing) { const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1); - LLViewerImage* hair_img = getTEImage( TEX_HAIR ); + LLViewerTexture* hair_img = getTEImage( TEX_HAIR ); for (U32 i = 0; i < mBakedTextureData[BAKED_HAIR].mMeshes.size(); i++) { mBakedTextureData[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); @@ -8439,7 +8462,7 @@ void LLVOAvatar::updateMeshTextures() { const ETextureIndex texture_index = *local_tex_iter; const BOOL is_baked_ready = (is_layer_baked[baked_index] && mBakedTextureData[baked_index].mIsLoaded) || other_culled; - setLocalTexture(texture_index, getTEImage(texture_index), is_baked_ready ); + setLocalTexture(texture_index, LLViewerTextureManager::staticCastToFetchedTexture(getTEImage(texture_index)), is_baked_ready ); } } removeMissingBakedTextures(); @@ -8448,7 +8471,7 @@ void LLVOAvatar::updateMeshTextures() //----------------------------------------------------------------------------- // setLocalTexture() //----------------------------------------------------------------------------- -void LLVOAvatar::setLocalTexture( ETextureIndex index, LLViewerImage* tex, BOOL baked_version_ready ) +void LLVOAvatar::setLocalTexture( ETextureIndex index, LLViewerFetchedTexture* tex, BOOL baked_version_ready ) { if (!isIndexLocalTexture(index)) return; @@ -8479,7 +8502,7 @@ void LLVOAvatar::setLocalTexture( ETextureIndex index, LLViewerImage* tex, BOOL } else { - tex->setLoadedCallback( onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), index) ); + tex->setLoadedCallback( onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), index), NULL ); } } tex->setMinDiscardLevel(desired_discard); @@ -8654,7 +8677,7 @@ void LLVOAvatar::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid ) { // Baked textures live on other sims. LLHost target_host = getObjectHost(); - setTEImage( te, gImageList.getImageFromHost( uuid, target_host ) ); + setTEImage( te, LLViewerTextureManager::getFetchedTextureFromHost( uuid, target_host ) ); if (uuid != IMG_INVISIBLE) { // Do not update textures when setting a new invisible baked texture as @@ -8917,7 +8940,7 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context ) iter++) { const LLVOAvatarDictionary::TextureDictionaryEntry *text_dict = iter->second; - const LLViewerImage* te_image = getTEImage(iter->first); + const LLViewerTexture* te_image = getTEImage(iter->first); if( !te_image ) { llinfos << " " << text_dict->mName << ": null ptr" << llendl; @@ -9136,6 +9159,13 @@ void LLVOAvatar::wearableUpdated(EWearableType type, BOOL upload_result) } } } + + // Physics type has no associated baked textures, but change of params needs to be sent to + // other avatars. + if (isSelf() && type == WT_PHYSICS) + { + gAgent.sendAgentSetAppearance(); + } } @@ -9233,14 +9263,14 @@ void LLVOAvatar::onFirstTEMessageReceived() // (That is, don't do a transition from unbaked to baked.) if (layer_baked) { - LLViewerImage* image = getTEImage( mBakedTextureData[i].mTextureIndex ); + LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getTEImage( mBakedTextureData[i].mTextureIndex )); mBakedTextureData[i].mLastTextureIndex = image->getID(); // If we have more than one texture for the other baked layers, we'll want to call this for them too. if ((image->getID() != IMG_INVISIBLE) && (i == BAKED_HEAD || i == BAKED_UPPER || i == BAKED_LOWER)) { - image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ), NULL); } - image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); + image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ), NULL ); } } @@ -9311,7 +9341,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) && baked_index != BAKED_SKIRT) { setTEImage(mBakedTextureData[baked_index].mTextureIndex, - gImageList.getImage(mBakedTextureData[baked_index].mLastTextureIndex)); + LLViewerTextureManager::getFetchedTexture(mBakedTextureData[baked_index].mLastTextureIndex, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } } @@ -9340,6 +9370,8 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) updateMeshTextures(); // enables updates for laysets without baked textures. + mSupportsPhysics = false; + // parse visual params S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam); if( num_blocks > 1 ) @@ -9357,11 +9389,11 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) for( S32 i = 0; i < num_blocks; i++ ) { - while( param && (!param->isTweakable()) ) + while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) // should not be any of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT { param = getNextVisualParam(); } - + if( !param ) { llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file for " << getFullname() << " (Too many)." << llendl; @@ -9372,7 +9404,11 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) mesgsys->getU8Fast(_PREHASH_VisualParam, _PREHASH_ParamValue, value, i); F32 newWeight = U8_to_F32(value, param->getMinWeight(), param->getMaxWeight()); - if(param->getID() == 507 && newWeight != getActualBoobGrav()) + if(param->getID() == 10000) + { + mSupportsPhysics = true; + } + else if(param->getID() == 507 && newWeight != getActualBoobGrav()) { llwarns << "Boob Grav SET to " << newWeight << " for " << getFullname() << llendl; setActualBoobGrav(newWeight); @@ -9408,14 +9444,14 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } } - while( param && (!param->isTweakable()) ) + while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) { param = getNextVisualParam(); } if( param ) { - if (param->getName() == "tattoo_red") - llinfos << getFullname() << " does not have tattoo tinting." << llendl; + if(param->getName() == "breast_physics_mass") + llinfos << getFullname() << " does not have avatar physics." << llendl; else llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file for " << getFullname() << " (Prematurely reached end of list at " << param->getName() << ")." << llendl; //return; //ASC-TTRFE @@ -9485,7 +9521,7 @@ void LLVOAvatar::getAnimNames( LLDynamicArray* names ) names->put( "enter_away_from_keyboard_state" ); } -void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) +void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) { if (!userdata) return; @@ -9538,7 +9574,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi, if (text_dict->mIsUsedByBakedTexture) { const ETextureIndex texture_index = iter->first; - const LLViewerImage *baked_img = self->getTEImage(texture_index); + const LLViewerTexture *baked_img = self->getTEImage(texture_index); if (baked_img && id == baked_img->getID()) { const EBakedTextureIndex baked_index = text_dict->mBakedTextureIndex; @@ -9583,7 +9619,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi, } // static -void LLVOAvatar::onInitialBakedTextureLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) +void LLVOAvatar::onInitialBakedTextureLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) { LLUUID *avatar_idp = (LLUUID *)userdata; LLVOAvatar *selfp = gObjectList.findAvatar(*avatar_idp); @@ -9598,7 +9634,7 @@ void LLVOAvatar::onInitialBakedTextureLoaded( BOOL success, LLViewerImage *src_v } } -void LLVOAvatar::onBakedTextureLoaded(BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) +void LLVOAvatar::onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) { //llinfos << "onBakedTextureLoaded: " << src_vi->getID() << llendl; @@ -9633,7 +9669,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) mHeadMesh1.setTexture( head_baked ); */ for (U32 i = 0; i < mBakedTextureData.size(); i++) { - LLViewerImage* image_baked = getTEImage( mBakedTextureData[i].mTextureIndex ); + LLViewerTexture* image_baked = getTEImage( mBakedTextureData[i].mTextureIndex ); if (id == image_baked->getID()) { mBakedTextureData[i].mIsLoaded = true; @@ -9652,7 +9688,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) local_tex_iter != baked_dict->mLocalTextures.end(); local_tex_iter++) { - setLocalTexture(*local_tex_iter, getTEImage(*local_tex_iter), TRUE); + setLocalTexture(*local_tex_iter, LLViewerTextureManager::staticCastToFetchedTexture(getTEImage(*local_tex_iter)), TRUE); } // ! BACKWARDS COMPATIBILITY ! @@ -9708,7 +9744,7 @@ void LLVOAvatar::dumpArchetypeXML( void* ) { if( LLVOAvatar::getTEWearableType((ETextureIndex)te) == type ) { - LLViewerImage* te_image = avatar->getTEImage((ETextureIndex)te); + LLViewerTexture* te_image = avatar->getTEImage((ETextureIndex)te); if( te_image ) { std::string uuid_str; @@ -9947,7 +9983,7 @@ void LLVOAvatar::dumpLocalTextures() } else { - const LLViewerImage* image = local_tex_data.mImage; + const LLViewerFetchedTexture* image = local_tex_data.mImage; llinfos << "LocTex " << name << ": " << "Discard " << image->getDiscardLevel() << ", " @@ -9963,7 +9999,7 @@ void LLVOAvatar::dumpLocalTextures() } else { - llinfos << "LocTex " << name << ": No LLViewerImage" << llendl; + llinfos << "LocTex " << name << ": No LLViewerTexture" << llendl; } } } @@ -9990,7 +10026,7 @@ void LLVOAvatar::removeMissingBakedTextures() const S32 te = mBakedTextureData[i].mTextureIndex; if (getTEImage(te)->isMissingAsset()) { - setTEImage(te, gImageList.getImage(IMG_DEFAULT_AVATAR)); + setTEImage(te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR)); removed = TRUE; } } @@ -10675,7 +10711,7 @@ void LLVOAvatar::idleUpdateRenderCost() std::set::const_iterator tex_iter; for(tex_iter = textures.begin();tex_iter != textures.end();++tex_iter) { - LLViewerImage* img = gImageList.getImage(*tex_iter); + LLViewerTexture* img = LLViewerTextureManager::getFetchedTexture(*tex_iter); if(img) { shame += (img->getHeight() * img->getWidth()) >> 4; @@ -10785,7 +10821,7 @@ U32 calc_shame(LLVOVolume* volume, std::set &textures) { LLFace* face = drawablep->getFace(i); const LLTextureEntry* te = face->getTextureEntry(); - LLViewerImage* img = face->getTexture(); + LLViewerTexture* img = face->getTexture(); textures.insert(img->getID()); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 8c33139da..e21337c90 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -55,6 +55,7 @@ extern const LLUUID ANIM_AGENT_BODY_NOISE; extern const LLUUID ANIM_AGENT_BREATHE_ROT; +extern const LLUUID ANIM_AGENT_PHYSICS_MOTION; extern const LLUUID ANIM_AGENT_EDITING; extern const LLUUID ANIM_AGENT_EYE; extern const LLUUID ANIM_AGENT_FLY_ADJUST; @@ -98,6 +99,9 @@ public: void getClientInfo(std::string& clientTag, LLColor4& tagColor, BOOL useComment=FALSE); std::string extraMetadata; // + + // EmeraldBoobUtils + bool mSupportsPhysics; //Client supports v2 wearable physics. Disable emerald physics. //-------------------------------------------------------------------- // LLViewerObject interface @@ -342,8 +346,8 @@ public: LLVOAvatarDefines::ETextureIndex getBakedTE( LLTexLayerSet* layerset ); void updateComposites(); void onGlobalColorChanged( LLTexGlobalColor* global_color, BOOL set_by_user ); - BOOL getLocalTextureRaw( LLVOAvatarDefines::ETextureIndex index, LLImageRaw* image_raw_pp ); - BOOL getLocalTextureGL( LLVOAvatarDefines::ETextureIndex index, LLImageGL** image_gl_pp ); + //BOOL getLocalTextureRaw( LLVOAvatarDefines::ETextureIndex index, LLImageRaw* image_raw_pp ); + BOOL getLocalTextureGL( LLVOAvatarDefines::ETextureIndex index, LLViewerTexture** image_gl_pp ); const LLUUID& getLocalTextureID( LLVOAvatarDefines::ETextureIndex index ); LLGLuint getScratchTexName( LLGLenum format, U32* texture_bytes ); BOOL bindScratchTexture( LLGLenum format ); @@ -356,7 +360,7 @@ public: void releaseUnnecessaryTextures(); void requestLayerSetUploads(); bool hasPendingBakedUploads(); - static void onLocalTextureLoaded( BOOL succcess, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); + static void onLocalTextureLoaded( BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); static void dumpArchetypeXML( void* ); static void dumpScratchTextureByteCount(); static void dumpBakedStatus(); @@ -387,7 +391,7 @@ public: // texture compositing //-------------------------------------------------------------------- public: - void setLocTexTE( U8 te, LLViewerImage* image, BOOL set_by_user ); + void setLocTexTE( U8 te, LLViewerTexture* image, BOOL set_by_user ); void setupComposites(); typedef std::map lod_mesh_map_t; @@ -488,7 +492,7 @@ public: private: LLFace* mShadow0Facep; LLFace* mShadow1Facep; - LLPointer mShadowImagep; + LLPointer mShadowImagep; //-------------------------------------------------------------------- // Keeps track of foot step state for generating sounds @@ -629,6 +633,7 @@ public: static BOOL sDebugInvisible; static BOOL sShowAttachmentPoints; static F32 sLODFactor; // user-settable LOD factor + static F32 sPhysicsLODFactor; // user-settable physics LOD factor static BOOL sJointDebug; // output total number of joints being touched for each avatar static BOOL sDebugAvatarRotation; static F32 sAvMorphTime; @@ -795,13 +800,13 @@ protected: BOOL isFullyBaked(); void deleteLayerSetCaches(bool clearAll = true); static BOOL areAllNearbyInstancesBaked(S32& grey_avatars); - static void onBakedTextureMasksLoaded(BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); - void setLocalTexture(LLVOAvatarDefines::ETextureIndex i, LLViewerImage* tex, BOOL baked_version_exits); + static void onBakedTextureMasksLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); + void setLocalTexture(LLVOAvatarDefines::ETextureIndex i, LLViewerFetchedTexture* tex, BOOL baked_version_exits); void requestLayerSetUpdate(LLVOAvatarDefines::ETextureIndex i); - void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex i, LLViewerImage* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked); - void addBakedTextureStats( LLViewerImage* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level); - static void onInitialBakedTextureLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); - static void onBakedTextureLoaded(BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); + void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex i, LLViewerTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked); + void addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level); + static void onInitialBakedTextureLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ); + static void onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); void useBakedTexture(const LLUUID& id); void dumpAvatarTEs(const std::string& context); void removeMissingBakedTextures(); @@ -854,10 +859,10 @@ private: struct LocalTextureData { - LocalTextureData() : mIsBakedReady(FALSE), mDiscard(MAX_DISCARD_LEVEL+1), mImage(NULL) + LocalTextureData() : mIsBakedReady(false), mDiscard(MAX_DISCARD_LEVEL+1), mImage(NULL) {} - LLPointer mImage; - BOOL mIsBakedReady; + LLPointer mImage; + bool mIsBakedReady; S32 mDiscard; }; typedef std::map localtexture_map_t; diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp index a24054b4f..0346301ff 100644 --- a/indra/newview/llvoclouds.cpp +++ b/indra/newview/llvoclouds.cpp @@ -44,7 +44,7 @@ #include "llprimitive.h" #include "llsky.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" #include "llvosky.h" @@ -61,8 +61,8 @@ LLVOClouds::LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re mCloudGroupp = NULL; mbCanSelect = FALSE; setNumTEs(1); - LLViewerImage* image = gImageList.getImage(gCloudTextureID); - image->setBoostLevel(LLViewerImageBoostLevel::BOOST_CLOUDS); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(gCloudTextureID); + image->setBoostLevel(LLViewerTexture::BOOST_CLOUDS); setTEImage(0, image); } diff --git a/indra/newview/llvoclouds.h b/indra/newview/llvoclouds.h index 52e5a681e..c4a75f5b5 100644 --- a/indra/newview/llvoclouds.h +++ b/indra/newview/llvoclouds.h @@ -37,7 +37,7 @@ #include "lltable.h" #include "v4coloru.h" -class LLViewerImage; +class LLViewerTexture; class LLViewerCloudGroup; class LLCloudGroup; diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index f5c4e9d3c..0cd754a8d 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -47,7 +47,7 @@ #include "llvosky.h" #include "llvotree.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "pipeline.h" #include "llspatialpartition.h" @@ -107,7 +107,7 @@ void LLVOGrass::updateSpecies() SpeciesMap::const_iterator it = sSpeciesTable.begin(); mSpecies = (*it).first; } - setTEImage(0, gImageList.getImage(sSpeciesTable[mSpecies]->mTextureID)); + setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } @@ -172,7 +172,7 @@ void LLVOGrass::initClass() static LLStdStringHandle texture_name_string = LLXmlTree::addAttributeString("texture_name"); success &= grass_def->getFastAttributeString(texture_name_string, textureName); - LLViewerImage* grass_image = gImageList.getImageFromFile(textureName); + LLViewerTexture* grass_image = LLViewerTextureManager::getFetchedTextureFromFile(textureName); newGrass->mTextureID = grass_image->getID(); } diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h index fe2667f4d..6a6fcc31c 100644 --- a/indra/newview/llvograss.h +++ b/indra/newview/llvograss.h @@ -38,7 +38,7 @@ #include class LLSurfacePatch; -class LLViewerImage; +class LLViewerTexture; class LLVOGrass : public LLAlphaObject diff --git a/indra/newview/llvoground.h b/indra/newview/llvoground.h index b58ebae33..0ccb0834a 100644 --- a/indra/newview/llvoground.h +++ b/indra/newview/llvoground.h @@ -36,7 +36,7 @@ #include "stdtypes.h" #include "v3color.h" #include "v4coloru.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llviewerobject.h" class LLVOGround : public LLStaticViewerObject diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index eca5594a5..79e8fc535 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1781,7 +1781,7 @@ void LLVoiceClient::stateMachine() if(!mSocket) { - mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); + mSocket = LLSocket::create(LLSocket::STREAM_TCP); } mConnected = mSocket->blockingConnect(mDaemonHost); diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index 5606398aa..1a899db7f 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -43,8 +43,7 @@ #include "llviewercamera.h" #include "llviewerobject.h" #include "llimagegl.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llvoiceclient.h" #include "llrender.h" @@ -143,7 +142,7 @@ LLVoiceVisualizer::LLVoiceVisualizer( const U8 type ) for (int i=0; igetLeftAxis() * DOT_SIZE; - LLVector3 u = LLViewerCamera::getInstance()->getUpAxis() * DOT_SIZE; + LLViewerCamera* camera = LLViewerCamera::getInstance(); + LLVector3 l = camera->getLeftAxis() * DOT_SIZE; + LLVector3 u = camera->getUpAxis() * DOT_SIZE; LLVector3 bottomLeft = mSoundSymbol.mPosition + l - u; LLVector3 bottomRight = mSoundSymbol.mPosition - l - u; @@ -497,8 +497,8 @@ void LLVoiceVisualizer::render() F32 width = i * WAVE_WIDTH_SCALE * mSoundSymbol.mWaveExpansion[i]; F32 height = i * WAVE_HEIGHT_SCALE * mSoundSymbol.mWaveExpansion[i]; - LLVector3 l = LLViewerCamera::getInstance()->getLeftAxis() * width; - LLVector3 u = LLViewerCamera::getInstance()->getUpAxis() * height; + LLVector3 l = camera->getLeftAxis() * width; + LLVector3 u = camera->getUpAxis() * height; LLVector3 bottomLeft = mSoundSymbol.mPosition + l - u; LLVector3 bottomRight = mSoundSymbol.mPosition - l - u; diff --git a/indra/newview/llvoicevisualizer.h b/indra/newview/llvoicevisualizer.h index 0cbf24b78..0868ca9a3 100644 --- a/indra/newview/llvoicevisualizer.h +++ b/indra/newview/llvoicevisualizer.h @@ -121,7 +121,7 @@ class LLVoiceVisualizer : public LLHUDEffect bool mWaveActive [ NUM_VOICE_SYMBOL_WAVES ]; F64 mWaveFadeOutStartTime [ NUM_VOICE_SYMBOL_WAVES ]; F32 mWaveOpacity [ NUM_VOICE_SYMBOL_WAVES ]; - LLPointer mTexture [ NUM_VOICE_SYMBOL_WAVES ]; + LLPointer mTexture [ NUM_VOICE_SYMBOL_WAVES ]; bool mActive; LLVector3 mPosition; }; diff --git a/indra/newview/llvoinventorylistener.h b/indra/newview/llvoinventorylistener.h index 335e867fc..1531e6e33 100644 --- a/indra/newview/llvoinventorylistener.h +++ b/indra/newview/llvoinventorylistener.h @@ -42,7 +42,7 @@ class LLVOInventoryListener { public: virtual void inventoryChanged(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void* user_data) = 0; diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 0443aaaca..f2f835220 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -49,7 +49,7 @@ #include "llglheaders.h" #include "llsky.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" #include "llworld.h" @@ -226,8 +226,8 @@ void LLSkyTex::init() for (S32 i = 0; i < 2; ++i) { - mImageGL[i] = new LLImageGL(FALSE); - mImageGL[i]->setAddressMode(LLTexUnit::TAM_CLAMP); + mTexture[i] = LLViewerTextureManager::getLocalTexture(FALSE); + mTexture[i]->setAddressMode(LLTexUnit::TAM_CLAMP); mImageRaw[i] = new LLImageRaw(sResolution, sResolution, sComponents); initEmpty(i); @@ -236,16 +236,16 @@ void LLSkyTex::init() void LLSkyTex::cleanupGL() { - mImageGL[0] = NULL; - mImageGL[1] = NULL; + mTexture[0] = NULL; + mTexture[1] = NULL; } void LLSkyTex::restoreGL() { for (S32 i = 0; i < 2; i++) { - mImageGL[i] = new LLImageGL(FALSE); - mImageGL[i]->setAddressMode(LLTexUnit::TAM_CLAMP); + mTexture[i] = LLViewerTextureManager::getLocalTexture(FALSE); + mTexture[i]->setAddressMode(LLTexUnit::TAM_CLAMP); } } @@ -303,13 +303,13 @@ void LLSkyTex::create(const F32 brightness) void LLSkyTex::createGLImage(S32 which) { - mImageGL[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLViewerImageBoostLevel::OTHER); - mImageGL[which]->setAddressMode(LLTexUnit::TAM_CLAMP); + mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLViewerTexture::LOCAL); + mTexture[which]->setAddressMode(LLTexUnit::TAM_CLAMP); } void LLSkyTex::bindTexture(BOOL curr) { - gGL.getTexUnit(0)->bind(mImageGL[getWhich(curr)]); + gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)]); } /*************************************** @@ -390,11 +390,11 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) mSun.setIntensity(SUN_INTENSITY); mMoon.setIntensity(0.1f * SUN_INTENSITY); - mSunTexturep = gImageList.getImage(gSunTextureID, TRUE, TRUE); + mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - mMoonTexturep = gImageList.getImage(gMoonTextureID, TRUE, TRUE); + mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - mBloomTexturep = gImageList.getImage(IMG_BLOOM1); + mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1); mBloomTexturep->setNoDelete() ; mBloomTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -485,11 +485,11 @@ void LLVOSky::restoreGL() { mSkyTex[i].restoreGL(); } - mSunTexturep = gImageList.getImage(gSunTextureID, TRUE, TRUE); + mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - mMoonTexturep = gImageList.getImage(gMoonTextureID, TRUE, TRUE); + mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - mBloomTexturep = gImageList.getImage(IMG_BLOOM1); + mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1); mBloomTexturep->setNoDelete() ; mBloomTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index 19dd1443d..67e79ff88 100644 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -36,7 +36,7 @@ #include "stdtypes.h" #include "v3color.h" #include "v4coloru.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llviewerobject.h" #include "llframetimer.h" @@ -122,7 +122,7 @@ class LLSkyTex private: static S32 sResolution; static S32 sComponents; - LLPointer mImageGL[2]; + LLPointer mTexture[2]; LLPointer mImageRaw[2]; LLColor4 *mSkyData; LLVector3 *mSkyDirs; // Cache of sky direction vectors @@ -547,9 +547,9 @@ public: BOOL isReflFace(const LLFace* face) const { return face == mFace[FACE_REFLECTION]; } LLFace* getReflFace() const { return mFace[FACE_REFLECTION]; } - LLViewerImage* getSunTex() const { return mSunTexturep; } - LLViewerImage* getMoonTex() const { return mMoonTexturep; } - LLViewerImage* getBloomTex() const { return mBloomTexturep; } + LLViewerTexture* getSunTex() const { return mSunTexturep; } + LLViewerTexture* getMoonTex() const { return mMoonTexturep; } + LLViewerTexture* getBloomTex() const { return mBloomTexturep; } void forceSkyUpdate(void) { mForceUpdate = TRUE; } public: @@ -559,9 +559,9 @@ public: protected: ~LLVOSky(); - LLPointer mSunTexturep; - LLPointer mMoonTexturep; - LLPointer mBloomTexturep; + LLPointer mSunTexturep; + LLPointer mMoonTexturep; + LLPointer mBloomTexturep; static S32 sResolution; static S32 sTileResX; diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp index 5943f9be9..f35f3d533 100644 --- a/indra/newview/llvotextbubble.cpp +++ b/indra/newview/llvotextbubble.cpp @@ -43,7 +43,7 @@ #include "llbox.h" #include "lldrawable.h" #include "llface.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llvolume.h" #include "pipeline.h" #include "llviewerregion.h" @@ -125,7 +125,7 @@ void LLVOTextBubble::updateTextures() const LLTextureEntry *te = getTE(i); F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT); texel_area_ratio = llclamp(texel_area_ratio, .125f, 16.f); - LLViewerImage *imagep = getTEImage(i); + LLViewerTexture *imagep = getTEImage(i); if (imagep) { imagep->addTextureStats(mPixelArea / texel_area_ratio); @@ -142,9 +142,9 @@ LLDrawable *LLVOTextBubble::createDrawable(LLPipeline *pipeline) for (U32 i = 0; i < getNumTEs(); i++) { - LLViewerImage *imagep; + LLViewerTexture *imagep; const LLTextureEntry *texture_entry = getTE(i); - imagep = gImageList.getImage(texture_entry->getID()); + imagep = LLViewerTextureManager::getFetchedTexture(texture_entry->getID()); mDrawable->addFace((LLFacePool*) NULL, imagep); } @@ -194,7 +194,7 @@ BOOL LLVOTextBubble::updateGeometry(LLDrawable *drawable) { LLFace *face = drawable->getFace(i); face->setTEOffset(i); - face->setTexture(LLViewerImage::sSmokeImagep); + face->setTexture(LLViewerFetchedTexture::sSmokeImagep); face->setState(LLFace::FULLBRIGHT); } diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 2c6fa925a..8e0d09f2a 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -50,7 +50,7 @@ #include "lldrawable.h" #include "llface.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" #include "llworld.h" @@ -68,12 +68,14 @@ const F32 LEAF_TOP = 1.0f; const F32 LEAF_BOTTOM = 0.52f; const F32 LEAF_WIDTH = 1.f; -S32 LLVOTree::sLODVertexOffset[4]; -S32 LLVOTree::sLODVertexCount[4]; -S32 LLVOTree::sLODIndexOffset[4]; -S32 LLVOTree::sLODIndexCount[4]; -S32 LLVOTree::sLODSlices[4] = {10, 5, 4, 3}; -F32 LLVOTree::sLODAngles[4] = {30.f, 20.f, 15.f, 0.f}; +const S32 LLVOTree::sMAX_NUM_TREE_LOD_LEVELS = 4 ; + +S32 LLVOTree::sLODVertexOffset[sMAX_NUM_TREE_LOD_LEVELS]; +S32 LLVOTree::sLODVertexCount[sMAX_NUM_TREE_LOD_LEVELS]; +S32 LLVOTree::sLODIndexOffset[sMAX_NUM_TREE_LOD_LEVELS]; +S32 LLVOTree::sLODIndexCount[sMAX_NUM_TREE_LOD_LEVELS]; +S32 LLVOTree::sLODSlices[sMAX_NUM_TREE_LOD_LEVELS] = {10, 5, 4, 3}; +F32 LLVOTree::sLODAngles[sMAX_NUM_TREE_LOD_LEVELS] = {30.f, 20.f, 15.f, F_ALMOST_ZERO}; F32 LLVOTree::sTreeFactor = 1.f; @@ -104,7 +106,7 @@ LLVOTree::~LLVOTree() //static bool LLVOTree::isTreeRenderingStopped() { - return LLVOTree::sTreeFactor < LLVOTree::sLODAngles[4 - 1] ; + return LLVOTree::sTreeFactor < LLVOTree::sLODAngles[sMAX_NUM_TREE_LOD_LEVELS - 1] ; } // static @@ -319,11 +321,10 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys, // // Load Species-Specific data // - mTreeImagep = gImageList.getImage(sSpeciesTable[mSpecies]->mTextureID); - if (mTreeImagep) - { - gGL.getTexUnit(0)->bind(mTreeImagep.get()); - } + static const S32 MAX_TREE_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL = 32 ; //frames. + mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mTreeImagep->setMaxVirtualSizeResetInterval(MAX_TREE_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); //allow to wait for at most 16 frames to reset virtual size. + mBranchLength = sSpeciesTable[mSpecies]->mBranchLength; mTrunkLength = sSpeciesTable[mSpecies]->mTrunkLength; mLeafScale = sSpeciesTable[mSpecies]->mLeafScale; @@ -459,9 +460,8 @@ void LLVOTree::setPixelAreaAndAngle(LLAgent &agent) F32 cos_angle_to_view_dir = lookAt * LLViewerCamera::getInstance()->getXAxis() ; F32 range = dist - getMinScale()/2; - if (range < F_ALMOST_ZERO) // range == zero + if (range < F_ALMOST_ZERO || isHUDAttachment()) // range == zero { - range = 0; mAppAngle = 180.f; } else @@ -548,7 +548,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable) face->mCenterAgent = getPositionAgent(); face->mCenterLocal = face->mCenterAgent; - for (lod = 0; lod < 4; lod++) + for (lod = 0; lod < sMAX_NUM_TREE_LOD_LEVELS; lod++) { slices = sLODSlices[lod]; sLODVertexOffset[lod] = max_vertices; @@ -726,7 +726,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable) // Generate the vertices // Generate the indices - for (lod = 0; lod < 4; lod++) + for (lod = 0; lod < sMAX_NUM_TREE_LOD_LEVELS; lod++) { slices = sLODSlices[lod]; F32 base_radius = 0.65f; diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index 133f39352..89c15b587 100644 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -39,7 +39,7 @@ class LLFace; class LLDrawPool; - +class LLViewerFetchedTexture; class LLVOTree : public LLViewerObject { @@ -153,6 +153,7 @@ public: }; static F32 sTreeFactor; // Tree level of detail factor + static const S32 sMAX_NUM_TREE_LOD_LEVELS ; friend class LLDrawPoolTree; protected: @@ -161,7 +162,7 @@ protected: LLVector3 mWind; LLPointer mReferenceBuffer; //reference geometry for generating tree mesh - LLPointer mTreeImagep; // Pointer to proper tree image + LLPointer mTreeImagep; // Pointer to proper tree image U8 mSpecies; // Species of tree F32 mBranchLength; // Scale (length) of tree branches diff --git a/indra/newview/llvotreenew.h b/indra/newview/llvotreenew.h index 4960d909c..426470101 100644 --- a/indra/newview/llvotreenew.h +++ b/indra/newview/llvotreenew.h @@ -41,7 +41,7 @@ #include "llstrider.h" #include "v2math.h" #include "v3math.h" -#include "llviewerimage.h" +#include "llviewertexture.h" class LLFace; class LLDrawPool; @@ -187,7 +187,7 @@ public: //LLTreeParams mParams; U8 mSpecies; - LLPointer mTreeImagep; + LLPointer mTreeImagep; LLMatrix4 mTrunkFlareFrames[MAX_FLARE]; F32 mSegSplitsError[3]; U32 mRandOffset[MAX_LEVELS]; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 0eb19b92d..62c9ec640 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -57,7 +57,7 @@ #include "llsky.h" #include "lltexturefetch.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "llviewertextureanim.h" #include "llworld.h" @@ -485,7 +485,7 @@ void LLVOVolume::updateTextureVirtualSize() return; } - if (LLViewerImage::sDontLoadVolumeTextures || LLAppViewer::getTextureFetch()->mDebugPause) + if (LLViewerTexture::sDontLoadVolumeTextures || LLAppViewer::getTextureFetch()->mDebugPause) { return; } @@ -502,7 +502,7 @@ void LLVOVolume::updateTextureVirtualSize() { LLFace* face = mDrawable->getFace(i); const LLTextureEntry *te = face->getTextureEntry(); - LLViewerImage *imagep = face->getTexture(); + LLViewerTexture *imagep = face->getTexture(); if (!imagep || !te || face->mExtents[0] == face->mExtents[1]) { @@ -516,7 +516,7 @@ void LLVOVolume::updateTextureVirtualSize() { F32 area = (F32) LLViewerCamera::getInstance()->getScreenPixelArea(); vsize = area; - imagep->setBoostLevel(LLViewerImageBoostLevel::BOOST_HUD); + imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); face->setPixelArea(area); // treat as full screen face->setVirtualSize(vsize); } @@ -531,7 +531,7 @@ void LLVOVolume::updateTextureVirtualSize() // Our attachments must really rez fast and fully: // we shouldn't have to zoom on them to get the textures // fully loaded ! - imagep->setBoostLevel(LLViewerImageBoostLevel::BOOST_HUD); + imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); imagep->dontDiscard(); } } @@ -575,14 +575,14 @@ void LLVOVolume::updateTextureVirtualSize() if (mSculptTexture.notNull()) { mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), - (S32)LLViewerImageBoostLevel::BOOST_SCULPTED)); + (S32)LLViewerTexture::BOOST_SCULPTED)); mSculptTexture->setForSculpt() ; if(!mSculptTexture->isCachedRawImageReady()) { S32 lod = llmin(mLOD, 3); F32 lodf = ((F32)(lod + 1.0f)/4.f); - F32 tex_size = lodf * LLViewerImage::sMaxSculptRez ; + F32 tex_size = lodf * LLViewerTexture::sMaxSculptRez ; mSculptTexture->addTextureStats(2.f * tex_size * tex_size, FALSE); //if the sculpty very close to the view point, load first @@ -675,7 +675,7 @@ void LLVOVolume::setScale(const LLVector3 &scale, BOOL damped) LLFace* LLVOVolume::addFace(S32 f) { const LLTextureEntry* te = getTE(f); - LLViewerImage* imagep = getTEImage(f); + LLViewerTexture* imagep = getTEImage(f); return mDrawable->addFace(te, imagep); } @@ -767,7 +767,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail void LLVOVolume::updateSculptTexture() { - LLPointer old_sculpt = mSculptTexture; + LLPointer old_sculpt = mSculptTexture; if (isSculpted()) { @@ -775,7 +775,7 @@ void LLVOVolume::updateSculptTexture() LLUUID id = sculpt_params->getSculptTexture(); if (id.notNull()) { - mSculptTexture = gImageList.getImage(id); + mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); } } else @@ -1309,7 +1309,7 @@ BOOL LLVOVolume::isRootEdit() const return TRUE; } -void LLVOVolume::setTEImage(const U8 te, LLViewerImage *imagep) +void LLVOVolume::setTEImage(const U8 te, LLViewerTexture *imagep) { BOOL changed = (mTEImages[te] != imagep); LLViewerObject::setTEImage(te, imagep); @@ -1801,7 +1801,7 @@ void LLVOVolume::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_p trans_mat.translate(getRegion()->getOriginAgent()); } - volume->generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, nodep->mSilhouetteSegments, view_vector, trans_mat, mRelativeXformInvTrans); + volume->generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, nodep->mSilhouetteSegments, view_vector, trans_mat, mRelativeXformInvTrans, nodep->getTESelectMask()); nodep->mSilhouetteExists = TRUE; } @@ -2104,7 +2104,7 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e { LLFace* face = mDrawable->getFace(face_hit); - if (pick_transparent || !face->getTexture() || !face->getTexture()->getHasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))) + if (pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))) { v_end = p; if (face_hitp != NULL) @@ -2156,7 +2156,7 @@ U32 LLVOVolume::getPartitionType() const LLVolumePartition::LLVolumePartition() : LLSpatialPartition(LLVOVolume::VERTEX_DATA_MASK, TRUE, GL_DYNAMIC_DRAW_ARB) { - mLODPeriod = 16; + mLODPeriod = 32; mDepthMask = FALSE; mDrawableType = LLPipeline::RENDER_TYPE_VOLUME; mPartitionType = LLViewerRegion::PARTITION_VOLUME; @@ -2168,7 +2168,7 @@ LLVolumeBridge::LLVolumeBridge(LLDrawable* drawablep) : LLSpatialBridge(drawablep, TRUE, LLVOVolume::VERTEX_DATA_MASK) { mDepthMask = FALSE; - mLODPeriod = 16; + mLODPeriod = 32; mDrawableType = LLPipeline::RENDER_TYPE_VOLUME; mPartitionType = LLViewerRegion::PARTITION_BRIDGE; @@ -2224,9 +2224,10 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, model_mat = &(drawable->getRegion()->mRenderMatrix); } - U8 bump = (type == LLRenderPass::PASS_BUMP ? facep->getTextureEntry()->getBumpmap() : 0); + + U8 bump = (type == LLRenderPass::PASS_BUMP || type == LLRenderPass::PASS_POST_BUMP) ? facep->getTextureEntry()->getBumpmap() : 0; - LLViewerImage* tex = facep->getTexture(); + LLViewerTexture* tex = facep->getTexture(); U8 glow = 0; @@ -2381,7 +2382,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA) { const LLTextureEntry* te = facep->getTextureEntry(); - LLViewerImage* tex = facep->getTexture(); + LLViewerTexture* tex = facep->getTexture(); if (facep->isState(LLFace::TEXTURE_ANIM)) { @@ -2634,7 +2635,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: LLSpatialGroup::buffer_map_t buffer_map; - LLViewerImage* last_tex = NULL; + LLViewerTexture* last_tex = NULL; S32 buffer_index = 0; if (distance_sort) @@ -2646,7 +2647,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: { //pull off next face LLFace* facep = *face_iter; - LLViewerImage* tex = facep->getTexture(); + LLViewerTexture* tex = facep->getTexture(); if (distance_sort) { @@ -2707,9 +2708,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: { if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage) { - buffer = createVertexBuffer(group->mSpatialPartition->mVertexDataMask, + //Using group->mSpatialPartition->mVertexDataMask may be dropping MAP_BINORMAL on RENDER_BUMP... + buffer = createVertexBuffer(mask /*group->mSpatialPartition->mVertexDataMask*/, group->mBufferUsage); buffer->allocateBuffer(geom_count, index_count, TRUE); + llassert_always(buffer->getTypeMask() == mask); } else { @@ -2761,7 +2764,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: const LLTextureEntry* te = facep->getTextureEntry(); - BOOL is_alpha = facep->getPoolType() == LLDrawPool::POOL_ALPHA ? TRUE : FALSE; + BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE; if (is_alpha) { @@ -2801,13 +2804,17 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: } else if (LLPipeline::sRenderDeferred) { //deferred rendering - if (te->getBumpmap()) - { //register in deferred bump pass - registerFace(group, facep, LLRenderPass::PASS_BUMP); - } - else if (te->getFullbright()) + if (te->getFullbright()) { //register in post deferred fullbright shiny pass registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_SHINY); + if (te->getBumpmap()) + { //register in post deferred bump pass + registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); + } + } + else if (te->getBumpmap()) + { //register in deferred bump pass + registerFace(group, facep, LLRenderPass::PASS_BUMP); } else { //register in deferred simple pass (deferred simple includes shiny) @@ -2833,6 +2840,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: else if (fullbright) { //fullbright registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); + if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap()) + { //if this is the deferred render and a bump map is present, register in post deferred bump + registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); + } } else { diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 371a01d5d..8f1b11bae 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -34,7 +34,7 @@ #define LL_LLVOVOLUME_H #include "llviewerobject.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llframetimer.h" #include "llapr.h" #include @@ -154,7 +154,7 @@ public: /*virtual*/ void setScale(const LLVector3 &scale, BOOL damped); - /*virtual*/ void setTEImage(const U8 te, LLViewerImage *imagep); + /*virtual*/ void setTEImage(const U8 te, LLViewerTexture *imagep); /*virtual*/ S32 setTETexture(const U8 te, const LLUUID &uuid); /*virtual*/ S32 setTEColor(const U8 te, const LLColor3 &color); /*virtual*/ S32 setTEColor(const U8 te, const LLColor4 &color); @@ -242,7 +242,7 @@ private: BOOL mVolumeChanged; F32 mVObjRadius; LLVolumeInterface *mVolumeImpl; - LLPointer mSculptTexture; + LLPointer mSculptTexture; S32 mIndexInTex; // statics diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index f53654179..0e80c62b2 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -45,7 +45,7 @@ #include "llsurface.h" #include "llvosky.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "llworld.h" #include "pipeline.h" diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h index 30753daa3..43b2b55dc 100644 --- a/indra/newview/llvowater.h +++ b/indra/newview/llvowater.h @@ -34,7 +34,7 @@ #define LL_VOWATER_H #include "llviewerobject.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "pipeline.h" #include "v2math.h" diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp index 330bc8a39..9af050c4c 100644 --- a/indra/newview/llwatchdog.cpp +++ b/indra/newview/llwatchdog.cpp @@ -184,8 +184,8 @@ void LLWatchdog::init(killer_event_callback func) mKillerCallback = func; if(!mSuspectsAccessMutex && !mTimer) { - mSuspectsAccessMutex = new LLMutex(NULL); - mTimer = new LLWatchdogTimerThread(); + mSuspectsAccessMutex = new LLMutex; + mTimer = new LLWatchdogTimerThread; mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000); mLastClockCount = LLTimer::getTotalTime(); diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 848c8137f..682079249 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -143,10 +143,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) void LLWaterParamManager::loadPreset(const std::string & name,bool propagate) { // bugfix for SL-46920: preventing filenames that break stuff. - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_filename(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_filename = LLWeb::curlEscape(name); escaped_filename += ".xml"; @@ -199,10 +196,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate) void LLWaterParamManager::savePreset(const std::string & name) { // bugfix for SL-46920: preventing filenames that break stuff. - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_filename(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_filename = LLWeb::curlEscape(name); escaped_filename += ".xml"; @@ -415,10 +409,7 @@ bool LLWaterParamManager::removeParamSet(const std::string& name, bool delete_fr std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", "")); // use full curl escaped name - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_name(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_name = LLWeb::curlEscape(name); gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml"); } diff --git a/indra/newview/llwaterparamset.cpp b/indra/newview/llwaterparamset.cpp index a26ccedfb..3e97f9dbe 100644 --- a/indra/newview/llwaterparamset.cpp +++ b/indra/newview/llwaterparamset.cpp @@ -39,7 +39,7 @@ #include "llwaterparammanager.h" #include "lluictrlfactory.h" #include "llsliderctrl.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewercontrol.h" #include "lluuid.h" diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index f83fa4dbb..e85726166 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -43,7 +43,7 @@ #include "llviewerwindow.h" #include "llfloatercustomize.h" #include "llinventorymodel.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerregion.h" #include "llvoavatar.h" @@ -72,6 +72,7 @@ const std::string LLWearable::sTypeName[ WT_COUNT+1 ] = "skirt", "alpha", "tattoo", + "physics", "invalid" }; @@ -93,6 +94,7 @@ const std::string LLWearable::sTypeLabel[ WT_COUNT+1 ] = "Skirt", "Alpha", "Tattoo", + "Physics", "invalid" }; @@ -118,6 +120,7 @@ LLAssetType::EType LLWearable::typeToAssetType(EWearableType wearable_type) case WT_SKIRT: case WT_ALPHA: case WT_TATTOO: + case WT_PHYSICS: return LLAssetType::AT_CLOTHING; default: return LLAssetType::AT_NONE; @@ -657,7 +660,7 @@ BOOL LLWearable::isDirty() { if( LLVOAvatar::getTEWearableType((ETextureIndex) te ) == mType ) { - LLViewerImage* avatar_image = avatar->getTEImage( te ); + LLViewerTexture* avatar_image = avatar->getTEImage( te ); if( !avatar_image ) { llassert( 0 ); @@ -768,7 +771,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user ) if( LLVOAvatar::getTEWearableType((ETextureIndex) te ) == mType ) { const LLUUID& image_id = get_if_there(mTEMap, te, LLVOAvatar::getDefaultTEImageID((ETextureIndex) te ) ); - LLViewerImage* image = gImageList.getImage( image_id ); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id ); avatar->setLocTexTE( te, image, set_by_user ); } } @@ -839,7 +842,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user ) } // Pull textures - LLViewerImage* image = gImageList.getImage( IMG_DEFAULT_AVATAR ); + LLViewerTexture* image =LLViewerTextureManager::getFetchedTexture( IMG_DEFAULT_AVATAR ); for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) { if( LLVOAvatar::getTEWearableType((ETextureIndex) te ) == type ) @@ -906,7 +909,7 @@ void LLWearable::readFromAvatar() { if( LLVOAvatar::getTEWearableType((ETextureIndex) te ) == mType ) { - LLViewerImage* image = avatar->getTEImage( te ); + LLViewerTexture* image = avatar->getTEImage( te ); if( image ) { mTEMap[te] = image->getID(); diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index 253ae97b0..72d876359 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -58,7 +58,8 @@ enum EWearableType // If you change this, update LLWearable::getTypeName(), get WT_SKIRT = 12, WT_ALPHA = 13, WT_TATTOO = 14, - WT_COUNT = 15, + WT_PHYSICS = 15, + WT_COUNT = 16, WT_INVALID = 255 }; diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 512c03fa4..0ab91c58e 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -219,11 +219,7 @@ LLWearable* LLWearableList::createWearableMatchedToInventoryItem( LLWearable* ol { lldebugs << "LLWearableList::createWearableMatchedToInventoryItem()" << llendl; - LLTransactionID tid; - LLAssetID new_asset_id; - new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - LLWearable* wearable = new LLWearable( tid ); + LLWearable* wearable = generateNewWearable(); wearable->copyDataFrom( old_wearable ); wearable->setName( item->getName() ); @@ -231,8 +227,6 @@ LLWearable* LLWearableList::createWearableMatchedToInventoryItem( LLWearable* ol wearable->setPermissions( item->getPermissions() ); wearable->setSaleInfo( item->getSaleInfo() ); - mList[ new_asset_id ] = wearable; - // Send to the dataserver wearable->saveNewAsset(); @@ -242,22 +236,15 @@ LLWearable* LLWearableList::createWearableMatchedToInventoryItem( LLWearable* ol LLWearable* LLWearableList::createCopyFromAvatar( LLWearable* old_wearable, const std::string& new_name ) { lldebugs << "LLWearableList::createCopyFromAvatar()" << llendl; - - LLTransactionID tid; - LLAssetID new_asset_id; - tid.generate(); - new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - LLWearable* wearable = new LLWearable( tid ); + LLWearable* wearable = generateNewWearable(); wearable->copyDataFrom( old_wearable ); LLPermissions perm(old_wearable->getPermissions()); perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true); wearable->setPermissions(perm); wearable->readFromAvatar(); // update from the avatar - - if (!new_name.empty()) wearable->setName(new_name); - mList[ new_asset_id ] = wearable; + if (!new_name.empty()) wearable->setName(new_name); // Send to the dataserver wearable->saveNewAsset(); @@ -270,17 +257,13 @@ LLWearable* LLWearableList::createCopy( LLWearable* old_wearable ) { lldebugs << "LLWearableList::createCopy()" << llendl; - LLTransactionID tid; - LLAssetID new_asset_id; - tid.generate(); - new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - LLWearable* wearable = new LLWearable( tid ); - wearable->copyDataFrom( old_wearable ); + LLWearable *wearable = generateNewWearable(); + wearable->copyDataFrom(old_wearable); + LLPermissions perm(old_wearable->getPermissions()); perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true); wearable->setPermissions(perm); - mList[ new_asset_id ] = wearable; + // Send to the dataserver wearable->saveNewAsset(); @@ -292,12 +275,7 @@ LLWearable* LLWearableList::createNewWearable( EWearableType type ) { lldebugs << "LLWearableList::createNewWearable()" << llendl; - LLTransactionID tid; - LLAssetID new_asset_id; - tid.generate(); - new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - LLWearable* wearable = new LLWearable( tid ); + LLWearable *wearable = generateNewWearable(); wearable->setType( type ); std::string name = "New "; @@ -310,14 +288,23 @@ LLWearable* LLWearableList::createNewWearable( EWearableType type ) wearable->setPermissions(perm); // Description and sale info have default values. - wearable->setParamsToDefaults(); wearable->setTexturesToDefaults(); - mList[ new_asset_id ] = wearable; - // Send to the dataserver wearable->saveNewAsset(); + + return wearable; +} + +LLWearable *LLWearableList::generateNewWearable() +{ + LLTransactionID tid; + tid.generate(); + LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + + LLWearable* wearable = new LLWearable(tid); + mList[new_asset_id] = wearable; return wearable; } diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h index cda0cb11f..8edba5b25 100644 --- a/indra/newview/llwearablelist.h +++ b/indra/newview/llwearablelist.h @@ -45,12 +45,11 @@ public: S32 getLength() { return mList.size(); } - void getAsset( - const LLAssetID& assetID, - const std::string& wearable_name, - LLAssetType::EType asset_type, - void(*asset_arrived_callback)(LLWearable*, void* userdata), - void* userdata ); + void getAsset(const LLAssetID& assetID, + const std::string& wearable_name, + LLAssetType::EType asset_type, + void(*asset_arrived_callback)(LLWearable*, void* userdata), + void* userdata); LLWearable* createWearableMatchedToInventoryItem( LLWearable* old_wearable, LLViewerInventoryItem* item ); LLWearable* createCopyFromAvatar( LLWearable* old_wearable, const std::string& new_name = std::string() ); @@ -61,6 +60,8 @@ public: static void processGetAssetReply(const char* filename, const LLAssetID& assetID, void* user_data, S32 status, LLExtStat ext_status); protected: + LLWearable* generateNewWearable(); // used for the create... functions +private: std::map< LLUUID, LLWearable* > mList; }; diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 7a7c80fdf..5bca8db8e 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -68,6 +68,20 @@ void LLWeb::loadURLExternal(const std::string& url) } +// static +std::string LLWeb::curlEscape(const std::string& url) +{ + std::stringstream escaped_url; + for (std::string::const_iterator iter = url.begin(); iter != url.end(); ++iter) + { + if (isalnum(*iter)) + escaped_url << *iter; + else + escaped_url << '%' << std::hex << std::setfill('0') << std::setw(2) << std::uppercase << (int)*iter; + } + return escaped_url.str(); +} + // static std::string LLWeb::escapeURL(const std::string& url) { diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h index 278821bac..8dd13ffcb 100644 --- a/indra/newview/llweb.h +++ b/indra/newview/llweb.h @@ -51,6 +51,9 @@ public: // Loads unescaped url in external browser. static void loadURLExternal(const std::string& url); + // Behaves like the old curl_escape. + static std::string curlEscape(const std::string& url); + // Returns escaped (eg, " " to "%20") url static std::string escapeURL(const std::string& url); diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp index 59bc9dc62..bc8281480 100644 --- a/indra/newview/llwindebug.cpp +++ b/indra/newview/llwindebug.cpp @@ -862,7 +862,8 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop // Since there is exception info... Release the hounds. gEmergencyMemoryReserve.release(); - if(gSavedSettings.getControl("SaveMinidump").notNull() && gSavedSettings.getBOOL("SaveMinidump")) + LLControlVariable* save_minimap = gSavedSettings.getControl("SaveMinidump"); + if(save_minimap && save_minimap->getValue().asBoolean()) { _MINIDUMP_EXCEPTION_INFORMATION ExInfo; diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp index 2abf9d45a..577d1edc1 100644 --- a/indra/newview/llwldaycycle.cpp +++ b/indra/newview/llwldaycycle.cpp @@ -35,6 +35,7 @@ #include "llwldaycycle.h" #include "llsdserialize.h" #include "llwlparammanager.h" +#include "llweb.h" #include "llviewerwindow.h" @@ -57,10 +58,7 @@ void LLWLDayCycle::loadDayCycle(const std::string & fileName) mTimeMap.clear(); // bugfix for SL-46920: preventing filenames that break stuff. - char * curl_str = curl_escape(fileName.c_str(), fileName.size()); - std::string escaped_filename(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_filename = LLWeb::curlEscape(fileName); escaped_filename += ".xml"; @@ -125,10 +123,7 @@ void LLWLDayCycle::saveDayCycle(const std::string & fileName) { // bugfix for SL-46920: preventing filenames that break stuff. - char * curl_str = curl_escape(fileName.c_str(), fileName.size()); - std::string escaped_filename(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_filename = LLWeb::curlEscape(fileName); escaped_filename += ".xml"; diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index dfe921667..bb41f9aac 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -187,10 +187,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate) { // bugfix for SL-46920: preventing filenames that break stuff. - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_filename(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_filename = LLWeb::curlEscape(name); escaped_filename += ".xml"; @@ -244,10 +241,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate) void LLWLParamManager::savePreset(const std::string & name) { // bugfix for SL-46920: preventing filenames that break stuff. - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_filename(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_filename = LLWeb::curlEscape(name); escaped_filename += ".xml"; @@ -531,10 +525,7 @@ bool LLWLParamManager::removeParamSet(const std::string& name, bool delete_from_ std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", "")); // use full curl escaped name - char * curl_str = curl_escape(name.c_str(), name.size()); - std::string escaped_name(curl_str); - curl_free(curl_str); - curl_str = NULL; + std::string escaped_name = LLWeb::curlEscape(name); gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml"); } diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 80a70565e..0c445b65f 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -46,8 +46,7 @@ #include "llregionhandle.h" #include "llsurface.h" #include "llviewercamera.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewernetwork.h" #include "llviewerobjectlist.h" #include "llviewerparceloverlay.h" @@ -114,8 +113,8 @@ LLWorld::LLWorld() : *(default_texture++) = MAX_WATER_COLOR.mV[2]; *(default_texture++) = MAX_WATER_COLOR.mV[3]; - mDefaultWaterTexturep = new LLViewerImage(raw, FALSE); - gGL.getTexUnit(0)->bind(mDefaultWaterTexturep.get()); + mDefaultWaterTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); + gGL.getTexUnit(0)->bind(mDefaultWaterTexturep); mDefaultWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); } @@ -137,10 +136,11 @@ void LLWorld::destroyClass() LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) { LLMemType mt(LLMemType::MTYPE_REGIONS); - + llinfos << "Add region with handle: " << region_handle << " on host " << host << llendl; LLViewerRegion *regionp = getRegionFromHandle(region_handle); if (regionp) { + llinfos << "Region exists, removing it " << llendl; LLHost old_host = regionp->getHost(); // region already exists! if (host == old_host && regionp->isAlive()) @@ -374,9 +374,14 @@ LLVector3d LLWorld::clipToVisibleRegions(const LLVector3d &start_pos, const LLVe clip_factor = (region_coord.mV[VY] - region_width) / delta_pos_abs.mdV[VY]; } - // clamp to < 256 to stay in sim + // clamp to within region dimensions LLVector3d final_region_pos = LLVector3d(region_coord) - (delta_pos * clip_factor); - final_region_pos.clamp(0.0, 255.999); + final_region_pos.mdV[VX] = llclamp(final_region_pos.mdV[VX], 0.0, + (F64)(region_width - F_ALMOST_ZERO)); + final_region_pos.mdV[VY] = llclamp(final_region_pos.mdV[VY], 0.0, + (F64)(region_width - F_ALMOST_ZERO)); + final_region_pos.mdV[VZ] = llclamp(final_region_pos.mdV[VZ], 0.0, + (F64)(LLWorld::getInstance()->getRegionMaxHeight() - F_ALMOST_ZERO)); return regionp->getPosGlobalFromRegion(LLVector3(final_region_pos)); } @@ -1161,7 +1166,7 @@ void LLWorld::shiftRegions(const LLVector3& offset) LLViewerPartSim::getInstance()->shift(offset); } -LLViewerImage* LLWorld::getDefaultWaterTexture() +LLViewerTexture* LLWorld::getDefaultWaterTexture() { return mDefaultWaterTexturep; } @@ -1381,26 +1386,17 @@ void send_agent_resume() LLAppViewer::instance()->resumeMainloopTimeout(); } -static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin) -{ - LLVector3d pos_global; - LLVector3 pos_local; - U8 bits; - - bits = compact_local & 0xFF; - pos_local.mV[VZ] = F32(bits) * 4.f; - compact_local >>= 8; - - bits = compact_local & 0xFF; - pos_local.mV[VY] = (F32)bits; - compact_local >>= 8; - - bits = compact_local & 0xFF; - pos_local.mV[VX] = (F32)bits; - - pos_global.setVec( pos_local ); - pos_global += region_origin; - return pos_global; +static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin) +{ + LLVector3d pos_global(region_origin); + LLVector3d pos_local; + + pos_local.mdV[VZ] = (compact_local & 0xFFU) * 4; + pos_local.mdV[VY] = (compact_local >> 8) & 0xFFU; + pos_local.mdV[VX] = (compact_local >> 16) & 0xFFU; + + pos_global += pos_local; + return pos_global; } void LLWorld::getAvatars(std::vector* avatar_ids, std::vector* positions, const LLVector3d& relative_to, F32 radius) const @@ -1435,6 +1431,42 @@ void LLWorld::getAvatars(std::vector* avatar_ids, std::vector::iterator iter = LLCharacter::sInstances.begin(); + iter != LLCharacter::sInstances.end(); ++iter) + { + LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; + if(pVOAvatar->isDead() || pVOAvatar->isSelf()) + continue; + LLUUID uuid = pVOAvatar->getID(); + if(uuid.isNull()) + continue; + LLVector3d pos_global = pVOAvatar->getPositionGlobal(); + if(dist_vec(pos_global, relative_to) <= radius) + { + bool found = false; + uuid_vec_t::iterator sel_iter = avatar_ids->begin(); + for (; sel_iter != avatar_ids->end(); sel_iter++) + { + if(*sel_iter == uuid) + { + found = true; + break; + } + } + if(!found) + { + if(positions != NULL) + positions->push_back(pos_global); + avatar_ids->push_back(uuid); + } + } + } + } } diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h index 528ef68bc..ec6e45b23 100644 --- a/indra/newview/llworld.h +++ b/indra/newview/llworld.h @@ -45,7 +45,7 @@ #include "llmemory.h" #include "llstring.h" #include "llviewerpartsim.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llvowater.h" class LLViewerRegion; @@ -141,7 +141,7 @@ public: F32 getLandFarClip() const; void setLandFarClip(const F32 far_clip); - LLViewerImage *getDefaultWaterTexture(); + LLViewerTexture *getDefaultWaterTexture(); void updateWaterObjects(); void waterHeightRegionInfo(std::string const& sim_name, F32 water_height); void shiftRegions(const LLVector3& offset); @@ -193,7 +193,7 @@ private: std::list mHoleWaterObjects; LLPointer mEdgeWaterObjects[8]; - LLPointer mDefaultWaterTexturep; + LLPointer mDefaultWaterTexturep; }; diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 51efa80c0..b56260403 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -44,7 +44,7 @@ #include "llviewercontrol.h" #include "llfloaterworldmap.h" #include "lltracker.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerregion.h" #include "llregionflags.h" #include "hippogridmanager.h" @@ -548,7 +548,7 @@ void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**) // } // else // { - new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE); + new_layer.LayerImage = LLViewerTextureManager::getFetchedTexture(new_layer.LayerImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); // } gGL.getTexUnit(0)->bind(new_layer.LayerImage.get()); @@ -580,13 +580,13 @@ bool LLWorldMap::useWebMapTiles() } // public static -LLPointer LLWorldMap::loadObjectsTile(U32 grid_x, U32 grid_y) +LLPointer LLWorldMap::loadObjectsTile(U32 grid_x, U32 grid_y) { // Get the grid coordinates std::string imageurl = gSavedSettings.getString("MapServerURL") + llformat("map-%d-%d-%d-objects.jpg", 1, grid_x, grid_y); - LLPointer img = gImageList.getImageFromUrl(imageurl); - img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP); + LLPointer img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl,TRUE,LLViewerTexture::BOOST_MAP,LLViewerTexture::LOD_TEXTURE); + img->setBoostLevel(LLViewerTexture::BOOST_MAP); // Return the smart pointer return img; @@ -687,7 +687,7 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**) } else { - siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); + siminfo->mCurrentImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); } gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get()); siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -696,7 +696,7 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**) if (siminfo->mMapImageID[2].notNull()) { #ifdef IMMEDIATE_IMAGE_LOAD - siminfo->mOverlayImage = gImageList.getImage(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE); + siminfo->mOverlayImage = LLViewerTextureManager::getFetchedTextureURL(siminfo->mMapImageID[2]); #endif } else @@ -932,7 +932,7 @@ void LLWorldMap::dump() llinfos << "image discard " << (S32)info->mCurrentImage->getDiscardLevel() << " fullwidth " << info->mCurrentImage->getWidth(0) << " fullheight " << info->mCurrentImage->getHeight(0) - << " maxvirt " << info->mCurrentImage->mMaxVirtualSize + << " maxvirt " << info->mCurrentImage->getMaxVirtualSize() << " maxdisc " << (S32)info->mCurrentImage->getMaxDiscardLevel() << llendl; } diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index ab82a82a2..a8d9c748e 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -44,7 +44,7 @@ #include "llworldmipmap.h" #include "lluuid.h" #include "llmemory.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "lleventinfo.h" #include "v3color.h" @@ -97,8 +97,8 @@ public: LLUUID mMapImageID[MAP_SIM_IMAGE_TYPES]; // Hold a reference to the currently displayed image. - LLPointer mCurrentImage; - LLPointer mOverlayImage; + LLPointer mCurrentImage; + LLPointer mOverlayImage; }; #define MAP_BLOCK_RES 256 @@ -106,7 +106,7 @@ public: struct LLWorldMapLayer { BOOL LayerDefined; - LLPointer LayerImage; + LLPointer LayerImage; LLUUID LayerImageID; LLRect LayerExtents; @@ -172,7 +172,7 @@ public: static void gotMapServerURL(bool flag) { sGotMapURL = flag; } static bool useWebMapTiles(); - static LLPointer loadObjectsTile(U32 grid_x, U32 grid_y); + static LLPointer loadObjectsTile(U32 grid_x, U32 grid_y); void dump(); @@ -190,9 +190,10 @@ public: // World Mipmap delegation: currently used when drawing the mipmap void equalizeBoostLevels(); - LLPointer getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true) { - return mWorldMipmap.getObjectsTile(grid_x, grid_y, level, load); - } + LLPointer getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true) { return mWorldMipmap.getObjectsTile(grid_x, grid_y, level, load); } + +private: + bool clearItems(bool force = false); // Clears the item lists public: // Map from region-handle to simulator info diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index c82bc401b..4a90e66f2 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -54,8 +54,7 @@ #include "lltextureview.h" #include "lltracker.h" #include "llviewercamera.h" -#include "llviewerimage.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewermenu.h" #include "llviewerparceloverlay.h" #include "llviewerregion.h" @@ -645,7 +644,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { continue; } LLWorldMapLayer *layer = &LLWorldMap::getInstance()->mMapLayers[LLWorldMap::getInstance()->mCurrentMap][layer_idx]; - LLViewerImage *current_image = layer->LayerImage; + LLViewerTexture *current_image = layer->LayerImage; if (current_image->isMissingAsset()) { @@ -680,10 +679,10 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { continue; } - current_image->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP_VISIBLE); + current_image->setBoostLevel(LLViewerTexture::BOOST_MAP_VISIBLE); current_image->setKnownDrawSize(llround(pix_width * LLUI::sGLScaleFactor.mV[VX]), llround(pix_height * LLUI::sGLScaleFactor.mV[VY])); - if (!current_image->getHasGLTexture()) + if (!current_image->hasGLTexture()) { continue; // better to draw nothing than the default image } @@ -748,8 +747,8 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { U64 handle = (*it).first; LLSimInfo* info = (*it).second; - LLViewerImage* simimage = info->mCurrentImage; - LLViewerImage* overlayimage = info->mOverlayImage; + LLViewerTexture* simimage = info->mCurrentImage; + LLViewerTexture* overlayimage = info->mOverlayImage; if (sMapScale < SIM_MAP_SCALE) { @@ -784,7 +783,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { bool sim_visible = (sMapScale >= map_scale_cutoff) && (simimage != NULL) && - (simimage->getHasGLTexture()); + (simimage->hasGLTexture()); if (sim_visible) { @@ -829,7 +828,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { } else { - info->mCurrentImage = gImageList.getImage(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); + info->mCurrentImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE); } info->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP); simimage = info->mCurrentImage; @@ -843,7 +842,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) { textures_requested_this_tick++; - info->mOverlayImage = gImageList.getImage(info->mMapImageID[2], MIPMAP_TRUE, FALSE); + info->mOverlayImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[2], MIPMAP_TRUE); info->mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); overlayimage = info->mOverlayImage; gGL.getTexUnit(0)->bind(overlayimage); @@ -858,13 +857,13 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { S32 draw_size = llround(sMapScale); if (simimage != NULL) { - simimage->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP); + simimage->setBoostLevel(LLViewerTexture::BOOST_MAP); simimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); } if (overlayimage != NULL) { - overlayimage->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP); + overlayimage->setBoostLevel(LLViewerTexture::BOOST_MAP); overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); } @@ -893,7 +892,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { gGL.vertex3f(right, top, 0.f); gGL.end(); - if (gSavedSettings.getBOOL("MapShowLandForSale") && overlayimage && overlayimage->getHasGLTexture()) + if (gSavedSettings.getBOOL("MapShowLandForSale") && overlayimage && overlayimage->hasGLTexture()) { gGL.getTexUnit(0)->bind(overlayimage); gGL.color4f(1.f, 1.f, 1.f, alpha); @@ -1240,11 +1239,11 @@ bool LLWorldMapView::drawMipmapLevel(S32 width, S32 height, S32 level, bool load // Convert to the mipmap level coordinates for that point (i.e. which tile to we hit) LLWorldMipmap::globalToMipmap(pos_global[VX], pos_global[VY], level, &grid_x, &grid_y); // Get the tile. Note: NULL means that the image does not exist (so it's considered "complete" as far as fetching is concerned) - LLPointer simimage = LLWorldMap::getInstance()->getObjectsTile(grid_x, grid_y, level, load); + LLPointer simimage = LLWorldMap::getInstance()->getObjectsTile(grid_x, grid_y, level, load); if (simimage) { // Check the texture state - if (simimage->getHasGLTexture()) + if (simimage->hasGLTexture()) { // Increment the number of completly fetched tiles completed_tiles++; diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h index 42338ccc6..c40963b3c 100644 --- a/indra/newview/llworldmapview.h +++ b/indra/newview/llworldmapview.h @@ -42,7 +42,7 @@ #include "v3math.h" #include "v3dmath.h" #include "v4color.h" -#include "llviewerimage.h" +#include "llviewertexture.h" #include "llmapimagetype.h" #include "llworldmap.h" @@ -53,7 +53,7 @@ const S32 DEFAULT_TRACKING_ARROW_SIZE = 16; class LLColor4; class LLColor4U; class LLCoordGL; -class LLViewerImage; +class LLViewerTexture; class LLTextBox; diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index c854863db..17ca2d573 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -35,7 +35,7 @@ #include "llworldmipmap.h" #include "llviewercontrol.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "math.h" // log() // Turn this on to output tile stats in the standard output @@ -78,23 +78,23 @@ void LLWorldMipmap::equalizeBoostLevels() // For each tile for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++) { - LLPointer img = iter->second; + LLPointer img = iter->second; S32 current_boost_level = img->getBoostLevel(); - if (current_boost_level == LLViewerImageBoostLevel::BOOST_MAP_VISIBLE) + if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE) { // If level was BOOST_MAP_VISIBLE, the tile has been used in the last draw so keep it high - img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP); + img->setBoostLevel(LLViewerTexture::BOOST_MAP); } else { // If level was BOOST_MAP only (or anything else...), the tile wasn't used in the last draw // so we drop its boost level to BOOST_NONE. - img->setBoostLevel(LLViewerImageBoostLevel::BOOST_NONE); + img->setBoostLevel(LLViewerTexture::BOOST_NONE); } #if DEBUG_TILES_STAT // Increment some stats if compile option on nb_tiles++; - if (current_boost_level == LLViewerImageBoostLevel::BOOST_MAP_VISIBLE) + if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE) { nb_visible++; } @@ -120,13 +120,13 @@ void LLWorldMipmap::dropBoostLevels() // For each tile for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++) { - LLPointer img = iter->second; - img->setBoostLevel(LLViewerImageBoostLevel::BOOST_NONE); + LLPointer img = iter->second; + img->setBoostLevel(LLViewerTexture::BOOST_NONE); } } } -LLPointer LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) +LLPointer LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) { // Check the input data llassert(level <= MAP_LEVELS); @@ -153,7 +153,7 @@ LLPointer LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S if (load) { // Load it - LLPointer img = loadObjectsTile(grid_x, grid_y, level); + LLPointer img = loadObjectsTile(grid_x, grid_y, level); // Insert the image in the map level_mipmap.insert(sublevel_tiles_t::value_type( handle, img )); // Find the element again in the map (it's there now...) @@ -167,7 +167,7 @@ LLPointer LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S } // Get the image pointer and check if this asset is missing - LLPointer img = found->second; + LLPointer img = found->second; if (img->isMissingAsset()) { // Return NULL if asset missing @@ -178,13 +178,13 @@ LLPointer LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S // Boost the tile level so to mark it's in use *if* load on if (load) { - img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP_VISIBLE); + img->setBoostLevel(LLViewerTexture::BOOST_MAP_VISIBLE); } return img; } } -LLPointer LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level) +LLPointer LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level) { // Get the grid coordinates std::string imageurl = gSavedSettings.getString("MapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y); @@ -195,8 +195,8 @@ LLPointer LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, // END DEBUG //LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; - LLPointer img = gImageList.getImageFromUrl(imageurl); - img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP); + LLPointer img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl); + img->setBoostLevel(LLViewerTexture::BOOST_MAP); // Return the smart pointer return img; @@ -224,7 +224,7 @@ void LLWorldMipmap::cleanMissedTilesFromLevel(S32 level) sublevel_tiles_t::iterator it = level_mipmap.begin(); while (it != level_mipmap.end()) { - LLPointer img = it->second; + LLPointer img = it->second; if (img->isMissingAsset()) { level_mipmap.erase(it++); diff --git a/indra/newview/llworldmipmap.h b/indra/newview/llworldmipmap.h index 9d6a80a41..19bb9d99e 100644 --- a/indra/newview/llworldmipmap.h +++ b/indra/newview/llworldmipmap.h @@ -39,7 +39,8 @@ #include "indra_constants.h" // REGION_WIDTH_UNITS #include "llregionhandle.h" // to_region_handle() -class LLViewerImage; +class LLViewerTexture; +class LLViewerFetchedTexture; // LLWorldMipmap : Mipmap handling of all the tiles used to render the world at any resolution. // This class provides a clean structured access to the hierarchy of tiles stored in the @@ -48,7 +49,7 @@ class LLViewerImage; // structure (at least, that it exists...) but doesn't requite the caller to know the details of it. // IOW, you need to know that rendering levels exists as well as grid coordinates for regions, // but you can ignore where those tiles are located, how to get them, etc... -// The class API gives you back LLPointer per tile. +// The class API gives you back LLPointer per tile. // See llworldmipmapview.cpp for the implementation of a class who knows how to render an LLWorldMipmap. @@ -72,7 +73,7 @@ public: // Drop the boost levels to none (used when hiding the map) void dropBoostLevels(); // Get the tile smart pointer, does the loading if necessary - LLPointer getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true); + LLPointer getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true); // Helper functions: those are here as they depend solely on the topology of the mipmap though they don't access it // Convert sim scale (given in sim width in display pixels) into a mipmap level @@ -84,13 +85,13 @@ private: // Get a handle (key) from grid coordinates U64 convertGridToHandle(U32 grid_x, U32 grid_y) { return to_region_handle(grid_x * REGION_WIDTH_UNITS, grid_y * REGION_WIDTH_UNITS); } // Load the relevant tile from S3 - LLPointer loadObjectsTile(U32 grid_x, U32 grid_y, S32 level); + LLPointer loadObjectsTile(U32 grid_x, U32 grid_y, S32 level); // Clear a level from its "missing" tiles void cleanMissedTilesFromLevel(S32 level); // The mipmap is organized by resolution level (MAP_LEVELS of them). Each resolution level is an std::map // using a region_handle as a key and storing a smart pointer to the image as a value. - typedef std::map > sublevel_tiles_t; + typedef std::map > sublevel_tiles_t; sublevel_tiles_t mWorldObjectsMipMap[MAP_LEVELS]; // sublevel_tiles_t mWorldTerrainMipMap[MAP_LEVELS]; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c1299f3ac..e10b64409 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -76,7 +76,7 @@ #include "lltool.h" #include "lltoolmgr.h" #include "llviewercamera.h" -#include "llviewerimagelist.h" +#include "llviewertexturelist.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" @@ -224,11 +224,7 @@ glh::matrix4f gl_ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, return ret; } -#if SHY_MOD //screenshot improvement void display_update_camera(bool tiling=false); -#else //shy_mod -void display_update_camera(); -#endif //ignore //---------------------------------------- S32 LLPipeline::sCompiles = 0; @@ -490,22 +486,21 @@ void LLPipeline::resizeScreenTexture() GLuint resX = gViewerWindow->getWindowDisplayWidth(); GLuint resY = gViewerWindow->getWindowDisplayHeight(); - U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor"); - if (res_mod > 1 && res_mod < resX && res_mod < resY) - { - resX /= res_mod; - resY /= res_mod; - } - allocateScreenBuffer(resX,resY); - - llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl; } } void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) { U32 samples = gSavedSettings.getU32("RenderFSAASamples"); + U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor"); + if (res_mod > 1 && res_mod < resX && res_mod < resY) + { + resX /= res_mod; + resY /= res_mod; + } + + if (LLPipeline::sRenderDeferred) { //allocate deferred rendering color buffers @@ -517,6 +512,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) { mDeferredLight[i].allocate(resX, resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); } + + //HACK: make alpha masking work on ATI depth shadows (work around for ATI driver bug) + U32 shadow_fmt = 0;/*gGLManager.mIsATI ? GL_ALPHA : 0;*/ + + for (U32 i = 0; i < 4; i++) + { + mSunShadow[i].allocate(1024,1024, shadow_fmt, TRUE, FALSE); + } } else { @@ -524,7 +527,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) } - if (gGLManager.mHasFramebufferMultisample && samples > 1) + if (LLRenderTarget::sUseFBO && gGLManager.mHasFramebufferMultisample && samples > 1) { if (LLPipeline::sRenderDeferred) { @@ -538,9 +541,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) } mScreen.setSampleBuffer(&mSampleBuffer); + stop_glerror(); } - else if (LLPipeline::sRenderDeferred) + if (LLPipeline::sRenderDeferred) { //share depth buffer between deferred targets mDeferredScreen.shareDepthBuffer(mScreen); for (U32 i = 0; i < 2; i++) @@ -616,6 +620,9 @@ void LLPipeline::createGLBuffers() stop_glerror(); + GLuint resX = gViewerWindow->getWindowDisplayWidth(); + GLuint resY = gViewerWindow->getWindowDisplayHeight(); + if (LLPipeline::sRenderGlow) { //screen space glow buffers const U32 glow_res = llmax(1, @@ -625,19 +632,12 @@ void LLPipeline::createGLBuffers() { mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE,FALSE); } - } - GLuint resX = gViewerWindow->getWindowDisplayWidth(); - GLuint resY = gViewerWindow->getWindowDisplayHeight(); - - allocateScreenBuffer(resX,resY); + allocateScreenBuffer(resX,resY); + } if (sRenderDeferred) { - mSunShadow[0].allocate(1024,1024, 0, TRUE, FALSE); - mSunShadow[1].allocate(1024,1024, 0, TRUE, FALSE); - mSunShadow[2].allocate(1024,1024, 0, TRUE, FALSE); - mSunShadow[3].allocate(1024,1024, 0, TRUE, FALSE); if (!mNoiseMap) { @@ -772,9 +772,9 @@ S32 LLPipeline::setLightingDetail(S32 level) class LLOctreeDirtyTexture : public LLOctreeTraveler { public: - const std::set& mTextures; + const std::set& mTextures; - LLOctreeDirtyTexture(const std::set& textures) : mTextures(textures) { } + LLOctreeDirtyTexture(const std::set& textures) : mTextures(textures) { } virtual void visit(const LLOctreeNode* node) { @@ -787,7 +787,8 @@ public: for (LLSpatialGroup::drawmap_elem_t::iterator j = i->second.begin(); j != i->second.end(); ++j) { LLDrawInfo* params = *j; - if (mTextures.find(params->mTexture) != mTextures.end()) + LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(params->mTexture); + if (tex && mTextures.find(tex) != mTextures.end()) { group->setState(LLSpatialGroup::GEOM_DIRTY); } @@ -804,7 +805,7 @@ public: }; // Called when a texture changes # of channels (causes faces to move to alpha pool) -void LLPipeline::dirtyPoolObjectTextures(const std::set& textures) +void LLPipeline::dirtyPoolObjectTextures(const std::set& textures) { assertInitialized(); @@ -836,7 +837,7 @@ void LLPipeline::dirtyPoolObjectTextures(const std::set& texture } } -LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerImage *tex0) +LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerTexture *tex0) { assertInitialized(); @@ -908,7 +909,7 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerImage *tex0) } -LLDrawPool *LLPipeline::getPool(const U32 type, LLViewerImage *tex0) +LLDrawPool *LLPipeline::getPool(const U32 type, LLViewerTexture *tex0) { LLMemType mt(LLMemType::MTYPE_PIPELINE); LLDrawPool *poolp = findPool(type, tex0); @@ -925,7 +926,7 @@ LLDrawPool *LLPipeline::getPool(const U32 type, LLViewerImage *tex0) // static -LLDrawPool* LLPipeline::getPoolFromTE(const LLTextureEntry* te, LLViewerImage* imagep) +LLDrawPool* LLPipeline::getPoolFromTE(const LLTextureEntry* te, LLViewerTexture* imagep) { LLMemType mt(LLMemType::MTYPE_PIPELINE); U32 type = getPoolTypeFromTE(te, imagep); @@ -933,7 +934,7 @@ LLDrawPool* LLPipeline::getPoolFromTE(const LLTextureEntry* te, LLViewerImage* i } //static -U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerImage* imagep) +U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* imagep) { LLMemType mt(LLMemType::MTYPE_PIPELINE); @@ -2621,7 +2622,7 @@ void render_hud_elements() //TO-DO: //V2 moved this line from LLPipeline::renderGeom //Uncomment once multisample z-buffer issues are figured out on ati cards. - // LLHUDObject::renderAll(); + LLHUDObject::renderAll(); //gObjectList.resetObjectBeacons(); } @@ -2661,7 +2662,7 @@ void LLPipeline::renderHighlights() // Make sure the selection image gets downloaded and decoded if (!mFaceSelectImagep) { - mFaceSelectImagep = gImageList.getImage(IMG_FACE_SELECT); + mFaceSelectImagep = LLViewerTextureManager::getFetchedTexture(IMG_FACE_SELECT); } mFaceSelectImagep->addTextureStats((F32)MAX_IMAGE_AREA); @@ -2691,7 +2692,7 @@ void LLPipeline::renderHighlights() for (S32 i = 0; i < count; i++) { LLFace* facep = mHighlightFaces[i]; - facep->renderSelected(LLViewerImage::sNullImagep, color); + facep->renderSelected(LLViewerTexture::sNullImagep, color); } } @@ -2782,8 +2783,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) sUnderWaterRender = FALSE; } - gGL.getTexUnit(0)->bind(LLViewerImage::sDefaultImagep); - LLViewerImage::sDefaultImagep->setAddressMode(LLTexUnit::TAM_WRAP); + gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sDefaultImagep); + LLViewerFetchedTexture::sDefaultImagep->setAddressMode(LLTexUnit::TAM_WRAP); ////////////////////////////////////////////// // @@ -2948,7 +2949,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) //TO-DO: //V2 moved this line to LLPipeline::render_hud_elements //Migrate once multisample z-buffer issues are figured out on ati cards. - LLHUDObject::renderAll(); + //LLHUDObject::renderAll(); gObjectList.resetObjectBeacons(); } else @@ -3180,6 +3181,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) //TO-DO: //V2 moved block to LLPipeline::renderDeferredLighting //Migrate once multisample z-buffer issues are figured out on ati cards. + /*if(!sImpostorRender) { renderHighlights(); mHighlightFaces.clear(); @@ -3200,7 +3202,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) // Make sure particle effects disappear LLHUDObject::renderAllForTimer(); } - } + }*/ //END if (occlude) @@ -3473,7 +3475,7 @@ void LLPipeline::renderDebug() LLGLEnable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE); - gGL.getTexUnit(0)->bind(LLViewerImage::sWhiteImagep.get()); + gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep); for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin(); iter != mGroupQ2.end(); ++iter) { @@ -5296,7 +5298,7 @@ void LLPipeline::bindScreenToTexture() } -void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) +void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, bool tiling) { if (!(gPipeline.canUseVertexShaders() && sRenderGlow)) @@ -5315,7 +5317,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } - U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor"); + static const LLCachedControl res_mod("RenderResolutionDivisor",1); LLVector2 tc1(0,0); LLVector2 tc2((F32) gViewerWindow->getWindowDisplayWidth()*2, @@ -5348,7 +5350,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) gGL.setColorMask(true, true); glClearColor(0,0,0,0); - if (for_snapshot) + if (tiling && !LLPipeline::sRenderDeferred) //Need to coax this into working with deferred now that tiling is back. { gGL.getTexUnit(0)->bind(&mGlow[1]); { @@ -5370,7 +5372,6 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) LLGLEnable blend(GL_BLEND); gGL.setSceneBlendType(LLRender::BT_ADD); - gGL.begin(LLRender::TRIANGLE_STRIP); gGL.color4f(1,1,1,1); @@ -5409,15 +5410,15 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) } gGlowExtractProgram.bind(); - F32 minLum = llmax(gSavedSettings.getF32("RenderGlowMinLuminance"), 0.0f); - F32 maxAlpha = gSavedSettings.getF32("RenderGlowMaxExtractAlpha"); - F32 warmthAmount = gSavedSettings.getF32("RenderGlowWarmthAmount"); - LLVector3 lumWeights = gSavedSettings.getVector3("RenderGlowLumWeights"); - LLVector3 warmthWeights = gSavedSettings.getVector3("RenderGlowWarmthWeights"); - gGlowExtractProgram.uniform1f("minLuminance", minLum); + static const LLCachedControl minLum("RenderGlowMinLuminance",2.5); + static const LLCachedControl maxAlpha("RenderGlowMaxExtractAlpha",0.065f); + static const LLCachedControl warmthAmount("RenderGlowWarmthAmount",0.0f); + static const LLCachedControl lumWeights("RenderGlowLumWeights",LLVector3(.299f,.587f,.114f)); + static const LLCachedControl warmthWeights("RenderGlowWarmthWeights",LLVector3(1.f,.5f,.7f)); + gGlowExtractProgram.uniform1f("minLuminance", llmax(minLum.get(),0.0f)); gGlowExtractProgram.uniform1f("maxExtractAlpha", maxAlpha); - gGlowExtractProgram.uniform3f("lumWeights", lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]); - gGlowExtractProgram.uniform3f("warmthWeights", warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]); + gGlowExtractProgram.uniform3f("lumWeights", lumWeights.get().mV[0], lumWeights.get().mV[1], lumWeights.get().mV[2]); + gGlowExtractProgram.uniform3f("warmthWeights", warmthWeights.get().mV[0], warmthWeights.get().mV[1], warmthWeights.get().mV[2]); gGlowExtractProgram.uniform1f("warmthAmount", warmthAmount); LLGLEnable blend_on(GL_BLEND); LLGLEnable test(GL_ALPHA_TEST); @@ -5454,19 +5455,21 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) // power of two between 1 and 1024 - U32 glowResPow = gSavedSettings.getS32("RenderGlowResolutionPow"); + static const LLCachedControl glowResPow("RenderGlowResolutionPow",9); const U32 glow_res = llmax(1, llmin(1024, 1 << glowResPow)); - S32 kernel = gSavedSettings.getS32("RenderGlowIterations")*2; - F32 delta = gSavedSettings.getF32("RenderGlowWidth") / glow_res; + static const LLCachedControl glow_iters("RenderGlowIterations",2); + S32 kernel = glow_iters*2; + static const LLCachedControl glow_width("RenderGlowWidth",1.3f); + F32 delta = glow_width*zoom_factor/glow_res; // Use half the glow width if we have the res set to less than 9 so that it looks // almost the same in either case. if (glowResPow < 9) { delta *= 0.5f; } - F32 strength = gSavedSettings.getF32("RenderGlowStrength"); + static const LLCachedControl strength("RenderGlowStrength",.35f); gGlowProgram.bind(); gGlowProgram.uniform1f("glowStrength", strength); @@ -5593,11 +5596,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) //TO-DO: //V2 requires this for hover text and such since they have been pulled out of geom render. //Do this when multisample z-buffer issues are figured out - /*if (LLRenderTarget::sUseFBO) + if (LLRenderTarget::sUseFBO) { //copy depth buffer from mScreen to framebuffer LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(), 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST); - }*/ + } } @@ -5774,6 +5777,12 @@ void LLPipeline::renderDeferredLighting() } LLViewerCamera* camera = LLViewerCamera::getInstance(); + /*{ + LLGLDepthTest depth(GL_TRUE); + mDeferredDepth.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(), + 0, 0, mDeferredDepth.getWidth(), mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST); + }*/ + LLGLEnable multisample(GL_MULTISAMPLE_ARB); if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD)) @@ -5829,6 +5838,10 @@ void LLPipeline::renderDeferredLighting() { bindDeferredShader(gDeferredSunProgram); + glClearColor(1,1,1,1); + mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT); + glClearColor(0,0,0,0); + glh::matrix4f inv_trans = glh_get_current_modelview().inverse().transpose(); const U32 slice = 32; @@ -5853,7 +5866,11 @@ void LLPipeline::renderDeferredLighting() { LLGLDisable blend(GL_BLEND); - LLGLDepthTest depth(GL_FALSE); + //TO-DO: + //V2 changed to LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); + //Do this when multisample z-buffer issues are figured out + //LLGLDepthTest depth(GL_FALSE); + LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); stop_glerror(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); stop_glerror(); @@ -5871,22 +5888,26 @@ void LLPipeline::renderDeferredLighting() //mDeferredLight[1].copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(), // 0, 0, mDeferredLight[0].getWidth(), mDeferredLight[0].getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); - + glClearColor(1,1,1,1); + mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT); + glClearColor(0,0,0,0); + bindDeferredShader(gDeferredBlurLightProgram); - LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian"); - U32 kern_length = llclamp(gSavedSettings.getU32("RenderShadowBlurSamples"), (U32) 1, (U32) 16)*2 - 1; - F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize"); + static const LLCachedControl go("RenderShadowGaussian",LLVector3(2.f,2.f,0.f)); + static const LLCachedControl blur_size("RenderShadowBlurSize",.7f); + static const LLCachedControl blur_samples("RenderShadowBlurSamples",(U32)5); + U32 kern_length = llclamp(blur_samples.get(), (U32) 1, (U32) 16)*2 - 1; - // sample symmetrically with the middle sample falling exactly on 0.0 + // sample symmetrically with the middle sample falling exactly on 0.0 F32 x = -(kern_length/2.0f) + 0.5f; LLVector3 gauss[32]; // xweight, yweight, offset for (U32 i = 0; i < kern_length; i++) { - gauss[i].mV[0] = llgaussian(x, go.mV[0]); - gauss[i].mV[1] = llgaussian(x, go.mV[1]); + gauss[i].mV[0] = llgaussian(x, go.get().mV[0]); + gauss[i].mV[1] = llgaussian(x, go.get().mV[1]); gauss[i].mV[2] = x; x += 1.f; } @@ -5909,7 +5930,8 @@ void LLPipeline::renderDeferredLighting() //TO-DO: //V2 changed to LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); //Do this when multisample z-buffer issues are figured out - LLGLDepthTest depth(GL_FALSE); + //LLGLDepthTest depth(GL_FALSE); + LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); stop_glerror(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); stop_glerror(); @@ -5928,7 +5950,8 @@ void LLPipeline::renderDeferredLighting() //TO-DO: //V2 changed to LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); //Do this when multisample z-buffer issues are figured out - LLGLDepthTest depth(GL_FALSE); + //LLGLDepthTest depth(GL_FALSE); + LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); stop_glerror(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); stop_glerror(); @@ -5996,6 +6019,7 @@ void LLPipeline::renderDeferredLighting() gPipeline.popRenderTypeMask(); } + gGL.setSceneBlendType(LLRender::BT_ADD); std::list fullscreen_lights; std::list light_colors; @@ -6149,6 +6173,7 @@ void LLPipeline::renderDeferredLighting() LLPipeline::RENDER_TYPE_PASS_ALPHA, LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, LLPipeline::RENDER_TYPE_PASS_BUMP, + LLPipeline::RENDER_TYPE_PASS_POST_BUMP, LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK, LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY, @@ -6167,7 +6192,7 @@ void LLPipeline::renderDeferredLighting() //TO-DO: //V2 moved block from LLPipeline::renderGeomPostDeferred //Migrate once multisample z-buffer issues are figured out on ati cards. - /*{ + { //render highlights, etc. renderHighlights(); mHighlightFaces.clear(); @@ -6182,7 +6207,7 @@ void LLPipeline::renderDeferredLighting() gObjectList.renderObjectBeacons(); gObjectList.resetObjectBeacons(); } - }*/ + } mScreen.flush(); @@ -6348,9 +6373,10 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) } - if (gSavedSettings.getBOOL("RenderWaterReflections")) + static const LLCachedControl water_reflections("RenderWaterReflections",false); + if (water_reflections) { //mask out selected geometry based on reflection detail - S32 detail = gSavedSettings.getS32("RenderReflectionDetail"); + static const LLCachedControl detail("RenderReflectionDetail",0); //if (detail > 0) { //mask out selected geometry based on reflection detail { @@ -6375,7 +6401,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) LLPipeline::RENDER_TYPE_CLASSIC_CLOUDS, LLPipeline::RENDER_TYPE_WL_CLOUDS, LLPipeline::END_RENDER_TYPES); - static LLCachedControl skip_distortion_updates("SkipReflectOcclusionUpdates",false); + static const LLCachedControl skip_distortion_updates("SkipReflectOcclusionUpdates",false); LLPipeline::sSkipUpdate = skip_distortion_updates; LLGLUserClipPlane clip_plane(plane, mat, projection); LLGLDisable cull(GL_CULL_FACE); @@ -6552,7 +6578,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) //temporary hack to disable shadows but keep local lights static BOOL clear = TRUE; - BOOL gen_shadow = gSavedSettings.getBOOL("RenderDeferredSunShadow"); + static const LLCachedControl gen_shadow("RenderDeferredSunShadow",false); if (!gen_shadow) { if (clear) @@ -6604,10 +6630,10 @@ void LLPipeline::generateSunShadow(LLCamera& camera) LLVector3 up; //clip contains parallel split distances for 3 splits - LLVector3 clip = gSavedSettings.getVector3("RenderShadowClipPlanes"); + static const LLCachedControl clip("RenderShadowClipPlanes",LLVector3(4.f,8.f,24.f)); //far clip on last split is minimum of camera view distance and 128 - mSunClipPlanes = LLVector4(clip, clip.mV[2] * clip.mV[2]/clip.mV[1]); + mSunClipPlanes = LLVector4(clip, clip.get().mV[2] * clip.get().mV[2]/clip.get().mV[1]); const LLPickInfo& pick_info = gViewerWindow->getLastPick(); @@ -6621,11 +6647,14 @@ void LLPipeline::generateSunShadow(LLCamera& camera) F32 dist[] = { 0.1f, mSunClipPlanes.mV[0], mSunClipPlanes.mV[1], mSunClipPlanes.mV[2], mSunClipPlanes.mV[3] }; //currently used for amount to extrude frusta corners for constructing shadow frusta - LLVector3 n = gSavedSettings.getVector3("RenderShadowNearDist"); - F32 nearDist[] = { n.mV[0], n.mV[1], n.mV[2], n.mV[2] }; + static const LLCachedControl n("RenderShadowNearDist",LLVector3(256,256,256)); + F32 nearDist[] = { n.get().mV[0], n.get().mV[1], n.get().mV[2], n.get().mV[2] }; for (S32 j = 0; j < 4; j++) { + + LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j; + //restore render matrices glh_set_current_modelview(saved_view); glh_set_current_projection(saved_proj); @@ -6666,7 +6695,6 @@ void LLPipeline::generateSunShadow(LLCamera& camera) } - LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j; LLVector3 left = lightDir%at; up = left%lightDir; up.normVec(); @@ -6874,12 +6902,12 @@ void LLPipeline::generateSunShadow(LLCamera& camera) glPopMatrix(); gGLLastMatrix = NULL; - LLPipeline::sUseOcclusion = occlude; - sMinRenderSize = 0.f; + sMinRenderSize = 0.f; mSunShadow[j].flush(); } - if (!gSavedSettings.getBOOL("CameraOffset")) + static const LLCachedControl camera_offset("CameraOffset",false); + if (!camera_offset) { glh_set_current_modelview(saved_view); glh_set_current_projection(saved_proj); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index a7b318c60..436d73726 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -48,7 +48,7 @@ #include -class LLViewerImage; +class LLViewerTexture; class LLEdge; class LLFace; class LLViewerObject; @@ -99,7 +99,7 @@ public: void setDisableVBOMapping(BOOL no_vbo_mapping); void generateImpostor(LLVOAvatar* avatar); void bindScreenToTexture(); - void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0); + void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0, bool tiling = false); void init(); void cleanup(); @@ -107,15 +107,15 @@ public: /// @brief Get a draw pool from pool type (POOL_SIMPLE, POOL_MEDIA) and texture. /// @return Draw pool, or NULL if not found. - LLDrawPool *findPool(const U32 pool_type, LLViewerImage *tex0 = NULL); + LLDrawPool *findPool(const U32 pool_type, LLViewerTexture *tex0 = NULL); /// @brief Get a draw pool for faces of the appropriate type and texture. Create if necessary. /// @return Always returns a draw pool. - LLDrawPool *getPool(const U32 pool_type, LLViewerImage *tex0 = NULL); + LLDrawPool *getPool(const U32 pool_type, LLViewerTexture *tex0 = NULL); /// @brief Figures out draw pool type from texture entry. Creates pool if necessary. - static LLDrawPool* getPoolFromTE(const LLTextureEntry* te, LLViewerImage* te_image); - static U32 getPoolTypeFromTE(const LLTextureEntry* te, LLViewerImage* imagep); + static LLDrawPool* getPoolFromTE(const LLTextureEntry* te, LLViewerTexture* te_image); + static U32 getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* imagep); void addPool(LLDrawPool *poolp); // Only to be used by LLDrawPool classes for splitting pools! void removePool( LLDrawPool* poolp ); @@ -155,7 +155,7 @@ public: ); // Something about these textures has changed. Dirty them. - void dirtyPoolObjectTextures(const std::set& textures); + void dirtyPoolObjectTextures(const std::set& textures); void resetDrawOrders(); @@ -345,6 +345,7 @@ public: RENDER_TYPE_PASS_FULLBRIGHT_SHINY = LLRenderPass::PASS_FULLBRIGHT_SHINY, RENDER_TYPE_PASS_SHINY = LLRenderPass::PASS_SHINY, RENDER_TYPE_PASS_BUMP = LLRenderPass::PASS_BUMP, + RENDER_TYPE_PASS_POST_BUMP = LLRenderPass::PASS_POST_BUMP, RENDER_TYPE_PASS_GLOW = LLRenderPass::PASS_GLOW, RENDER_TYPE_PASS_ALPHA = LLRenderPass::PASS_ALPHA, RENDER_TYPE_PASS_ALPHA_MASK = LLRenderPass::PASS_ALPHA_MASK, @@ -603,7 +604,7 @@ public: protected: std::vector mSelectedFaces; - LLPointer mFaceSelectImagep; + LLPointer mFaceSelectImagep; U32 mLightMask; U32 mLightMovingMask; diff --git a/indra/newview/qtoolalign.cpp b/indra/newview/qtoolalign.cpp index 166c93f6a..b40faef40 100644 --- a/indra/newview/qtoolalign.cpp +++ b/indra/newview/qtoolalign.cpp @@ -626,4 +626,4 @@ void QToolAlign::align() LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION); -} \ No newline at end of file +} diff --git a/indra/newview/qtoolalign.h b/indra/newview/qtoolalign.h index 168453da4..1bef073ba 100644 --- a/indra/newview/qtoolalign.h +++ b/indra/newview/qtoolalign.h @@ -46,4 +46,4 @@ private: BOOL mForce; }; -#endif // Q_QTOOLALIGN_H \ No newline at end of file +#endif // Q_QTOOLALIGN_H diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 281efcf0b..94b88fb0c 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -835,7 +835,7 @@ bool RlvHandler::redirectChatOrEmote(const std::string& strUTF8Text) const case LLAssetType::AT_CLOTHING: { // NOTE: without its asset we don't know what type the wearable is so we need to look at the item's flags instead - EWearableType wtType = (EWearableType)(pItem->getFlags() & LLInventoryItem::II_FLAGS_WEARABLES_MASK); + EWearableType wtType = (EWearableType)(pItem->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK); LLViewerInventoryCategory* pFolder; if ( (!isWearable(wtType)) || ( (gAgent.getWearable(wtType)) && (!isRemovable(wtType)) ) || @@ -1993,7 +1993,7 @@ ERlvCmdRet RlvHandler::onGetOutfit(const RlvCommand& rlvCmd, std::string& strRep const EWearableType wtRlvTypes[] = { WT_GLOVES, WT_JACKET, WT_PANTS, WT_SHIRT, WT_SHOES, WT_SKIRT, WT_SOCKS, - WT_UNDERPANTS, WT_UNDERSHIRT, WT_SKIN, WT_EYES, WT_HAIR, WT_SHAPE, WT_ALPHA, WT_TATTOO + WT_UNDERPANTS, WT_UNDERSHIRT, WT_SKIN, WT_EYES, WT_HAIR, WT_SHAPE, WT_ALPHA, WT_TATTOO, WT_PHYSICS }; for (int idxType = 0, cntType = sizeof(wtRlvTypes) / sizeof(EWearableType); idxType < cntType; idxType++) diff --git a/indra/newview/scriptcounter.cpp b/indra/newview/scriptcounter.cpp index 87786c078..37acc1e37 100644 --- a/indra/newview/scriptcounter.cpp +++ b/indra/newview/scriptcounter.cpp @@ -357,7 +357,7 @@ void ScriptCounter::completechk() } void ScriptCounter::inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* user_data) { @@ -371,8 +371,8 @@ void ScriptCounter::inventoryChanged(LLViewerObject* obj, { if(inv) { - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for( ; it != end; ++it) { LLInventoryObject* asset = (*it); diff --git a/indra/newview/scriptcounter.h b/indra/newview/scriptcounter.h index 95c6c9985..b1c737189 100644 --- a/indra/newview/scriptcounter.h +++ b/indra/newview/scriptcounter.h @@ -48,7 +48,7 @@ public: static void processObjectPropertiesFamily(LLMessageSystem* msg, void** user_data); static void processObjectProperties(LLMessageSystem* msg, void** user_data); void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data); @@ -75,4 +75,4 @@ private: static bool doDelete; static std::stringstream sstr; static int countingDone; -}; \ No newline at end of file +}; diff --git a/indra/newview/shcommandhandler.cpp b/indra/newview/shcommandhandler.cpp index da2cc1aa1..a0c5eb9dd 100644 --- a/indra/newview/shcommandhandler.cpp +++ b/indra/newview/shcommandhandler.cpp @@ -175,4 +175,27 @@ CMD_SCRIPT(gettext) } } +#include "llphysicsmotion.h" + +void cmdline_printchat(std::string message); +CMD_CHAT(physparams) +{ + //args[1] = avatar name + for (std::vector::iterator iter = LLCharacter::sInstances.begin();iter != LLCharacter::sInstances.end(); ++iter) + { + LLVOAvatar* inst = (LLVOAvatar*) *iter; + if(!inst)continue; + if(inst->getFullname().find(args[1].asString())!=std::string::npos) + { + LLPhysicsMotionController *motion = (LLPhysicsMotionController*)(inst->findMotion(LLUUID("7360e029-3cb8-ebc4-863e-212df440d987"))); + cmdline_printchat(std::string("Phys param info for ")+inst->getFullname()+":\n"); + if(motion) + { + cmdline_printchat(motion->getString()); + } + else + cmdline_printchat("Unable to find physics motion controller\n"); + } + } +} #endif //shy_mod diff --git a/indra/newview/skins/Pony-Aquablue/colors.xml b/indra/newview/skins/Pony-Aquablue/colors.xml index 71a7787df..cf9466fad 100644 --- a/indra/newview/skins/Pony-Aquablue/colors.xml +++ b/indra/newview/skins/Pony-Aquablue/colors.xml @@ -1,3 +1,3 @@ - - - + + + diff --git a/indra/newview/skins/Pony-Aquablue/colors_base.xml b/indra/newview/skins/Pony-Aquablue/colors_base.xml index 917aeea7f..f77e42294 100644 --- a/indra/newview/skins/Pony-Aquablue/colors_base.xml +++ b/indra/newview/skins/Pony-Aquablue/colors_base.xml @@ -58,11 +58,11 @@ - - - - - + + + + + diff --git a/indra/newview/skins/dark/colors_base.xml b/indra/newview/skins/dark/colors_base.xml index 52ca9f1af..8e758b6cb 100644 --- a/indra/newview/skins/dark/colors_base.xml +++ b/indra/newview/skins/dark/colors_base.xml @@ -1,206 +1,206 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/textures/inv_item_physics.png b/indra/newview/skins/default/textures/inv_item_physics.png new file mode 100644 index 000000000..360baec46 Binary files /dev/null and b/indra/newview/skins/default/textures/inv_item_physics.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 0f5cc88ad..3f93a7ef8 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -389,5 +389,6 @@ + diff --git a/indra/newview/skins/default/xui/en-us/floater_about.xml b/indra/newview/skins/default/xui/en-us/floater_about.xml index f41797f6a..a050870ed 100644 --- a/indra/newview/skins/default/xui/en-us/floater_about.xml +++ b/indra/newview/skins/default/xui/en-us/floater_about.xml @@ -58,44 +58,44 @@ bottom="0" width="446" word_wrap="true"> -Singularity Viewer is developed and maintained by Siana Gearz, Shyotl Kuhr and Narv Czervik, with contributions by Henri Beauchamp, Kitty Barnett, Thickbrick Sleaford, Wolfspirit Magic and others. Singularity is based upon Ascent source code. Credits for Ascent include Hg Beeks, Charley Levenque, Hazim Gazov, Zwagoth Klaar, Qarl Fizz, and others. Ascent is based upon the Inertia source code. - - Singularity Viewer includes source code contributions of the following residents: Able Whitman, Adam Marker, Agathos Frascati, Aimee Trescothick, Alejandro Rosenthal, Aleric Inglewood, Alissa Sabre, Angus Boyd, Ann Congrejo, Argent Stonecutter, Asuka Neely, Balp Allen, Benja Kepler, Biancaluce Robbiani, Blakar Ogre, blino Nakamura, Boroondas Gupte, Bulli Schumann, bushing Spatula, Carjay McGinnis, Catherine Pfeffer, Celierra Darling, Cron Stardust, Dale Glass, Drewan Keats, Dylan Haskell, Dzonatas Sol, Eddy Stryker, EponymousDylan Ra, Eva Nowicka, Farallon Greyskin, Feep Larsson, Flemming Congrejo, Fluf Fredriksson, Fremont Cunningham, Geneko Nemeth, Gigs Taggart, Ginko Bayliss, Grazer Kline, Gudmund Shepherd, Hamncheese Omlet, HappySmurf Papp, Henri Beauchamp, Hikkoshi Sakai, Hiro Sommambulist, Hoze Menges, Ian Kas, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Joghert LeSabre, Kage Pixel, Ken March, Kerutsen Sellery, Khyota Wulluf, Kunnis Basiat, Lisa Lowe, Lockhart Cordoso, maciek marksman, Magnus Balczo, Malwina Dollinger, march Korda, Matthew Dowd, McCabe Maxsted, Michelle2 Zenovka, Mm Alder, Mr Greggan, Nicholaz Beresford, Nounouch Hapmouche, Patric Mills, Paul Churchill, Paula Innis, Peekay Semyorka, Peter Lameth, Pf Shan, princess niven, Renault Clio, Ringo Tuxing, Robin Cornelius, Ryozu Kojima, Salahzar Stenvaag, Sammy Frederix, Scrippy Scofield, Seg Baphomet, Sergen Davies, SignpostMarv Martin, Simon Nolan, SpacedOut Frye, Sporked Friis, Stevex Janus, Still Defiant, Strife Onizuka, Tayra Dagostino, TBBle Kurosawa, Teardrops Fall, tenebrous pau, Tharax Ferraris, Thickbrick Sleaford, Thraxis Epsilon, tiamat bingyi, TraductoresAnonimos Alter, Tue Torok, Vadim Bigbear, Vixen Heron, Whoops Babii, Wilton Lundquist, Zarkonnen Decosta, Zi Ree, Zipherius Turas - - Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others. + Singularity Viewer is developed and maintained by Siana Gearz, Shyotl Kuhr, Aleric Inglewood and Narv Czervik, with contributions by Henri Beauchamp, Kitty Barnett, Thickbrick Sleaford, Wolfspirit Magic and others. Singularity is based upon Ascent source code. Credits for Ascent include Hg Beeks, Charley Levenque, Hazim Gazov, Zwagoth Klaar, Qarl Fizz, and others. Ascent is based upon the Inertia source code. -Linden Lab would like to thank the following residents: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, -Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, -Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, -Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, -Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, -Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar + Singularity Viewer includes source code contributions of the following residents: Able Whitman, Adam Marker, Agathos Frascati, Aimee Trescothick, Alejandro Rosenthal, Aleric Inglewood, Alissa Sabre, Angus Boyd, Ann Congrejo, Argent Stonecutter, Asuka Neely, Balp Allen, Benja Kepler, Biancaluce Robbiani, Blakar Ogre, blino Nakamura, Boroondas Gupte, Bulli Schumann, bushing Spatula, Carjay McGinnis, Catherine Pfeffer, Celierra Darling, Cron Stardust, Dale Glass, Drewan Keats, Dylan Haskell, Dzonatas Sol, Eddy Stryker, EponymousDylan Ra, Eva Nowicka, Farallon Greyskin, Feep Larsson, Flemming Congrejo, Fluf Fredriksson, Fremont Cunningham, Geneko Nemeth, Gigs Taggart, Ginko Bayliss, Grazer Kline, Gudmund Shepherd, Hamncheese Omlet, HappySmurf Papp, Henri Beauchamp, Hikkoshi Sakai, Hiro Sommambulist, Hoze Menges, Ian Kas, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Joghert LeSabre, Kage Pixel, Ken March, Kerutsen Sellery, Khyota Wulluf, Kunnis Basiat, Lisa Lowe, Lockhart Cordoso, maciek marksman, Magnus Balczo, Malwina Dollinger, march Korda, Matthew Dowd, McCabe Maxsted, Michelle2 Zenovka, Mm Alder, Mr Greggan, Nicholaz Beresford, Nounouch Hapmouche, Patric Mills, Paul Churchill, Paula Innis, Peekay Semyorka, Peter Lameth, Pf Shan, princess niven, Renault Clio, Ringo Tuxing, Robin Cornelius, Ryozu Kojima, Salahzar Stenvaag, Sammy Frederix, Scrippy Scofield, Seg Baphomet, Sergen Davies, SignpostMarv Martin, Simon Nolan, SpacedOut Frye, Sporked Friis, Stevex Janus, Still Defiant, Strife Onizuka, Tayra Dagostino, TBBle Kurosawa, Teardrops Fall, tenebrous pau, Tharax Ferraris, Thickbrick Sleaford, Thraxis Epsilon, tiamat bingyi, TraductoresAnonimos Alter, Tue Torok, Vadim Bigbear, Vixen Heron, Whoops Babii, Wilton Lundquist, Zarkonnen Decosta, Zi Ree, Zipherius Turas + + Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others. + + Linden Lab would like to thank the following residents: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, + Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, + Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, + Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, + Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, + Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar - 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion - APR Copyright (C) 2000-2004 The Apache Software Foundation - cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) - DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. - expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. - FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). - GL Copyright (C) 1999-2004 Brian Paul. - Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. - jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) - jpeglib Copyright (C) 1991-1998, Thomas G. Lane. - ogg/vorbis Copyright (C) 2001, Xiphophorus - OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. - SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga - SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - xmlrpc-epi Copyright (C) 2000 Epinions, Inc. - zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. - google-perftools Copyright (c) 2005, Google Inc. + 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion + APR Copyright (C) 2000-2004 The Apache Software Foundation + cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) + DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. + expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. + FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). + GL Copyright (C) 1999-2004 Brian Paul. + Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. + jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) + jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + ogg/vorbis Copyright (C) 2001, Xiphophorus + OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. + SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga + SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + xmlrpc-epi Copyright (C) 2000 Epinions, Inc. + zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. + google-perftools Copyright (c) 2005, Google Inc. - All rights reserved. See licenses.txt for details. + All rights reserved. See licenses.txt for details. - Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) + Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) - To be a success in business, be daring, be first, be different. --Henry Marchant + To be a success in business, be daring, be first, be different. --Henry Marchant diff --git a/indra/newview/skins/default/xui/en-us/floater_about_land.xml b/indra/newview/skins/default/xui/en-us/floater_about_land.xml index f1fd3617d..0a6692eeb 100644 --- a/indra/newview/skins/default/xui/en-us/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en-us/floater_about_land.xml @@ -32,7 +32,7 @@ font="SansSerifSmall" handle_edit_keys_directly="false" height="52" left="96" max_length="255" mouse_opaque="true" name="Description" select_all_on_focus_received="false" select_on_focus="false" - width="350" word_wrap="true" /> + width="350" word_wrap="true" spell_check="true" /> About Land or select another parcel to show its details. + width="330" word_wrap="true" spell_check="true"> There is no Covenant provided for this Estate. - Arts & Culture + Arts and Culture Business @@ -671,7 +671,7 @@ Only large parcels can be listed in search. Newcomer Friendly - Parks & Nature + Parks and Nature Residential @@ -682,6 +682,9 @@ Only large parcels can be listed in search. Other + + Rental + -