Apertura del repositorio

This commit is contained in:
2025-05-24 18:09:39 -03:00
parent 76e6359dad
commit d883ddd0d0
35253 changed files with 2891973 additions and 2 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,6 @@
/* Localized versions of Info.plist keys */
CFBundleName = "Firestorm";
CFBundleShortVersionString = "Firestorm version %%VERSION%%";
CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2025 The Phoenix Firestorm Project, Inc.";
+1
View File
@@ -0,0 +1 @@
en-us
+1
View File
@@ -0,0 +1 @@
de
+90
View File
@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${MACOSX_EXECUTABLE_NAME}</string>
<key>CFBundleGetInfoString</key>
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
<key>CFBundleIconFile</key>
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLongVersionString</key>
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
<key>CFBundleName</key>
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>LSApplicationCategoryType</key>
<string>public.app-category.games</string>
<key>LSRequiresCarbon</key>
<true/>
<key>NSAppSleepDisabled</key>
<true/>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is needed to allow connection to voice.</string>
<key>NSHumanReadableCopyright</key>
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>slurl</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>seconlife</string>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/x-grid-location-info</string>
</array>
<key>CFBundleTypeName</key>
<string>Secondlife SLURL</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>SLRL</string>
</array>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSTypeIsPackage</key>
<true/>
<key>NSDocumentClass</key>
<string>SecondLifeSLURL</string>
</dict>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>Second Life URL</string>
<key>CFBundleURLSchemes</key>
<array>
<string>secondlife</string>
<string>x-grid-location-info</string>
<string>hop</string>
</array>
<key>LSIsAppleDefaultForScheme</key>
<true/>
</dict>
</array>
<key>NSPrincipalClass</key>
<string>${MACOSX_BUNDLE_NSPRINCIPAL_CLASS}</string>
<key>NSMainNibFile</key>
<string>${MACOSX_BUNDLE_NSMAIN_NIB_FILE}</string>
<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>
+83
View File
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${MACOSX_EXECUTABLE_NAME}</string>
<key>CFBundleGetInfoString</key>
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
<key>CFBundleIconFile</key>
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLongVersionString</key>
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
<key>CFBundleName</key>
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>LSRequiresCarbon</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
<key>NSMicrophoneUsageDescription</key>
<string>For voice chat, you must grant permission for Second Life to use the microphone.</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>slurl</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>seconlife</string>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/x-grid-location-info</string>
</array>
<key>CFBundleTypeName</key>
<string>Secondlife SLURL</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>SLRL</string>
</array>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSTypeIsPackage</key>
<true/>
<key>NSDocumentClass</key>
<string>SecondLifeSLURL</string>
</dict>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>Second Life URL</string>
<key>CFBundleURLSchemes</key>
<array>
<string>secondlife</string>
<string>x-grid-location-info</string>
</array>
<key>LSIsAppleDefaultForScheme</key>
<true/>
</dict>
</array>
<key>NSPrincipalClass</key>
<string>${MACOSX_BUNDLE_NSPRINCIPAL_CLASS}</string>
<key>NSMainNibFile</key>
<string>${MACOSX_BUNDLE_NSMAIN_NIB_FILE}</string>
</dict>
</plist>
+28
View File
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>SecondLifeVorbis</string>
<key>CFBundleGetInfoString</key>
<string></string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.secondlife.indra.vorbis</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>SecondLifeVorbis</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string></string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.0.1d1</string>
</dict>
</plist>
@@ -0,0 +1 @@
ja
+1
View File
@@ -0,0 +1 @@
ko
+502
View File
@@ -0,0 +1,502 @@
GNU LESSER GENERAL PUBLIC LICENSE
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.
GNU LESSER GENERAL PUBLIC LICENSE
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 a brief 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!
+687
View File
@@ -0,0 +1,687 @@
#include "llviewerprecompiledheaders.h"
#include "NACLantispam.h"
#include "llagent.h"
#include "llmutelist.h"
#include "llnotificationsutil.h"
#include "llslurl.h"
#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "llworld.h"
#include <time.h>
#include <boost/regex.hpp>
const static boost::regex NEWLINES("\\n{1}");
// NACLAntiSpamQueueEntry
NACLAntiSpamQueueEntry::NACLAntiSpamQueueEntry() :
mEntryTime(0),
mEntryAmount(0),
mBlocked(false)
{
}
void NACLAntiSpamQueueEntry::clearEntry()
{
mEntryTime = 0;
mEntryAmount = 0;
mBlocked = false;
}
U32 NACLAntiSpamQueueEntry::getEntryAmount()
{
return mEntryAmount;
}
U32 NACLAntiSpamQueueEntry::getEntryTime()
{
return mEntryTime;
}
void NACLAntiSpamQueueEntry::updateEntryAmount()
{
mEntryAmount++;
}
void NACLAntiSpamQueueEntry::updateEntryTime()
{
mEntryTime = (U32)time(NULL);
}
void NACLAntiSpamQueueEntry::setBlocked()
{
mBlocked = true;
}
bool NACLAntiSpamQueueEntry::getBlocked()
{
return mBlocked;
}
// NACLAntiSpamQueue
NACLAntiSpamQueue::NACLAntiSpamQueue(U32 time, U32 amount) :
mQueueTime(time),
mQueueAmount(amount)
{
}
NACLAntiSpamQueue::~NACLAntiSpamQueue()
{
purgeEntries();
}
void NACLAntiSpamQueue::setAmount(U32 amount)
{
mQueueAmount = amount;
}
void NACLAntiSpamQueue::setTime(U32 time)
{
mQueueTime = time;
}
U32 NACLAntiSpamQueue::getTime()
{
return mQueueTime;
}
U32 NACLAntiSpamQueue::getAmount()
{
return mQueueAmount;
}
NACLAntiSpamQueueEntry* NACLAntiSpamQueue::getEntry(const LLUUID& source)
{
spam_queue_entry_map_t::iterator found = mEntries.find(source);
if (found != mEntries.end())
{
return found->second;
}
else
{
return nullptr;
}
}
void NACLAntiSpamQueue::clearEntries()
{
for (auto& [id, entry] : mEntries)
{
//AO: Only clear entries that are not blocked.
if (!entry->getBlocked())
{
entry->clearEntry();
}
}
}
void NACLAntiSpamQueue::purgeEntries()
{
for (spam_queue_entry_map_t::iterator it = mEntries.begin(); it != mEntries.end(); ++it)
{
delete it->second;
}
mEntries.clear();
}
void NACLAntiSpamQueue::blockEntry(const LLUUID& source)
{
spam_queue_entry_map_t::iterator it = mEntries.find(source);
if (it == mEntries.end())
{
mEntries[source] = new NACLAntiSpamQueueEntry();
}
mEntries[source]->setBlocked();
}
EAntispamCheckResult NACLAntiSpamQueue::checkEntry(const LLUUID& name, U32 multiplier)
{
spam_queue_entry_map_t::iterator it = mEntries.find(name);
if (it != mEntries.end())
{
if (it->second->getBlocked())
{
return EAntispamCheckResult::ExistingBlock;
}
U32 eTime = it->second->getEntryTime();
U32 currentTime = (U32)time(0);
if ((currentTime - eTime) <= mQueueTime)
{
it->second->updateEntryAmount();
U32 eAmount = it->second->getEntryAmount();
if (eAmount > (mQueueAmount * multiplier))
{
it->second->setBlocked();
return EAntispamCheckResult::NewBlock;
}
else
{
return EAntispamCheckResult::Unblocked;
}
}
else
{
it->second->clearEntry();
it->second->updateEntryAmount();
it->second->updateEntryTime();
return EAntispamCheckResult::Unblocked;
}
}
else
{
LL_DEBUGS("AntiSpam") << "New queue entry:" << name.asString() << LL_ENDL;
NACLAntiSpamQueueEntry* entry = new NACLAntiSpamQueueEntry();
entry->updateEntryAmount();
entry->updateEntryTime();
mEntries[name] = entry;
return EAntispamCheckResult::Unblocked;
}
}
// NACLAntiSpamRegistry
static const char* QUEUE_NAME[ANTISPAM_QUEUE_MAX] = {
"Chat",
"Inventory",
"Instant Message",
"Calling Card",
"Sound",
"Sound Preload",
"Script Dialog",
"Teleport"
};
NACLAntiSpamRegistry::NACLAntiSpamRegistry() :
mGlobalTime(gSavedSettings.getU32("_NACL_AntiSpamTime")),
mGlobalAmount(gSavedSettings.getU32("_NACL_AntiSpamAmount")),
mGlobalQueue(gSavedSettings.getBOOL("_NACL_AntiSpamGlobalQueue"))
{
for (S32 queue = 0; queue < ANTISPAM_QUEUE_MAX; ++queue)
{
mQueues[queue] = new NACLAntiSpamQueue(mGlobalTime, mGlobalAmount);
}
}
NACLAntiSpamRegistry::~NACLAntiSpamRegistry()
{
purgeAllQueues();
for (S32 queue = 0; queue < ANTISPAM_QUEUE_MAX; ++queue)
{
delete mQueues[queue];
}
}
const char* NACLAntiSpamRegistry::getQueueName(EAntispamQueue queue)
{
if (queue >= ANTISPAM_QUEUE_MAX || queue < ANTISPAM_QUEUE_CHAT)
{
return "Unknown";
}
return QUEUE_NAME[queue];
}
void NACLAntiSpamRegistry::setRegisteredQueueTime(EAntispamQueue queue, U32 time)
{
if (queue >= ANTISPAM_QUEUE_MAX || queue < ANTISPAM_QUEUE_CHAT || mQueues[queue] == nullptr)
{
LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(queue) << LL_ENDL;
return;
}
mQueues[queue]->setTime(time);
}
void NACLAntiSpamRegistry::setRegisteredQueueAmount(EAntispamQueue queue, U32 amount)
{
if (queue >= ANTISPAM_QUEUE_MAX || queue < ANTISPAM_QUEUE_CHAT || mQueues[queue] == nullptr)
{
LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(queue) << LL_ENDL;
return;
}
mQueues[queue]->setAmount(amount);
}
void NACLAntiSpamRegistry::setAllQueueTimes(U32 time)
{
mGlobalTime = time;
for (S32 queue = 0; queue < ANTISPAM_QUEUE_MAX; ++queue)
{
if (mQueues[queue])
{
mQueues[queue]->setTime(time);
}
}
}
void NACLAntiSpamRegistry::setAllQueueAmounts(U32 amount)
{
mGlobalAmount = amount;
for (S32 queue = 0; queue < ANTISPAM_QUEUE_MAX; ++queue)
{
if (!mQueues[queue])
{
continue;
}
if (queue == ANTISPAM_QUEUE_SOUND || queue == ANTISPAM_QUEUE_SOUND_PRELOAD)
{
mQueues[queue]->setAmount(amount * 5);
}
else
{
mQueues[queue]->setAmount(amount);
}
}
}
void NACLAntiSpamRegistry::clearRegisteredQueue(EAntispamQueue queue)
{
if (queue >= ANTISPAM_QUEUE_MAX || queue < ANTISPAM_QUEUE_CHAT || mQueues[queue] == nullptr)
{
LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(queue) << LL_ENDL;
return;
}
mQueues[queue]->clearEntries();
}
void NACLAntiSpamRegistry::purgeRegisteredQueue(EAntispamQueue queue)
{
if (queue >= ANTISPAM_QUEUE_MAX || queue < ANTISPAM_QUEUE_CHAT || mQueues[queue] == nullptr)
{
LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(queue) << LL_ENDL;
return;
}
mQueues[queue]->purgeEntries();
}
void NACLAntiSpamRegistry::blockOnQueue(EAntispamQueue queue, const LLUUID& source)
{
static LLCachedControl<bool> useAntiSpam(gSavedSettings, "UseAntiSpam");
if (!useAntiSpam)
{
return;
}
if (mGlobalQueue)
{
blockGlobalEntry(source);
}
else
{
if (queue >= ANTISPAM_QUEUE_MAX || queue < ANTISPAM_QUEUE_CHAT || mQueues[queue] == nullptr)
{
LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(queue) << LL_ENDL;
return;
}
mQueues[queue]->blockEntry(source);
}
}
void NACLAntiSpamRegistry::blockGlobalEntry(const LLUUID& source)
{
spam_queue_entry_map_t::iterator it = mGlobalEntries.find(source);
if (it == mGlobalEntries.end())
{
mGlobalEntries[source] = new NACLAntiSpamQueueEntry();
}
mGlobalEntries[source]->setBlocked();
}
bool NACLAntiSpamRegistry::checkQueue(EAntispamQueue queue, const LLUUID& source, EAntispamSource sourcetype, U32 multiplier)
// returns true if blocked, false otherwise
{
// skip all checks if we're we've been administratively turned off
static LLCachedControl<bool> useAntiSpam(gSavedSettings, "UseAntiSpam");
static LLCachedControl<bool> useAntiSpamMine(gSavedSettings, "FSUseAntiSpamMine");
if (!useAntiSpam)
{
return false;
}
if (source.isNull() || gAgentID == source)
{
return false;
}
if (sourcetype == ANTISPAM_SOURCE_OBJECT)
{
LLViewerObject* obj = gObjectList.findObject(source);
if (obj && obj->permYouOwner() && !useAntiSpamMine)
{
return false;
}
}
EAntispamCheckResult result{ EAntispamCheckResult::Unblocked };
if (mGlobalQueue)
{
result = checkGlobalEntry(source, multiplier);
}
else
{
if (queue >= ANTISPAM_QUEUE_MAX || queue < ANTISPAM_QUEUE_CHAT || mQueues[queue] == nullptr)
{
LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(queue) << LL_ENDL;
return false;
}
result = mQueues[queue]->checkEntry(source, multiplier);
}
if (result == EAntispamCheckResult::Unblocked) // safe
{
return false;
}
if (result == EAntispamCheckResult::ExistingBlock) // previously blocked
{
return true;
}
if (result == EAntispamCheckResult::NewBlock) // newly blocked, result == 1
{
if (!LLMuteList::getInstance()->isMuted(source))
{
AntispamObjectData data;
data.mName = source.asString();
data.mQueue = queue;
data.mCount = multiplier * mQueues[queue]->getAmount();
data.mPeriod = mQueues[queue]->getTime();
data.mNotificationId = "AntiSpamBlocked";
if (sourcetype == ANTISPAM_SOURCE_OBJECT)
{
bool sent = false;
for (auto region : LLWorld::getInstance()->getRegionList())
{
if (gMessageSystem && region && region->isAlive())
{
gMessageSystem->newMessage(_PREHASH_RequestObjectPropertiesFamily);
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
gMessageSystem->addU32Fast(_PREHASH_RequestFlags, 0);
gMessageSystem->addUUIDFast(_PREHASH_ObjectID, source);
gMessageSystem->sendReliable(region->getHost());
sent = true;
}
}
if (sent)
{
mObjectData[source] = data;
}
}
else if (sourcetype == ANTISPAM_SOURCE_AGENT)
{
LLUUID request_id;
request_id.generate();
LLAvatarNameCache::callback_connection_t cb = LLAvatarNameCache::get(source, boost::bind(&NACLAntiSpamRegistry::onAvatarNameCallback, this, _1, _2, data, request_id));
mAvatarNameCallbackConnections.insert(std::make_pair(request_id, cb));
}
}
LL_INFOS("AntiSpam") << "Blocked " << source.asString() << " for spamming a " << getQueueName(queue) << " (" << multiplier * mQueues[queue]->getAmount() << ") times in " << mQueues[queue]->getTime() << " seconds." << LL_ENDL;
return true;
}
// fallback, should not get here
return false;
}
bool NACLAntiSpamRegistry::checkNewlineFlood(EAntispamQueue queue, const LLUUID& source, const std::string& message)
{
if (!isBlockedOnQueue(ANTISPAM_QUEUE_IM, source))
{
static LLCachedControl<U32> _NACL_AntiSpamNewlines(gSavedSettings, "_NACL_AntiSpamNewlines");
boost::sregex_iterator iter(message.begin(), message.end(), NEWLINES);
if ((std::abs(std::distance(iter, boost::sregex_iterator())) > _NACL_AntiSpamNewlines))
{
blockOnQueue(ANTISPAM_QUEUE_IM, source);
if (!LLMuteList::getInstance()->isMuted(source))
{
LL_INFOS("AntiSpam") << "[antispam] blocked owner due to too many newlines: " << source << LL_ENDL;
AntispamObjectData data;
data.mName = source.asString();
data.mQueue = queue;
data.mCount = _NACL_AntiSpamNewlines();
data.mPeriod = 0;
data.mNotificationId = (queue == ANTISPAM_QUEUE_IM ? "AntiSpamImNewLineFloodBlocked" : "AntiSpamChatNewLineFloodBlocked");
LLUUID request_id;
request_id.generate();
LLAvatarNameCache::callback_connection_t cb = LLAvatarNameCache::get(source,
boost::bind(&NACLAntiSpamRegistry::onAvatarNameCallback,
this, _1, _2, data, request_id));
mAvatarNameCallbackConnections.insert( std::make_pair( request_id, cb ) );
}
return true;
}
return false;
}
return true;
}
bool NACLAntiSpamRegistry::isBlockedOnQueue(EAntispamQueue queue, const LLUUID& source)
{
// skip all checks if we're we've been administratively turned off
static LLCachedControl<bool> useAntiSpam(gSavedSettings, "UseAntiSpam");
if (!useAntiSpam)
{
return false;
}
if (mGlobalQueue)
{
spam_queue_entry_map_t::iterator found = mGlobalEntries.find(source);
if (found != mGlobalEntries.end())
{
return (found->second->getBlocked());
}
else
{
return false;
}
}
else
{
if (queue >= ANTISPAM_QUEUE_MAX || queue < ANTISPAM_QUEUE_CHAT || mQueues[queue] == nullptr)
{
LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(queue) << LL_ENDL;
return false;
}
NACLAntiSpamQueueEntry* entry = mQueues[queue]->getEntry(source);
return (entry && entry->getBlocked());
}
}
// Global queue
void NACLAntiSpamRegistry::setGlobalQueue(bool value)
{
purgeAllQueues();
mGlobalQueue = value;
}
void NACLAntiSpamRegistry::setGlobalAmount(U32 amount)
{
mGlobalAmount = amount;
}
void NACLAntiSpamRegistry::setGlobalTime(U32 time)
{
mGlobalTime = time;
}
void NACLAntiSpamRegistry::clearAllQueues()
{
if (mGlobalQueue)
{
clearGlobalEntries();
}
else
{
for (S32 queue = 0; queue < ANTISPAM_QUEUE_MAX; ++queue)
{
if (mQueues[queue])
{
mQueues[queue]->clearEntries();
}
}
}
}
void NACLAntiSpamRegistry::purgeAllQueues()
{
for (auto& [avid, callback] : mAvatarNameCallbackConnections)
{
if (callback.connected())
{
callback.disconnect();
}
}
mAvatarNameCallbackConnections.clear();
if (mGlobalQueue)
{
purgeGlobalEntries();
}
else
{
for (S32 queue = 0; queue < ANTISPAM_QUEUE_MAX; ++queue)
{
if (mQueues[queue])
{
mQueues[queue]->purgeEntries();
}
}
}
mObjectData.clear();
}
EAntispamCheckResult NACLAntiSpamRegistry::checkGlobalEntry(const LLUUID& source, U32 multiplier)
{
spam_queue_entry_map_t::iterator it = mGlobalEntries.find(source);
if (it != mGlobalEntries.end())
{
if (it->second->getBlocked())
{
return EAntispamCheckResult::ExistingBlock;
}
U32 eTime = it->second->getEntryTime();
U32 currentTime = (U32)time(NULL);
if ((currentTime - eTime) <= mGlobalTime)
{
it->second->updateEntryAmount();
U32 eAmount = it->second->getEntryAmount();
if (eAmount > (mGlobalAmount * multiplier))
{
return EAntispamCheckResult::NewBlock;
}
else
{
return EAntispamCheckResult::Unblocked;
}
}
else
{
it->second->clearEntry();
it->second->updateEntryAmount();
it->second->updateEntryTime();
return EAntispamCheckResult::Unblocked;
}
}
else
{
NACLAntiSpamQueueEntry* entry = new NACLAntiSpamQueueEntry();
entry->updateEntryAmount();
entry->updateEntryTime();
mGlobalEntries[source] = entry;
return EAntispamCheckResult::Unblocked;
}
}
void NACLAntiSpamRegistry::clearGlobalEntries()
{
for (auto& [id, entry] : mGlobalEntries)
{
entry->clearEntry();
}
}
void NACLAntiSpamRegistry::purgeGlobalEntries()
{
for (spam_queue_entry_map_t::iterator it = mGlobalEntries.begin(); it != mGlobalEntries.end(); ++it)
{
delete it->second;
}
mGlobalEntries.clear();
}
void NACLAntiSpamRegistry::processObjectPropertiesFamily(LLMessageSystem* msg)
{
static LLCachedControl<bool> useAntiSpam(gSavedSettings, "UseAntiSpam");
if (!useAntiSpam)
{
return;
}
LLUUID id;
LLUUID owner_id;
std::string name;
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, id);
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id);
msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, name);
std::map<LLUUID, AntispamObjectData>::iterator found = mObjectData.find(id);
if (found != mObjectData.end())
{
AntispamObjectData data = found->second;
if (!isBlockedOnQueue(data.mQueue, owner_id))
{
data.mName = LLSLURL("objectim", id, "").getSLURLString() + "?name=" + LLURI::escape(name) + "&owner=" + owner_id.asString();
notify(data);
}
mObjectData.erase(found);
}
}
void NACLAntiSpamRegistry::onAvatarNameCallback(const LLUUID& av_id, const LLAvatarName& av_name, AntispamObjectData data, const LLUUID& request_id)
{
std::map<LLUUID, LLAvatarNameCache::callback_connection_t>::iterator found = mAvatarNameCallbackConnections.find(request_id);
if (found != mAvatarNameCallbackConnections.end())
{
if (found->second.connected())
{
found->second.disconnect();
}
mAvatarNameCallbackConnections.erase(found);
}
data.mName = LLSLURL("agent", av_id, "inspect").getSLURLString();
notify(data);
}
void NACLAntiSpamRegistry::notify(AntispamObjectData data)
{
LLSD args;
args["SOURCE"] = data.mName;
args["QUEUE"] = getQueueName(data.mQueue);
args["COUNT"] = llformat("%d", data.mCount);
args["PERIOD"] = llformat("%d", data.mPeriod);
LLNotificationsUtil::add(data.mNotificationId, args);
}
+149
View File
@@ -0,0 +1,149 @@
#ifndef NACL_ANTISPAM_H
#define NACL_ANTISPAM_H
#include <unordered_map>
#include <unordered_set>
#include "llsingleton.h"
#include "llavatarnamecache.h"
typedef enum e_antispam_queue
{
ANTISPAM_QUEUE_CHAT,
ANTISPAM_QUEUE_INVENTORY,
ANTISPAM_QUEUE_IM,
ANTISPAM_QUEUE_CALLING_CARD,
ANTISPAM_QUEUE_SOUND,
ANTISPAM_QUEUE_SOUND_PRELOAD,
ANTISPAM_QUEUE_SCRIPT_DIALOG,
ANTISPAM_QUEUE_TELEPORT,
ANTISPAM_QUEUE_MAX
} EAntispamQueue;
typedef enum e_antispam_source_type
{
ANTISPAM_SOURCE_AGENT,
ANTISPAM_SOURCE_OBJECT
} EAntispamSource;
enum class EAntispamCheckResult
{
Unblocked,
NewBlock,
ExistingBlock
};
struct AntispamObjectData
{
std::string mName;
EAntispamQueue mQueue;
U32 mCount;
U32 mPeriod;
std::string mNotificationId;
};
class NACLAntiSpamQueueEntry
{
friend class NACLAntiSpamQueue;
friend class NACLAntiSpamRegistry;
public:
U32 getEntryAmount();
U32 getEntryTime();
protected:
NACLAntiSpamQueueEntry();
void clearEntry();
void updateEntryAmount();
void updateEntryTime();
bool getBlocked();
void setBlocked();
private:
U32 mEntryAmount;
U32 mEntryTime;
bool mBlocked;
};
typedef std::unordered_map<LLUUID, NACLAntiSpamQueueEntry*, FSUUIDHash> spam_queue_entry_map_t;
typedef std::unordered_set<LLUUID, FSUUIDHash> collision_sound_set_t;
class NACLAntiSpamQueue
{
friend class NACLAntiSpamRegistry;
public:
U32 getAmount();
U32 getTime();
protected:
NACLAntiSpamQueue(U32 time, U32 amount);
~NACLAntiSpamQueue();
void setAmount(U32 amount);
void setTime(U32 time);
void blockEntry(const LLUUID& source);
EAntispamCheckResult checkEntry(const LLUUID& source, U32 multiplier);
NACLAntiSpamQueueEntry* getEntry(const LLUUID& source);
void clearEntries();
void purgeEntries();
private:
spam_queue_entry_map_t mEntries;
U32 mQueueAmount;
U32 mQueueTime;
};
class NACLAntiSpamRegistry : public LLSingleton<NACLAntiSpamRegistry>
{
LLSINGLETON(NACLAntiSpamRegistry);
~NACLAntiSpamRegistry();
public:
void setGlobalQueue(bool value);
void setGlobalAmount(U32 amount);
void setGlobalTime(U32 time);
void setRegisteredQueueTime(EAntispamQueue queue, U32 time);
void setRegisteredQueueAmount(EAntispamQueue queue, U32 amount);
void setAllQueueTimes(U32 amount);
void setAllQueueAmounts(U32 time);
void blockOnQueue(EAntispamQueue queue, const LLUUID& source);
bool checkQueue(EAntispamQueue queue, const LLUUID& source, EAntispamSource sourcetype, U32 multiplier = 1);
bool checkNewlineFlood(EAntispamQueue queue, const LLUUID& source, const std::string& message);
bool isBlockedOnQueue(EAntispamQueue queue, const LLUUID& source);
void clearRegisteredQueue(EAntispamQueue queue);
void purgeRegisteredQueue(EAntispamQueue queue);
void clearAllQueues();
void purgeAllQueues();
void processObjectPropertiesFamily(LLMessageSystem* msg);
private:
const char* getQueueName(EAntispamQueue queue);
void blockGlobalEntry(const LLUUID& source);
EAntispamCheckResult checkGlobalEntry(const LLUUID& source, U32 multiplier);
void clearGlobalEntries();
void purgeGlobalEntries();
void onAvatarNameCallback(const LLUUID& av_id, const LLAvatarName& av_name, AntispamObjectData data, const LLUUID& request_id);
void notify(AntispamObjectData data);
NACLAntiSpamQueue* mQueues[ANTISPAM_QUEUE_MAX];
spam_queue_entry_map_t mGlobalEntries;
U32 mGlobalTime;
U32 mGlobalAmount;
bool mGlobalQueue;
collision_sound_set_t mCollisionSounds;
std::map<LLUUID, AntispamObjectData> mObjectData;
std::map<LLUUID, LLAvatarNameCache::callback_connection_t> mAvatarNameCallbackConnections;
};
#endif // NACL_ANTISPAM_H
+515
View File
@@ -0,0 +1,515 @@
/**
* @file NACLfloaterexploresounds.cpp
*/
#include "llviewerprecompiledheaders.h"
#include "NACLfloaterexploresounds.h"
#include "llcheckboxctrl.h"
#include "llscrolllistctrl.h"
#include "llagent.h"
#include "llagentcamera.h"
#include "llavatarnamecache.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "fsassetblacklist.h"
#include "fscommon.h"
#include "rlvhandler.h"
static const size_t num_collision_sounds = 28;
const LLUUID collision_sounds[num_collision_sounds] =
{
LLUUID("dce5fdd4-afe4-4ea1-822f-dd52cac46b08"),
LLUUID("51011582-fbca-4580-ae9e-1a5593f094ec"),
LLUUID("68d62208-e257-4d0c-bbe2-20c9ea9760bb"),
LLUUID("75872e8c-bc39-451b-9b0b-042d7ba36cba"),
LLUUID("6a45ba0b-5775-4ea8-8513-26008a17f873"),
LLUUID("992a6d1b-8c77-40e0-9495-4098ce539694"),
LLUUID("2de4da5a-faf8-46be-bac6-c4d74f1e5767"),
LLUUID("6e3fb0f7-6d9c-42ca-b86b-1122ff562d7d"),
LLUUID("14209133-4961-4acc-9649-53fc38ee1667"),
LLUUID("bc4a4348-cfcc-4e5e-908e-8a52a8915fe6"),
LLUUID("9e5c1297-6eed-40c0-825a-d9bcd86e3193"),
LLUUID("e534761c-1894-4b61-b20c-658a6fb68157"),
LLUUID("8761f73f-6cf9-4186-8aaa-0948ed002db1"),
LLUUID("874a26fd-142f-4173-8c5b-890cd846c74d"),
LLUUID("0e24a717-b97e-4b77-9c94-b59a5a88b2da"),
LLUUID("75cf3ade-9a5b-4c4d-bb35-f9799bda7fb2"),
LLUUID("153c8bf7-fb89-4d89-b263-47e58b1b4774"),
LLUUID("55c3e0ce-275a-46fa-82ff-e0465f5e8703"),
LLUUID("24babf58-7156-4841-9a3f-761bdbb8e237"),
LLUUID("aca261d8-e145-4610-9e20-9eff990f2c12"),
LLUUID("0642fba6-5dcf-4d62-8e7b-94dbb529d117"),
LLUUID("25a863e8-dc42-4e8a-a357-e76422ace9b5"),
LLUUID("9538f37c-456e-4047-81be-6435045608d4"),
LLUUID("8c0f84c3-9afd-4396-b5f5-9bca2c911c20"),
LLUUID("be582e5d-b123-41a2-a150-454c39e961c8"),
LLUUID("c70141d4-ba06-41ea-bcbc-35ea81cb8335"),
LLUUID("7d1826f4-24c4-4aac-8c2e-eff45df37783"),
LLUUID("063c97d3-033a-4e9b-98d8-05c8074922cb")
};
NACLFloaterExploreSounds::NACLFloaterExploreSounds(const LLSD& key)
: LLFloater(key), LLEventTimer(0.25f)
{
}
NACLFloaterExploreSounds::~NACLFloaterExploreSounds()
{
for (blacklist_avatar_name_cache_connection_map_t::iterator it = mBlacklistAvatarNameCacheConnections.begin(); it != mBlacklistAvatarNameCacheConnections.end(); ++it)
{
if (it->second.connected())
{
it->second.disconnect();
}
}
mBlacklistAvatarNameCacheConnections.clear();
mLocalPlayingAudioSourceIDs.clear();
}
bool NACLFloaterExploreSounds::postBuild()
{
getChild<LLButton>("play_locally_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handlePlayLocally, this));
getChild<LLButton>("look_at_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleLookAt, this));
getChild<LLButton>("stop_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStop, this));
getChild<LLButton>("bl_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistSound, this));
getChild<LLButton>("stop_locally_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStopLocally, this));
mHistoryScroller = getChild<LLScrollListCtrl>("sound_list");
mHistoryScroller->setCommitCallback(boost::bind(&NACLFloaterExploreSounds::handleSelection, this));
mHistoryScroller->setDoubleClickCallback(boost::bind(&NACLFloaterExploreSounds::handlePlayLocally, this));
mHistoryScroller->sortByColumn("playing", true);
mCollisionSounds = getChild<LLCheckBoxCtrl>("collision_chk");
mRepeatedAssets = getChild<LLCheckBoxCtrl>("repeated_asset_chk");
mAvatarSounds = getChild<LLCheckBoxCtrl>("avatars_chk");
mObjectSounds = getChild<LLCheckBoxCtrl>("objects_chk");
mPaused = getChild<LLCheckBoxCtrl>("pause_chk");
return true;
}
void NACLFloaterExploreSounds::handleSelection()
{
size_t num_selected = mHistoryScroller->getAllSelected().size();
bool multiple = (num_selected > 1);
childSetEnabled("look_at_btn", (num_selected && !multiple));
childSetEnabled("play_locally_btn", num_selected);
childSetEnabled("stop_btn", num_selected);
childSetEnabled("bl_btn", num_selected);
}
LLSoundHistoryItem NACLFloaterExploreSounds::getItem(const LLUUID& itemID)
{
std::map<LLUUID, LLSoundHistoryItem>::iterator found = gSoundHistory.find(itemID);
if (found != gSoundHistory.end())
{
return found->second;
}
else
{
// If log is paused, hopefully we can find it in mLastHistory
std::list<LLSoundHistoryItem>::iterator iter = mLastHistory.begin();
std::list<LLSoundHistoryItem>::iterator end = mLastHistory.end();
for ( ; iter != end; ++iter)
{
if ((*iter).mID == itemID)
{
return (*iter);
}
}
}
LLSoundHistoryItem item;
item.mID = LLUUID::null;
return item;
}
class LLSoundHistoryItemCompare
{
public:
bool operator() (LLSoundHistoryItem first, LLSoundHistoryItem second)
{
if (first.mPlaying)
{
if (second.mPlaying)
{
return (first.mTimeStarted > second.mTimeStarted);
}
else
{
return true;
}
}
else if (second.mPlaying)
{
return false;
}
else
{
return (first.mTimeStopped > second.mTimeStopped);
}
}
};
bool NACLFloaterExploreSounds::tick()
{
static const std::string str_playing = getString("Playing");
static const std::string str_not_playing = getString("NotPlaying");
static const std::string str_type_ui = getString("Type_UI");
static const std::string str_type_avatar = getString("Type_Avatar");
static const std::string str_type_trigger_sound = getString("Type_llTriggerSound");
static const std::string str_type_loop_sound = getString("Type_llLoopSound");
static const std::string str_type_play_sound = getString("Type_llPlaySound");
static const std::string str_unknown_name = LLTrans::getString("AvatarNameWaiting");
bool show_collision_sounds = mCollisionSounds->get();
bool show_repeated_assets = mRepeatedAssets->get();
bool show_avatars = mAvatarSounds->get();
bool show_objects = mObjectSounds->get();
std::list<LLSoundHistoryItem> history;
if (mPaused->get())
{
history = mLastHistory;
}
else
{
std::map<LLUUID, LLSoundHistoryItem>::iterator map_iter = gSoundHistory.begin();
std::map<LLUUID, LLSoundHistoryItem>::iterator map_end = gSoundHistory.end();
for ( ; map_iter != map_end; ++map_iter)
{
history.push_back((*map_iter).second);
}
LLSoundHistoryItemCompare c;
history.sort(c);
mLastHistory = history;
}
// Save scroll pos and selection so they can be restored
S32 scroll_pos = mHistoryScroller->getScrollPos();
uuid_vec_t selected_ids;
std::vector<LLScrollListItem*> selected_items = mHistoryScroller->getAllSelected();
std::vector<LLScrollListItem*>::iterator selection_iter = selected_items.begin();
std::vector<LLScrollListItem*>::iterator selection_end = selected_items.end();
for (; selection_iter != selection_end; ++selection_iter)
{
selected_ids.push_back((*selection_iter)->getUUID());
}
mHistoryScroller->clearRows();
std::list<LLUUID> unique_asset_list;
std::list<LLSoundHistoryItem>::iterator iter = history.begin();
std::list<LLSoundHistoryItem>::iterator end = history.end();
for ( ; iter != end; ++iter)
{
LLSoundHistoryItem item = (*iter);
bool is_avatar = item.mOwnerID == item.mSourceID;
if (is_avatar && !show_avatars)
{
continue;
}
bool is_object = !is_avatar;
if (is_object && !show_objects)
{
continue;
}
bool is_repeated_asset = std::find(unique_asset_list.begin(), unique_asset_list.end(), item.mAssetID) != unique_asset_list.end();
if (is_repeated_asset && !show_repeated_assets)
{
continue;
}
if (!item.mReviewed)
{
item.mReviewedCollision = std::find(&collision_sounds[0], &collision_sounds[num_collision_sounds], item.mAssetID) != &collision_sounds[num_collision_sounds];
item.mReviewed = true;
}
bool is_collision_sound = item.mReviewedCollision;
if (is_collision_sound && !show_collision_sounds)
{
continue;
}
unique_asset_list.push_back(item.mAssetID);
LLSD element;
element["id"] = item.mID;
LLSD& playing_column = element["columns"][0];
playing_column["column"] = "playing";
if (item.mPlaying)
{
playing_column["value"] = " " + str_playing;
}
else
{
LLStringUtil::format_map_t format_args;
format_args["TIME"] = llformat("%.1f", static_cast<F32>((LLTimer::getElapsedSeconds() - item.mTimeStopped) / 60.0));
playing_column["value"] = FSCommon::format_string(str_not_playing, format_args);
}
LLSD& type_column = element["columns"][1];
type_column["column"] = "type";
if (item.mType == LLAudioEngine::AUDIO_TYPE_UI)
{
// this shouldn't happen for now, as UI is forbidden in the log
type_column["value"] = str_type_ui;
}
else
{
std::string type;
if (is_avatar)
{
type = str_type_avatar;
}
else
{
if (item.mIsTrigger)
{
type = str_type_trigger_sound;
}
else
{
if (item.mIsLooped)
{
type = str_type_loop_sound;
}
else
{
type = str_type_play_sound;
}
}
}
type_column["value"] = type;
}
LLSD& owner_column = element["columns"][2];
owner_column["column"] = "owner";
LLAvatarName av_name;
if (LLAvatarNameCache::get(item.mOwnerID, &av_name))
{
owner_column["value"] = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name);
}
else
{
owner_column["value"] = str_unknown_name;
}
LLSD& sound_column = element["columns"][3];
sound_column["column"] = "sound";
sound_column["value"] = item.mAssetID.asString().substr(0,16);
mHistoryScroller->addElement(element, ADD_BOTTOM);
}
mHistoryScroller->selectMultiple(selected_ids);
mHistoryScroller->setScrollPos(scroll_pos);
// Clean up stopped local audio source IDs
uuid_vec_t stopped_audio_src_ids;
uuid_vec_t::iterator audio_src_id_iter = mLocalPlayingAudioSourceIDs.begin();
uuid_vec_t::iterator audio_src_id_end = mLocalPlayingAudioSourceIDs.end();
for (; audio_src_id_iter != audio_src_id_end; ++audio_src_id_iter)
{
LLUUID audio_src_id = *audio_src_id_iter;
LLAudioSource* audio_source = gAudiop->findAudioSource(audio_src_id);
if (!audio_source || audio_source->isDone())
{
stopped_audio_src_ids.push_back(audio_src_id);
}
}
for (uuid_vec_t::iterator stopped_audio_src_ids_iter = stopped_audio_src_ids.begin();
stopped_audio_src_ids_iter != stopped_audio_src_ids.end(); ++stopped_audio_src_ids_iter)
{
uuid_vec_t::iterator find_iter = std::find(mLocalPlayingAudioSourceIDs.begin(), mLocalPlayingAudioSourceIDs.end(), *stopped_audio_src_ids_iter);
if (find_iter != mLocalPlayingAudioSourceIDs.end())
{
mLocalPlayingAudioSourceIDs.erase(find_iter);
}
}
childSetEnabled("stop_locally_btn", mLocalPlayingAudioSourceIDs.size() > 0);
return false;
}
void NACLFloaterExploreSounds::handlePlayLocally()
{
std::vector<LLScrollListItem*> selection = mHistoryScroller->getAllSelected();
std::vector<LLScrollListItem*>::iterator selection_iter = selection.begin();
std::vector<LLScrollListItem*>::iterator selection_end = selection.end();
uuid_vec_t asset_list;
for ( ; selection_iter != selection_end; ++selection_iter)
{
LLSoundHistoryItem item = getItem((*selection_iter)->getValue());
if (item.mID.isNull())
{
continue;
}
// Unique assets only
if (std::find(asset_list.begin(), asset_list.end(), item.mAssetID) == asset_list.end())
{
asset_list.push_back(item.mAssetID);
LLUUID audio_source_id = LLUUID::generateNewID();
gAudiop->triggerSound(item.mAssetID, gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI, LLVector3d::zero, LLUUID::null, audio_source_id);
mLocalPlayingAudioSourceIDs.push_back(audio_source_id);
}
}
childSetEnabled("stop_locally_btn", mLocalPlayingAudioSourceIDs.size() > 0);
}
void NACLFloaterExploreSounds::handleLookAt()
{
LLUUID selection = mHistoryScroller->getSelectedValue().asUUID();
LLSoundHistoryItem item = getItem(selection); // Single item only
if (item.mID.isNull())
{
return;
}
LLVector3d pos_global = item.mPosition;
// Try to find object position
if (item.mSourceID.notNull())
{
LLViewerObject* object = gObjectList.findObject(item.mSourceID);
if (object)
{
pos_global = object->getPositionGlobal();
}
}
// Move the camera
// Find direction to self (reverse)
LLVector3d cam = gAgent.getPositionGlobal() - pos_global;
cam.normalize();
// Go 4 meters back and 3 meters up
cam *= 4.0;
cam += pos_global;
cam += LLVector3d(0.0, 0.0, 3.0);
gAgentCamera.setFocusOnAvatar(false, false);
gAgentCamera.setCameraPosAndFocusGlobal(cam, pos_global, item.mSourceID);
gAgentCamera.setCameraAnimating(false);
}
void NACLFloaterExploreSounds::handleStop()
{
std::vector<LLScrollListItem*> selection = mHistoryScroller->getAllSelected();
for (const auto& selection_item : selection)
{
LLSoundHistoryItem item = getItem(selection_item->getValue());
if (item.mID.notNull() && item.mPlaying)
{
LLAudioSource* audio_source = gAudiop->findAudioSource(item.mSourceID);
if (audio_source)
{
S32 type = item.mType;
audio_source->setType(LLAudioEngine::AUDIO_TYPE_UI);
audio_source->play(LLUUID::null);
audio_source->setType(type);
}
else
{
LL_WARNS("SoundExplorer") << "audio source for source ID " << item.mSourceID << " already gone but still marked as playing. Fixing ..." << LL_ENDL;
if (gSoundHistory.find(item.mID) != gSoundHistory.end())
{
gSoundHistory[item.mID].mPlaying = false;
gSoundHistory[item.mID].mTimeStopped = LLTimer::getElapsedSeconds();
}
else
{
for (auto& histItem : mLastHistory)
{
if (histItem.mID == item.mID)
{
histItem.mPlaying = false;
histItem.mTimeStopped = LLTimer::getElapsedSeconds();
break;
}
}
}
continue;
}
}
}
}
void NACLFloaterExploreSounds::handleStopLocally()
{
uuid_vec_t::iterator audio_source_id_iter = mLocalPlayingAudioSourceIDs.begin();
uuid_vec_t::iterator audio_source_id_end = mLocalPlayingAudioSourceIDs.end();
for (; audio_source_id_iter != audio_source_id_end; ++audio_source_id_iter)
{
LLUUID audio_source_id = *audio_source_id_iter;
LLAudioSource* audio_source = gAudiop->findAudioSource(audio_source_id);
if (audio_source && !audio_source->isDone())
{
audio_source->play(LLUUID::null);
}
}
mLocalPlayingAudioSourceIDs.clear();
}
//add sound to blacklist
void NACLFloaterExploreSounds::blacklistSound()
{
std::vector<LLScrollListItem*> selection = mHistoryScroller->getAllSelected();
std::vector<LLScrollListItem*>::iterator selection_iter = selection.begin();
std::vector<LLScrollListItem*>::iterator selection_end = selection.end();
for ( ; selection_iter != selection_end; ++selection_iter)
{
LLSoundHistoryItem item = getItem((*selection_iter)->getValue());
if (item.mID.isNull())
{
continue;
}
std::string region_name;
LLViewerRegion* cur_region = gAgent.getRegion();
if (cur_region)
{
region_name = cur_region->getName();
}
blacklist_avatar_name_cache_connection_map_t::iterator it = mBlacklistAvatarNameCacheConnections.find(item.mOwnerID);
if (it != mBlacklistAvatarNameCacheConnections.end())
{
if (it->second.connected())
{
it->second.disconnect();
}
mBlacklistAvatarNameCacheConnections.erase(it);
}
LLAvatarNameCache::callback_connection_t cb = LLAvatarNameCache::get(item.mOwnerID, boost::bind(&NACLFloaterExploreSounds::onBlacklistAvatarNameCacheCallback, this, _1, _2, item.mAssetID, region_name));
mBlacklistAvatarNameCacheConnections.insert(std::make_pair(item.mOwnerID, cb));
}
}
void NACLFloaterExploreSounds::onBlacklistAvatarNameCacheCallback(const LLUUID& av_id, const LLAvatarName& av_name, const LLUUID& asset_id, const std::string& region_name)
{
blacklist_avatar_name_cache_connection_map_t::iterator it = mBlacklistAvatarNameCacheConnections.find(av_id);
if (it != mBlacklistAvatarNameCacheConnections.end())
{
if (it->second.connected())
{
it->second.disconnect();
}
mBlacklistAvatarNameCacheConnections.erase(it);
}
FSAssetBlacklist::getInstance()->addNewItemToBlacklist(asset_id, av_name.getCompleteName(), region_name, LLAssetType::AT_SOUND);
}
+53
View File
@@ -0,0 +1,53 @@
/**
* @file NACLfloaterexploresounds.h
*/
#ifndef LL_LLFLOATEREXPLORESOUNDS_H
#define LL_LLFLOATEREXPLORESOUNDS_H
#include "llfloater.h"
#include "lleventtimer.h"
#include "llaudioengine.h"
#include "llavatarnamecache.h"
class LLCheckBoxCtrl;
class LLScrollListCtrl;
class NACLFloaterExploreSounds
: public LLFloater, public LLEventTimer
{
public:
NACLFloaterExploreSounds(const LLSD& key);
bool postBuild() override;
bool tick() override;
LLSoundHistoryItem getItem(const LLUUID& itemID);
private:
virtual ~NACLFloaterExploreSounds();
void handlePlayLocally();
void handleLookAt();
void handleStop();
void handleStopLocally();
void handleSelection();
void blacklistSound();
LLScrollListCtrl* mHistoryScroller;
LLCheckBoxCtrl* mCollisionSounds;
LLCheckBoxCtrl* mRepeatedAssets;
LLCheckBoxCtrl* mAvatarSounds;
LLCheckBoxCtrl* mObjectSounds;
LLCheckBoxCtrl* mPaused;
std::list<LLSoundHistoryItem> mLastHistory;
uuid_vec_t mLocalPlayingAudioSourceIDs;
typedef std::map<LLUUID, boost::signals2::connection> blacklist_avatar_name_cache_connection_map_t;
blacklist_avatar_name_cache_connection_map_t mBlacklistAvatarNameCacheConnections;
void onBlacklistAvatarNameCacheCallback(const LLUUID& av_id, const LLAvatarName& av_name, const LLUUID& asset_id, const std::string& region_name);
};
#endif
+190
View File
@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13E19" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<dependencies>
<deployment version="1070" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="824" id="845"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<menu title="Main Menu" systemMenu="main" id="29" userLabel="Main Menu">
<items>
<menuItem title="Puma" id="56">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Puma" systemMenu="apple" id="57">
<items>
<menuItem title="About Puma" id="58">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="236"/>
<menuItem title="Preferences…" keyEquivalent="," id="129"/>
<menuItem isSeparatorItem="YES" id="143"/>
<menuItem title="Services" id="131">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="130"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="144"/>
<menuItem title="Hide Puma" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-1" id="369"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="145">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="370"/>
</connections>
</menuItem>
<menuItem title="Show All" id="150">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="372"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="149"/>
<menuItem title="Quit Puma" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-3" id="823"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="711">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="712">
<items>
<menuItem title="Undo" keyEquivalent="z" id="713">
<connections>
<action selector="undo:" target="-1" id="776"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="714"/>
<menuItem isSeparatorItem="YES" id="715"/>
<menuItem title="Cut" keyEquivalent="x" id="716">
<connections>
<action selector="cut:" target="-1" id="768"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="717">
<connections>
<action selector="copy:" target="-1" id="782"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="718">
<connections>
<action selector="paste:" target="-1" id="769"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="721">
<connections>
<action selector="selectAll:" target="-1" id="785"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="19">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="24">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="23">
<connections>
<action selector="performMiniaturize:" target="-1" id="37"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="239">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="240"/>
</connections>
</menuItem>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="841">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="-1" id="842"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="92"/>
<menuItem title="Bring All to Front" id="5">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="39"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="103">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
</items>
</menu>
<customObject id="824" customClass="LLAppDelegate">
<connections>
<outlet property="inputView" destination="944" id="954"/>
<outlet property="inputWindow" destination="941" id="953"/>
<outlet property="window" destination="828" id="850"/>
</connections>
</customObject>
<window title="Puma" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" deferred="NO" oneShot="NO" showsToolbarButton="NO" frameAutosaveName="Puma" animationBehavior="default" id="828" customClass="LLNSWindow">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
<rect key="contentRect" x="196" y="240" width="1024" height="600"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
<view key="contentView" id="829">
<rect key="frame" x="0.0" y="0.0" width="1024" height="600"/>
<autoresizingMask key="autoresizingMask"/>
</view>
</window>
<window title="Input Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="941" customClass="LLUserInputWindow">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" utility="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="272" y="176" width="938" height="42"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
<view key="contentView" id="942">
<rect key="frame" x="0.0" y="0.0" width="938" height="42"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="943">
<rect key="frame" x="-1" y="-1" width="940" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<clipView key="contentView" id="Khf-O7-Q1p">
<rect key="frame" x="1" y="1" width="938" height="42"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView importsGraphics="NO" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" usesFontPanel="YES" verticallyResizable="YES" allowsNonContiguousLayout="YES" spellingCorrection="YES" smartInsertDelete="YES" id="944" customClass="LLNonInlineTextView">
<rect key="frame" x="0.0" y="0.0" width="938" height="42"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="938" height="42"/>
<size key="maxSize" width="939" height="10000000"/>
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="938" height="42"/>
<size key="maxSize" width="939" height="10000000"/>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="945">
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="946">
<rect key="frame" x="923" y="1" width="16" height="42"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
</view>
</window>
</objects>
</document>
File diff suppressed because it is too large Load Diff
+157
View File
@@ -0,0 +1,157 @@
/**
* @file SMAASearchTex.h
*
* $LicenseInfo:firstyear=2024&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2024, Linden Research, Inc.
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
/**
* Copyright (C) 2013 Jorge Jimenez (jorge@iryoku.com)
* Copyright (C) 2013 Jose I. Echevarria (joseignacioechevarria@gmail.com)
* Copyright (C) 2013 Belen Masia (bmasia@unizar.es)
* Copyright (C) 2013 Fernando Navarro (fernandn@microsoft.com)
* Copyright (C) 2013 Diego Gutierrez (diegog@unizar.es)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* 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. As clarification, there
* is no requirement that the copyright notice and permission be included in
* binary distributions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef SEARCHTEX_H
#define SEARCHTEX_H
#define SEARCHTEX_WIDTH 64
#define SEARCHTEX_HEIGHT 16
#define SEARCHTEX_PITCH SEARCHTEX_WIDTH
#define SEARCHTEX_SIZE (SEARCHTEX_HEIGHT * SEARCHTEX_PITCH)
/**
* Stored in R8 format. Load it in the following format:
* - DX9: D3DFMT_L8
* - DX10: DXGI_FORMAT_R8_UNORM
*/
static const unsigned char searchTexBytes[] = {
0xfe, 0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x7f, 0x7f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00,
0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0xfe, 0x7f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xfe,
0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
0x7f, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfe, 0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x7f, 0x7f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00,
0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0xfe, 0x7f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xfe,
0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
0x7f, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f,
0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00,
0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f,
0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00,
0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
};
#endif
BIN
View File
Binary file not shown.
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
7.1.13
+105
View File
@@ -0,0 +1,105 @@
/**
* @file VertexCache.h
* @brief VertexCache class definition
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef VERTEX_CACHE_H
#define VERTEX_CACHE_H
class VertexCache
{
public:
VertexCache(int size)
{
numEntries = size;
entries = new int[numEntries];
for(int i = 0; i < numEntries; i++)
entries[i] = -1;
}
VertexCache() { VertexCache(16); }
~VertexCache() { delete[] entries; entries = 0; }
bool InCache(int entry)
{
bool returnVal = false;
for(int i = 0; i < numEntries; i++)
{
if(entries[i] == entry)
{
returnVal = true;
break;
}
}
return returnVal;
}
int AddEntry(int entry)
{
int removed;
removed = entries[numEntries - 1];
//push everything right one
for(int i = numEntries - 2; i >= 0; i--)
{
entries[i + 1] = entries[i];
}
entries[0] = entry;
return removed;
}
void Clear()
{
memset(entries, -1, sizeof(int) * numEntries);
}
void Copy(VertexCache* inVcache)
{
for(int i = 0; i < numEntries; i++)
{
inVcache->Set(i, entries[i]);
}
}
int At(int index) { return entries[index]; }
void Set(int index, int value) { entries[index] = value; }
private:
int *entries;
int numEntries;
};
#endif
+28
View File
@@ -0,0 +1,28 @@
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}
DESTINATION ${APP_BINARY_DIR}
)
install(DIRECTORY skins app_settings linux_tools
DESTINATION ${APP_SHARE_DIR}
PATTERN ".svn" EXCLUDE
)
find_file(IS_ARTWORK_PRESENT NAMES have_artwork_bundle.marker
PATHS ${VIEWER_DIR}/newview/res)
if (IS_ARTWORK_PRESENT)
install(DIRECTORY res res-sdl character
DESTINATION ${APP_SHARE_DIR}
PATTERN ".svn" EXCLUDE
)
else (IS_ARTWORK_PRESENT)
message(STATUS "WARNING: Artwork is not present, and will not be installed")
endif (IS_ARTWORK_PRESENT)
install(FILES featuretable_linux.txt featuretable_solaris.txt
DESTINATION ${APP_SHARE_DIR}
)
install(FILES ${SCRIPTS_DIR}/messages/message_template.msg
DESTINATION ${APP_SHARE_DIR}/app_settings
)
+73
View File
@@ -0,0 +1,73 @@
{\rtf1\ansi\deff3\adeflang1025
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Tinos;}{\f4\fswiss\fprq2\fcharset0 Arimo{\*\falt arial};}{\f5\fnil\fprq0\fcharset128 Tinos;}{\f6\fnil\fprq2\fcharset0 DejaVu Sans Condensed;}}
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\hich\af6\langfe1033\dbch\af6\afs24\lang1033\loch\f3\fs24\lang1033 Default;}
{\s15\sbasedon0\snext16\sb240\sa120\keepn\hich\af6\dbch\af6\afs28\loch\f4\fs28 Heading;}
{\s16\sbasedon0\snext16\sb0\sa120 Text body;}
{\s17\sbasedon16\snext17\sb0\sa120 List;}
{\s18\sbasedon0\snext18\sb120\sa120\noline\i\afs24\ai\fs24 Caption;}
{\s19\sbasedon0\snext19\noline Index;}
{\s20\sbasedon0\snext20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20 Preformatted Text;}
}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment OpenOffice}{\vern4010}}\deftab709
{\*\pgdsctbl
{\pgdsc0\pgdscuse195\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default;}}
\formshade\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
\pgndec\pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
Acceptable Use Policy (AUP)}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
1. BACKGROUND: Users of the online voice services provided by Vivox, Inc. ("Vivox") (the "Service"), through the act of utilizing the Service, agree to adhere to this Acceptable Use Policy (the "Policy"). Vivox reserves the right to immediately terminate a user's access to the Service if the user engages in any of the activities prohibited by this Policy or uses the Service contrary to this Policy. Each user is responsible for all activities conducted under its account. The user is also responsible for adhering to any policy set forth by any other service provider accessed through the Service; Vivox, and its suppliers and providers, assume no responsibility or liability for a user's failure to comply with the Policy. The user acknowledges that Vivox may have access to information about or provided by the user, including diagnostic information sent automatically after a problem or error, and agrees to such access and use.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
2. PROHIBITED USES AND ACTIVITIES: Users shall not provide inaccurate or misleading information to Vivox or use the Service to: (i) access any other person's computer or computer system, software, or data without their knowledge and consent; or breach the security of another user; or attempt to circumvent the user authentication or security of any host, network, system, or account, which includes, but is not limited to, accessing data not intended for the user, logging into or making use of a server or account the user is not expressly authorized to access, or probing the security of other hosts, networks, or accounts; or use automated means (such as robots and spiders) to obtain information from Vivox's website or, though it, from other websites; (ii) interfere with computer networking or telecommunications service to any user, host or network, including, without limitation, denial of service attacks, flooding of a network, overloading a service, improper seizing and abuse of operator privileges and attempts to "crash" a host; (iii) violate the rules, regulations, or policies applicable to any network, server, computer database, or service that accessed by the user; (iv) transmit, re-transmit, or store any content or to engage in any activity that infringes the intellectual property rights or privacy rights of Vivox or any individual, group or entity, including but not limited to any rights protected by any copyright, patent, trademark, trade secret, trade dress, right of privacy, right of publicity, moral rights or other intellectual property right now known or later recognized by statute, judicial decision or regulation; (v) host, post, transmit, or re-transmit any content or material that is threatening, harassing, obscene, indecent, pornographic, hateful, malicious, racist, defamatory, libelous, treasonous, excessively violent or promotes the use of violence, or provides instruction, information or assistance in causing or carrying out violence against any government, organization, group or individual, or provides guidance, information or assistance with respect to causing damage or security breaches to or Vivox's network or to the network of any other service provider; (vi) commit an act that constitutes a criminal offense, gives rise to civil liability, or otherwise violates any applicable local, state, federal or international law, or (vii) encourage conduct that would constitute a criminal offense, give rise to civil liability, or otherwise violate any applicable local, state, federal or international law.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
3. SECURITY: In all cases, the user is solely responsible for the security of any device or application it chooses to connect to the Service, including any data stored on or communications passed.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
4. TRADEMARKS AND COPYRIGHTS. "Vivox," "Powered by Vivox" and similar marks are the property of Vivox. All other names, graphics, logos, marks and trade names used in connection with this Service, are the property of their owners and suppliers and may not be used without permission for any purpose. The copyright in the Vivox website and Service and all related materials are owned by Vivox or its suppliers unless otherwise stated.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
5. DISCLAIMER OF WARRANTIES. THE SERVICE IS PROVIDED "AS IS" AND "WITH ALL FAULTS," AND PROVIDER AND VIVOX HEREBY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION (I) WARRANTIES OF MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT, AND (II) ANY WARRANTIES CONCERNING THE SECURITY, RELIABILITY OR PERFORMANCE OF THE SERVICE. Certain states prohibit the disclaimer of warranties in certain cases, so the above may not apply to all users in all instances.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
THE DOWNLOADING OR SUBMISSION OF ANY MATERIALS IS DONE AT THE USER'S OWN RISK, AND THE USER IS SOLELY RESPONSIBLE FOR ANY LOSS OR DAMAGE TO ANY CONTENT, IMAGE, COMPUTER SYSTEM OR DATA THAT MAY RESULT FROM USING THE SERVICE.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
6. EXCLUSION OF DAMAGES. TO THE FULLEST EXTENT ALLOWED BY LAW, VIVOX SHALL NOT BE LIABLE FOR ANY INDIRECT OR CONSEQUENTIAL DAMAGES, INCLUDING INCIDENTAL, SPECIAL, EXEMPLARY AND PUNITIVE DAMAGES, RESULTING FROM THE USE OR PROVISION OF THE SERVICE, EVEN IF THE POSSIBILITY OF SUCH DAMAGES IS KNOWN. Certain states prohibit the limitation of liability in certain cases, so the above may not apply to the user in all instances.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
7. ENFORCEMENT OF THIS POLICY: Vivox does not routinely monitors the activity of Service accounts for violation of this Policy. Vivox reserves the right at any time to monitor usage, transmissions, and content from time to time to operate the Service; to identify violations of this Policy; and/or to protect the network, the Service and/or other users. If the Service is used in a way that Vivox, in their sole discretion, believe violate this Policy, it may take any responsive actions they deem appropriate, including, but are not limited to, the immediate suspension or termination of all or any portion of the Service. Vivox will have no liability for any of these responsive actions. These actions are not exclusive remedies and Vivox may take any other legal or technical action deemed appropriate. The user expressly authorizes Vivox to cooperate with (i) law enforcement authorities in the investigation of suspected legal violations, and (ii) any system administrators at other Internet service providers or other network or computing facilities in order to enforce this Policy. This cooperation may include making available personally identifiable information about users to law enforcement or system administrators. The failure to enforce this Policy, for whatever reason or for no reason, shall not be construed as a waiver of any right to do so at any time. The user agrees that if any portion of this Policy is held invalid or unenforceable, such portion will be construed consistent with applicable law as nearly as possible, and the remaining portions will remain in full force and effect. The user agrees to indemnify, defend and hold harmless Vivox and its affiliates, suppliers, providers, and agents against all claims and expenses (including reasonable attorney fees) resulting from users engaging in any of the prohibited activities listed in this Policy or resulting from users violating the Policy or any other posted policy related to the Service. The foregoing user indemnification will survive any termination of the user's agreements with Vivox .}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
8. ARBITRATION. Except for the right of a party to seek equitable relief, any disputes arising under or related to this Agreement ("Dispute"), excluding any Dispute relating to the validity or infringement of any intellectual property right, will be resolved by negotiation, mediation and, if necessary, arbitration, as follows. The party raising such Dispute will promptly advise the other party in writing describing in reasonable detail the nature of such Dispute ("Notice of Dispute"). The parties will negotiate in good faith to resolve the Dispute, but if they have not done so within thirty (30) days, the parties will submit the Dispute to a mutually agreed mediation organization. If the parties are unable to resolve the Dispute within sixty (60) days after delivery of the Notice of Dispute, then the Dispute will be resolved by a single arbitrator in a final and binding arbitration under the then current procedural rules of the American Arbitration Association. All proceedings will be conducted in the English language in Boston, Massachusetts. The arbitrator will have no power to modify the terms or conditions of this Agreement, or to award punitive damages. Any award rendered in such arbitration may be enforced by either party in any Court of competent jurisdiction.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
9. GENERAL TERMS. This Agreement is governed by the laws of the Commonwealth of Massachusetts. No agency, partnership, joint venture, employment or franchise relationship is intended or created by this Agreement. This AUP constitute the entire agreement between the parties concerning the use of the Service. If any provision of this Agreement is found to be unenforceable, it shall be deemed modified to the least extent needed to make the provision enforceable; the remaining terms of this Agreement shall remain in full force and effect. Vivox reserves the right to disclose any information about any user as required by a court order or as recommended by counsel in the context of any action by any government entity or other third party.}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch
}
\par \pard\plain \s20\sb0\sa0\hich\af5\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch
}{\rtlch \ltrch\loch
10. CHANGES TO THIS POLICY. Vivox may revise its Acceptable Use Policy from time to time without prior notice. Any changes will be presented in the latest version at the Vivox web site. All revised copies of the Policy are effective immediately upon a user's first use of the Service after the change has been posted.}
\par }
+23
View File
@@ -0,0 +1,23 @@
Acceptable Use Policy (AUP)
1. BACKGROUND: Users of the online voice services provided by Vivox, Inc. ("Vivox") (the "Service"), through the act of utilizing the Service, agree to adhere to this Acceptable Use Policy (the "Policy"). Vivox reserves the right to immediately terminate a user's access to the Service if the user engages in any of the activities prohibited by this Policy or uses the Service contrary to this Policy. Each user is responsible for all activities conducted under its account. The user is also responsible for adhering to any policy set forth by any other service provider accessed through the Service; Vivox, and its suppliers and providers, assume no responsibility or liability for a user's failure to comply with the Policy. The user acknowledges that Vivox may have access to information about or provided by the user, including diagnostic information sent automatically after a problem or error, and agrees to such access and use.
2. PROHIBITED USES AND ACTIVITIES: Users shall not provide inaccurate or misleading information to Vivox or use the Service to: (i) access any other person's computer or computer system, software, or data without their knowledge and consent; or breach the security of another user; or attempt to circumvent the user authentication or security of any host, network, system, or account, which includes, but is not limited to, accessing data not intended for the user, logging into or making use of a server or account the user is not expressly authorized to access, or probing the security of other hosts, networks, or accounts; or use automated means (such as robots and spiders) to obtain information from Vivox's website or, though it, from other websites; (ii) interfere with computer networking or telecommunications service to any user, host or network, including, without limitation, denial of service attacks, flooding of a network, overloading a service, improper seizing and abuse of operator privileges and attempts to "crash" a host; (iii) violate the rules, regulations, or policies applicable to any network, server, computer database, or service that accessed by the user; (iv) transmit, re-transmit, or store any content or to engage in any activity that infringes the intellectual property rights or privacy rights of Vivox or any individual, group or entity, including but not limited to any rights protected by any copyright, patent, trademark, trade secret, trade dress, right of privacy, right of publicity, moral rights or other intellectual property right now known or later recognized by statute, judicial decision or regulation; (v) host, post, transmit, or re-transmit any content or material that is threatening, harassing, obscene, indecent, pornographic, hateful, malicious, racist, defamatory, libelous, treasonous, excessively violent or promotes the use of violence, or provides instruction, information or assistance in causing or carrying out violence against any government, organization, group or individual, or provides guidance, information or assistance with respect to causing damage or security breaches to or Vivox's network or to the network of any other service provider; (vi) commit an act that constitutes a criminal offense, gives rise to civil liability, or otherwise violates any applicable local, state, federal or international law, or (vii) encourage conduct that would constitute a criminal offense, give rise to civil liability, or otherwise violate any applicable local, state, federal or international law.
3. SECURITY: In all cases, the user is solely responsible for the security of any device or application it chooses to connect to the Service, including any data stored on or communications passed.
4. TRADEMARKS AND COPYRIGHTS. "Vivox," "Powered by Vivox" and similar marks are the property of Vivox. All other names, graphics, logos, marks and trade names used in connection with this Service, are the property of their owners and suppliers and may not be used without permission for any purpose. The copyright in the Vivox website and Service and all related materials are owned by Vivox or its suppliers unless otherwise stated.
5. DISCLAIMER OF WARRANTIES. THE SERVICE IS PROVIDED "AS IS" AND "WITH ALL FAULTS," AND PROVIDER AND VIVOX HEREBY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION (I) WARRANTIES OF MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT, AND (II) ANY WARRANTIES CONCERNING THE SECURITY, RELIABILITY OR PERFORMANCE OF THE SERVICE. Certain states prohibit the disclaimer of warranties in certain cases, so the above may not apply to all users in all instances.
THE DOWNLOADING OR SUBMISSION OF ANY MATERIALS IS DONE AT THE USER'S OWN RISK, AND THE USER IS SOLELY RESPONSIBLE FOR ANY LOSS OR DAMAGE TO ANY CONTENT, IMAGE, COMPUTER SYSTEM OR DATA THAT MAY RESULT FROM USING THE SERVICE.
6. EXCLUSION OF DAMAGES. TO THE FULLEST EXTENT ALLOWED BY LAW, VIVOX SHALL NOT BE LIABLE FOR ANY INDIRECT OR CONSEQUENTIAL DAMAGES, INCLUDING INCIDENTAL, SPECIAL, EXEMPLARY AND PUNITIVE DAMAGES, RESULTING FROM THE USE OR PROVISION OF THE SERVICE, EVEN IF THE POSSIBILITY OF SUCH DAMAGES IS KNOWN. Certain states prohibit the limitation of liability in certain cases, so the above may not apply to the user in all instances.
7. ENFORCEMENT OF THIS POLICY: Vivox does not routinely monitors the activity of Service accounts for violation of this Policy. Vivox reserves the right at any time to monitor usage, transmissions, and content from time to time to operate the Service; to identify violations of this Policy; and/or to protect the network, the Service and/or other users. If the Service is used in a way that Vivox, in their sole discretion, believe violate this Policy, it may take any responsive actions they deem appropriate, including, but are not limited to, the immediate suspension or termination of all or any portion of the Service. Vivox will have no liability for any of these responsive actions. These actions are not exclusive remedies and Vivox may take any other legal or technical action deemed appropriate. The user expressly authorizes Vivox to cooperate with (i) law enforcement authorities in the investigation of suspected legal violations, and (ii) any system administrators at other Internet service providers or other network or computing facilities in order to enforce this Policy. This cooperation may include making available personally identifiable information about users to law enforcement or system administrators. The failure to enforce this Policy, for whatever reason or for no reason, shall not be construed as a waiver of any right to do so at any time. The user agrees that if any portion of this Policy is held invalid or unenforceable, such portion will be construed consistent with applicable law as nearly as possible, and the remaining portions will remain in full force and effect. The user agrees to indemnify, defend and hold harmless Vivox and its affiliates, suppliers, providers, and agents against all claims and expenses (including reasonable attorney fees) resulting from users engaging in any of the prohibited activities listed in this Policy or resulting from users violating the Policy or any other posted policy related to the Service. The foregoing user indemnification will survive any termination of the user's agreements with Vivox .
8. ARBITRATION. Except for the right of a party to seek equitable relief, any disputes arising under or related to this Agreement ("Dispute"), excluding any Dispute relating to the validity or infringement of any intellectual property right, will be resolved by negotiation, mediation and, if necessary, arbitration, as follows. The party raising such Dispute will promptly advise the other party in writing describing in reasonable detail the nature of such Dispute ("Notice of Dispute"). The parties will negotiate in good faith to resolve the Dispute, but if they have not done so within thirty (30) days, the parties will submit the Dispute to a mutually agreed mediation organization. If the parties are unable to resolve the Dispute within sixty (60) days after delivery of the Notice of Dispute, then the Dispute will be resolved by a single arbitrator in a final and binding arbitration under the then current procedural rules of the American Arbitration Association. All proceedings will be conducted in the English language in Boston, Massachusetts. The arbitrator will have no power to modify the terms or conditions of this Agreement, or to award punitive damages. Any award rendered in such arbitration may be enforced by either party in any Court of competent jurisdiction.
9. GENERAL TERMS. This Agreement is governed by the laws of the Commonwealth of Massachusetts. No agency, partnership, joint venture, employment or franchise relationship is intended or created by this Agreement. This AUP constitute the entire agreement between the parties concerning the use of the Service. If any provision of this Agreement is found to be unenforceable, it shall be deemed modified to the least extent needed to make the provision enforceable; the remaining terms of this Agreement shall remain in full force and effect. Vivox reserves the right to disclose any information about any user as required by a court order or as recommended by counsel in the context of any action by any government entity or other third party.
10. CHANGES TO THIS POLICY. Vivox may revise its Acceptable Use Policy from time to time without prior notice. Any changes will be presented in the latest version at the Vivox web site. All revised copies of the Policy are effective immediately upon a user's first use of the Service after the change has been posted.
+80
View File
@@ -0,0 +1,80 @@
/**
* @file VorbisFramework.h
* @author Dave Camp
* @date Fri Oct 10 2003
* @brief For the Macview project
*
* $LicenseInfo:firstyear=2003&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "ogg/ogg.h"
#include "vorbis/codec.h"
#include "vorbis/vorbisenc.h"
extern int mac_vorbis_analysis(vorbis_block *vb,ogg_packet *op);
extern int mac_vorbis_analysis_headerout(vorbis_dsp_state *v,
vorbis_comment *vc,
ogg_packet *op,
ogg_packet *op_comm,
ogg_packet *op_code);
extern int mac_vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi);
extern int mac_vorbis_encode_ctl(vorbis_info *vi,int number,void *arg);
extern int mac_vorbis_encode_setup_init(vorbis_info *vi);
extern int mac_vorbis_encode_setup_managed(vorbis_info *vi,
long channels,
long rate,
long max_bitrate,
long nominal_bitrate,
long min_bitrate);
extern void mac_vorbis_info_init(vorbis_info *vi);
extern void mac_vorbis_info_clear(vorbis_info *vi);
extern void mac_vorbis_comment_init(vorbis_comment *vc);
extern void mac_vorbis_comment_clear(vorbis_comment *vc);
extern int mac_vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb);
extern int mac_vorbis_block_clear(vorbis_block *vb);
extern void mac_vorbis_dsp_clear(vorbis_dsp_state *v);
extern float **mac_vorbis_analysis_buffer(vorbis_dsp_state *v,int vals);
extern int mac_vorbis_analysis_wrote(vorbis_dsp_state *v,int vals);
extern int mac_vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb);
extern int mac_ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op);
extern int mac_ogg_stream_init(ogg_stream_state *os,int serialno);
extern int mac_ogg_stream_flush(ogg_stream_state *os, ogg_page *og);
extern int mac_ogg_stream_pageout(ogg_stream_state *os, ogg_page *og);
extern int mac_ogg_page_eos(ogg_page *og);
extern int mac_ogg_stream_clear(ogg_stream_state *os);
#ifdef __cplusplus
}
#endif
+310
View File
@@ -0,0 +1,310 @@
/**
* @file alfloaterregiontracker.cpp
* @brief Region tracking floater
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Alchemy Viewer Source Code
* Copyright (C) 2014, Alchemy Viewer Project.
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "alfloaterregiontracker.h"
// library
#include "llbutton.h"
#include "lldir.h"
#include "llfile.h"
#include "llscrolllistctrl.h"
#include "llsd.h"
#include "llsdserialize.h"
#include "llsdserialize_xml.h"
#include "lltextbox.h"
// newview
#include "llagent.h"
#include "llfloaterworldmap.h"
#include "llfloaterreg.h"
#include "llnotificationsutil.h"
#include "llviewermessage.h"
#include "llworldmap.h"
#include "llworldmapmessage.h"
const std::string TRACKER_FILE = "tracked_regions.json";
const F64 REGION_UPDATE_TIMER = 60.0;
ALFloaterRegionTracker::ALFloaterRegionTracker(const LLSD& key)
: LLFloater(key),
LLEventTimer(5.f),
mRefreshRegionListBtn(NULL),
mRemoveRegionBtn(NULL),
mOpenMapBtn(NULL),
mRegionScrollList(NULL),
mLastRegionUpdate(0.0)
{
loadFromJSON();
}
ALFloaterRegionTracker::~ALFloaterRegionTracker()
{
saveToJSON();
}
bool ALFloaterRegionTracker::postBuild()
{
mRefreshRegionListBtn = getChild<LLButton>("refresh");
mRefreshRegionListBtn->setClickedCallback(boost::bind(&ALFloaterRegionTracker::refresh, this));
mRemoveRegionBtn = getChild<LLButton>("remove");
mRemoveRegionBtn->setClickedCallback(boost::bind(&ALFloaterRegionTracker::removeRegions, this));
mOpenMapBtn = getChild<LLButton>("open_map");
mOpenMapBtn->setClickedCallback(boost::bind(&ALFloaterRegionTracker::openMap, this));
mRegionScrollList = getChild<LLScrollListCtrl>("region_list");
mRegionScrollList->setCommitOnSelectionChange(true);
mRegionScrollList->setCommitCallback(boost::bind(&ALFloaterRegionTracker::updateHeader, this));
mRegionScrollList->setDoubleClickCallback(boost::bind(&ALFloaterRegionTracker::openMap, this));
updateHeader();
return LLFloater::postBuild();
}
void ALFloaterRegionTracker::onOpen(const LLSD& key)
{
requestRegionData();
mEventTimer.start();
refresh();
}
void ALFloaterRegionTracker::onClose(bool app_quitting)
{
mEventTimer.stop();
}
void ALFloaterRegionTracker::updateHeader()
{
S32 num_selected(mRegionScrollList->getNumSelected());
mRefreshRegionListBtn->setEnabled(mRegionMap.size() != 0);
mRemoveRegionBtn->setEnabled(!!num_selected);
mOpenMapBtn->setEnabled(num_selected <= 1);
}
void ALFloaterRegionTracker::refresh()
{
if (!mRegionMap.size())
{
updateHeader();
return;
}
const std::string& saved_selected_value = mRegionScrollList->getSelectedValue().asString();
S32 saved_scroll_pos = mRegionScrollList->getScrollPos();
mRegionScrollList->deleteAllItems();
const std::string& cur_region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLStringUtil::null;
F64 time_now = LLTimer::getElapsedSeconds();
bool request_region_update = (time_now - mLastRegionUpdate > REGION_UPDATE_TIMER);
if (request_region_update)
{
mLastRegionUpdate = time_now;
}
for (LLSD::map_const_iterator it = mRegionMap.beginMap(); it != mRegionMap.endMap(); it++)
{
const std::string& sim_name = it->first;
const LLSD& data = it->second;
if (data.isMap()) // Assume the rest is correct.
{
LLScrollListCell::Params label;
LLScrollListCell::Params maturity;
LLScrollListCell::Params region;
LLScrollListCell::Params count;
label.column("region_label").type("text").value(data["label"].asString());
maturity.column("region_maturity_icon").type("icon").font_halign(LLFontGL::HCENTER);
region.column("region_name").type("text").value(sim_name);
count.column("region_agent_count").type("text").value("...");
if (LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromName(sim_name))
{
maturity.value(info->getAccessIcon());
info->updateAgentCount(LLTimer::getElapsedSeconds());
S32 agent_count = info->getAgentCount();
if (info->isDown())
{
label.color(LLColor4::red);
maturity.color(LLColor4::red);
region.color(LLColor4::red);
count.color(LLColor4::red);
count.value(0);
}
else
{
count.value((sim_name == cur_region_name) ? agent_count + 1 : agent_count);
}
if (request_region_update)
{
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(sim_name);
}
}
else
{
label.color(LLColor4::grey);
maturity.color(LLColor4::grey);
region.color(LLColor4::grey);
count.color(LLColor4::grey);
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(sim_name);
if (!mEventTimer.getStarted()) mEventTimer.start();
}
LLScrollListItem::Params row;
row.value = sim_name;
row.columns.add(label);
row.columns.add(maturity);
row.columns.add(region);
row.columns.add(count);
mRegionScrollList->addRow(row);
}
}
if (!saved_selected_value.empty())
{
mRegionScrollList->selectByValue(saved_selected_value);
}
mRegionScrollList->setScrollPos(saved_scroll_pos);
}
bool ALFloaterRegionTracker::tick()
{
refresh();
return false;
}
void ALFloaterRegionTracker::requestRegionData()
{
if (!mRegionMap.size())
return;
for (LLSD::map_const_iterator it = mRegionMap.beginMap(); it != mRegionMap.endMap(); it++)
{
const std::string& name = it->first;
if (LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromName(name))
{
info->updateAgentCount(LLTimer::getElapsedSeconds());
}
else
{
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(name);
}
}
mEventTimer.start();
}
void ALFloaterRegionTracker::removeRegions()
{
typedef std::vector<LLScrollListItem*> item_t;
item_t items = mRegionScrollList->getAllSelected();
for (item_t::const_iterator it = items.begin(); it != items.end(); ++it)
{
mRegionMap.erase((*it)->getValue().asString());
}
mRegionScrollList->deleteSelectedItems();
saveToJSON();
updateHeader();
}
bool ALFloaterRegionTracker::saveToJSON()
{
const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, TRACKER_FILE);
llofstream out_file;
out_file.open(filename.c_str());
if (out_file.is_open())
{
LLSDSerialize::toPrettyNotation(mRegionMap, out_file);
out_file.close();
return true;
}
return false;
}
bool ALFloaterRegionTracker::loadFromJSON()
{
const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, TRACKER_FILE);
llifstream in_file;
in_file.open(filename.c_str());
if (in_file.is_open())
{
LLSDSerialize::fromNotation(mRegionMap, in_file, LLSDSerialize::SIZE_UNLIMITED);
in_file.close();
return true;
}
return false;
}
std::string ALFloaterRegionTracker::getRegionLabelIfExists(const std::string& name)
{
return mRegionMap.get(name)["label"].asString();
}
void ALFloaterRegionTracker::onRegionAddedCallback(const LLSD& notification, const LLSD& response)
{
const S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
const std::string& name = notification["payload"]["name"].asString();
std::string label = response["label"].asString();
LLStringUtil::trim(label);
if (!name.empty() && !label.empty())
{
if (mRegionMap.has(name))
{
for (LLSD::map_iterator it = mRegionMap.beginMap(); it != mRegionMap.endMap(); it++)
if (it->first == name) it->second["label"] = label;
}
else
{
LLSD region;
region["label"] = label;
mRegionMap.insert(name, region);
}
saveToJSON();
refresh();
}
}
}
void ALFloaterRegionTracker::openMap()
{
if (mRegionScrollList->getNumSelected() == 0)
{
LLFloaterReg::showInstance("world_map", "center");
}
else
{
const std::string& region = mRegionScrollList->getFirstSelected()->getValue().asString();
LLFloaterWorldMap* worldmap_floaterp = LLFloaterWorldMap::getInstance();
if (!region.empty() && worldmap_floaterp)
{
worldmap_floaterp->trackURL(region, 128, 128, 0);
LLFloaterReg::showInstance("world_map", "center");
}
}
}
+68
View File
@@ -0,0 +1,68 @@
/**
* @file alfloaterregiontracker.h
* @brief Region tracking floater
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Alchemy Viewer Source Code
* Copyright (C) 2014, Alchemy Viewer Project.
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* $/LicenseInfo$
*/
#pragma once
#include "lleventtimer.h"
#include "llfloater.h"
class LLButton;
class LLSD;
class LLScrollListCtrl;
class ALFloaterRegionTracker : public LLFloater, public LLEventTimer
{
friend class LLFloaterReg;
private:
ALFloaterRegionTracker(const LLSD& key);
virtual ~ALFloaterRegionTracker();
public:
bool postBuild() override;
void onOpen(const LLSD& key) override;
void onClose(bool app_quitting) override;
void refresh() override;
bool tick() override;
private:
void updateHeader();
void requestRegionData();
void removeRegions();
bool saveToJSON();
bool loadFromJSON();
void openMap();
public:
std::string getRegionLabelIfExists(const std::string& name);
void onRegionAddedCallback(const LLSD& notification, const LLSD& response);
private:
LLSD mRegionMap;
LLButton* mRefreshRegionListBtn;
LLButton* mRemoveRegionBtn;
LLButton* mOpenMapBtn;
LLScrollListCtrl* mRegionScrollList;
F64 mLastRegionUpdate;
};
+613
View File
@@ -0,0 +1,613 @@
/**
* @file animationexplorer.cpp
* @brief Animation Explorer floater implementation
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* Copyright (C) 2013, Zi Ree @ Second Life
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "animationexplorer.h"
#include "indra_constants.h" // for MASK_ALT etc.
#include "message.h" // for gMessageSystem
//#include "stdenums.h" // for ADD_TOP
#include "llagent.h" // for gAgent
#include "llanimationstates.h"
#include "llbutton.h"
#include "llcachename.h" // for gCacheName
#include "llcheckboxctrl.h"
#include "llfloater.h"
#include "llfloaterreg.h"
#include "llkeyframefallmotion.h"
#include "llrect.h"
#include "llscrolllistctrl.h"
#include "lltimer.h"
#include "lltoolmgr.h" // for MASK_ORBIT etc.
#include "lltrans.h"
#include "lluuid.h"
#include "llview.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "llviewerwindow.h" // for gViewerWindow
#include "llvoavatar.h"
#include "llvoavatarself.h" // for gAgentAvatarp
#include "llavatarnamecache.h"
#include "fsassetblacklist.h"
constexpr S32 MAX_ANIMATIONS = 100;
// --------------------------------------------------------------------------
RecentAnimationList::RecentAnimationList()
: LLSingleton<RecentAnimationList>()
{
}
RecentAnimationList::~RecentAnimationList()
{
}
void RecentAnimationList::addAnimation(const LLUUID& id, const LLUUID& playedBy)
{
AnimationEntry entry;
entry.animationID = id;
entry.playedBy = playedBy;
entry.time = LLTimer::getElapsedSeconds();
AnimationExplorer* explorer = LLFloaterReg::findTypedInstance<AnimationExplorer>("animation_explorer");
// only remember animation when it wasn't played by ourselves or the explorer window is open,
// so the list doesn't get polluted
if (playedBy != gAgentAvatarp->getID() || explorer)
{
mAnimationList.push_back(entry);
// only keep a certain number of entries
if (mAnimationList.size() > MAX_ANIMATIONS)
{
mAnimationList.pop_front();
}
}
// if the animation explorer floater is open, send this animation over immediately
if (explorer)
{
explorer->addAnimation(id, playedBy, LLTimer::getElapsedSeconds());
}
}
void RecentAnimationList::requestList(AnimationExplorer* explorer)
{
if (explorer)
{
// send the list of recent animations to the given animation explorer floater
for (std::deque<AnimationEntry>::iterator iter = mAnimationList.begin();
iter != mAnimationList.end();
++iter)
{
AnimationEntry entry = *iter;
explorer->addAnimation(entry.animationID, entry.playedBy, entry.time);
}
}
}
// --------------------------------------------------------------------------
AnimationExplorer::AnimationExplorer(const LLSD& key)
: LLFloater(key),
mPreviewCtrl(nullptr),
mLastMouseX(0),
mLastMouseY(0)
{
}
AnimationExplorer::~AnimationExplorer()
{
mAnimationPreview = nullptr;
for (const auto& cb : mAvatarNameCacheConnections)
{
if (cb.second.connected())
{
cb.second.disconnect();
}
}
mAvatarNameCacheConnections.clear();
}
void AnimationExplorer::startMotion(const LLUUID& motionID)
{
if (!mAnimationPreview)
{
return;
}
LLVOAvatar* avatarp = mAnimationPreview->getDummyAvatar();
avatarp->deactivateAllMotions();
avatarp->startMotion(ANIM_AGENT_STAND, 0.0f);
if (motionID.notNull())
{
avatarp->startMotion(motionID, 0.0f);
}
}
bool AnimationExplorer::postBuild()
{
mAnimationScrollList = getChild<LLScrollListCtrl>("animation_list");
mStopButton = getChild<LLButton>("stop_btn");
mBlacklistButton = getChild<LLButton>("blacklist_btn");
mStopAndRevokeButton = getChild<LLButton>("stop_and_revoke_btn");
mNoOwnedAnimationsCheckBox = getChild<LLCheckBoxCtrl>("no_owned_animations_check");
mAnimationScrollList->setCommitCallback(boost::bind(&AnimationExplorer::onSelectAnimation, this));
mStopButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopPressed, this));
mBlacklistButton->setCommitCallback(boost::bind(&AnimationExplorer::onBlacklistPressed, this));
mStopAndRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopAndRevokePressed, this));
mNoOwnedAnimationsCheckBox->setCommitCallback(boost::bind(&AnimationExplorer::onOwnedCheckToggled, this));
mPreviewCtrl = findChild<LLView>("animation_preview");
if (mPreviewCtrl)
{
if (isAgentAvatarValid())
{
mAnimationPreview = new LLPreviewAnimation(mPreviewCtrl->getRect().getWidth(), mPreviewCtrl->getRect().getHeight());
mAnimationPreview->setZoom(2.0f);
startMotion(LLUUID::null);
}
}
else
{
LL_WARNS("AnimationExplorer") << "Could not find animation preview control to place animation texture" << LL_ENDL;
return false;
}
// request list of recent animations
update();
return true;
}
void AnimationExplorer::onSelectAnimation()
{
LLScrollListItem* item = mAnimationScrollList->getFirstSelected();
if (!item)
{
return;
}
S32 column = mAnimationScrollList->getColumn("animation_id")->mIndex;
mCurrentAnimationID = item->getColumn(column)->getValue().asUUID();
column = mAnimationScrollList->getColumn("object_id")->mIndex;
mCurrentObject = item->getColumn(column)->getValue().asUUID();
startMotion(mCurrentAnimationID);
}
void AnimationExplorer::onStopPressed()
{
if (mCurrentAnimationID.notNull())
{
gAgentAvatarp->stopMotion(mCurrentAnimationID);
gAgent.sendAnimationRequest(mCurrentAnimationID, ANIM_REQUEST_STOP);
}
}
void AnimationExplorer::onBlacklistPressed()
{
onStopPressed();
LLScrollListItem* item = mAnimationScrollList->getFirstSelected();
if (!item)
{
return;
}
S32 column = mAnimationScrollList->getColumn("played_by")->mIndex;
std::string region_name{};
if (gAgent.getRegion())
{
region_name = gAgent.getRegion()->getName();
}
FSAssetBlacklist::getInstance()->addNewItemToBlacklist(mCurrentAnimationID, item->getColumn(column)->getValue(), region_name, LLAssetType::AT_ANIMATION);
}
void AnimationExplorer::onStopAndRevokePressed()
{
onStopPressed();
if (mCurrentObject.notNull())
{
if (LLViewerObject* vo = gObjectList.findObject(mCurrentObject); vo)
{
gAgentAvatarp->revokePermissionsOnObject(vo);
}
}
}
void AnimationExplorer::onOwnedCheckToggled()
{
update();
updateList(LLTimer::getElapsedSeconds());
}
void AnimationExplorer::draw()
{
LLFloater::draw();
LLRect r = mPreviewCtrl->getRect();
if (mAnimationPreview)
{
mAnimationPreview->requestUpdate();
gGL.color3f(1.0f, 1.0f, 1.0f);
gGL.getTexUnit(0)->bind(mAnimationPreview);
gGL.begin(LLRender::TRIANGLES);
{
gGL.texCoord2f(0.0f, 1.0f);
gGL.vertex2i(r.mLeft, r.mTop);
gGL.texCoord2f(0.0f, 0.0f);
gGL.vertex2i(r.mLeft, r.mBottom);
gGL.texCoord2f(1.0f, 0.0f);
gGL.vertex2i(r.mRight, r.mBottom);
gGL.texCoord2f(0.0f, 1.0f);
gGL.vertex2i(r.mLeft, r.mTop);
gGL.texCoord2f(1.0f, 0.0f);
gGL.vertex2i(r.mRight, r.mBottom);
gGL.texCoord2f(1.0f, 1.0f);
gGL.vertex2i(r.mRight, r.mTop);
}
gGL.end();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
// update tiems and "Still playing" status in the list once every few seconds
static F64 last_update = 0.0;
F64 time = LLTimer::getElapsedSeconds();
if (time - last_update > 5.0)
{
last_update = time;
updateList(time);
}
}
void AnimationExplorer::update()
{
// stop playing preview animations when reloading the list
startMotion(LLUUID::null);
mAnimationScrollList->deleteAllItems();
RecentAnimationList::instance().requestList(this);
}
void AnimationExplorer::updateList(F64 current_timestamp)
{
S32 played_column = mAnimationScrollList->getColumn("played")->mIndex;
S32 timestamp_column = mAnimationScrollList->getColumn("timestamp")->mIndex;
S32 priority_column = mAnimationScrollList->getColumn("priority")->mIndex;
S32 object_id_column = mAnimationScrollList->getColumn("object_id")->mIndex;
S32 anim_id_column = mAnimationScrollList->getColumn("animation_id")->mIndex;
// go through the full animation scroll list
std::vector<LLScrollListItem*> items = mAnimationScrollList->getAllData();
for (std::vector<LLScrollListItem*>::iterator list_iter = items.begin(); list_iter != items.end(); ++list_iter)
{
LLScrollListItem* item = *list_iter;
// get a pointer to the "Played" column text
LLScrollListText* played_text = dynamic_cast<LLScrollListText*>(item->getColumn(played_column));
// get the object ID from the list
LLUUID object_id = item->getColumn(object_id_column)->getValue().asUUID();
LLUUID anim_id = item->getColumn(anim_id_column)->getValue().asUUID();
// assume this animation is not running first
bool is_running = false;
// go through the list of playing animations to find out if this animation played by
// this object is still running
for (const auto& [anim_object_id, anim_anim_id] : gAgentAvatarp->mAnimationSources)
{
// object and animation found
if (anim_object_id == object_id && anim_anim_id == anim_id)
{
// set text to "Still playing" and break out of this loop
played_text->setText(LLTrans::getString("animation_explorer_still_playing"));
is_running = true;
break;
}
}
// animation was not found to be running
if (!is_running)
{
// get timestamp when this animation was started
F64 timestamp = item->getColumn(timestamp_column)->getValue().asReal();
// update text to show the number of seconds ago when this animation was started
LLStringUtil::format_map_t args;
args["SECONDS"] = llformat("%d", (S32) (current_timestamp - timestamp));
played_text->setText(LLTrans::getString("animation_explorer_seconds_ago", args));
}
std::string prio_text = LLTrans::getString("animation_explorer_unknown_priority");
if (LLKeyframeMotion* motion = dynamic_cast<LLKeyframeMotion*>(gAgentAvatarp->findMotion(anim_id)); motion)
{
prio_text = llformat("%d", (S32)motion->getPriority());
}
dynamic_cast<LLScrollListText*>(item->getColumn(priority_column))->setText(prio_text);
}
}
void AnimationExplorer::addAnimation(const LLUUID& id, const LLUUID& played_by, F64 time)
{
// don't add animations that are played by ourselves when the filter box is checked
if (played_by == gAgentAvatarp->getID())
{
if (mNoOwnedAnimationsCheckBox->getValue().asBoolean())
{
return;
}
}
// set object name to UUID at first
std::string playedByName = played_by.asString();
// find out if the object is still in reach
if (LLViewerObject* vo = gObjectList.findObject(played_by); vo)
{
// if it was an avatar, get the name here
if (vo->isAvatar())
{
LLAvatarName av_name;
if (LLAvatarNameCache::get(played_by, &av_name))
{
playedByName = av_name.getCompleteName();
}
else
{
if (mAvatarNameCacheConnections.find(played_by) != mAvatarNameCacheConnections.end())
{
boost::signals2::connection cb_connection = LLAvatarNameCache::get(played_by, boost::bind(&AnimationExplorer::onAvatarNameCallback, this, _1, _2));
mAvatarNameCacheConnections.insert(std::make_pair(played_by, cb_connection));
}
playedByName = LLTrans::getString("AvatarNameWaiting");
}
}
// not an avatar, do a lookup by UUID
else
{
// find out if we know the name to this UUID already
std::map<LLUUID, std::string>::iterator iter = mKnownIDs.find(played_by);
// if we don't know it yet, start a lookup
if (iter == mKnownIDs.end())
{
// if we are not already looking up this object's name, send a request out
if (std::find(mRequestedIDs.begin(), mRequestedIDs.end(), played_by) == mRequestedIDs.end())
{
// remember which object names we already requested
mRequestedIDs.push_back(played_by);
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ObjectSelect);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
msg->newMessageFast(_PREHASH_ObjectDeselect);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
}
}
else
{
// we know the name already
playedByName = mKnownIDs[played_by];
}
}
}
// insert the item into the scroll list
LLSD item;
item["columns"][0]["column"] = "played_by";
item["columns"][0]["value"] = playedByName;
item["columns"][1]["column"] = "played";
item["columns"][1]["value"] = LLTrans::getString("animation_explorer_still_playing");
item["columns"][2]["column"] = "priority";
item["columns"][2]["value"] = LLTrans::getString("animation_explorer_unknown_priority");
item["columns"][3]["column"] = "timestamp";
item["columns"][3]["value"] = time;
item["columns"][4]["column"] = "animation_id";
item["columns"][4]["value"] = id;
item["columns"][5]["column"] = "object_id";
item["columns"][5]["value"] = played_by;
mAnimationScrollList->addElement(item, ADD_TOP);
}
void AnimationExplorer::onAvatarNameCallback(const LLUUID& id, const LLAvatarName& av_name)
{
if (auto iter = mAvatarNameCacheConnections.find(id); iter != mAvatarNameCacheConnections.end())
{
if (iter->second.connected())
{
iter->second.disconnect();
}
mAvatarNameCacheConnections.erase(iter);
}
updateListEntry(id, av_name.getCompleteName());
}
void AnimationExplorer::requestNameCallback(LLMessageSystem* msg)
{
// if we weren't looking for any IDs, ignore this callback
if (mRequestedIDs.empty())
{
return;
}
// we might have received more than one answer in one block
S32 num = msg->getNumberOfBlocksFast(_PREHASH_ObjectData);
for (S32 index = 0; index < num; ++index)
{
LLUUID object_id;
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, object_id, index);
// if this is one of the objects we were looking for, process the data
if (auto iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), object_id); iter != mRequestedIDs.end())
{
// get the name of the object
std::string object_name;
msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, object_name, index);
// remove the object from the lookup list and add it to the known names list
mRequestedIDs.erase(iter);
mKnownIDs[object_id] = object_name;
updateListEntry(object_id, object_name);
}
}
}
void AnimationExplorer::updateListEntry(const LLUUID& id, const std::string& name)
{
S32 object_id_column = mAnimationScrollList->getColumn("object_id")->mIndex;
S32 played_by_column = mAnimationScrollList->getColumn("played_by")->mIndex;
// find all scroll list entries with this object UUID and update the names there
for (LLScrollListItem* item : mAnimationScrollList->getAllData())
{
const LLUUID& list_object_id = item->getColumn(object_id_column)->getValue().asUUID();
if (id == list_object_id)
{
LLScrollListText* played_by_text = (LLScrollListText*)item->getColumn(played_by_column);
played_by_text->setText(name);
}
}
}
// Copied from llfloaterbvhpreview.cpp
bool AnimationExplorer::handleMouseDown(S32 x, S32 y, MASK mask)
{
if (mPreviewCtrl && mPreviewCtrl->getRect().pointInRect(x, y))
{
bringToFront(x, y);
gFocusMgr.setMouseCapture(this);
gViewerWindow->hideCursor();
mLastMouseX = x;
mLastMouseY = y;
return true;
}
return LLFloater::handleMouseDown(x, y, mask);
}
// Copied from llfloaterbvhpreview.cpp
bool AnimationExplorer::handleMouseUp(S32 x, S32 y, MASK mask)
{
gFocusMgr.setMouseCapture(nullptr);
gViewerWindow->showCursor();
return LLFloater::handleMouseUp(x, y, mask);
}
// (Almost) Copied from llfloaterbvhpreview.cpp
bool AnimationExplorer::handleHover(S32 x, S32 y, MASK mask)
{
if (!mPreviewCtrl || !mAnimationPreview || !mPreviewCtrl->getRect().pointInRect(x, y))
{
return LLFloater::handleHover(x, y, mask);
}
MASK local_mask = mask & ~MASK_ALT;
if (mAnimationPreview && hasMouseCapture())
{
if (local_mask == MASK_PAN)
{
// pan here
mAnimationPreview->pan((F32)(x - mLastMouseX) * -0.005f, (F32)(y - mLastMouseY) * -0.005f);
}
else if (local_mask == MASK_ORBIT)
{
F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
F32 pitch_radians = (F32)(y - mLastMouseY) * 0.02f;
mAnimationPreview->rotate(yaw_radians, pitch_radians);
}
else
{
F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
F32 zoom_amt = (F32)(y - mLastMouseY) * 0.02f;
mAnimationPreview->rotate(yaw_radians, 0.f);
mAnimationPreview->zoom(zoom_amt);
}
mAnimationPreview->requestUpdate();
LLUI::getInstance()->setMousePositionLocal(this, mLastMouseX, mLastMouseY);
}
else if (local_mask == MASK_ORBIT)
{
gViewerWindow->setCursor(UI_CURSOR_TOOLCAMERA);
}
else if (local_mask == MASK_PAN)
{
gViewerWindow->setCursor(UI_CURSOR_TOOLPAN);
}
else
{
gViewerWindow->setCursor(UI_CURSOR_TOOLZOOMIN);
}
return true;
}
// (Almost) Copied from llfloaterbvhpreview.cpp
bool AnimationExplorer::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
if (mPreviewCtrl && mPreviewCtrl->getRect().pointInRect(x, y))
{
mAnimationPreview->zoom((F32)clicks * -0.2f);
mAnimationPreview->requestUpdate();
return true;
}
return LLFloater::handleScrollWheel(x, y, clicks);
}
// Copied from llfloaterbvhpreview.cpp
void AnimationExplorer::onMouseCaptureLost()
{
gViewerWindow->showCursor();
}
+134
View File
@@ -0,0 +1,134 @@
/**
* @file ao.h
* @brief Animation Explorer floater declaration
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* Copyright (C) 2013, Zi Ree @ Second Life
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef ANIMATIONEXPLORER_H
#define ANIMATIONEXPLORER_H
#include "llfloater.h"
#include "llfloaterbvhpreview.h" // for LLPreviewAnimation
#include "llsingleton.h"
// --------------------------------------------------------------------------
// RecentAnimationList: holds a list of recently placed animations to query
// by the animation explorer, so we don't have to keep the full floater
// loaded all the time.
// --------------------------------------------------------------------------
class AnimationExplorer;
class RecentAnimationList
: public LLSingleton<RecentAnimationList>
{
LLSINGLETON(RecentAnimationList);
~RecentAnimationList();
public:
struct AnimationEntry
{
LLUUID animationID; // asset ID of the animation
LLUUID playedBy; // object/agent who played this animation
F64 time; // time in seconds since viewer start when the animation started
};
std::deque<AnimationEntry> mAnimationList;
void addAnimation(const LLUUID& id, const LLUUID& playedBy); // called in llviewermessage.cpp
void requestList(AnimationExplorer* explorer); // request animation list
};
// --------------------------------------------------------------------------
// AnimationExplorer: floater that shows recently played animations and gives
// options to preview, stop animations and revoke animation permissions
// --------------------------------------------------------------------------
class LLAvatarName;
class LLButton;
class LLCheckBoxCtrl;
class LLMessageSystem;
class LLScrollListCtrl;
class LLView;
class AnimationExplorer
: public LLFloater
{
friend class LLFloaterReg;
private:
AnimationExplorer(const LLSD& key);
~AnimationExplorer();
public:
/*virtual*/ bool postBuild();
void addAnimation(const LLUUID& id, const LLUUID& playedBy, F64 time); // called from RecentAnimationList
// copied from llfloaterbvhpreview.h
bool handleMouseDown(S32 x, S32 y, MASK mask);
bool handleMouseUp(S32 x, S32 y, MASK mask);
bool handleHover(S32 x, S32 y, MASK mask);
bool handleScrollWheel(S32 x, S32 y, S32 clicks);
void onMouseCaptureLost();
void requestNameCallback(LLMessageSystem* msg); // object name query callback
protected:
void onAvatarNameCallback(const LLUUID& id, const LLAvatarName& av_name);
void updateListEntry(const LLUUID& id, const std::string& name);
LLScrollListCtrl* mAnimationScrollList;
LLButton* mStopButton;
LLButton* mBlacklistButton;
LLButton* mStopAndRevokeButton;
LLCheckBoxCtrl* mNoOwnedAnimationsCheckBox;
LLView* mPreviewCtrl; // dummy control on the floater where the avatar preview should go
LLPointer<LLPreviewAnimation> mAnimationPreview; // actual avatar preview
S32 mLastMouseX;
S32 mLastMouseY;
LLUUID mCurrentAnimationID; // currently selected animation's asset ID
LLUUID mCurrentObject; // object ID that played the currently selected animation
std::vector<LLUUID> mRequestedIDs; // list of object IDs we requested named for
std::map<LLUUID, std::string> mKnownIDs; // known list of names for object IDs
typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;
avatar_name_cache_connection_map_t mAvatarNameCacheConnections;
void draw();
void update(); // request list update from RecentAnimationList
void updateList(F64 current_timestamp); // update times and playing status in animation list
void startMotion(const LLUUID& motionID);
void onSelectAnimation();
void onStopPressed();
void onBlacklistPressed();
void onStopAndRevokePressed();
void onOwnedCheckToggled();
};
#endif // ANIMATIONEXPLORER_H
+998
View File
@@ -0,0 +1,998 @@
/**
* @file ao.cpp
* @brief Anything concerning the Viewer Side Animation Overrider GUI
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* Copyright (C) 2011, Zi Ree @ Second Life
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "ao.h"
#include "aoengine.h"
#include "aoset.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "llnotificationsutil.h"
#include "llspinctrl.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "utilitybar.h"
FloaterAO::FloaterAO(const LLSD& key)
: LLTransientDockableFloater(nullptr, true, key), LLEventTimer(10.f),
mSetList(0),
mSelectedSet(0),
mSelectedState(0),
mCanDragAndDrop(false),
mImportRunning(false),
mCurrentBoldItem(nullptr),
mMore(true)
{
mEventTimer.stop();
}
FloaterAO::~FloaterAO()
{
}
void FloaterAO::reloading(bool reload)
{
if (reload)
{
mEventTimer.start();
}
else
{
mEventTimer.stop();
}
mReloadCoverPanel->setVisible(reload);
enableSetControls(!reload);
enableStateControls(!reload);
}
bool FloaterAO::tick()
{
// reloading took too long, probably missed the signal, so we hide the reload cover
LL_WARNS("AOEngine") << "AO reloading timeout." << LL_ENDL;
updateList();
return false;
}
void FloaterAO::updateSetParameters()
{
mOverrideSitsCheckBox->setValue(mSelectedSet->getSitOverride());
mOverrideSitsCheckBoxSmall->setValue(mSelectedSet->getSitOverride());
mSmartCheckBox->setValue(mSelectedSet->getSmart());
mDisableMouselookCheckBox->setValue(mSelectedSet->getMouselookStandDisable());
bool isDefault = (mSelectedSet == AOEngine::instance().getDefaultSet());
mDefaultCheckBox->setValue(isDefault);
mDefaultCheckBox->setEnabled(!isDefault);
updateSmart();
}
void FloaterAO::updateAnimationList()
{
S32 currentStateSelected = mStateSelector->getCurrentIndex();
mStateSelector->removeall();
onChangeAnimationSelection();
if (!mSelectedSet)
{
mStateSelector->setEnabled(false);
mStateSelector->add(getString("ao_no_animations_loaded"));
return;
}
for (auto index = 0; index < mSelectedSet->mStateNames.size(); ++index)
{
const std::string& stateName = mSelectedSet->mStateNames[index];
AOSet::AOState* state = mSelectedSet->getStateByName(stateName);
mStateSelector->add(stateName, state, ADD_BOTTOM, true);
}
enableStateControls(true);
if (currentStateSelected == -1)
{
mStateSelector->selectFirstItem();
}
else
{
mStateSelector->selectNthItem(currentStateSelected);
}
onSelectState();
}
void FloaterAO::updateList()
{
mReloadButton->setEnabled(true);
mImportRunning = false;
// Lambda provides simple Alpha sorting, note this is case sensitive.
auto sortRuleLambda = [](const AOSet* s1, const AOSet* s2) -> bool
{
return s1->getName() < s2->getName();
};
mSetList = AOEngine::instance().getSetList();
std::sort(mSetList.begin(), mSetList.end(), sortRuleLambda);
// remember currently selected animation set name
std::string currentSetName = mSetSelector->getSelectedItemLabel();
mSetSelector->removeall();
mSetSelectorSmall->removeall();
mSetSelector->clear();
mSetSelectorSmall->clear();
mAnimationList->deleteAllItems();
mCurrentBoldItem = nullptr;
reloading(false);
if (mSetList.empty())
{
LL_DEBUGS("AOEngine") << "empty set list" << LL_ENDL;
mSetSelector->add(getString("ao_no_sets_loaded"));
mSetSelectorSmall->add(getString("ao_no_sets_loaded"));
mSetSelector->selectNthItem(0);
mSetSelectorSmall->selectNthItem(0);
enableSetControls(false);
return;
}
// make sure we have an animation set name to display
if (currentSetName.empty())
{
// selected animation set was empty, get the currently active animation set from the engine
currentSetName = AOEngine::instance().getCurrentSetName();
LL_DEBUGS("AOEngine") << "Current set name was empty, fetched name \"" << currentSetName << "\" from AOEngine" << LL_ENDL;
if(currentSetName.empty())
{
// selected animation set was empty, get the name of the first animation set in the list
currentSetName = mSetList[0]->getName();
LL_DEBUGS("AOEngine") << "Current set name still empty, fetched first set's name \"" << currentSetName << "\"" << LL_ENDL;
}
}
size_t selected_index = 0;
for (auto index = 0; index < mSetList.size(); ++index)
{
std::string setName = mSetList[index]->getName();
mSetSelector->add(setName, &mSetList[index], ADD_BOTTOM, true);
mSetSelectorSmall->add(setName, &mSetList[index], ADD_BOTTOM, true);
if (setName.compare(currentSetName) == 0)
{
selected_index = index;
mSelectedSet = AOEngine::instance().selectSetByName(currentSetName);
updateSetParameters();
updateAnimationList();
}
}
mSetSelector->selectNthItem(static_cast<S32>(selected_index));
mSetSelectorSmall->selectNthItem(static_cast<S32>(selected_index));
enableSetControls(true);
if (mSetSelector->getSelectedItemLabel().empty())
{
onClickReload();
}
}
void FloaterAO::updateScrollListData()
{
auto animationListData = mAnimationList->getAllData();
for (auto index = 0; index < mSelectedState->mAnimations.size(); ++index)
{
LLScrollListItem* item = animationListData[index];
item->setUserdata(&mSelectedState->mAnimations[index].mInventoryUUID);
}
}
bool FloaterAO::postBuild()
{
LLPanel* aoPanel = getChild<LLPanel>("animation_overrider_outer_panel");
mMainInterfacePanel = aoPanel->getChild<LLPanel>("animation_overrider_panel");
mSmallInterfacePanel = aoPanel->getChild<LLPanel>("animation_overrider_panel_small");
mReloadCoverPanel = aoPanel->getChild<LLPanel>("ao_reload_cover");
mSetSelector = mMainInterfacePanel->getChild<LLComboBox>("ao_set_selection_combo");
mActivateSetButton = mMainInterfacePanel->getChild<LLButton>("ao_activate");
mAddButton = mMainInterfacePanel->getChild<LLButton>("ao_add");
mRemoveButton = mMainInterfacePanel->getChild<LLButton>("ao_remove");
mDefaultCheckBox = mMainInterfacePanel->getChild<LLCheckBoxCtrl>("ao_default");
mOverrideSitsCheckBox = mMainInterfacePanel->getChild<LLCheckBoxCtrl>("ao_sit_override");
mSmartCheckBox = mMainInterfacePanel->getChild<LLCheckBoxCtrl>("ao_smart");
mDisableMouselookCheckBox = mMainInterfacePanel->getChild<LLCheckBoxCtrl>("ao_disable_stands_in_mouselook");
mStateSelector = mMainInterfacePanel->getChild<LLComboBox>("ao_state_selection_combo");
mAnimationList = mMainInterfacePanel->getChild<LLScrollListCtrl>("ao_state_animation_list");
mMoveUpButton = mMainInterfacePanel->getChild<LLButton>("ao_move_up");
mMoveDownButton = mMainInterfacePanel->getChild<LLButton>("ao_move_down");
mTrashButton = mMainInterfacePanel->getChild<LLButton>("ao_trash");
mCycleCheckBox = mMainInterfacePanel->getChild<LLCheckBoxCtrl>("ao_cycle");
mRandomizeCheckBox = mMainInterfacePanel->getChild<LLCheckBoxCtrl>("ao_randomize");
mCycleTimeTextLabel = mMainInterfacePanel->getChild<LLTextBox>("ao_cycle_time_seconds_label");
mCycleTimeSpinner = mMainInterfacePanel->getChild<LLSpinCtrl>("ao_cycle_time");
mReloadButton = mMainInterfacePanel->getChild<LLButton>("ao_reload");
mPreviousButton = mMainInterfacePanel->getChild<LLButton>("ao_previous");
mNextButton = mMainInterfacePanel->getChild<LLButton>("ao_next");
mLessButton = mMainInterfacePanel->getChild<LLButton>("ao_less");
mSetSelectorSmall = mSmallInterfacePanel->getChild<LLComboBox>("ao_set_selection_combo_small");
mMoreButton = mSmallInterfacePanel->getChild<LLButton>("ao_more");
mPreviousButtonSmall = mSmallInterfacePanel->getChild<LLButton>("ao_previous_small");
mNextButtonSmall = mSmallInterfacePanel->getChild<LLButton>("ao_next_small");
mOverrideSitsCheckBoxSmall = mSmallInterfacePanel->getChild<LLCheckBoxCtrl>("ao_sit_override_small");
mSetSelector->setCommitCallback(boost::bind(&FloaterAO::onSelectSet, this));
mSetSelector->setFocusLostCallback(boost::bind(&FloaterAO::onSelectSet, this));
mActivateSetButton->setCommitCallback(boost::bind(&FloaterAO::onClickActivate, this));
mAddButton->setCommitCallback(boost::bind(&FloaterAO::onClickAdd, this));
mRemoveButton->setCommitCallback(boost::bind(&FloaterAO::onClickRemove, this));
mDefaultCheckBox->setCommitCallback(boost::bind(&FloaterAO::onCheckDefault, this));
mOverrideSitsCheckBox->setCommitCallback(boost::bind(&FloaterAO::onCheckOverrideSits, this));
mSmartCheckBox->setCommitCallback(boost::bind(&FloaterAO::onCheckSmart, this));
mDisableMouselookCheckBox->setCommitCallback(boost::bind(&FloaterAO::onCheckDisableStands, this));
mAnimationList->setCommitOnSelectionChange(true);
mStateSelector->setCommitCallback(boost::bind(&FloaterAO::onSelectState, this));
mAnimationList->setCommitCallback(boost::bind(&FloaterAO::onChangeAnimationSelection, this));
mMoveUpButton->setCommitCallback(boost::bind(&FloaterAO::onClickMoveUp, this));
mMoveDownButton->setCommitCallback(boost::bind(&FloaterAO::onClickMoveDown, this));
mTrashButton->setCommitCallback(boost::bind(&FloaterAO::onClickTrash, this));
mCycleCheckBox->setCommitCallback(boost::bind(&FloaterAO::onCheckCycle, this));
mRandomizeCheckBox->setCommitCallback(boost::bind(&FloaterAO::onCheckRandomize, this));
mCycleTimeSpinner->setCommitCallback(boost::bind(&FloaterAO::onChangeCycleTime, this));
mReloadButton->setCommitCallback(boost::bind(&FloaterAO::onClickReload, this));
mPreviousButton->setCommitCallback(boost::bind(&FloaterAO::onClickPrevious, this));
mNextButton->setCommitCallback(boost::bind(&FloaterAO::onClickNext, this));
mLessButton->setCommitCallback(boost::bind(&FloaterAO::onClickLess, this));
mOverrideSitsCheckBoxSmall->setCommitCallback(boost::bind(&FloaterAO::onCheckOverrideSitsSmall, this));
mSetSelectorSmall->setCommitCallback(boost::bind(&FloaterAO::onSelectSetSmall, this));
mMoreButton->setCommitCallback(boost::bind(&FloaterAO::onClickMore, this));
mPreviousButtonSmall->setCommitCallback(boost::bind(&FloaterAO::onClickPrevious, this));
mNextButtonSmall->setCommitCallback(boost::bind(&FloaterAO::onClickNext, this));
// <AS:Chanayane> Double click on animation in AO
mAnimationList->setDoubleClickCallback(boost::bind(&FloaterAO::onDoubleClick, this));
// </AS:Chanayane>
updateSmart();
AOEngine::instance().setReloadCallback(boost::bind(&FloaterAO::updateList, this));
AOEngine::instance().setAnimationChangedCallback(boost::bind(&FloaterAO::onAnimationChanged, this, _1));
onChangeAnimationSelection();
mMainInterfacePanel->setVisible(true);
mSmallInterfacePanel->setVisible(false);
reloading(true);
updateList();
if (gSavedPerAccountSettings.getBOOL("UseFullAOInterface"))
{
onClickMore();
}
else
{
onClickLess();
}
return LLDockableFloater::postBuild();
}
void FloaterAO::enableSetControls(bool enable)
{
mSetSelector->setEnabled(enable);
mSetSelectorSmall->setEnabled(enable);
mActivateSetButton->setEnabled(enable);
mRemoveButton->setEnabled(enable);
mDefaultCheckBox->setEnabled(enable && (mSelectedSet != AOEngine::instance().getDefaultSet()));
mOverrideSitsCheckBox->setEnabled(enable);
mOverrideSitsCheckBoxSmall->setEnabled(enable);
mDisableMouselookCheckBox->setEnabled(enable);
if (!enable)
{
enableStateControls(enable);
}
}
void FloaterAO::enableStateControls(bool enable)
{
mStateSelector->setEnabled(enable);
mAnimationList->setEnabled(enable);
mCycleCheckBox->setEnabled(enable);
if (enable)
{
updateCycleParameters();
}
else
{
mRandomizeCheckBox->setEnabled(enable);
mCycleTimeTextLabel->setEnabled(enable);
mCycleTimeSpinner->setEnabled(enable);
}
mPreviousButton->setEnabled(enable);
mPreviousButtonSmall->setEnabled(enable);
mNextButton->setEnabled(enable);
mNextButtonSmall->setEnabled(enable);
mCanDragAndDrop = enable;
}
void FloaterAO::onOpen(const LLSD& key)
{
UtilityBar::instance().setAOInterfaceButtonExpanded(true);
}
void FloaterAO::onClose(bool app_quitting)
{
if (!app_quitting)
{
UtilityBar::instance().setAOInterfaceButtonExpanded(false);
}
}
void FloaterAO::onSelectSet()
{
AOSet* set = AOEngine::instance().getSetByName(mSetSelector->getSelectedItemLabel());
if (!set)
{
onRenameSet();
return;
}
// only update the interface when we actually selected a different set - FIRE-29542
if (mSelectedSet != set)
{
mSelectedSet=set;
updateSetParameters();
updateAnimationList();
}
}
void FloaterAO::onSelectSetSmall()
{
// sync main set selector with small set selector
mSetSelector->selectNthItem(mSetSelectorSmall->getCurrentIndex());
mSelectedSet = AOEngine::instance().getSetByName(mSetSelectorSmall->getSelectedItemLabel());
if (mSelectedSet)
{
updateSetParameters();
updateAnimationList();
// small selector activates the selected set immediately
onClickActivate();
}
}
void FloaterAO::onRenameSet()
{
if (!mSelectedSet)
{
LL_WARNS("AOEngine") << "Rename AO set without set selected." << LL_ENDL;
return;
}
std::string name = mSetSelector->getSimple();
LLStringUtil::trim(name);
LLUIString new_set_name = name;
if (!name.empty())
{
if (
LLTextValidate::validateASCIIPrintableNoPipe.validate(new_set_name.getWString()) && // only allow ASCII
name.find_first_of(":|") == std::string::npos) // don't allow : or |
{
if (AOEngine::instance().renameSet(mSelectedSet, name))
{
reloading(true);
return;
}
}
else
{
LLSD args;
args["AO_SET_NAME"] = name;
LLNotificationsUtil::add("RenameAOMustBeASCII", args);
}
}
mSetSelector->setSimple(mSelectedSet->getName());
}
void FloaterAO::onClickActivate()
{
// sync small set selector with main set selector
mSetSelectorSmall->selectNthItem(mSetSelector->getCurrentIndex());
LL_DEBUGS("AOEngine") << "Set activated: " << mSetSelector->getSelectedItemLabel() << LL_ENDL;
AOEngine::instance().selectSet(mSelectedSet);
}
LLScrollListItem* FloaterAO::addAnimation(const std::string& name)
{
LLSD row;
row["columns"][0]["column"] = "icon";
row["columns"][0]["type"] = "icon";
row["columns"][0]["value"] = "FSAO_Animation_Stopped";
row["columns"][1]["column"] = "animation_name";
row["columns"][1]["type"] = "text";
row["columns"][1]["value"] = name;
return mAnimationList->addElement(row);
}
void FloaterAO::onSelectState()
{
mAnimationList->deleteAllItems();
mCurrentBoldItem = nullptr;
mAnimationList->setCommentText(getString("ao_no_animations_loaded"));
mAnimationList->setEnabled(false);
onChangeAnimationSelection();
if (!mSelectedSet)
{
return;
}
mSelectedState = mSelectedSet->getStateByName(mStateSelector->getSelectedItemLabel());
if (!mSelectedState)
{
return;
}
mSelectedState = (AOSet::AOState*)mStateSelector->getCurrentUserdata();
if (mSelectedState->mAnimations.size())
{
for (auto index = 0; index < mSelectedState->mAnimations.size(); ++index)
{
LLScrollListItem* item = addAnimation(mSelectedState->mAnimations[index].mName);
if (item)
{
item->setUserdata(&mSelectedState->mAnimations[index].mInventoryUUID);
// update currently playing animation if we are looking at the currently running state in the UI
if (mSelectedSet->getMotion() == mSelectedState->mRemapID &&
mSelectedState->mCurrentAnimationID == mSelectedState->mAnimations[index].mAssetUUID)
{
mCurrentBoldItem = item;
((LLScrollListIcon*)item->getColumn(0))->setValue("FSAO_Animation_Playing");
((LLScrollListText*)item->getColumn(1))->setFontStyle(LLFontGL::BOLD);
}
}
}
mAnimationList->setCommentText("");
mAnimationList->setEnabled(true);
}
mCycleCheckBox->setValue(mSelectedState->mCycle);
mRandomizeCheckBox->setValue(mSelectedState->mRandom);
mCycleTimeSpinner->setValue(mSelectedState->mCycleTime);
updateCycleParameters();
}
void FloaterAO::onClickReload()
{
reloading(true);
mSelectedSet = nullptr;
mSelectedState = nullptr;
AOEngine::instance().reload(false);
updateList();
}
void FloaterAO::onClickAdd()
{
LLNotificationsUtil::add("NewAOSet", LLSD(), LLSD(), boost::bind(&FloaterAO::newSetCallback, this, _1, _2));
}
bool FloaterAO::newSetCallback(const LLSD& notification, const LLSD& response)
{
std::string newSetName = response["message"].asString();
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLStringUtil::trim(newSetName);
LLUIString new_set_name = newSetName;
if (newSetName.empty())
{
return false;
}
else if (
!LLTextValidate::validateASCIIPrintableNoPipe.validate(new_set_name.getWString()) || // only allow ASCII
newSetName.find_first_of(":|") != std::string::npos) // don't allow : or |
{
LLSD args;
args["AO_SET_NAME"] = newSetName;
LLNotificationsUtil::add("NewAOCantContainNonASCII", args);
return false;
}
if (option == 0)
{
AOEngine::instance().addSet(newSetName, [this](const LLUUID& new_cat_id)
{
reloading(true);
});
}
return false;
}
void FloaterAO::onClickRemove()
{
if (!mSelectedSet)
{
return;
}
LLSD args;
args["AO_SET_NAME"] = mSelectedSet->getName();
LLNotificationsUtil::add("RemoveAOSet", args, LLSD(), boost::bind(&FloaterAO::removeSetCallback, this, _1, _2));
}
bool FloaterAO::removeSetCallback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option ==0)
{
if (AOEngine::instance().removeSet(mSelectedSet))
{
reloading(true);
// to prevent snapping back to deleted set
mSetSelector->removeall();
mSetSelectorSmall->removeall();
// visually indicate there are no items left
mSetSelector->clear();
mSetSelectorSmall->clear();
mAnimationList->deleteAllItems();
mCurrentBoldItem = nullptr;
return true;
}
}
return false;
}
void FloaterAO::onCheckDefault()
{
if (mSelectedSet)
{
AOEngine::instance().setDefaultSet(mSelectedSet);
}
}
void FloaterAO::onCheckOverrideSits()
{
mOverrideSitsCheckBoxSmall->setValue(mOverrideSitsCheckBox->getValue());
if (mSelectedSet)
{
AOEngine::instance().setOverrideSits(mSelectedSet, mOverrideSitsCheckBox->getValue().asBoolean());
}
updateSmart();
}
void FloaterAO::onCheckOverrideSitsSmall()
{
mOverrideSitsCheckBox->setValue(mOverrideSitsCheckBoxSmall->getValue());
onCheckOverrideSits();
}
void FloaterAO::updateSmart()
{
mSmartCheckBox->setEnabled(mOverrideSitsCheckBox->getValue());
}
void FloaterAO::onCheckSmart()
{
if (mSelectedSet)
{
AOEngine::instance().setSmart(mSelectedSet, mSmartCheckBox->getValue().asBoolean());
}
}
void FloaterAO::onCheckDisableStands()
{
if (mSelectedSet)
{
AOEngine::instance().setDisableMouselookStands(mSelectedSet, mDisableMouselookCheckBox->getValue().asBoolean());
}
}
void FloaterAO::onChangeAnimationSelection()
{
std::vector<LLScrollListItem*> list = mAnimationList->getAllSelected();
LL_DEBUGS("AOEngine") << "Selection count: " << list.size() << LL_ENDL;
bool resortEnable = false;
bool trashEnable = false;
// Linden Lab bug: scroll lists still select the first item when you click on them, even when they are disabled.
// The control does not memorize it's enabled/disabled state, so mAnimationList->mEnabled() doesn't seem to work.
// So we need to safeguard against it.
if (!mCanDragAndDrop)
{
mAnimationList->deselectAllItems();
LL_DEBUGS("AOEngine") << "Selection count now: " << list.size() << LL_ENDL;
}
else if (!list.empty())
{
if (list.size() == 1)
{
resortEnable = true;
}
trashEnable = true;
}
mMoveDownButton->setEnabled(resortEnable);
mMoveUpButton->setEnabled(resortEnable);
mTrashButton->setEnabled(trashEnable);
}
void FloaterAO::onClickMoveUp()
{
if (!mSelectedState)
{
return;
}
std::vector<LLScrollListItem*> list = mAnimationList->getAllSelected();
if (list.size() != 1)
{
return;
}
S32 currentIndex = mAnimationList->getFirstSelectedIndex();
if (currentIndex == -1)
{
return;
}
if (AOEngine::instance().swapWithPrevious(mSelectedState, currentIndex))
{
mAnimationList->swapWithPrevious(currentIndex);
updateScrollListData();
}
}
void FloaterAO::onClickMoveDown()
{
if (!mSelectedState)
{
return;
}
std::vector<LLScrollListItem*> list = mAnimationList->getAllSelected();
if (list.size() != 1)
{
return;
}
S32 currentIndex = mAnimationList->getFirstSelectedIndex();
if (currentIndex >= (mAnimationList->getItemCount() - 1))
{
return;
}
if (AOEngine::instance().swapWithNext(mSelectedState, currentIndex))
{
mAnimationList->swapWithNext(currentIndex);
updateScrollListData();
}
}
void FloaterAO::onClickTrash()
{
if (!mSelectedState)
{
return;
}
std::vector<LLScrollListItem*> list = mAnimationList->getAllSelected();
if (list.empty())
{
return;
}
for (auto index = list.size() - 1; index != -1; --index)
{
AOEngine::instance().removeAnimation(mSelectedSet, mSelectedState, mAnimationList->getItemIndex(list[index]));
}
mAnimationList->deleteSelectedItems();
mCurrentBoldItem = nullptr;
}
void FloaterAO::updateCycleParameters()
{
bool enabled = mCycleCheckBox->getValue().asBoolean();
mRandomizeCheckBox->setEnabled(enabled);
mCycleTimeTextLabel->setEnabled(enabled);
mCycleTimeSpinner->setEnabled(enabled);
}
void FloaterAO::onCheckCycle()
{
if (mSelectedState)
{
bool cycle = mCycleCheckBox->getValue().asBoolean();
AOEngine::instance().setCycle(mSelectedState, cycle);
updateCycleParameters();
}
}
void FloaterAO::onCheckRandomize()
{
if (mSelectedState)
{
AOEngine::instance().setRandomize(mSelectedState, mRandomizeCheckBox->getValue().asBoolean());
}
}
void FloaterAO::onChangeCycleTime()
{
if (mSelectedState)
{
AOEngine::instance().setCycleTime(mSelectedState, mCycleTimeSpinner->getValueF32());
}
}
void FloaterAO::onClickPrevious()
{
AOEngine::instance().cycle(AOEngine::CyclePrevious);
}
void FloaterAO::onClickNext()
{
AOEngine::instance().cycle(AOEngine::CycleNext);
}
// <AS:Chanayane> Double click on animation in AO
void FloaterAO::onDoubleClick()
{
LLScrollListItem* item = mAnimationList->getFirstSelected();
if (!item)
{
return;
}
LLUUID* animUUID = (LLUUID*)item->getUserdata();
if (!animUUID)
{
return;
}
// do nothing if animation is for a different state than the active state
if (mSelectedState != AOEngine::instance().getCurrentState())
{
return;
}
// activate AO set if necessary
if (AOEngine::instance().getCurrentSet() != mSelectedSet)
{
// sync small set selector with main set selector
mSetSelectorSmall->selectNthItem(mSetSelector->getCurrentIndex());
LL_DEBUGS("AOEngine") << "Set activated: " << mSetSelector->getSelectedItemLabel() << LL_ENDL;
AOEngine::instance().selectSet(mSelectedSet);
}
AOEngine::instance().playAnimation(*animUUID);
}
// </AS:Chanayane>
void FloaterAO::onClickMore()
{
LLRect fullSize = gSavedPerAccountSettings.getRect("floater_rect_animation_overrider_full");
if (fullSize.getHeight() < getMinHeight())
{
fullSize.setOriginAndSize(fullSize.mLeft, fullSize.mBottom, fullSize.getWidth(), getRect().getHeight());
}
if (fullSize.getWidth() < getMinWidth())
{
fullSize.setOriginAndSize(fullSize.mLeft, fullSize.mBottom, getRect().getWidth(), fullSize.getHeight());
}
mMore = true;
mSmallInterfacePanel->setVisible(false);
mMainInterfacePanel->setVisible(true);
setCanResize(true);
gSavedPerAccountSettings.setBOOL("UseFullAOInterface", true);
reshape(getRect().getWidth(), fullSize.getHeight());
}
void FloaterAO::onClickLess()
{
LLRect fullSize = getRect();
LLRect smallSize = mSmallInterfacePanel->getRect();
smallSize.setLeftTopAndSize(0, 0, smallSize.getWidth(), smallSize.getHeight() + getHeaderHeight());
gSavedPerAccountSettings.setRect("floater_rect_animation_overrider_full", fullSize);
mMore = false;
mSmallInterfacePanel->setVisible(true);
mMainInterfacePanel->setVisible(false);
setCanResize(false);
gSavedPerAccountSettings.setBOOL("UseFullAOInterface", false);
reshape(getRect().getWidth(), smallSize.getHeight());
// save current size and position
gSavedPerAccountSettings.setRect("floater_rect_animation_overrider_full", fullSize);
}
void FloaterAO::onAnimationChanged(const LLUUID& animation)
{
LL_DEBUGS("AOEngine") << "Received animation change to " << animation << LL_ENDL;
if (mCurrentBoldItem)
{
// <AS:Chanayane> Safer casts
if (LLScrollListCell* icon_cell = mCurrentBoldItem->getColumn(0))
{
if (LLScrollListIcon* icon = dynamic_cast<LLScrollListIcon*>(icon_cell))
{
icon->setValue("FSAO_Animation_Stopped");
}
}
if (LLScrollListCell* text_cell = mCurrentBoldItem->getColumn(1))
{
if (LLScrollListText* text = dynamic_cast<LLScrollListText*>(text_cell))
{
text->setFontStyle(LLFontGL::NORMAL);
}
}
// </AS:Chanayane>
mCurrentBoldItem = nullptr;
}
if (animation.isNull())
{
return;
}
// <AS:Chanayane> Fix potential nullptr
if (!mAnimationList)
{
LL_WARNS("AO") << "Animation list control is null." << LL_ENDL;
return;
}
// </AS:Chanayane>
// <AS:Chanayane> Safer casts
// why do we have no LLScrollListCtrl::getItemByUserdata() ? -Zi
for (LLScrollListItem* item : mAnimationList->getAllData())
{
LLUUID* id = static_cast<LLUUID*>(item->getUserdata());
// <AS:Chanayane> compares the LLUUID values instead of pointer values
//if (id == &animation)
if (id && *id == animation)
// </AS:Chanayane>
{
mCurrentBoldItem = item;
if (LLScrollListCell* icon_cell = mCurrentBoldItem->getColumn(0))
{
if (LLScrollListIcon* icon = dynamic_cast<LLScrollListIcon*>(icon_cell))
{
icon->setValue("FSAO_Animation_Playing");
}
}
if (LLScrollListCell* text_cell = mCurrentBoldItem->getColumn(1))
{
if (LLScrollListText* text = dynamic_cast<LLScrollListText*>(text_cell))
{
text->setFontStyle(LLFontGL::BOLD);
}
}
return;
}
}
// </AS:Chanayane>
}
// virtual
bool FloaterAO::handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop, EDragAndDropType type, void* data,
EAcceptance* accept, std::string& tooltipMsg)
{
// no drag & drop on small interface
if (!mMore)
{
tooltipMsg = getString("ao_dnd_only_on_full_interface");
*accept = ACCEPT_NO;
return true;
}
LLInventoryItem* item = (LLInventoryItem*)data;
if (type == DAD_NOTECARD)
{
if (mImportRunning)
{
*accept = ACCEPT_NO;
return true;
}
*accept = ACCEPT_YES_SINGLE;
if (item && drop)
{
if (AOEngine::instance().importNotecard(item))
{
reloading(true);
mReloadButton->setEnabled(false);
mImportRunning = true;
}
}
}
else if (type == DAD_ANIMATION)
{
if (!drop && (!mSelectedSet || !mSelectedState || !mCanDragAndDrop))
{
*accept = ACCEPT_NO;
return true;
}
*accept = ACCEPT_YES_MULTI;
if (item && drop)
{
AOEngine::instance().addAnimation(mSelectedSet, mSelectedState, item);
addAnimation(item->getName());
// TODO: this would be the right thing to do, but it blocks multi drop
// before final release this must be resolved
reloading(true);
}
}
else
{
*accept = ACCEPT_NO;
}
return true;
}
+164
View File
@@ -0,0 +1,164 @@
/**
* @file ao.h
* @brief Anything concerning the Viewer Side Animation Overrider GUI
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* Copyright (C) 2011, Zi Ree @ Second Life
*
* 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;
* version 2.1 of the License only.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef AO_H
#define AO_H
#include "lleventtimer.h"
#include "lltransientdockablefloater.h"
#include "aoset.h"
class LLButton;
class LLComboBox;
class LLCheckBoxCtrl;
class LLScrollListCtrl;
class LLScrollListItem;
class LLSpinCtrl;
class LLTextBox;
class FloaterAO
: public LLTransientDockableFloater,
public LLEventTimer
{
friend class LLFloaterReg;
private:
FloaterAO(const LLSD& key);
~FloaterAO();
public:
/*virtual*/ bool postBuild();
virtual void onOpen(const LLSD& key);
virtual void onClose(bool app_quitting);
void updateList();
void updateScrollListData();
void updateSetParameters();
void updateAnimationList();
bool handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop, EDragAndDropType cargo_type, void* cargo_data,
EAcceptance* accept, std::string& tooltip_msg);
protected:
LLScrollListItem* addAnimation(const std::string& name);
void onSelectSet();
void onSelectSetSmall();
void onRenameSet();
void onSelectState();
void onChangeAnimationSelection();
void onClickReload();
void onClickAdd();
void onClickRemove();
void onClickActivate();
void onCheckDefault();
void onCheckOverrideSits();
void onCheckOverrideSitsSmall();
void onCheckSmart();
void onCheckDisableStands();
void onClickMoveUp();
void onClickMoveDown();
void onClickTrash();
void onCheckCycle();
void onCheckRandomize();
void onChangeCycleTime();
void onClickPrevious();
void onClickNext();
void onClickMore();
void onClickLess();
// <AS:Chanayane> Double click on animation in AO
void onDoubleClick();
// </AS:Chanayane>
void onAnimationChanged(const LLUUID& animation);
void reloading(bool reload);
void updateSmart();
void updateCycleParameters();
void enableSetControls(bool enable);
void enableStateControls(bool enable);
bool newSetCallback(const LLSD& notification, const LLSD& response);
bool removeSetCallback(const LLSD& notification, const LLSD& response);
virtual bool tick();
std::vector<AOSet*> mSetList;
AOSet* mSelectedSet;
AOSet::AOState* mSelectedState;
LLPanel* mReloadCoverPanel;
// Full interface
LLPanel* mMainInterfacePanel;
LLComboBox* mSetSelector;
LLButton* mActivateSetButton;
LLButton* mAddButton;
LLButton* mRemoveButton;
LLCheckBoxCtrl* mDefaultCheckBox;
LLCheckBoxCtrl* mOverrideSitsCheckBox;
LLCheckBoxCtrl* mSmartCheckBox;
LLCheckBoxCtrl* mDisableMouselookCheckBox;
LLComboBox* mStateSelector;
LLScrollListCtrl* mAnimationList;
LLScrollListItem* mCurrentBoldItem;
LLButton* mMoveUpButton;
LLButton* mMoveDownButton;
LLButton* mTrashButton;
LLCheckBoxCtrl* mCycleCheckBox;
LLCheckBoxCtrl* mRandomizeCheckBox;
LLTextBox* mCycleTimeTextLabel;
LLSpinCtrl* mCycleTimeSpinner;
LLButton* mReloadButton;
LLButton* mPreviousButton;
LLButton* mNextButton;
LLButton* mLessButton;
// Small interface
LLPanel* mSmallInterfacePanel;
LLComboBox* mSetSelectorSmall;
LLButton* mMoreButton;
LLButton* mPreviousButtonSmall;
LLButton* mNextButtonSmall;
LLCheckBoxCtrl* mOverrideSitsCheckBoxSmall;
bool mCanDragAndDrop;
bool mImportRunning;
bool mMore;
};
#endif // AO_H
File diff suppressed because it is too large Load Diff
+231
View File
@@ -0,0 +1,231 @@
/**
* @file aoengine.h
* @brief The core Animation Overrider engine
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2011, Zi Ree @ Second Life
*
* 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;
* version 2.1 of the License only.
*
* 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
* $/LicenseInfo$
*/
#ifndef AOENGINE_H
#define AOENGINE_H
#include "aoset.h"
#include "llassettype.h"
#include "lleventtimer.h"
#include "llextendedstatus.h"
#include "llsingleton.h"
#include "llviewerinventory.h"
#include <boost/signals2.hpp>
class AOTimerCollection
: public LLEventTimer
{
public:
AOTimerCollection();
~AOTimerCollection();
virtual bool tick();
void enableInventoryTimer(bool enable);
void enableSettingsTimer(bool enable);
void enableReloadTimer(bool enable);
void enableImportTimer(bool enable);
protected:
void updateTimers();
bool mInventoryTimer;
bool mSettingsTimer;
bool mReloadTimer;
bool mImportTimer;
};
// ----------------------------------------------------
class AOSitCancelTimer
: public LLEventTimer
{
public:
AOSitCancelTimer();
~AOSitCancelTimer();
void oneShot();
void stop();
virtual bool tick();
protected:
S32 mTickCount;
};
// ----------------------------------------------------
class AOState;
class LLInventoryItem;
class LLVFS;
class AOEngine
: public LLSingleton<AOEngine>
{
LLSINGLETON(AOEngine);
~AOEngine();
public:
enum eCycleMode
{
CycleAny,
CycleNext,
CyclePrevious
};
void enable(bool enable);
void enableStands(bool enable_stands);
const LLUUID override(const LLUUID& motion, bool start);
void tick();
void update();
void reload(bool);
void reloadStateAnimations(AOSet::AOState* state);
void clear(bool from_timer);
const LLUUID& getAOFolder() const;
void addSet(const std::string& name, inventory_func_type callback, bool reload = true);
bool removeSet(AOSet* set);
void addAnimation(const AOSet* set, AOSet::AOState* state, const LLInventoryItem* item, bool reload = true);
bool removeAnimation(const AOSet* set, AOSet::AOState* state, S32 index);
void checkSitCancel();
void checkBelowWater(bool check_underwater);
bool importNotecard(const LLInventoryItem* item);
void processImport(bool from_timer);
bool swapWithPrevious(AOSet::AOState* state, S32 index);
bool swapWithNext(AOSet::AOState* state, S32 index);
void cycleTimeout(const AOSet* set);
void cycle(eCycleMode cycleMode);
// <AS:Chanayane> Double click on animation in AO
void playAnimation(const LLUUID& animation);
const AOSet* getCurrentSet() const;
const AOSet::AOState* getCurrentState() const;
// </AS:Chanayane>
void inMouselook(bool mouselook);
void selectSet(AOSet* set);
AOSet* selectSetByName(const std::string& name);
AOSet* getSetByName(const std::string& name) const;
// callback from LLAppViewer
static void onLoginComplete();
const std::vector<AOSet*> getSetList() const;
const std::string getCurrentSetName() const;
const AOSet* getDefaultSet() const;
bool renameSet(AOSet* set, const std::string& name);
void setDefaultSet(AOSet* set);
void setOverrideSits(AOSet* set, bool override_sit);
void setSmart(AOSet* set, bool smart);
void setDisableMouselookStands(AOSet* set, bool disabled);
void setCycle(AOSet::AOState* set, bool cycle);
void setRandomize(AOSet::AOState* state, bool randomize);
void setCycleTime(AOSet::AOState* state, F32 time);
void saveSettings();
typedef boost::signals2::signal<void ()> updated_signal_t;
boost::signals2::connection setReloadCallback(const updated_signal_t::slot_type& cb)
{
return mUpdatedSignal.connect(cb);
};
typedef boost::signals2::signal<void (const LLUUID&)> animation_changed_signal_t;
boost::signals2::connection setAnimationChangedCallback(const animation_changed_signal_t::slot_type& cb)
{
return mAnimationChangedSignal.connect(cb);
};
protected:
void init();
void setLastMotion(const LLUUID& motion);
void setLastOverriddenMotion(const LLUUID& motion);
void setStateCycleTimer(const AOSet::AOState* state);
void stopAllStandVariants();
void stopAllSitVariants();
bool foreignAnimations();
AOSet::AOState* mapSwimming(const LLUUID& motion) const;
AOSet::AOState* getStateForMotion(const LLUUID& motion) const;
void updateSortOrder(AOSet::AOState* state);
void saveSet(const AOSet* set);
void saveState(const AOSet::AOState* state);
bool createAnimationLink(AOSet::AOState* state, const LLInventoryItem* item);
bool findForeignItems(const LLUUID& uuid) const;
void purgeFolder(const LLUUID& uuid) const;
void onRegionChange();
void onToggleAOControl();
void onToggleAOStandsControl();
void onPauseAO();
static void onNotecardLoadComplete(const LLUUID& assetUUID, LLAssetType::EType type,
void* userdata, S32 status, LLExtStat extStatus);
void parseNotecard(const char* buffer);
updated_signal_t mUpdatedSignal;
animation_changed_signal_t mAnimationChangedSignal;
AOTimerCollection mTimerCollection;
AOSitCancelTimer mSitCancelTimer;
bool mEnabled;
bool mEnabledStands;
bool mInMouselook;
bool mUnderWater;
LLUUID mAOFolder;
LLUUID mLastMotion;
LLUUID mLastOverriddenMotion;
LLUUID mTransitionId;
// this motion will be ignored once in the overrider when stopping, fixes a case
// where the AO doesn't correctly start up on login or when getting enabled manually
LLUUID mIgnoreMotionStopOnce;
std::vector<AOSet*> mSets;
std::vector<AOSet*> mOldSets;
AOSet* mCurrentSet;
AOSet* mDefaultSet;
AOSet* mImportSet;
std::vector<AOSet*> mOldImportSets;
S32 mImportRetryCount;
boost::signals2::connection mRegionChangeConnection;
};
#endif // AOENGINE_H
+320
View File
@@ -0,0 +1,320 @@
/**
* @file aoset.cpp
* @brief Implementation of an Animation Overrider set of animations
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2011, Zi Ree @ Second Life
*
* 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;
* version 2.1 of the License only.
*
* 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
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "aoengine.h"
#include "aoset.h"
#include "llanimationstates.h"
#include "llinventorymodel.h"
AOSet::AOSet(const LLUUID inventoryID)
: LLEventTimer(10000.0f),
mInventoryID(inventoryID),
mName("** New AO Set **"),
mSitOverride(false),
mSmart(false),
mMouselookStandDisable(false),
mComplete(false),
mDirty(false),
mCurrentMotion(LLUUID())
{
LL_DEBUGS("AOEngine") << "Creating new AO set: " << this << LL_ENDL;
// ZHAO names first, alternate names following, separated by | characters
// keep number and order in sync with the enum in the declaration
const std::string stateNames[AOSTATES_MAX]=
{
"Standing|Stand.1|Stand.2|Stand.3",
"Walking|Walk.N",
"Running",
"Sitting|Sit.N",
"Sitting On Ground|Sit.G",
"Crouching|Crouch",
"Crouch Walking|Walk.C",
"Landing|Land.N",
"Soft Landing",
"Standing Up|Stand.U",
"Falling",
"Flying Down|Hover.D",
"Flying Up|Hover.U",
"Flying|Fly.N",
"Flying Slow",
"Hovering|Hover.N",
"Jumping|Jump.N",
"Pre Jumping|Jump.P",
"Turning Right|Turn.R",
"Turning Left|Turn.L",
"Typing",
"Floating|Swim.H",
"Swimming Forward|Swim.N",
"Swimming Up|Swim.U",
"Swimming Down|Swim.D"
};
// keep number and order in sync with the enum in the declaration
const LLUUID stateUUIDs[AOSTATES_MAX]=
{
ANIM_AGENT_STAND,
ANIM_AGENT_WALK,
ANIM_AGENT_RUN,
ANIM_AGENT_SIT,
ANIM_AGENT_SIT_GROUND_CONSTRAINED,
ANIM_AGENT_CROUCH,
ANIM_AGENT_CROUCHWALK,
ANIM_AGENT_LAND,
ANIM_AGENT_MEDIUM_LAND,
ANIM_AGENT_STANDUP,
ANIM_AGENT_FALLDOWN,
ANIM_AGENT_HOVER_DOWN,
ANIM_AGENT_HOVER_UP,
ANIM_AGENT_FLY,
ANIM_AGENT_FLYSLOW,
ANIM_AGENT_HOVER,
ANIM_AGENT_JUMP,
ANIM_AGENT_PRE_JUMP,
ANIM_AGENT_TURNRIGHT,
ANIM_AGENT_TURNLEFT,
ANIM_AGENT_TYPE,
ANIM_AGENT_HOVER, // needs special treatment
ANIM_AGENT_FLY, // needs special treatment
ANIM_AGENT_HOVER_UP, // needs special treatment
ANIM_AGENT_HOVER_DOWN // needs special treatment
};
for (S32 index = 0; index < AOSTATES_MAX; ++index)
{
std::vector<std::string> stateNameList;
LLStringUtil::getTokens(stateNames[index], stateNameList, "|");
mStates[index].mName = stateNameList[0]; // for quick reference
mStates[index].mAlternateNames = stateNameList; // to get all possible names, including mName
mStates[index].mRemapID = stateUUIDs[index];
mStates[index].mInventoryUUID = LLUUID::null;
mStates[index].mCurrentAnimation = 0;
mStates[index].mCurrentAnimationID = LLUUID::null;
mStates[index].mCycle = false;
mStates[index].mRandom = false;
mStates[index].mCycleTime = 0;
mStates[index].mDirty = false;
mStateNames.emplace_back(stateNameList[0]);
}
stopTimer();
}
AOSet::~AOSet()
{
LL_DEBUGS("AOEngine") << "Set deleted: " << this << LL_ENDL;
}
AOSet::AOState* AOSet::getState(S32 eName)
{
return &mStates[eName];
}
AOSet::AOState* AOSet::getStateByName(const std::string& name)
{
for (S32 index = 0; index < AOSTATES_MAX; ++index)
{
AOState* state = &mStates[index];
for (auto names = 0; names < state->mAlternateNames.size(); ++names)
{
if (state->mAlternateNames[names].compare(name) == 0)
{
return state;
}
}
}
return nullptr;
}
AOSet::AOState* AOSet::getStateByRemapID(const LLUUID& id)
{
LLUUID remap_id = id;
if (remap_id == ANIM_AGENT_SIT_GROUND)
{
remap_id = ANIM_AGENT_SIT_GROUND_CONSTRAINED;
}
for (S32 index = 0; index < AOSTATES_MAX; ++index)
{
if (mStates[index].mRemapID == remap_id)
{
return &mStates[index];
}
}
return nullptr;
}
const LLUUID& AOSet::getAnimationForState(AOState* state) const
{
if (state)
{
auto numOfAnimations = state->mAnimations.size();
if (numOfAnimations)
{
if (state->mCycle)
{
if (state->mRandom)
{
state->mCurrentAnimation = (U32)(ll_frand() * numOfAnimations);
LL_DEBUGS("AOEngine") << "randomly chosen " << state->mCurrentAnimation << " of " << numOfAnimations << LL_ENDL;
}
else
{
state->mCurrentAnimation++;
if (state->mCurrentAnimation >= state->mAnimations.size())
{
state->mCurrentAnimation = 0;
}
LL_DEBUGS("AOEngine") << "cycle " << state->mCurrentAnimation << " of " << numOfAnimations << LL_ENDL;
}
}
AOAnimation& anim = state->mAnimations[state->mCurrentAnimation];
if (anim.mAssetUUID.isNull())
{
LL_DEBUGS("AOEngine") << "Asset UUID for chosen animation " << anim.mName << " not yet known, try to find it." << LL_ENDL;
if(LLViewerInventoryItem* item = gInventory.getItem(anim.mInventoryUUID) ; item)
{
LL_DEBUGS("AOEngine") << "Found asset UUID for chosen animation: " << item->getAssetUUID() << " - Updating AOAnimation.mAssetUUID" << LL_ENDL;
anim.mAssetUUID = item->getAssetUUID();
}
else
{
LL_DEBUGS("AOEngine") << "Inventory UUID " << anim.mInventoryUUID << " for chosen animation " << anim.mName << " still returns no asset." << LL_ENDL;
}
}
return anim.mAssetUUID;
}
else
{
LL_DEBUGS("AOEngine") << "animation state has no animations assigned" << LL_ENDL;
}
}
return LLUUID::null;
}
void AOSet::startTimer(F32 timeout)
{
mEventTimer.stop();
mPeriod = timeout;
mEventTimer.start();
LL_DEBUGS("AOEngine") << "Starting state timer for " << getName() << " at " << timeout << LL_ENDL;
}
void AOSet::stopTimer()
{
LL_DEBUGS("AOEngine") << "State timer for " << getName() << " stopped." << LL_ENDL;
mEventTimer.stop();
}
bool AOSet::tick()
{
AOEngine::instance().cycleTimeout(this);
return false;
}
const LLUUID& AOSet::getInventoryUUID() const
{
return mInventoryID;
}
void AOSet::setInventoryUUID(const LLUUID& inventoryID)
{
mInventoryID = inventoryID;
}
const std::string& AOSet::getName() const
{
return mName;
}
void AOSet::setName(const std::string& name)
{
mName=name;
}
bool AOSet::getSitOverride() const
{
return mSitOverride;
}
void AOSet::setSitOverride(bool override_sit)
{
mSitOverride = override_sit;
}
bool AOSet::getSmart() const
{
return mSmart;
}
void AOSet::setSmart(bool smart)
{
mSmart = smart;
}
bool AOSet::getMouselookStandDisable() const
{
return mMouselookStandDisable;
}
void AOSet::setMouselookStandDisable(bool disable)
{
mMouselookStandDisable = disable;
}
bool AOSet::getComplete() const
{
return mComplete;
}
void AOSet::setComplete(bool complete)
{
mComplete = complete;
}
bool AOSet::getDirty() const
{
return mDirty;
}
void AOSet::setDirty(bool dirty)
{
mDirty = dirty;
}
void AOSet::setMotion(const LLUUID& motion)
{
mCurrentMotion = motion;
}
const LLUUID& AOSet::getMotion() const
{
return mCurrentMotion;
}
+145
View File
@@ -0,0 +1,145 @@
/**
* @file aoset.h
* @brief Implementation of an Animation Overrider set of animations
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2011, Zi Ree @ Second Life
*
* 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;
* version 2.1 of the License only.
*
* 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
* $/LicenseInfo$
*/
#ifndef AOSET_H
#define AOSET_H
#include "lleventtimer.h"
class LLInventoryItem;
class AOSet
: public LLEventTimer
{
public:
AOSet(const LLUUID inventoryID);
~AOSet();
// keep number and order in sync with list of names in the constructor
enum
{
Start = 0, // convenience, so we don't have to know the name of the first state
Standing = 0,
Walking,
Running,
Sitting,
SittingOnGround,
Crouching,
CrouchWalking,
Landing,
SoftLanding,
StandingUp,
Falling,
FlyingDown,
FlyingUp,
Flying,
FlyingSlow,
Hovering,
Jumping,
PreJumping,
TurningRight,
TurningLeft,
Typing,
Floating,
SwimmingForward,
SwimmingUp,
SwimmingDown,
AOSTATES_MAX
};
struct AOAnimation
{
std::string mName;
LLUUID mAssetUUID;
LLUUID mInventoryUUID;
LLUUID mOriginalUUID;
S32 mSortOrder;
};
struct AOState
{
std::string mName;
std::vector<std::string> mAlternateNames;
std::vector<const LLInventoryItem*> mAddQueue;
LLUUID mRemapID;
bool mCycle;
bool mRandom;
F32 mCycleTime;
std::vector<AOAnimation> mAnimations;
U32 mCurrentAnimation;
LLUUID mCurrentAnimationID;
LLUUID mInventoryUUID;
bool mDirty;
};
const LLUUID& getInventoryUUID() const;
void setInventoryUUID(const LLUUID& inventoryID);
const std::string& getName() const;
void setName(const std::string& name);
bool getSitOverride() const;
void setSitOverride(bool override_sit);
bool getSmart() const;
void setSmart(bool smart);
bool getMouselookStandDisable() const;
void setMouselookStandDisable(bool disable);
bool getComplete() const;
void setComplete(bool complete);
const LLUUID& getMotion() const;
void setMotion(const LLUUID& motion);
bool getDirty() const;
void setDirty(bool dirty);
AOState* getState(S32 eName);
AOState* getStateByName(const std::string& name);
AOState* getStateByRemapID(const LLUUID& id);
const LLUUID& getAnimationForState(AOState* state) const;
void startTimer(F32 timeout);
void stopTimer();
bool tick() override;
std::vector<std::string> mStateNames;
protected:
LLUUID mInventoryID;
std::string mName;
bool mSitOverride;
bool mSmart;
bool mMouselookStandDisable;
bool mComplete;
LLUUID mCurrentMotion;
bool mDirty;
AOState mStates[AOSTATES_MAX];
};
#endif // AOSET_H
+2
View File
@@ -0,0 +1,2 @@
Translations 1.0
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,369 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-118</real>
<real>-107</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-107</real>
<real>-85</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-85</real>
<real>-63</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-54</real>
<real>-49</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-18</real>
<real>-39</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>14</real>
<real>-37</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>37</real>
<real>-51</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>66</real>
<real>-76</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>85</real>
<real>-103</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.4296875</real>
<real>0</real>
<real>1.5366822481155396e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>63</real>
<real>67</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.4296875</real>
<real>0</real>
<real>1.5366822481155396e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>63</real>
<real>45</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.4296875</real>
<real>0</real>
<real>1.5366822481155396e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-71</real>
<real>61</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.4296875</real>
<real>0</real>
<real>1.5366822481155396e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-71</real>
<real>41</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-2</real>
<real>52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>17</real>
<real>71</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>37</real>
<real>91</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>62</real>
<real>111</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>82</real>
<real>125</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-22</real>
<real>60</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-39</real>
<real>76</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-67</real>
<real>101</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-94</real>
<real>123</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-123</real>
<real>140</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>99</real>
<real>143</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
@@ -0,0 +1,219 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-141</real>
<real>-28</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-127</real>
<real>-52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-111</real>
<real>-75</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-89</real>
<real>-97</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-54</real>
<real>-115</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-14</real>
<real>-115</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>23</real>
<real>-100</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>50</real>
<real>-83</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>70</real>
<real>-61</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>91</real>
<real>-17</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>42</real>
<real>104</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>42</real>
<real>80</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-85</real>
<real>101</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-87</real>
<real>75</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
+152
View File
@@ -0,0 +1,152 @@
<llsd>
<map>
<key>scale</key>
<real>.7</real>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>4</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>3.5</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>2</real>
<real>3.5</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>-4</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>2</real>
<real>-3.5</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>3.5</real>
<real>-2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-3.5</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-2</real>
<real>3.5</real>
</array>
</map><map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-2</real>
<real>-3.5</real>
</array></map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-3.5</real>
<real>-2</real>
</array>
</map>
</array>
</map>
</llsd>
@@ -0,0 +1,504 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-142</real>
<real>-1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>113</real>
<real>88</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>105</real>
<real>-5</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>7</real>
<real>-75</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-23</real>
<real>129</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-91</real>
<real>-67</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-90</real>
<real>105</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-57</real>
<real>-85</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-146</real>
<real>52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>123</real>
<real>51</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>18</real>
<real>-11</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-49</real>
<real>52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0.5</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>47</real>
<real>109</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0.5</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-71</real>
<real>1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>27</real>
<real>69</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>93</real>
<real>-63</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.75</real>
<real>0.75</real>
<real>0.75</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>51</real>
<real>12</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.75</real>
<real>0.75</real>
<real>0.75</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-138</real>
<real>101</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-146</real>
<real>-104</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>5</real>
<real>-105</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-23</real>
<real>16</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-101</real>
<real>81</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>99</real>
<real>117</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-27</real>
<real>-5</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-42</real>
<real>89</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>58</real>
<real>-119</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>157</real>
<real>-109</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.5</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>133</real>
<real>25</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.5</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>169</real>
<real>107</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.5</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-150</real>
<real>-72</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-107</real>
<real>-124</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>163</real>
<real>-52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>75</real>
<real>132</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
@@ -0,0 +1,249 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.328125</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-109</real>
<real>57</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.6796875</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-82</real>
<real>89</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.890625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-43</real>
<real>111</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.75781238079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-2</real>
<real>112</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.38281238079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>38</real>
<real>97</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.17187488079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>67</real>
<real>77</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.20312494039535522</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>79</real>
<real>51</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.55468744039535522</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>81</real>
<real>13</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1.0000001192092896</real>
<real>0.99999994039535522</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>65</real>
<real>-25</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0.76562511920928955</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>37</real>
<real>-51</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0.41406261920928955</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>6</real>
<real>-69</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0.10937511920928955</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-35</real>
<real>-72</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.3125002384185791</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-69</real>
<real>-52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.6875002384185791</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-91</real>
<real>-39</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0.82031285762786865</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-107</real>
<real>-11</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-120</real>
<real>20</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
+219
View File
@@ -0,0 +1,219 @@
<llsd>
<map>
<key>scale</key>
<real>.8</real>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>2</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>3</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>4</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>3</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>4</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-1</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-2</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-3</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-4</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>-1</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>0</real>
<real>-2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>-3</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>4</real>
</array></map>
</array>
</map>
</llsd>
+579
View File
@@ -0,0 +1,579 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-175</real>
<real>-125</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-154</real>
<real>-89</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-134</real>
<real>-43</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-117</real>
<real>9</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-113</real>
<real>75</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-95</real>
<real>25</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-86</real>
<real>-29</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-79</real>
<real>-84</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-61</real>
<real>-60</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-35</real>
<real>-15</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-14</real>
<real>36</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-1</real>
<real>85</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>5</real>
<real>44</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-5</real>
<real>-1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-5</real>
<real>-55</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>21</real>
<real>-96</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>47</real>
<real>-104</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>65</real>
<real>-68</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>79</real>
<real>-29</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>87</real>
<real>36</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>87</real>
<real>76</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>99</real>
<real>-23</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>115</real>
<real>-69</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>143</real>
<real>-111</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.3515625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-141</real>
<real>-129</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.3515625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-125</real>
<real>-81</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.3515625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-113</real>
<real>-47</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.3515625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-63</real>
<real>-109</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.3515625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-46</real>
<real>-76</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.3515625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-33</real>
<real>-33</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.3515625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>62</real>
<real>-121</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.3515625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>78</real>
<real>-97</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.1640625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-101</real>
<real>-125</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.1640625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-97</real>
<real>-91</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.1640625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-39</real>
<real>-123</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.1640625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-25</real>
<real>-96</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.1640625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>10</real>
<real>-117</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.1640625</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>102</real>
<real>-111</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
+339
View File
@@ -0,0 +1,339 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>90</real>
<real>75</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>75</real>
<real>105</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>45</real>
<real>120</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>15</real>
<real>-121</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-95</real>
<real>0</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-91</real>
<real>75</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-76</real>
<real>105</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-46</real>
<real>120</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-16</real>
<real>-121</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>60</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>-151</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-17</real>
<real>92</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>15</real>
<real>92</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-30</real>
<real>109</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>27</real>
<real>109</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>99</real>
<real>6</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>104</real>
<real>48</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-105</real>
<real>34</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-78</real>
<real>-38</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-46</real>
<real>-78</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>46</real>
<real>-82</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>75</real>
<real>-35</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
+324
View File
@@ -0,0 +1,324 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-163</real>
<real>88</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-165</real>
<real>51</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-166</real>
<real>17</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-166</real>
<real>-37</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-166</real>
<real>-75</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-139</real>
<real>-79</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-105</real>
<real>-80</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-75</real>
<real>-81</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>126</real>
<real>103</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>86</real>
<real>108</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>46</real>
<real>87</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>33</real>
<real>55</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>26</real>
<real>8</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>35</real>
<real>-35</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>66</real>
<real>-71</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>99</real>
<real>-67</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>126</real>
<real>-61</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>145</real>
<real>-19</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>143</real>
<real>5</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>113</real>
<real>1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>90</real>
<real>0</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
@@ -0,0 +1,369 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-113</real>
<real>-95</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-126</real>
<real>-63</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-113</real>
<real>-8</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-68</real>
<real>57</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-8</real>
<real>107</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>39</real>
<real>116</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>66</real>
<real>103</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>68</real>
<real>63</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>44</real>
<real>-1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>7</real>
<real>-60</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.047707695513963699</real>
<real>0.002288818359375</real>
<real>0.583648681640625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-56</real>
<real>-99</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-128</real>
<real>39</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-137</real>
<real>93</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-114</real>
<real>121</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-54</real>
<real>115</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>111</real>
<real>-41</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>110</real>
<real>-87</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>64</real>
<real>-137</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>11</real>
<real>-116</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-53</real>
<real>-59</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.00390625</real>
<real>0.78680431842803955</real>
<real>0.99609375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-102</real>
<real>-5</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>3</real>
<real>86</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>86</real>
<real>5</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>48</real>
<real>46</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
@@ -0,0 +1,249 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.18</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-26</real>
<real>-27</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.18</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>26</real>
<real>-27</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.05</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-24</real>
<real>-80</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.05</real>
<real></real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>24</real>
<real>-80</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.12</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>-51</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.51</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-37</real>
<real>107</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.51</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>37</real>
<real>107</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.34</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>78</real>
<real>38</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.34</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-78</real>
<real>38</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.25</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-62</real>
<real>4</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.44</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-58</real>
<real>76</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.44</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>58</real>
<real>76</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>.99</real>
<real>.25</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>62</real>
<real>4</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.8359375</real>
<real>0</real>
<real>2.989545464515686e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>-11</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.8359375</real>
<real>0</real>
<real>2.989545464515686e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>10</real>
<real>14</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.8359375</real>
<real>0</real>
<real>2.989545464515686e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-8</real>
<real>21</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
@@ -0,0 +1,309 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0.19531238079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-102</real>
<real>-1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.19531238079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-139</real>
<real>55</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.19531238079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-183</real>
<real>124</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.19531238079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-105</real>
<real>85</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.19531238079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-37</real>
<real>41</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.92187488079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-3</real>
<real>40</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.92187488079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>59</real>
<real>84</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.92187488079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>130</real>
<real>123</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.92187488079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>93</real>
<real>47</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.92187488079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>49</real>
<real>-12</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.46875</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>61</real>
<real>-43</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.46875</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>109</real>
<real>-87</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.46875</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>158</real>
<real>-131</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.46875</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>71</real>
<real>-108</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.46875</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-9</real>
<real>-71</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>3.5762786865234375e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-49</real>
<real>-64</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>3.5762786865234375e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-119</real>
<real>-100</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>3.5762786865234375e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-187</real>
<real>-125</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>3.5762786865234375e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-141</real>
<real>-52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>3.5762786865234375e-007</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-101</real>
<real>-19</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
+165
View File
@@ -0,0 +1,165 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-1</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-2</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-3</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-4</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-5</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-6</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-7</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-8</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-9</real>
<real>0</real>
<real>0</real>
</array>
</map><map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>-10</real>
<real>0</real>
<real>0</real>
</array>
</map>
</array>
<key>scale</key>
<real>2.3</real>
</map>
</llsd>
+369
View File
@@ -0,0 +1,369 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.2578125</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-137</real>
<real>32</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.994140625</real>
<real>0.33013916015625</real>
<real>0.005859375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-129</real>
<real>59</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.994140625</real>
<real>0.33013916015625</real>
<real>0.005859375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-109</real>
<real>77</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.99609375</real>
<real>0.6085205078125</real>
<real>0.00390625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-82</real>
<real>92</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.99609375</real>
<real>0.6085205078125</real>
<real>0.00390625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-50</real>
<real>105</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.998046875</real>
<real>0.88909912109375</real>
<real>0.001953125</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-22</real>
<real>108</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.998046875</real>
<real>0.88909912109375</real>
<real>0.001953125</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>17</real>
<real>109</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.80468738079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>47</real>
<real>99</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.80468738079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>71</real>
<real>83</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.52343738079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>94</real>
<real>52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.52343738079071045</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>97</real>
<real>21</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.078124880790710449</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>89</real>
<real>-3</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.078124880790710449</real>
<real>1</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>69</real>
<real>-28</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.32031244039535522</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>39</real>
<real>-45</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.32031244039535522</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>2</real>
<real>-48</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.67187494039535522</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-21</real>
<real>-29</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1</real>
<real>0.67187494039535522</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-25</real>
<real>7</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0.85937511920928955</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-6</real>
<real>27</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0.85937511920928955</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>21</real>
<real>32</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0.57812511920928955</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>38</real>
<real>23</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0.57812511920928955</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>41</real>
<real>1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.0078127384185791016</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>26</real>
<real>-9</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.0078127384185791016</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>13</real>
<real>5</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.7343752384185791</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>23</real>
<real>9</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
+218
View File
@@ -0,0 +1,218 @@
<llsd>
<map>
<key>scale</key>
<real>1.3</real>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>2</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>1</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-1</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-2</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-2</real>
<real>1</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-2</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-2</real>
<real>-1</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-2</real>
<real>-2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-1</real>
<real>-2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>-2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>1</real>
<real>-2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>2</real>
<real>-2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>2</real>
<real>-1</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>2</real>
<real>0</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>2</real>
<real>1</real>
</array></map>
</array>
</map>
</llsd>
+271
View File
@@ -0,0 +1,271 @@
<llsd>
<map>
<key>scale</key>
<real>.3</real>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>0</real>
<real>9</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>1</real>
<real>6</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>2</real>
<real>3.5</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>4</real>
<real>3</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>6.5</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>5</real>
<real>-1</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>3.5</real>
<real>-3</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>3.75</real>
<real>-6</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>4</real>
<real>-9</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>2</real>
<real>-7.7</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-1</real>
<real>6</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-2</real>
<real>3.5</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-4</real>
<real>3</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-6.5</real>
<real>2</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-5</real>
<real>-1</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key> <array>
<real>0</real>
<real>-3.5</real>
<real>-3</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-3.75</real>
<real>-6</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-4</real>
<real>-9</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>-2</real>
<real>-7.7</real>
</array>
</map> <map>
<key>color</key>
<array>
<real>0</real>
<real>1.0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key><array>
<real>0</real>
<real>0</real>
<real>-6.5</real>
</array></map>
</array>
</map>
</llsd>
+264
View File
@@ -0,0 +1,264 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-145</real>
<real>-59</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-44</real>
<real>-52</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>86</real>
<real>-49</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-45</real>
<real>27</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>78</real>
<real>29</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-145</real>
<real>-93</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-34</real>
<real>-84</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>84</real>
<real>-77</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-38</real>
<real>-16</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>78</real>
<real>-7</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>75</real>
<real>57</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-48</real>
<real>61</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-92</real>
<real>57</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-88</real>
<real>-5</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-152</real>
<real>-11</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-157</real>
<real>49</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>1</real>
<real>1</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-124</real>
<real>24</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
@@ -0,0 +1,564 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-25</real>
<real>92</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-53</real>
<real>83</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-81</real>
<real>65</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-98</real>
<real>43</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-103</real>
<real>17</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-95</real>
<real>-7</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-81</real>
<real>-39</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-61</real>
<real>-51</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-35</real>
<real>-39</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-21</real>
<real>-21</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.96484375</real>
<real>0.96484375</real>
<real>0.96484375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-22</real>
<real>1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-53</real>
<real>-55</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-27</real>
<real>-56</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>7</real>
<real>-43</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>25</real>
<real>-23</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>37</real>
<real>4</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>39</real>
<real>47</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>29</real>
<real>72</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>2</real>
<real>87</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-22</real>
<real>85</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-39</real>
<real>63</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-47</real>
<real>47</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-41</real>
<real>32</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-27</real>
<real>19</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.9375</real>
<real>0.9375</real>
<real>0.9375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-33</real>
<real>13</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.9375</real>
<real>0.9375</real>
<real>0.9375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-43</real>
<real>21</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.9375</real>
<real>0.9375</real>
<real>0.9375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-57</real>
<real>47</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.9375</real>
<real>0.9375</real>
<real>0.9375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-47</real>
<real>68</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.9375</real>
<real>0.9375</real>
<real>0.9375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-73</real>
<real>43</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.9375</real>
<real>0.9375</real>
<real>0.9375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-70</real>
<real>1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.9375</real>
<real>0.9375</real>
<real>0.9375</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-45</real>
<real>-7</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-17</real>
<real>5</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-14</real>
<real>-15</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-17</real>
<real>-29</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>1</real>
<real>-8</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>1</real>
<real>35</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-14</real>
<real>53</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
+399
View File
@@ -0,0 +1,399 @@
<llsd>
<map>
<key>data</key>
<array>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-187</real>
<real>-56</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-173</real>
<real>-32</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-155</real>
<real>-9</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-134</real>
<real>22</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-107</real>
<real>-1</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-85</real>
<real>-22</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-62</real>
<real>-45</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-43</real>
<real>-22</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-27</real>
<real>-2</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-10</real>
<real>27</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>14</real>
<real>7</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>34</real>
<real>-9</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>49</real>
<real>-24</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>78</real>
<real>-4</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>94</real>
<real>10</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>113</real>
<real>30</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.20584124326705933</real>
<real>0.130859375</real>
<real>0.869140625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-182</real>
<real>12</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.20584124326705933</real>
<real>0.130859375</real>
<real>0.869140625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-130</real>
<real>-45</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.20584124326705933</real>
<real>0.130859375</real>
<real>0.869140625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-69</real>
<real>23</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.20584124326705933</real>
<real>0.130859375</real>
<real>0.869140625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>1</real>
<real>-34</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.20584124326705933</real>
<real>0.130859375</real>
<real>0.869140625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>58</real>
<real>32</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>0.20584124326705933</real>
<real>0.130859375</real>
<real>0.869140625</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>117</real>
<real>-14</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-139</real>
<real>48</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-57</real>
<real>-70</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>-18</real>
<real>62</real>
</array>
</map>
<map>
<key>color</key>
<array>
<real>1</real>
<real>0.5</real>
<real>0</real>
<real>1</real>
</array>
<key>offset</key>
<array>
<real>0</real>
<real>54</real>
<real>-52</real>
</array>
</map>
</array>
<key>scale</key>
<real>0.02</real>
</map>
</llsd>
@@ -0,0 +1,10 @@
<llsd>
<map>
<key>endHue</key>
<real>312.72726440429687</real>
<key>rotateSpeed</key>
<real>0.64999997615814209</real>
<key>startHue</key>
<real>280</real>
</map>
</llsd>
@@ -0,0 +1,10 @@
<llsd>
<map>
<key>endHue</key>
<real>410.90908813476562</real>
<key>rotateSpeed</key>
<real>1</real>
<key>startHue</key>
<real>360</real>
</map>
</llsd>
@@ -0,0 +1,10 @@
<llsd>
<map>
<key>endHue</key>
<real>398.18182373046875</real>
<key>rotateSpeed</key>
<real>0.23000000417232513</real>
<key>startHue</key>
<real>350.90908813476562</real>
</map>
</llsd>
@@ -0,0 +1,10 @@
<llsd>
<map>
<key>endHue</key>
<real>360</real>
<key>rotateSpeed</key>
<real>1</real>
<key>startHue</key>
<real>0</real>
</map>
</llsd>
@@ -0,0 +1,10 @@
<llsd>
<map>
<key>endHue</key>
<real>243.63636779785156</real>
<key>rotateSpeed</key>
<real>2.3299999237060547</real>
<key>startHue</key>
<real>176.36363220214844</real>
</map>
</llsd>
+120
View File
@@ -0,0 +1,120 @@
<llsd>
<map>
<key>AvatarSitRotation</key>
<map>
<key>Comment</key>
<string>Avatar real sitting rotation used in preset</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Quaternion</string>
<key>Value</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
</map>
<key>CameraAngle</key>
<map>
<key>Comment</key>
<string>Camera field of view angle (Radians)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.047197551</real>
</map>
<key>CameraOffsetBuild</key>
<map>
<key>Comment</key>
<string>Default camera position relative to focus point when entering build mode</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3</string>
<key>Value</key>
<array>
<real>-6</real>
<real>0</real>
<real>6</real>
</array>
</map>
<key>CameraOffsetRearView</key>
<map>
<key>Comment</key>
<string>Initial camera offset from avatar in Front View</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3</string>
<key>Value</key>
<array>
<real>2.2</real>
<real>0.0</real>
<real>0.0</real>
</array>
</map>
<key>CameraOffsetScale</key>
<map>
<key>Comment</key>
<string>Scales the default offset</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1</real>
</map>
<key>CameraZoomFraction</key>
<map>
<key>Comment</key>
<string>Mousewheel driven fraction of zoom</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.90322577953338623</real>
</map>
<key>FocusOffsetRearView</key>
<map>
<key>Comment</key>
<string>Initial focus point offset relative to avatar for the camera preset Front View (x-axis is forward)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3D</string>
<key>Value</key>
<array>
<real>0.0</real>
<real>0.0</real>
<real>0.0</real>
</array>
</map>
<key>PresetCameraActive</key>
<map>
<key>Comment</key>
<string>Name of currently selected preference</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>Default</string>
</map>
<key>TrackFocusObject</key>
<map>
<key>Comment</key>
<string>Camera tracks last object zoomed on</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
</map>
</llsd>
+120
View File
@@ -0,0 +1,120 @@
<llsd>
<map>
<key>AvatarSitRotation</key>
<map>
<key>Comment</key>
<string>Avatar real sitting rotation used in preset</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Quaternion</string>
<key>Value</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
</map>
<key>CameraAngle</key>
<map>
<key>Comment</key>
<string>Camera field of view angle (Radians)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.047197551</real>
</map>
<key>CameraOffsetBuild</key>
<map>
<key>Comment</key>
<string>Default camera position relative to focus point when entering build mode</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3</string>
<key>Value</key>
<array>
<real>-6</real>
<real>0</real>
<real>6</real>
</array>
</map>
<key>CameraOffsetRearView</key>
<map>
<key>Comment</key>
<string>Initial camera offset from avatar in Rear View</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3</string>
<key>Value</key>
<array>
<real>-3</real>
<real>0</real>
<real>0.75</real>
</array>
</map>
<key>CameraOffsetScale</key>
<map>
<key>Comment</key>
<string>Scales the default offset</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1</real>
</map>
<key>CameraZoomFraction</key>
<map>
<key>Comment</key>
<string>Mousewheel driven fraction of zoom</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.90322577953338623</real>
</map>
<key>FocusOffsetRearView</key>
<map>
<key>Comment</key>
<string>Initial focus point offset relative to avatar for the camera preset Rear View (x-axis is forward)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3D</string>
<key>Value</key>
<array>
<real>1.0</real>
<real>0.0</real>
<real>1.0</real>
</array>
</map>
<key>PresetCameraActive</key>
<map>
<key>Comment</key>
<string>Name of currently selected preference</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>Default</string>
</map>
<key>TrackFocusObject</key>
<map>
<key>Comment</key>
<string>Camera tracks last object zoomed on</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
</map>
</llsd>
+120
View File
@@ -0,0 +1,120 @@
<llsd>
<map>
<key>AvatarSitRotation</key>
<map>
<key>Comment</key>
<string>Avatar real sitting rotation used in preset</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Quaternion</string>
<key>Value</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
</map>
<key>CameraAngle</key>
<map>
<key>Comment</key>
<string>Camera field of view angle (Radians)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.047197551</real>
</map>
<key>CameraOffsetBuild</key>
<map>
<key>Comment</key>
<string>Default camera position relative to focus point when entering build mode</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3</string>
<key>Value</key>
<array>
<real>-6</real>
<real>0</real>
<real>6</real>
</array>
</map>
<key>CameraOffsetRearView</key>
<map>
<key>Comment</key>
<string>Initial camera offset from avatar in Side View</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3</string>
<key>Value</key>
<array>
<real>-1.0</real>
<real>0.7</real>
<real>0.5</real>
</array>
</map>
<key>CameraOffsetScale</key>
<map>
<key>Comment</key>
<string>Scales the default offset</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1</real>
</map>
<key>CameraZoomFraction</key>
<map>
<key>Comment</key>
<string>Mousewheel driven fraction of zoom</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.90322577953338623</real>
</map>
<key>FocusOffsetRearView</key>
<map>
<key>Comment</key>
<string>Initial focus point offset relative to avatar for the camera preset Side View (x-axis is forward)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3D</string>
<key>Value</key>
<array>
<real>1.5</real>
<real>0.7</real>
<real>1.0</real>
</array>
</map>
<key>PresetCameraActive</key>
<map>
<key>Comment</key>
<string>Name of currently selected preference</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>Default</string>
</map>
<key>TrackFocusObject</key>
<map>
<key>Comment</key>
<string>Camera tracks last object zoomed on</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
</map>
</llsd>
+120
View File
@@ -0,0 +1,120 @@
<llsd>
<map>
<key>AvatarSitRotation</key>
<map>
<key>Comment</key>
<string>Avatar real sitting rotation used in preset</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Quaternion</string>
<key>Value</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
</map>
<key>CameraAngle</key>
<map>
<key>Comment</key>
<string>Camera field of view angle (Radians)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.047197551</real>
</map>
<key>CameraOffsetBuild</key>
<map>
<key>Comment</key>
<string>Default camera position relative to focus point when entering build mode</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3</string>
<key>Value</key>
<array>
<real>-6</real>
<real>0</real>
<real>6</real>
</array>
</map>
<key>CameraOffsetRearView</key>
<map>
<key>Comment</key>
<string>Initial camera offset from avatar in Shoulder View</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3</string>
<key>Value</key>
<array>
<real>-3</real>
<real>-0.4</real>
<real>-0.2</real>
</array>
</map>
<key>CameraOffsetScale</key>
<map>
<key>Comment</key>
<string>Scales the default offset</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.1</real>
</map>
<key>CameraZoomFraction</key>
<map>
<key>Comment</key>
<string>Mousewheel driven fraction of zoom</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.90322577953338623</real>
</map>
<key>FocusOffsetRearView</key>
<map>
<key>Comment</key>
<string>Initial focus point offset relative to avatar for the camera preset Shoulder View (x-axis is forward)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Vector3D</string>
<key>Value</key>
<array>
<real>0.9</real>
<real>-0.7</real>
<real>0.2</real>
</array>
</map>
<key>PresetCameraActive</key>
<map>
<key>Comment</key>
<string>Name of currently selected preference</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>Default</string>
</map>
<key>TrackFocusObject</key>
<map>
<key>Comment</key>
<string>Camera tracks last object zoomed on</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
</map>
</llsd>
File diff suppressed because it is too large Load Diff
+108
View File
@@ -0,0 +1,108 @@
<llsd>
<map>
<!-- Settings for the whole particle system -->
<key>SourceMaxAge</key><!-- how long the source can live with 0 forever -->
<real>0</real>
<key>SourceStartAge</key>
<real>0</real>
<key>AngularVelocity</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
</array>
<key>InnerAngle</key>
<real>3.1415927410125732421875</real>
<key>OuterAngle</key>
<real>0</real>
<key>BurstPartCount</key>
<integer>1</integer>
<key>BurstRadius</key>
<real>0.3</real>
<key>BurstRate</key>
<real>0.02</real>
<key>BurstSpeedMin</key>
<real>0.1</real>
<key>BurstSpeedMax</key>
<real>1</real>
<!-- pattern flags set to 1 for true and 0 for false -->
<key>LL_PART_SRC_PATTERN_ANGLE</key>
<integer>0</integer>
<key>LL_PART_SRC_PATTERN_ANGLE_CONE</key>
<integer>1</integer>
<key>LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY</key>
<integer>0</integer>
<key>LL_PART_SRC_PATTERN_DROP</key>
<integer>0</integer>
<key>LL_PART_SRC_PATTERN_EXPLODE</key>
<integer>0</integer>
<!-- end of pattern flags -->
<!-- Settings for single particles within the system -->
<key>ParticleMaxAge</key><!-- how long a single particle can live with 0 forever -->
<real>4</real>
<key>PartImageID</key> <!--This setting is ignored for the cloud, used instead for now is the hardcoded -->
<string>0000000000000-0000-0000-000000000000</string><!-- skins/default/textures/cloud-particle.j2c -->
<key>StartColor</key><!-- RGBA -->
<array>
<real>0.666</real>
<real>0.228</real>
<real>0.13</real>
<real>0.1</real>
</array>
<key>EndColor</key><!-- RGBA -->
<array>
<real>0.766</real>
<real>0.328</real>
<real>0.23</real>
<real>0.9</real>
</array>
<key>StartScale</key>
<array>
<real>0.8</real>
<real>0.8</real>
</array>
<key>EndScale</key>
<array>
<real>0.02</real>
<real>0.02</real>
</array>
<key>TargetId</key><!-- This setting is ignored for the cloud -->
<string>00000000-0000-0000-0000-000000000000</string>
<!-- masks flags set to 1 for true and 0 for false-->
<key>LL_PART_BEAM_MASK</key>
<integer>0</integer>
<key>LL_PART_BOUNCE_MASK</key>
<integer>0</integer>
<key>LL_PART_EMISSIVE_MASK</key>
<integer>1</integer>
<key>LL_PART_FOLLOW_SRC_MASK</key>
<integer>0</integer>
<key>LL_PART_FOLLOW_VELOCITY_MASK</key>
<integer>0</integer>
<key>LL_PART_INTERP_COLOR_MASK</key>
<integer>1</integer>
<key>LL_PART_INTERP_SCALE_MASK</key>
<integer>1</integer>
<key>LL_PART_TARGET_LINEAR_MASK</key>
<integer>0</integer>
<key>LL_PART_TARGET_POS_MASK</key>
<integer>1</integer>
<key>LL_PART_WIND_MASK</key>
<integer>0</integer>
<!-- end of mask flags -->
</map>
</llsd>
+478
View File
@@ -0,0 +1,478 @@
<?xml version="1.0"?>
<llsd>
<map>
<!-- Please insert new keys in alphabetical order. -->
<key>analyzeperformance</key>
<map>
<key>desc</key>
<string>When used in conjunction with logperformance, analyzes result of log against baseline.</string>
<key>map-to</key>
<string>AnalyzePerformance</string>
</map>
<key>autologin</key>
<map>
<key>desc</key>
<string>log in as last saved user</string>
<key>map-to</key>
<string>AutoLogin</string>
</map>
<key>channel</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>CmdLineChannel</string>
</map>
<key>console</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>ShowConsoleWindow</string>
</map>
<key>cooperative</key>
<map>
<key>desc</key>
<string>Yield some idle time to local host.</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>YieldTime</string>
</map>
<key>crashonstartup</key>
<map>
<key>desc</key>
<string>Crashes on startup. For QA use.</string>
<key>map-to</key>
<string>CrashOnStartup</string>
</map>
<key>debugsession</key>
<map>
<key>desc</key>
<string>Run as if RenderDebugGLSession is TRUE, but log errors until end of session.</string>
<key>map-to</key>
<string>DebugSession</string>
</map>
<key>debugviews</key>
<map>
<key>map-to</key>
<string>DebugViews</string>
</map>
<key>disablecrashlogger</key>
<map>
<key>desc</key>
<string>Disables the crash logger and lets the OS handle crashes</string>
<key>map-to</key>
<string>DisableCrashLogger</string>
</map>
<key>drop</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>PacketDropPercentage</string>
</map>
<key>god</key>
<map>
<key>desc</key>
<string>Log in a god if you have god access.</string>
<key>map-to</key>
<string>ConnectAsGod</string>
</map>
<key>graphicslevel</key>
<map>
<key>desc</key>
<string>Set the detail level.
0 - low, 1 - medium, 2 - high, 3 - ultra</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>RenderQualityPerformance</string>
</map>
<key>grid</key>
<map>
<key>desc</key>
<string>Specify the name of the grid to connect to.</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>CmdLineGridChoice</string>
</map>
<key>update-service</key>
<map>
<key>desc</key>
<string>Override the url base for the update query.</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>CmdLineUpdateService</string>
</map>
<key>help</key>
<map>
<key>desc</key>
<string>display this help message</string>
<key>short</key>
<string>h</string>
</map>
<key>helperuri</key>
<map>
<key>desc</key>
<string>helper web CGI prefix to use</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>CmdLineHelperURI</string>
</map>
<key>ignorepixeldepth</key>
<map>
<key>desc</key>
<string>Ignore pixel depth settings.</string>
<key>map-to</key>
<string>IgnorePixelDepth</string>
</map>
<key>inbw</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>InBandwidth</string>
</map>
<key>leap</key>
<map>
<key>desc</key>
<string>command line to run an LLSD Event API Plugin</string>
<key>count</key>
<integer>1</integer>
<!-- you can specify multiple such plugins -->
<key>compose</key>
<boolean>true</boolean>
<key>map-to</key>
<string>LeapCommand</string>
</map>
<key>logfile</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>UserLogFile</string>
</map>
<!-- [FS:CR] Use UserLoginInfoCmdLine Plz -->
<key>login</key>
<map>
<key>desc</key>
<string>3 tokens: first, last and password</string>
<key>count</key>
<integer>3</integer>
<key>map-to</key>
<string>UserLoginInfoCmdLine</string>
</map>
<key>loginpage</key>
<map>
<key>desc</key>
<string>Login authentication page to use.</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>LoginPage</string>
</map>
<key>loginuri</key>
<map>
<key>desc</key>
<string>login server and CGI script to use</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>CmdLineLoginURI</string>
</map>
<key>logmetrics</key>
<map>
<key>desc</key>
<string>Log metrics for benchmarking</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>LogMetrics</string>
</map>
<key>logperformance</key>
<map>
<key>desc</key>
<string>Log performance metrics for benchmarking</string>
<key>map-to</key>
<string>LogPerformance</string>
</map>
<key>multiple</key>
<map>
<key>desc</key>
<string>Allow multiple viewers.</string>
<key>map-to</key>
<string>AllowMultipleViewers</string>
</map>
<key>noaudio</key>
<map>
<key>map-to</key>
<string>NoAudio</string>
</map>
<key>nofmod</key>
<map>
<key>map-to</key>
<string>UseMediaPluginsForStreamingAudio</string>
</map>
<key>noninteractive</key>
<map>
<key>desc</key>
<string>Run in semi-headless mode where only login and logout need to work.</string>
<key>map-to</key>
<string>NonInteractive</string>
</map>
<key>nonotifications</key>
<map>
<key>desc</key>
<string>User will not get any notifications. NOTE: All notifications that occur will get added to ignore file for future runs.</string>
<key>map-to</key>
<string>IgnoreAllNotifications</string>
</map>
<key>nopreload</key>
<map>
<key>map-to</key>
<string>NoPreload</string>
</map>
<key>noprobe</key>
<map>
<key>map-to</key>
<string>NoHardwareProbe</string>
</map>
<key>noquicktime</key>
<map>
<key>map-to</key>
<string>NoQuickTime</string>
</map>
<key>nosound</key>
<map>
<key>map-to</key>
<string>NoAudio</string>
</map>
<key>no-verify-ssl-cert</key>
<map>
<key>map-to</key>
<string>NoVerifySSLCert</string>
</map>
<key>novoice</key>
<map>
<key>desc</key>
<string>Disable voice.</string>
<key>map-to</key>
<string>CmdLineDisableVoice</string>
</map>
<key>outbw</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>OutBandwidth</string>
</map>
<key>port</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>UserConnectionPort</string>
</map>
<key>purge</key>
<map>
<key>desc</key>
<string>Delete files in the cache.</string>
<key>map-to</key>
<string>PurgeCacheOnNextStartup</string>
</map>
<key>qa</key>
<map>
<key>desc</key>
<string>Activated debugging menu in Advanced Settings.</string>
<key>map-to</key>
<string>QAMode</string>
</map>
<key>quitafter</key>
<map>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>QuitAfterSeconds</string>
</map>
<key>replaysession</key>
<map>
<key>desc</key>
<string>After login, replay last recorded session and quit.</string>
<key>map-to</key>
<string>ReplaySession</string>
</map>
<key>rotate</key>
<map>
<key>map-to</key>
<string>RotateRight</string>
</map>
<key>safe</key>
<map>
<key>desc</key>
<string>Reset preferences, run in safe mode.</string>
<key>map-to</key>
<string>SafeMode</string>
</map>
<key>sessionsettings</key>
<map>
<key>desc</key>
<string>Specify the filename of a configuration file that contains temporary per-session configuration overrides.</string>
<key>count</key>
<integer>1</integer>
<!-- Special case. Mapped to settings procedurally. -->
</map>
<key>set</key>
<map>
<key>desc</key>
<string>specify the value of a particular configuration variable that overrides all other settings.</string>
<key>count</key>
<integer>2</integer>
<key>compose</key>
<boolean>true</boolean>
<!-- Special case. Mapped to settings procedurally. -->
</map>
<key>setdefault</key>
<map>
<key>desc</key>
<string>specify the value of a particular configuration variable which can be overridden by settings.xml.</string>
<key>count</key>
<integer>2</integer>
<!-- Special case. Mapped to settings procedurally. -->
</map>
<key>settings</key>
<map>
<key>desc</key>
<string>Specify the filename of a configuration file.</string>
<key>count</key>
<integer>1</integer>
<!-- Special case. Mapped to settings procedurally. -->
</map>
<key>skin</key>
<map>
<key>desc</key>
<string>ui/branding skin folder to use</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>SkinCurrent</string>
</map>
<key>slurl</key>
<map>
<key>desc</key>
<string>Startup SLurl</string>
<key>count</key>
<integer>1</integer>
<key>positional</key>
<boolean>true</boolean>
<key>last_option</key>
<boolean>true</boolean>
<key>map-to</key>
<string>CmdLineLoginLocation</string>
</map>
<key>url</key>
<map>
<key>desc</key>
<string>Startup location</string>
<key>count</key>
<integer>1</integer>
<key>last_option</key>
<boolean>true</boolean>
<key>map-to</key>
<string>CmdLineLoginLocation</string>
</map>
<key>usersessionsettings</key>
<map>
<key>desc</key>
<string>Specify the filename of a configuration file that contains temporary per-session configuration user overrides.</string>
<key>count</key>
<integer>1</integer>
<!-- Special case. Mapped to settings procedurally. -->
</map>
<key>skipupdatecheck</key>
<map>
<key>desc</key>
<string>Skips update check at startup.</string>
<key>map-to</key>
<string>CmdLineSkipUpdater</string>
</map>
<!-- FS:Ansariel - Option to not auto-save passwords when using login option >
<key>logindontsavepassword</key>
<map>
<key>desc</key>
<string>Specifies that the password should not be saved if the login parameter is used.</string>
<! Special case. Mapped to settings procedurally. >
</map>
<! FS:Ansariel - Option to not auto-save passwords when using login option -->
<!-- FS:Ansariel FIRE-12671: Force VRAM if DirectX detection is broken -->
<key>forcevideomemory</key>
<map>
<key>desc</key>
<string>Overrides the video memory detection on Windows if a value greater 0 is passed</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
<string>FSForcedVideoMemory</string>
</map>
<!-- FS:Ansariel -->
</map>
</llsd>
+683
View File
@@ -0,0 +1,683 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<commands>
<command name="aboutland"
available_in_toybox="true"
icon="Command_AboutLand_Icon"
label_ref="Command_AboutLand_Label"
tooltip_ref="Command_AboutLand_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="about_land"
is_enabled_function="Floater.CanShow"
is_enabled_parameters="about_land"
is_running_function="Floater.IsOpen"
is_running_parameters="about_land"
/>
<command name="appearance"
available_in_toybox="true"
icon="Command_Appearance_Icon"
label_ref="Command_Appearance_Label"
tooltip_ref="Command_Appearance_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="appearance"
is_running_function="Floater.IsOpen"
is_running_parameters="appearance"
/>
<command name="avatar"
available_in_toybox="true"
icon="Command_Avatar_Icon"
label_ref="Command_Avatar_Label"
tooltip_ref="Command_Avatar_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="avatar"
is_enabled_function="GridFeatureCheck"
is_enabled_parameters="avatar_picker"
is_running_function="Floater.IsOpen"
is_running_parameters="avatar"
/>
<command name="build"
available_in_toybox="true"
icon="Command_Build_Icon"
label_ref="Command_Build_Label"
tooltip_ref="Command_Build_Tooltip"
execute_function="Build.Toggle"
execute_parameters="build"
is_enabled_function="Build.EnabledOrActive"
is_enabled_parameters="build"
is_running_function="Floater.IsOpen"
is_running_parameters="build"
/>
<!-- <FS:minerjr> [FIRE-35039] Add flag to show/hide the on-screen console -->
<!-- Added checkbox_control to the chat toolbar control to show/hide the on-screen console -->
<command name="chat"
available_in_toybox="true"
is_flashing_allowed="true"
icon="Command_Chat_Icon"
label_ref="Command_Chat_Label"
tooltip_ref="Command_Conversations_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_im_container"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_im_container"
checkbox_control="FSShowOnscreenConsole"
/>
<!-- </FS:minerjr> [FIRE-35039] -->
<command name="compass"
available_in_toybox="false"
icon="Command_Compass_Icon"
label_ref="Command_Compass_Label"
tooltip_ref="Command_Compass_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="compass"
is_running_function="Floater.IsOpen"
is_running_parameters="compass"
/>
<command name="destinations"
available_in_toybox="true"
icon="Command_Destinations_Icon"
label_ref="Command_Destinations_Label"
tooltip_ref="Command_Destinations_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="destinations"
is_enabled_function="GridFeatureCheck"
is_enabled_parameters="destination_guide"
is_running_function="Floater.IsOpen"
is_running_parameters="destinations"
/>
<command name="gestures"
available_in_toybox="true"
icon="Command_Gestures_Icon"
label_ref="Command_Gestures_Label"
tooltip_ref="Command_Gestures_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="gestures"
is_running_function="Floater.IsOpen"
is_running_parameters="gestures"
/>
<command name="howto"
available_in_toybox="true"
icon="Command_HowTo_Icon"
label_ref="Command_HowTo_Label"
tooltip_ref="Command_HowTo_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="guidebook"
is_running_function="Floater.IsOpen"
is_running_parameters="guidebook"
/>
<command name="inventory"
available_in_toybox="true"
icon="Command_Inventory_Icon"
label_ref="Command_Inventory_Label"
tooltip_ref="Command_Inventory_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="inventory"
is_enabled_function="RLV.EnableIfNot"
is_enabled_parameters="showinv"
is_running_function="Floater.IsOpen"
is_running_parameters="inventory"
/>
<command name="map"
available_in_toybox="true"
icon="Command_Map_Icon"
label_ref="Command_Map_Label"
tooltip_ref="Command_Map_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="world_map"
is_enabled_function="RLV.EnableIfNot"
is_enabled_parameters="showworldmap"
is_running_function="Floater.IsOpen"
is_running_parameters="world_map"
/>
<command name="marketplace"
available_in_toybox="false"
icon="Command_Marketplace_Icon"
label_ref="Command_Marketplace_Label"
tooltip_ref="Command_Marketplace_Tooltip"
execute_function="Avatar.OpenMarketplace"
/>
<command name="marketplacelistings"
available_in_toybox="true"
icon="Command_MktListings_Icon"
label_ref="Command_MarketplaceListings_Label"
tooltip_ref="Command_MarketplaceListings_Tooltip"
execute_function="Marketplace.Toggle"
execute_parameters="marketplace"
is_enabled_function="Marketplace.Enabled"
is_enabled_parameters="marketplace"
is_running_function="Floater.IsOpen"
is_running_parameters="marketplace_listings"
/>
<command name="minimap"
available_in_toybox="true"
icon="Command_MiniMap_Icon"
label_ref="Command_MiniMap_Label"
tooltip_ref="Command_MiniMap_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="mini_map"
is_enabled_function="RLV.EnableIfNot"
is_enabled_parameters="showminimap"
is_running_function="Floater.IsOpen"
is_running_parameters="mini_map"
/>
<command name="move"
available_in_toybox="true"
icon="Command_Move_Icon"
label_ref="Command_Move_Label"
tooltip_ref="Command_Move_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="moveview"
is_running_function="Floater.IsOpen"
is_running_parameters="moveview"
/>
<command name="people"
available_in_toybox="true"
icon="Command_People_Icon"
label_ref="Command_People_Label"
tooltip_ref="Command_People_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="people"
is_running_function="Floater.IsOpen"
is_running_parameters="people"
/>
<command name="picks"
available_in_toybox="true"
icon="Command_Picks_Icon"
label_ref="Command_Picks_Label"
tooltip_ref="Command_Picks_Tooltip"
execute_function="Avatar.TogglePicks"
is_running_function="Avatar.IsPicksTabOpen"
/>
<command name="places"
available_in_toybox="true"
icon="Command_Places_Icon"
label_ref="Command_Places_Label"
tooltip_ref="Command_Places_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="places"
is_running_function="Floater.IsOpen"
is_running_parameters="places"
/>
<command name="poser"
available_in_toybox="true"
icon="Command_Poser_Icon"
label_ref="Command_Poser_Label"
tooltip_ref="Command_Poser_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="fs_poser"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_poser"
/>
<command name="preferences"
available_in_toybox="true"
icon="Command_Preferences_Icon"
label_ref="Command_Preferences_Label"
tooltip_ref="Command_Preferences_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="preferences"
is_running_function="Floater.IsOpen"
is_running_parameters="preferences"
/>
<command name="profile"
available_in_toybox="true"
icon="Command_Profile_Icon"
label_ref="Command_Profile_Label"
tooltip_ref="Command_Profile_Tooltip"
execute_function="Avatar.ToggleMyProfile"
is_running_function="Avatar.IsMyProfileOpen"
/>
<command name="search"
available_in_toybox="true"
icon="Command_Search_Icon"
label_ref="Command_Search_Label"
tooltip_ref="Command_Search_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="search"
is_running_function="Floater.IsOpen"
is_running_parameters="search"
/>
<command name="snapshot"
available_in_toybox="true"
icon="Command_Snapshot_Icon"
label_ref="Command_Snapshot_Label"
tooltip_ref="Command_Snapshot_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="snapshot"
is_running_function="Floater.IsOpen"
is_running_parameters="snapshot"
/>
<command name="flickr"
available_in_toybox="true"
icon="Command_Flickr_Icon"
label_ref="Command_Flickr_Label"
tooltip_ref="Command_Flickr_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="flickr"
is_running_function="Floater.IsOpen"
is_running_parameters="flickr"
/>
<command name="primfeed"
available_in_toybox="true"
icon="Command_Primfeed_Icon"
label_ref="Command_Primfeed_Label"
tooltip_ref="Command_Primfeed_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="primfeed"
is_running_function="Floater.IsOpen"
is_running_parameters="primfeed"
/>
<command name="speak"
available_in_toybox="true"
icon="Command_Speak_Icon"
label_ref="Command_Speak_Label"
tooltip_ref="Command_Speak_Tooltip"
execute_function="Agent.PressMicrophone"
execute_parameters="speak"
execute_stop_function="Agent.ReleaseMicrophone"
execute_stop_parameters="speak"
is_enabled_function="Agent.IsActionAllowed"
is_enabled_parameters="speak"
is_running_function="Agent.IsMicrophoneOn"
is_running_parameters="speak"
checkbox_control="PushToTalkToggle"
/>
<command name="RFO"
available_in_toybox="true"
icon="Command_RFO_Icon"
label_ref="Command_RFO_Label"
tooltip_ref="Command_RFO_Tooltip"
execute_function="TogglePerAccountControl"
execute_parameters="FSRenderFriendsOnly"
is_running_function="CheckPerAccountControl"
is_running_parameters="FSRenderFriendsOnly"
checkbox_control="FSRenderFriendsOnlyPersistsTP"
/>
<command name="derender_animated_objects"
available_in_toybox="false"
icon="derender_animated_objects"
label_ref="Command_DAO_Label"
tooltip_ref="Command_DAO_Tooltip"
execute_function="Tools.DerenderAnimatedObjects"
/>
<command name="view"
available_in_toybox="true"
icon="Command_View_Icon"
label_ref="Command_View_Label"
tooltip_ref="Command_View_Tooltip"
execute_function="View.ToggleCameraFloater"
is_running_function="View.CheckCameraFloater"
/>
<command name="reporter"
available_in_toybox="true"
icon="Command_Report_Abuse_Icon"
label_ref="Command_Report_Abuse_Label"
tooltip_ref="Command_Report_Abuse_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="reporter"
is_running_function="Floater.IsOpen"
is_running_parameters="reporter"
/>
<command name="gridstatus"
available_in_toybox="true"
is_flashing_allowed="true"
icon="Command_Grid_Status_Icon"
label_ref="Command_Grid_Status_Label"
tooltip_ref="Command_Grid_Status_Tooltip"
execute_function="OpenGridStatus"
is_running_function="Floater.IsOpen"
is_running_parameters="grid_status"
/>
<!-- Firestorm command buttons -->
<command name="voice"
available_in_toybox="true"
icon="Command_Voice_Icon"
label_ref="Command_Voice_Label"
tooltip_ref="Command_Voice_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_voice_controls"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_voice_controls"
/>
<command name="quickprefs"
available_in_toybox="true"
icon="phoenix_18"
label_ref="Command_Quickprefs_Label"
tooltip_ref="Command_Quickprefs_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="quickprefs"
is_running_function="Floater.IsOpen"
is_running_parameters="quickprefs"
/>
<command name="animationoverride"
available_in_toybox="true"
icon="ao_toggle_18"
label_ref="Command_AO_Label"
tooltip_ref="Command_AO_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="animation_overrider"
is_running_function="Floater.IsOpen"
is_running_parameters="animation_overrider"
checkbox_control="UseAO"
/>
<command name="webbrowser"
available_in_toybox="true"
icon="www_18"
label_ref="Command_Webbrowser_Label"
tooltip_ref="Command_Webbrowser_Tooltip"
execute_function="ToggleWebBrowser"
execute_parameters="HOME_PAGE"
is_running_function="Floater.IsOpen"
is_running_parameters="web_content"
/>
<!-- this uses control_name instead of the execute/is_running functions -Zi -->
<command name="defaultchatbar"
available_in_toybox="true"
icon="chatbar_18"
label_ref="Command_Default_Chat_Bar_Label"
tooltip_ref="Command_Default_Chat_Bar_Tooltip"
control_name="MainChatbarVisible"
/>
<command name="areasearch"
available_in_toybox="true"
icon="areasearch"
label_ref="Command_Areasearch_Label"
tooltip_ref="Command_Areasearch_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="area_search"
is_running_function="Floater.IsOpen"
is_running_parameters="area_search"
/>
<command name="settings_debug"
available_in_toybox="true"
icon="settings_debug"
label_ref="Command_Settings_Debug_Label"
tooltip_ref="Command_Settings_Debug_Tooltip"
execute_function="ToggleSettingsDebug"
is_running_function="Floater.IsOpen"
is_running_parameters="settings_debug"
/>
<command name="statistics"
available_in_toybox="true"
icon="statistics"
label_ref="Command_Statistics_Label"
tooltip_ref="Command_Statistics_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="stats"
is_running_function="Floater.IsOpen"
is_running_parameters="stats"
/>
<command name="regioninfo"
available_in_toybox="true"
icon="regioninfo"
label_ref="Command_Region_Label"
tooltip_ref="Command_Region_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="region_info"
is_running_function="Floater.IsOpen"
is_running_parameters="region_info"
/>
<command name="fly"
available_in_toybox="true"
icon="Move_Fly_Off"
label_ref="Command_Fly_Label"
tooltip_ref="Command_Fly_Tooltip"
execute_function="Agent.toggleFlying"
is_running_function="Agent.getFlying"
is_enabled_function="Agent.enableFlying"
/>
<command name="groundsit"
available_in_toybox="true"
icon="groundsit"
label_ref="Command_Groundsit_Label"
tooltip_ref="Command_Groundsit_Tooltip"
execute_function="Self.ForceSit"
is_running_function="Self.getForceSit"
is_enabled_function="Self.EnableForceSit"
/>
<command name="soundexplorer"
available_in_toybox="true"
icon="sound_explorer"
label_ref="Command_Sound_Explorer_Label"
tooltip_ref="Command_Sound_Explorer_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="sound_explorer"
is_running_function="Floater.IsOpen"
is_running_parameters="sound_explorer"
/>
<command name="assetblacklist"
available_in_toybox="true"
icon="asset_blacklist"
label_ref="Command_Asset_Blacklist_Label"
tooltip_ref="Command_Asset_Blacklist_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_asset_blacklist"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_asset_blacklist"
/>
<command name="phototools"
available_in_toybox="true"
icon="phototools"
label_ref="Command_Phototools_Label"
tooltip_ref="Command_Phototools_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="phototools"
is_running_function="Floater.IsOpen"
is_running_parameters="phototools"
/>
<command name="phototools_view"
available_in_toybox="true"
icon="phototools_camera"
label_ref="Command_Phototools_View_Label"
tooltip_ref="Command_Phototools_View_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="phototools_camera"
is_running_function="Floater.IsOpen"
is_running_parameters="phototools_camera"
/>
<command name="contact_sets"
available_in_toybox="true"
icon="contact_sets"
label_ref="Command_Contact_Sets_Label"
tooltip_ref="Command_Contact_Sets_Tooltip"
execute_function="SideTray.PanelPeopleTab"
execute_parameters="contact_sets_panel"
/>
<command name="mouselook_view"
available_in_toybox="true"
icon="mouselook"
label_ref="Command_Mouselook_Label"
tooltip_ref="Command_Mouselook_Tooltip"
execute_function="View.Mouselook"
is_enabled_function="View.EnableMouselook"
/>
<command name="landmark_here"
available_in_toybox="true"
icon="landmark_here"
label_ref="Command_Landmark_Here_Label"
tooltip_ref="Command_Landmark_Here_Tooltip"
execute_function="World.CreateLandmark"
is_enabled_function="World.EnableCreateLandmark"
/>
<command name="teleport_history"
available_in_toybox="true"
icon="teleport_history"
label_ref="Command_Teleport_History_Label"
tooltip_ref="Command_Teleport_History_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_teleporthistory"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_teleporthistory"
/>
<command name="pose_stand"
available_in_toybox="true"
icon="pose_stand"
label_ref="Command_Pose_Stand_Label"
tooltip_ref="Command_Pose_Stand_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_posestand"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_posestand"
is_enabled_function="Agent.IsActionAllowed"
is_enabled_parameters="fs_when_not_sitting"
/>
<command name="snapshot_to_disk"
available_in_toybox="true"
icon="Command_Snapshot_2_Disk_Icon"
label_ref="Command_Snapshot_To_Disk_Label"
tooltip_ref="Command_Snapshot_To_Disk_Tooltip"
execute_function="File.TakeSnapshotToDisk"
/>
<command name="radar"
available_in_toybox="true"
icon="radar"
label_ref="Command_Radar_Label"
tooltip_ref="Command_Radar_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_radar"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_radar"
/>
<command name="conversation_log"
available_in_toybox="true"
icon="Chat_History"
label_ref="Command_Conversation_Log_Label"
tooltip_ref="Command_Conversation_Log_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="conversation"
is_running_function="Floater.IsOpen"
is_running_parameters="conversation"
/>
<command name="move_lock"
available_in_toybox="true"
icon="move_lock"
label_ref="Command_Move_Lock_Label"
tooltip_ref="Command_Move_Lock_Tooltip"
execute_function="Self.ToggleMoveLock"
is_running_function="Self.GetMoveLock"
is_enabled_function="Self.EnableMoveLock"
/>
<command name="block_list"
available_in_toybox="true"
icon="block_list"
label_ref="Command_Blocklist_Label"
tooltip_ref="Command_Blocklist_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_blocklist"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_blocklist"
/>
<command name="resync_animations"
available_in_toybox="true"
icon="resync_animations"
label_ref="Command_ResyncAnimations_Label"
tooltip_ref="Command_ResyncAnimations_Tooltip"
execute_function="Tools.ResyncAnimations"
/>
<command name="regiontracker"
available_in_toybox="true"
icon="Command_RegionTracker_Icon"
label_ref="Command_RegionTracker_Label"
tooltip_ref="Command_RegionTracker_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="region_tracker"
is_running_function="Floater.IsOpen"
is_running_parameters="region_tracker"
/>
<command name="group_titles"
available_in_toybox="true"
icon="Group_Titles_Icon"
label_ref="Command_Group_Titles_Label"
tooltip_ref="Command_Group_Titles_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_group_titles"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_group_titles"
/>
<command name="wearable_favorites"
available_in_toybox="true"
icon="Wearable_Favorites_Icon"
label_ref="Command_Wearable_Favorites_Label"
tooltip_ref="Command_Wearable_Favorites_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_wearable_favorites"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_wearable_favorites"
/>
<command name="beacons"
available_in_toybox="true"
icon="beacons"
label_ref="Command_Beacons_Label"
tooltip_ref="Command_Beacons_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="beacons"
is_running_function="Floater.IsOpen"
is_running_parameters="beacons"
/>
<command name="stop_animations"
available_in_toybox="true"
icon="Stop_Animations_Icon"
label_ref="Command_Stop_Animations_Label"
tooltip_ref="Command_Stop_Animations_Tooltip"
execute_function="Tools.StopAllAnimations"
execute_parameters="stop"
/>
<command name="discord"
available_in_toybox="true"
icon="Command_Discord_Icon"
label_ref="Command_Discord_Label"
tooltip_ref="Command_Discord_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_discord"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_discord"
/>
<command name="myenvironments"
available_in_toybox="true"
is_flashing_allowed="true"
icon="Command_Environments_Icon"
label_ref="Command_Environments_Label"
tooltip_ref="Command_Environments_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="my_environments"
is_enabled_function="RLV.EnableIfNot"
is_enabled_parameters="setenv"
is_running_function="Floater.IsOpen"
is_running_parameters="my_environments"
/>
<command name="360capture"
available_in_toybox="true"
is_flashing_allowed="true"
icon="Command_360_Capture_Icon"
label_ref="Command_360_Capture_Label"
tooltip_ref="Command_360_Capture_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="360capture"
is_running_function="Floater.IsOpen"
is_running_parameters="360capture"
/>
<command name="performance"
available_in_toybox="true"
icon="Command_Performance_Icon"
label_ref="Command_Performance_Label"
tooltip_ref="Command_Performance_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="performance"
is_running_function="Floater.IsOpen"
is_running_parameters="performance"
checkbox_control="AutoTuneFPS"
/>
</commands>
@@ -0,0 +1,82 @@
<?xml version="1.0" ?>
<llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="llsd.xsd">
<array>
<map>
<key>Name</key>
<string>all</string>
<key>Character</key>
<string>🔍</string>
</map>
<map>
<key>Character</key>
<string>😀</string>
<key>Categories</key>
<array>
<string>smileys and emotion</string>
<string>people and body</string>
</array>
</map>
<map>
<key>Character</key>
<string>🥬</string>
<key>Categories</key>
<array>
<string>animals and nature</string>
</array>
</map>
<map>
<key>Character</key>
<string>🍔</string>
<key>Categories</key>
<array>
<string>food and drink</string>
</array>
</map>
<map>
<key>Character</key>
<string>🛩</string>
<key>Categories</key>
<array>
<string>travel and places</string>
</array>
</map>
<map>
<key>Character</key>
<string>🏈</string>
<key>Categories</key>
<array>
<string>activities</string>
</array>
</map>
<map>
<key>Character</key>
<string>💡</string>
<key>Categories</key>
<array>
<string>objects</string>
</array>
</map>
<map>
<key>Character</key>
<string>⚠</string>
<key>Categories</key>
<array>
<string>symbols</string>
</array>
</map>
<map>
<key>Name</key>
<string>others</string>
<key>Character</key>
<string>🌂</string>
</map>
<map>
<key>Name</key>
<string>skip</string>
<key>Categories</key>
<array>
<string>components</string>
</array>
</map>
</array>
</llsd>
@@ -0,0 +1,57 @@
<llsd>
<array>
<array>
<string>sepia</string>
</array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>1.2</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.4</real>
<real>0.1</real>
<real>0.0</real>
</array>
<array>
<string>darken</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>blend</string>
<real>0.0</real>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>1.7</real>
<real>3.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.7</real>
<real>0.3</real>
<real>0.2</real>
</array>
</array>
</llsd>
@@ -0,0 +1,11 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.01</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,36 @@
<llsd>
<array>
<array>
<string>grayscale</string>
</array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>posterize</string>
<real>10.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>gradient</string>
</array>
<array>
<string>colorize</string>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>0.15</real>
</array>
<array>
<string>blur</string>
</array>
</array>
</llsd>
@@ -0,0 +1,7 @@
<llsd>
<array>
<array>
<string>grayscale</string>
</array>
</array>
</llsd>
@@ -0,0 +1,25 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>uniform</string>
<string>add</string>
<real>0.0</real>
<real>1.0</real>
</array>
<array>
<string>gamma</string>
<real>0.25</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,11 @@
<llsd>
<array>
<array>
<string>brighten</string>
<real>0.5</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,24 @@
<llsd>
<array>
<array>
<string>gradient</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>linearize</string>
<real>0.94</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>1.2</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,47 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>0.8</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.3</real>
<real>0.0</real>
<real>0.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>blend</string>
<real>0.0</real>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
<real>10.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.1</real>
<real>0.1</real>
<real>0.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,11 @@
<llsd>
<array>
<array>
<string>darken</string>
<real>0.2</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,24 @@
<llsd>
<array>
<array>
<string>gradient</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>linearize</string>
<real>0.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>1.3</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,39 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>blend</string>
<real>0.0</real>
<real>0.4</real>
<real>0.0</real>
<real>0.0</real>
<real>0.5</real>
<real>2.0</real>
</array>
<array>
<string>sharpen</string>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>blend</string>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>0.0</real>
<real>0.5</real>
<real>2.0</real>
</array>
<array>
<string>blur</string>
</array>
</array>
</llsd>
@@ -0,0 +1,38 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>0.8</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>fade</string>
<real>0.6</real>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
<real>4.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>0.0</real>
<real>1.0</real>
<real>0.4</real>
<real>0.0</real>
<real>0.2</real>
</array>
</array>
</llsd>
@@ -0,0 +1,8 @@
<llsd>
<array>
<array>
<string>saturate</string>
<real>3.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,20 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>grayscale</string>
</array>
<array>
<string>screen</string>
<string>line</string>
<real>0.02</real>
<real>0.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,131 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.01</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>gradient</string>
<string>add</string>
<real>0.5</real>
<real>0.0</real>
<real>-1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>-1.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.1</real>
<real>0.1</real>
<real>0.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>0.0</real>
<real>0.5</real>
<real>-1.0</real>
<real>1.0</real>
<real>1.5</real>
<real>5.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.6</real>
<real>0.0</real>
<real>0.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>0.0</real>
<real>0.5</real>
<real>-1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>5.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.6</real>
<real>0.6</real>
<real>0.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>0.0</real>
<real>0.5</real>
<real>0.5</real>
<real>-0.5</real>
<real>0.10</real>
<real>20.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.7</real>
<real>0.0</real>
<real>0.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>0.0</real>
<real>0.5</real>
<real>0.6</real>
<real>-0.6</real>
<real>0.05</real>
<real>20.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.7</real>
<real>0.0</real>
<real>0.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>0.0</real>
<real>0.5</real>
<real>0.4</real>
<real>-0.4</real>
<real>0.025</real>
<real>20.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.7</real>
<real>0.0</real>
<real>0.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,78 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.09</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>brighten</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>gradient</string>
<string>add</string>
<real>1.0</real>
<real>0.0</real>
<real>-1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>-1.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.1</real>
<real>0.1</real>
<real>0.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>0.0</real>
<real>1.0</real>
<real>-1.0</real>
<real>1.0</real>
<real>1.5</real>
<real>5.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.8</real>
<real>0.0</real>
<real>0.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>0.0</real>
<real>1.0</real>
<real>-1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>5.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.8</real>
<real>0.8</real>
<real>0.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,11 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,118 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.02</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>1.02</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>saturate</string>
<real>1.2</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>blend</string>
<real>0.0</real>
<real>0.25</real>
<real>0.0</real>
<real>0.0</real>
<real>0.25</real>
<real>2.0</real>
</array>
<array>
<string>sharpen</string>
</array>
<array>
<string>stencil</string>
<string>gradient</string>
<string>blend</string>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>-1.0</real>
<real>0.0</real>
<real>-0.25</real>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>stencil</string>
<string>gradient</string>
<string>blend</string>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
<real>0.0</real>
<real>0.25</real>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
</array>
</llsd>
@@ -0,0 +1,11 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.9</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,20 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>grayscale</string>
</array>
<array>
<string>screen</string>
<string>2Dsine</string>
<real>0.02</real>
<real>0.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,24 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>colorize</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>0.0</real>
<real>0.3</real>
<real>0.0</real>
</array>
<array>
<string>saturate</string>
<real>0.35</real>
</array>
</array>
</llsd>
@@ -0,0 +1,35 @@
<llsd>
<array>
<array>
<string>blur</string>
</array>
<array>
<string>darken</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>0.9</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>linearize</string>
<real>0.01</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>posterize</string>
<real>3.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,8 @@
<llsd>
<array>
<array>
<string>rotate</string>
<real>180.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,7 @@
<llsd>
<array>
<array>
<string>sepia</string>
</array>
</array>
</llsd>
@@ -0,0 +1,7 @@
<llsd>
<array>
<array>
<string>sharpen</string>
</array>
</array>
</llsd>
@@ -0,0 +1,7 @@
<llsd>
<array>
<array>
<string>blur</string>
</array>
</array>
</llsd>
@@ -0,0 +1,47 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>0.0</real>
<real>0.4</real>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
<real>2.0</real>
</array>
<array>
<string>contrast</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>add</string>
<real>-0.8</real>
<real>0.0</real>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
<real>2.0</real>
</array>
<array>
<string>contrast</string>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</array>
</llsd>
@@ -0,0 +1,42 @@
<llsd>
<array>
<array>
<string>grayscale</string>
</array>
<array>
<string>linearize</string>
<real>0.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>posterize</string>
<real>50.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>gradient</string>
</array>
<array>
<string>screen</string>
<string>line</string>
<real>0.02</real>
<real>90.0</real>
</array>
<array>
<string>colorize</string>
<real>0.0</real>
<real>1.0</real>
<real>0.0</real>
<real>0.1</real>
<real>0.2</real>
<real>0.2</real>
</array>
<array>
<string>blur</string>
</array>
</array>
</llsd>
@@ -0,0 +1,46 @@
<llsd>
<array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>fade</string>
<real>0.0</real>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>1.2</real>
<real>3.0</real>
</array>
<array>
<string>linearize</string>
<real>0.05</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>grayscale</string>
</array>
<array>
<string>contrast</string>
<real>1.1</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>blend</string>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>0.0</real>
<real>0.5</real>
<real>2.0</real>
</array>
<array>
<string>blur</string>
</array>
</array>
</llsd>
@@ -0,0 +1,44 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>darken</string>
<real>0.15</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>uniform</string>
<string>add</string>
<real>0.0</real>
<real>0.5</real>
</array>
<array>
<string>screen</string>
<string>line</string>
<real>0.02</real>
<real>0.0</real>
</array>
<array>
<string>gamma</string>
<real>0.25</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>blur</string>
</array>
<array>
<string>blur</string>
</array>
</array>
</llsd>

Some files were not shown because too many files have changed in this diff Show More